在保持频率的同时放慢音乐播放速度


10

以较慢的速度播放音乐音频会降低其音调(频率)。是否有工具和理论来减慢歌曲播放速度并保持频率不变?我想一个人可以进行开窗傅立叶变换或小波变换。似乎必须预先选择窗口大小或动态选择小波基础。是否有任何具体且详细的理论和应用程序可以做到这一点?


1
除了下面提供的答案外,请参阅此链接以获取更多信息。
A_A

Answers:


5

是的,我们中的一些人可以做到,您可以在不影响音高的情况下加快或降低速度,有人将其称为“时间拉伸”的应用程序,有不同的实现方式,可以在频域或时域中进行,您需要选择什么是最适合您的,您会发现每种优点和缺点。

时域:

在时域中,您可以尝试一些技术,例如:

  • TDHS(时域谐波缩放)
  • SOLA(同步重叠添加)
  • PSOLA(音高同步重叠叠加)
  • WSOLA(波形相似性重叠叠加)

优点:速度快,某些算法易于理解,单声道声音质量佳。

缺点:通常,您需要一个非常好的音高轨迹以将其拼接到正确的位置,这很难做到:-(,因此,如果您的音高轨迹失败或无法在Poliphonic声音中工作,此算法会产生很多故障/伪像在输出声音中。

频域:

我在频域中知道的所有时间范围都是基于相位声码器技术的。

优点:可以和弦或单声道的声音工作。

缺点:可能很难理解所有的数学知识,实现起来有点困难,没有像时域代码那样快,对于语音,我更喜欢时域结果,但没有分享改善标准相位声码器结果的一些技巧。

我可以说窗口和跳数是相位声码器质量的关键之一,通常我们选择4x重叠进行合成,一个hann窗口4096就足够了(当然,如果您对此大小有处理能力) ,标准相位声码器可以添加一些混响效果,为避免此类问题,您可能需要锁定相位。

有关数据的信息,请查看Miller PuckettePortnoff


谢谢您的回答。最幼稚的方法有什么问题:将整个时间信号作为整个时间间隔的函数扩展为一个整体,而不用开窗进入傅立叶级数并将所有频率乘以一个常数。我了解时域的任何局部误差都会影响所有傅立叶系数。除此之外,这种幼稚的非本地化方法的陷阱是什么?
汉斯(Hans)

我从来没有尝试过这样的方法,它可能会起作用,明显的问题是这可能会非常昂贵,这肯定不是一种有效的方法,假设您有一个音频(1分钟)以44100Hz采样,现在你提议你将不得不在应用傅立叶44100 * 60 = 2646000分一次和过程,所以忘了在实时任何企图处理这些
ederwander

1
我认为我之前提出的建议在纯数学意义上是行不通的(不考虑成本和错误敏感性)。
汉斯

3

您描述的工具/理论实际上是音乐技术上的一大研究领域,广泛地称为音频时标修改。该字段的主要组成部分是如何防止时间延长后频率发生可听见的变化。可以使用频域和时域方法来实现,这取决于您的应用程序的约束或目标。音频时标/音高修改的维基百科条目是一个很好的起点。

如果您热衷于使用基于频率/小波的方法,则窗口大小和基础的选择将影响您对信号进行本地化的能力。以STFT为例,较长的窗口对于固定的正弦波将表现良好,但会破坏瞬态。较短的窗口将以频域定位为代价提供较好的瞬态响应。其他小波基的性能将取决于信号在基上的投影性质。


非常感谢您的回答。您对小波的应用有什么参考吗?
汉斯

请同时在ederwander的回答下面查看我的评论。谢谢。
汉斯(Hans)

2

下面是Stephan M. Bernsee的C ++中一个简单而有价值的教程功能的链接(smbPitchShift.cpp),该功能可以在不改变音调的情况下降低或加快音乐的播放速度。

他已根据“广泛开放许可(WOL)”发布了此代码。在我的应用程序中,我能够使他的功能实时适应慢下来的音乐-即播放mp3文件时,并且同时对mp3信号进行音高检测。

我还提供了一个指向Bernsee网站的链接,其中包含他对音频信号(例如音乐)的时间伸展和音高偏移的详细说明。

https://github.com/AndyA/BatPhone/blob/master/pitchshift.c

http://blogs.zynaptiq.com/bernsee/time-pitch-overview/


原始代码不适用time stretch,原始代码适用Pitch Shift,在这种情况下,您将需要组合时间刻度修改Pitch Shifit + Resample (interpolation),Bernsee的代码在一个尺寸窗口中效果很好,4096您可以将音调移位一个八度(大于或小于一个八度) ,这意味着相应地,您将只能使用2.0x-0.5x之间的因数来制作高质量的时标,精心构建的相位声码器可以在相同的窗口大小下实现更好的结果,并且可以对这些结果进行推断质量更好的因素
ederwander 2016年

糟糕,现在记得我必须应用“重采样”才能完成时间拉伸,因此原始音高不会改变。自从GitHub链接版本以来,Bernsee似乎对其代码进行了一些更改。他的较新代码可从他的网站上下载-可能会增加其原始规格的转换范围。我调整了他的原始代码,以便将音调调高8倍。
詹姆斯·保罗·米拉德

您的代码和Bernsee页面之间没有区别,主要的数学运算仍然相同,我可以看到的最大区别是8192下载页面的代码中的窗口大小= ,所以您是否需要多处理4倍的点才能进行处理,我要说的是,使用一半的窗口大小,8192/2=4096您可以使用相位声码器的一些秘密来完成相同的工作,这里的要点是,您可以通过更少的处理来保持质量。
ederwander '16

尽管我提供了到BatPhone的GitHub链接,但这不是我的代码。我只是从Internet搜索中拉出它来查看smbPitchShift()。我的代码已从伯尔尼(Bernsee)的版本进行了很大的修改,并位于以下文件中:github.com/CreativeDetectors/PitchScope_Player/blob/master/Src/…–
James Paul Millard

是的,现在我可以看到,它确实是重采样,您可能有兴趣看到/听到我的相位声码器的作用。
ederwander '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.