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

评论

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

#1 楼

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

时域:

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


TDHS(时域谐波可扩展)
SOLA(同步重叠添加)
PSOLA(音高同步重叠添加)
WSOLA(波形相似重叠添加)

优点:速度快,一些算法易于理解,单声道声音质量好。很难做到:-(,因此,如果您的音调跟踪失败或无法在Poliphonic声音中工作,则此算法会在输出声音中产生许多故障/伪影。

频率域:

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

优点:适用于和弦或单声道声音。

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

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

数据化后,看看Miller Puckette和Portnoff纸

评论


$ \ begingroup $
谢谢您的回答。最幼稚的方法有什么问题:将整个时间信号作为整个时间间隔的函数扩展为一个整体,而不用开窗浏览傅立叶级数并将所有频率乘以一个常数。我了解时域中的任何局部误差都会影响所有傅立叶系数。除此之外,这种幼稚的非本地化方法的陷阱是什么?
$ \ endgroup $
–汉斯
16年7月1日在17:56

$ \ begingroup $
我从来没有尝试过类似的方法,它可能会起作用,明显的问题是这可能会非常昂贵,这肯定不是一种有效的方法,想象一下您有一段音频(1分钟)在现在要执行44100Hz的建议,您必须立即在44100 * 60 = 2646000点处应用傅立叶并进行处理,因此,请不要进行任何实时处理,
$ \ endgroup $
–ederwander
16年7月2日,0:13

$ \ begingroup $
我认为我之前提出的建议在纯粹的数学意义上是行不通的(不考虑成本和错误敏感性)。
$ \ endgroup $
–汉斯
16年7月8日在20:26

#2 楼

您描述的工具/理论实际上是音乐技术上的一大研究领域,广泛地称为音频时标修改。该字段的主要组成部分是如何防止时间延长后频率发生可听见的变化。可以使用频域和时域方法来实现,这取决于应用程序的约束或目标。音频时标/音调修改的维基百科条目是一个不错的起点。您对信号定位的能力。以STFT为例,对于固定的正弦曲线,长窗效果很好,但会破坏瞬态。较短的窗口将以频域定位为代价提供较好的瞬态响应。其他小波基的性能将取决于信号在基上的投影性质。

评论


$ \ begingroup $
非常感谢您的回答。您对小波的应用有什么参考吗?
$ \ endgroup $
–汉斯
16年7月1日在17:49

$ \ begingroup $
请同时在ederwander的回答下面查看我的评论。谢谢。
$ \ endgroup $
–汉斯
16年7月1日在18:12

#3 楼

下面是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/

评论


$ \ begingroup $
原始代码不应用时间拉伸,原始代码应用Pitch Shift,在这种情况下,要应用时间刻度修改,您需要结合使用Pitch Shifit + Resample(插值),Bernsee的代码在使用大小为4096,您将能够将音调移位一个八度(高于或低于此八度),这意味着相应地,您将只能使用2.0x-0.5x之间的因数来制作高质量的时标,精心构建的相位声码器可以实现使用相同的窗口大小可获得更好的结果,您将能够以更高的质量推断这些因素
$ \ endgroup $
–ederwander
16年7月6日在11:46

$ \ begingroup $
糟糕,现在记得我必须应用“重采样”来完成时间伸展,以使原始音高不变。自从GitHub链接版本以来,Bernsee似乎对其代码进行了一些更改。他的较新代码可从他的网站上下载-可能会增加其原始规格的转换范围。我调整了他的原始代码,以便将音调调高8倍。
$ \ endgroup $
–詹姆斯·保罗·米拉德(James Paul Millard)
16年7月6日在17:24

$ \ begingroup $
您的代码和Bernsee页面之间没有区别,主要数学原理仍然相同,我可以看到的最大区别是下载页面的代码中的窗口大小= 8192,所以您必须做处理要多出4倍,我再说一遍,用一半的窗口大小8192/2 = 4096,您可以使用相位声码器的一些秘密来完成相同的工作,这里的要点是,您可以通过更少的处理来保持质量。
$ \ endgroup $
–ederwander
16年7月6日在17:54

$ \ begingroup $
尽管我提供了BatPhone的GitHub链接,但这不是我的代码。我只是从Internet搜索中拉出它来查看smbPitchShift()。我的代码相对于伯恩西(Bernsee)的版本进行了很大的修改,并保存在以下文件中:github.com/CreativeDetectors/PitchScope_Player/blob/master/Src/…
$ \ endgroup $
–詹姆斯·保罗·米拉德(James Paul Millard)
16年7月6日在18:22

$ \ begingroup $
是的,现在我可以看到,它确实是重采样,您可能有兴趣看到/听到我的相位声码器的作用。
$ \ endgroup $
–ederwander
16年7月6日在18:48