1

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

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

2) 在每个块上运行 FFT

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

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

5)将所有块粘在一起

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

4

4 回答 4

2

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

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

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

于 2010-04-12T19:34:32.140 回答
2

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

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

于 2010-04-13T06:48:36.520 回答
1

找到这篇关于该主题的精彩文章,供以后尝试的任何人使用!

于 2010-04-13T05:46:11.090 回答
0

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

于 2010-04-12T19:28:39.883 回答