以较慢的速度播放一段音乐音频会降低其音高(频率)。有没有一种工具和理论可以在保持频率不变的情况下减慢歌曲的播放速度?我想可以进行加窗傅里叶变换或小波变换。似乎必须预先选择窗口大小或动态选择小波基。是否有任何具体而详细的理论和应用来做到这一点?
在保持频率的同时减慢音乐播放速度
是的,我们中的一些人可以做到,你可以在不影响音高的情况下加速或减速,有些人称之为时间拉伸的应用,有不同的方法可以做到,你可以在频域或时域做,你需要选择什么是最适合你的,你会发现每个的优点和缺点。
时域:
在时域中,您可以尝试一些技术,例如:
- TDHS(时域谐波标度)
- SOLA(同步重叠添加)
- PSOLA(音高同步重叠添加)
- WSOLA(波形相似性重叠添加)
优点:速度快,一些算法易于理解,单声道声音质量好。
缺点:通常你需要一个非常好的音高轨道来拼接到正确的位置,这很难做到:-(,所以如果你的音高轨道失败或不能在 Poliphonic 声音中工作,这个算法会产生很多故障/伪影在输出声音中。
频域:
我在频域中知道的所有时间拉伸都基于相位声码器技术。
优点:适用于复音或单音。
缺点:理解所有数学可能会很痛苦,实现有点困难,不像时域代码那么快,对于语音我更喜欢时域结果,一些提高标准相位声码器结果的技巧没有分享。
我可以说窗口和跳跃大小是相位声码器质量的关键之一,通常我们选择4x
重叠重新合成,一个大小的 hann 窗口4096
对我的耳朵来说就足够了(当然如果你有这个大小的处理能力) ,标准相位声码器可以添加一些混响效果,为了避免这种问题,你可能需要锁定相位。
有关数据,请查看Miller Puckette和Portnoff论文
您描述的工具/理论实际上是音乐技术研究的一个大领域,广泛称为音频时间尺度修改。该领域的一个重要组成部分是如何防止在时间拉伸后频率发生可听见的变化。这可以通过频域和时域方法来解决,具体取决于应用程序的约束或目标。音频时间尺度/音高修改的维基百科条目是一个很好的起点。
如果您热衷于使用频率/小波基的方法,您的窗口大小和基的选择将影响您定位信号的能力。以 STFT 为例,长窗口对于固定正弦曲线表现良好,但会破坏瞬态。较短的窗口将以频域定位为代价提供更好的瞬态响应。其他小波基的性能将取决于信号在基上投影的性质。
下面是 Stephan M. Bernsee 用 C++ 编写的一个简单而有价值的教程函数 (smbPitchShift.cpp) 的链接,它可以在不改变音高的情况下减慢或加速音乐。
他已在 The Wide Open License (WOL) 下发布了此代码。在我的应用程序中,我能够实时调整他的功能以降低音乐的速度——即在播放 mp3 文件的同时还对该 mp3 信号进行音高检测。
我还提供了一个指向 Bernsee 网站的链接,其中包含他对音频信号(例如音乐)的时间拉伸和音高转换的详细描述。