傅立叶变换以转置 wav 文件的密钥

Posted

技术标签:

【中文标题】傅立叶变换以转置 wav 文件的密钥【英文标题】:fourier transform to transpose key of a wav file 【发布时间】:2010-04-12 19:23:54 【问题描述】:

我想编写一个应用程序来转置 wav 文件播放的键(为了好玩,我知道有些应用程序已经这样做了)...我对如何实现这一点的主要理解是

1) 将音频文件切成非常小的块(比如每秒 1/10)

2) 对每个块运行 FFT

3) 根据我想要的键将频率空间向上或向下移相

4) 使用逆 FFT 将每个块返回到时域

5) 将所有块粘在一起

但现在我想知道,当我尝试将转换后的块重新粘合在一起时,它们是否会不再连续。有什么想法我应该如何做到这一点以保证连续性,还是我什么都不担心?

【问题讨论】:

【参考方案1】:

将每个块的时间样本重叠一半,以便第一个块之后的每个块由前一个块的最后 N/2 个样本和 N/2 个新样本组成。请务必在转换之前对样本应用一些窗口。

移频后,执行逆 FFT 并使用每个块的中间 N/2 个样本。您需要在 IFFT 之后调整最终增益。

当然,将时间样本与正弦波混合,然后进行低通滤波也会在时域中提供相同的偏移。混频器的频率将是所需的频率差。

【讨论】:

我认为混音器可能更符合 OP 的要求。但如果涉及过滤器,则重叠保存 FFT 技巧非常好。有关详细信息,请参阅en.wikipedia.org/wiki/Overlap-save_method。如果你做对了,你也不需要一个窗口——这个窗口更适合分析应用程序。 @larry 我不明白这是如何解决不连续性的......看起来结果信号通常与过去的块不同步。至于混频正弦波,我不熟悉这种方法。【参考方案2】:

对于语音,您可能想查看PSOLA - 这是pitch-shifting 和/或time stretching/compression 的流行算法,它比基本的重叠添加方法稍微复杂一点,但并不复杂。

如果您需要处理非语音样本,例如音乐,然后有several possibilities,但是其他答案中提到的重叠添加FFT/修改/IFFT方法可能是最好的选择。

【讨论】:

我的印象是 PSOLA 主要用于语音而不是音乐。这是正确的吗? @tom10: 好点 - 我不知道它有多好用,例如音乐。我想如果这是针对语音以外的应用程序,则更基本的重叠添加方法可能更合适。我会相应地编辑我的答案。【参考方案3】:

在该主题上找到this great article,供以后尝试的人使用!

【讨论】:

【参考方案4】:

您可能必须在块之间找到一个过零点,才能将各个 wav 重新粘合在一起。否则,您可能会发现您在块之间获得了点击或弹出。

【讨论】:

是的,这就是我所关心的,但仅仅让它在边界处连续可能还不够好,我怀疑不连续的梯度甚至二阶导数也可能给我带来点击。

以上是关于傅立叶变换以转置 wav 文件的密钥的主要内容,如果未能解决你的问题,请参考以下文章

在matlab中查找傅立叶变换的一秒样本

什么是傅立叶变换?为什么要进行傅立叶变换?一些回忆

直接傅立叶变换的最大值

傅立叶变换

傅立叶变换得到大约一半的输出错误

为什么要进行傅立叶变换?傅立叶变换究竟有何意义?如何用Matlab实现快速傅立叶变换