我想编写一个应用来转换wav文件所使用的密钥(为了好玩,我知道有些应用程序已经这样做了)...我对如何实现这一目标的主要理解是
1)将音频文件切割成非常小的块(比如每秒1/10)
2)对每个块运行FFT
3)根据我想要的键
向上或向下移相频率空间4)使用逆FFT将每个块返回到时域
5)将所有块粘合在一起
但是现在我想知道当我尝试将它们粘合在一起时,转换的块是否不再是连续的。有没有想法我应该如何保证连续性,或者我只是担心什么?
答案 0 :(得分:2)
将每个块的时间样本重叠一半,以使第一个块之后的每个块包含来自前一个块的最后N / 2个样本和N / 2个新样本。确保在转换之前对样本应用一些窗口。
移动频率后,执行逆FFT并使用每个块的中间N / 2个采样。您需要在IFFT之后调整最终收益。
当然,将时间样本与正弦波混合然后低通滤波也将在时域中提供相同的移位。混频器的频率是所需的频率差。
答案 1 :(得分:2)
对于语音,您可能需要查看PSOLA - 这是pitch-shifting
和/或time stretching/compression
的常用算法,它比基本的重叠添加方法稍微复杂一点,但并不复杂。
如果您需要处理非语音样本,例如音乐,然后有several possibilities,但其他答案中提到的重叠加法FFT /修改/ IFFT方法可能是最好的选择。
答案 2 :(得分:1)
找到关于此主题的this great article,对于将来尝试它的人来说!
答案 3 :(得分:0)
您可能必须在块之间找到过零点以将各个wav重新粘合在一起。否则,您可能会发现在块之间获得了点击或弹出。