我正在尝试找出如何(如果可能)以类似FFT的方式提取任意音频样本(通常是音乐)的频率分量,但是在我对FFT算法的研究中,我了解到它遭受了一些困扰为此,存在严格的限制。

FFT存在3个问题:


因为FFT的bin分辨率等于您的窗口大小,所以要达到相当合理的精度(例如1 Hz),则需要一个不合理的较长窗口(例如1秒)。这意味着您无法快速检测到瞬态或新引入的频率。这也意味着使用更快的CPU和更高的采样率无法解决该问题-限制本质上与时间有关。
人类对数感知频率,但是FFT区间是线性间隔的。例如,在我们听力的低端,相差20hz很大,而在高端处,相差20hz是不可察觉的。因此,要获得低频所需的精度,我们必须计算的远远超过高频所需的精度。
其中一些问题可以通过在FFT档之间进行插值来解决。这可能适用于许多音乐音频,因为频率之间通常会相隔很远,因此不会有超过1个频率泄漏到一对箱中。但这并非总是如此,特别是对于打击乐器之类的非谐音。所以插值实际上只是猜测。

根据我对DFT / FFT算法的了解,输出(仓幅度)实际上是每个仓频率处正弦/余弦的相关性。令我惊讶的是,如果可以重新设计算法以使bin频率非线性地间隔开(即我们将一组不同的正弦/余弦相关联),那么我们就可以在所有频率上达到心理听觉相等的分辨率。这是可能的,还是基于我对所涉及数学的不完全理解而做的白日梦?

我想我也可以通过使我感兴趣的每个频率的正弦/余弦相关来用蛮力解决问题。我在这里不太了解数学。这可能吗?什么样的效率?它可以解决我的问题吗?

是否有其他方法可以实现信号的更准确,实时,频率分解? CPU效率是一个问题,但不是主要问题-我对在理论上是否可以完全实现它有部分兴趣。但是,在现代台式机上实时可行的方法是理想的。

评论

您要解决哪个问题? f0检测,多次f0检测(用于转录),和弦识别,音色建模...?对于其中的一些问题,有一些专门的解决方案。您是否关心可逆性(用于分析->转换-​​>重新合成框架)?

我要解决的问题无疑是开放的。我对数字音乐普遍感兴趣,涵盖了您的大部分清单。但是我的模糊性部分是由于我对可以做什么以及解决所提到的每个问题的具体行业标准或最佳方法缺乏了解(直到我问了这个问题,我一直以为是FFT)。但是,您最感兴趣的项目是音色建模。我还想找到在录音中同时提取复杂音色的方法。重新合成令人兴奋。 AI算法很有趣。

我过去尝试解决的一个更具体的问题,并且想在某个时候再试一次:我想编写一个程序,以实时“即兴”与一群用麦克风录制的播放器或歌手。我什至对我的电脑发出“细微的回响”,这明显地延迟了而且不合时宜。对于这样的即兴演奏,准确地调准节奏是至关重要的。当然,还有其他方法可以做到这一点(演奏者演奏数字乐器或向计算机提供一些“内部信息”,例如预设的和弦进行等),但这不是我的目标。

“可以重新设计算法,使bin频率非线性地间隔开,然后我们可以在所有频率上达到心理听觉上相等的分辨率。”听起来像是连续的Morlet小波变换

#1 楼

正如我在前一篇文章中所评论的那样,时频分析方法称为“短期傅立叶变换” $ X $,等效于一个滤波器组,用于分析您的信号$ x $。对于给定的分析窗口$ w_n $,大小为$ N $,频率为$ k / N $的滤波器为:
$$ h_n = w _ {− n} e ^ {j2 \ pi \ frac {nk} {N}} $$

对于通常的分析窗口(Hann,Hamming甚至矩形),它对应于一个低通滤波器,截止频率约为$ 1 / N $,即“移到”频率仓$ k $(由于复数指数调制),因此导致带通滤波器。

在这一点上,为了直接回答您对反映人类感知的担忧,一些人派生了[“ constant-Q transform”(CQT)] [Brown91]。在其滤波器组的解释中,它依赖于与FT相同的原理。但是,中心$ f_k $并不像“正常” FT那样线性间隔,而是log2间隔。然后,音阶与西方音乐音阶紧密相关:如果选择$ f_ {k + 1} = 2 ^ {1/12} f_k $,则每八度可获得12个频率(响起钟声?:-)),带宽设置为$ \ frac {2 ^ {1/12}-1} {2} f_k $。您还可以选择最适合您需要的其他中心。

您可以在各处找到CQT的实现,在这里可以找到Klapuri教授最近提出的实现,并且带有相当不错的逆函数。 。巴黎电信学院的音频小组也有Prado教授的实现,但是我还没有尝试过。

[Brown91] J. Brown,“恒定Q频谱变换的计算”,Journal of美国声学学会,1991年,第89卷,第425-434页

编辑20121014:对您的(bryhoyt)问题的一些答案和评论。




您对主要问题的评论仅是一般性想法:
您似乎对许多应用程序感兴趣,对我而言,这些应用程序并不是要解决的琐碎问题。 “ Timbre建模”对我来说听起来与语音识别等相关,这与音调或频率分辨率或精度无关紧要(请考虑通常如何计算MFCC)。

还请考虑如何许多顶级研究人员(F. Pachet和法国IRCAM的脑震荡团队等)正在研究自动即兴演奏和伴奏这一主题:这项任务并非不可能,但需要许多领域的专业知识。总而言之,一个典型的系统至少需要模仿人类的听觉系统,实现声音/音乐/音高/节奏感知,了解音乐理论,并根据所有先前步骤的估算做出决策。傅立叶变换,或任何信号表示形式,仅是迈向最终目标的一步(微小),而且,按照我的观点,这可能是迄今为止最好的理解。

话虽如此,每个人仍有可能远远超出实际发生的情况,并且您可以通过一个简单而优雅的解决方案来解决它!完成后,别忘了发布它! :-)



一个44kHz的0.1s样本足以包含各种各样的频率


在FT的情况下,在FT的所有频点处,分辨率约为$ F_s / N = 44100/4410 = 10Hz $。 100Hz几乎是2个半音!可能会更好...



FFT无法检测到低频和高频,但是您说其他算法可以:有什么折衷?


简短的答案:请阅读我关于旋律估计的论文!

进一步详细说明:由于要处理的声音的假设,许多音高估计算法超出了FT的限制。我们希望自然声音(人声,双簧管,萨克斯管,钢琴...)的音符比单个正弦波更复杂。大多数音高或多或少是谐波的,这意味着可以将它们建模为正弦波之和,其频率是基频的倍数。

因此,在估算音高时考虑这些谐波是有用的,存在使用诸如频谱和,频谱乘积或自相关函数之类​​的检测功能的方法。最近有人发起了一个相关主题。

权衡是什么?更具体地说,在合理的短窗口内,我可以期望达到什么水平的频率精度? (我知道CQT中的窗口大小是可变的-有多少?)更具体地说,我将能够接近多大的距离。如前所述,在0.005s的窗口内,目标是在0.005s的窗口内达到0.5%频率差的目标?


如前所述,在0.005s的窗口内,您可以期待200Hz的“频率泄漏”。仅当您有2个频率接近200Hz的正弦波时,这才是真正的问题,这样FT便无法显示它们是2个不同的正弦波。好吧,我们离您的0.5%还远(顺便说一句,半音是频率的6%!),0.005s对于您的目的来说确实有点小。但是,如果您想每隔0.005s提供一次估算,您仍然可以像在语音/音乐处理中一样处理更长的重叠帧。

关于窗户的尺寸,您可以参考[Schoerkhuber2010],其框架长度等于:
$$
N_k = \ frac {F_s} {f_k(2 ^ {1 / B}-1)}
$$
其中$ B $是CQT所需的每倍频程的频点数。这意味着很长的窗口:$ B = 48 $和$ f_k = 100Hz $需要大约0.7s的长窗口。没什么可说的是我们随后失去了一些时间分辨率……但是,正如前面提到的,只有当我们忘记声音的结构时,这才是一个问题。此外,心理声学认为,在500Hz以下,人类并不能很好地区分正弦波:即使人类也受到挑战。当然,我们可以希望我们的计算机能够比我们做得更好,但是在这里,我们面临着一个棘手的问题!

最后,请注意,存在计算声音的时频表示的其他方法,考虑例如伽马通滤波器组。我之前提到的CQT的优点是,既有用于转换也可以用于其反转的软件。就我个人而言,我仍然坚持使用STFT,因为它简单易用,因为到目前为止,即使在进行信号源分离时,我也从来不需要在低频下获得更好的分辨率。

[Schoerkhuber2010] Schoerkhuber,C. and Klapuri,A。,“用于音乐处理的Constant-Q转换工具箱”,第七届声音和音乐计算会议,西班牙巴塞罗那,2010年。



评论


$ \ begingroup $
稍​​加说明:CQT可能有助于解决您所关注的第1点和第2点,但不能解决第3点。至于第3点,在时间和频率分辨率之间总是要取舍,如果您想要低频分量中的频率分辨率,您很可能需要接受以失去时间分辨率。现在,对于音高估计,可能还有其他解决方案,如果您有兴趣,可以阅读我的博士学位论文中的:D
$ \ endgroup $
–让·路易斯·杜里(Jean-louis Durrieu)
2012年10月10日21:29

$ \ begingroup $
我不太明白。我知道您不会免费获得任何东西-我不能指望算法能够至少在最低频率的至少两个周期内准确检测出未以良好分辨率进行采样的频率。但是以44kHz采样0.1s就足以包含很大范围的频率,人类可以准确地分辨出这些频率(相对而言-“这里是5分”,“平坦是4分”,等等),证明了这一点。在某处。 FFT无法检测到低频和高频,但是您说其他算法可以:有什么折衷办法?
$ \ endgroup $
– bryhoyt
2012年10月14日在7:28

$ \ begingroup $
在上述所有出色的答案中,CQT看起来最适合我提出的问题。权衡是什么?更具体地说,在一个合理的短窗口内,我可以期望什么水平的频率精度? (我知道CQT中的窗口大小是可变的-有多少?)更具体地说,我将能够接近多大的距离。目标是频率差异为0.5%,窗口为0.005s? (这是我对人何时可以开始听到不协调或不正常的声音的粗略估计)
$ \ endgroup $
– bryhoyt
2012年10月14日上午8:05

#2 楼

首先,采用经典的短期傅里叶变换方法,除了内插法之外,还有其他选择-特别是利用相位信息来恢复瞬时频率的技术(请参阅此问题),它可以非常准确地为您提供频谱峰值的位置而无需FFT大小增加。正确地说,缺点是您没有提高系统识别相邻峰的能力-相比使用FFT bin索引的中心频率,这已经是一个很大的改进。

关于您的蛮力方法... FFT具有此分辨率限制(bins位于$ \ frac {sr} {FFT \ _size} $),因为它正在“探测”具有复杂积分且在分析中为零的指数窗口-并且它们必须具有一个周期,该周期是分析窗口的长度的整数除法。如果您试图天真地使用相同的方法以其他比率“探测”频率,那么它将不起作用,因为您将使用不包含完整周期的函数来“探测”信号。如果要使其起作用,则必须将分析窗口增加到蛮力搜索中所有信号周期的最小公倍数,这正是您要避免的事情!

还有另一种有效的蛮力方法:用开窗的复杂指数(Gabor小波)“探测”信号。它们的特征是中心频率,中心时间和带宽(用于测量子波在时间或频率上的扩展方式)。您必须在所需的任意时间偏移,频率和带宽下评估信号与这些小波之间的许多很多关联。结果将与非常灵活的“平铺” STFT相同,在该STFT中,为每个时间范围和每个频段选择了最佳的窗口大小。除了计算成本外,缺点是没有高效的算法,也没有因果的算法(您需要事先知道与词典中最长的小波一样多的样本)。如果您想尝试这些技术,请看一下MPTK。

子类空间跟踪/高分辨率方法是最后一种对音乐信号效果很好的方法。他们从模型估计的角度解决了这个问题:“假设该信号是$ k $指数阻尼正弦波的总和,给出最小平方误差的最佳幅度/频率是多少?”,因此需要获得的样本数量准确的估算仅取决于噪声水平。但是,要使它们起作用,有一些障碍:理想情况下,必须预先知道$ k $的组件数。已经提出了像ESTER这样的阶数估计方法来最佳地选择模型阶数。
它们在存在白噪声的情况下表现良好-这要求在分析之前将信号白化;在滤波器组的各个通道中执行分析也有帮助。

虽然计算量大,但可以在线工作,如果模型阶数和/或噪声较低,则窗口很短。

#3 楼

频率或音调?已经有大量关于人体音高感知的研究论文和书籍。但是,在IIRC中,除非准确掌握基本音调,否则人们往往无法准确地“提取”频率。并且“临界频带”内的多个频率峰值倾向于被感知为噪声。因此,任何“接近人类准确性”的方法都可能还必须包括一些人类感知的估计错误。

FFT只是一堆滤波器,除非正交性和可逆性好,否则它们在许多目的上都不是最佳的要求。如果您不需要这两个滤波器组(并且人类的感觉显然不需要),则可以使用其他滤波器组,例如MEL频率滤波器组。一旦MEL频率滤波器组确定了一个频率峰值,通过FFT插值或相位声码器技术进行的进一步分析可能有助于细化任何隔离频谱频率峰值的频率估计。

请注意,没有其他信息与FFT相比,实际上是通过在相同时域数据跨度上使用的所有这些滤波技术来收集的。实际上发生的事情可能是信息丢失,无法更好地匹配人类听力系统的“不准确性”或异常情况。

从一组频率进行音高估计是一个完全不同的问题,这也是一个主题,涉及许多研究论文和有关听力学的书籍中的一章。

最后一部分您对性能的问题可能会引起麻烦。如今,人们可以在手机处理器上实时执行数十个FFT和数十个不同的滤波器组。考虑到CPU供应商提供的非常高效的FFT库,具有1000个“多余”仓位的FFT可能比明显更小但编码更幼稚的滤波器组效率更高。

评论


$ \ begingroup $
非常有用的答案,谢谢。我知道音高和频率之间的差异,但是您的回答确实有助于强调人的准确度取决于满足某些要求的声音。根据我对和谐的了解,人类在提取并非音调基本要素的频率方面非常糟糕。我可以准确区分彼此的音调间隔和音调失调的间隔(辅音间隔比不谐音更容易)。但是我很难区分两个不合时宜的间隔(“平坦”,“非常平坦”,“清晰”等)。
$ \ endgroup $
– bryhoyt
2012年10月14日7:43

#4 楼

有很多选择,但这取决于您在做什么。从物理上讲,我认为我们的耳朵更像是并行滤波器组,而不是FFT,这为它们提供了良好的时间分辨率,而称为“聚焦”的过程为其提供了良好的频率分辨率。因此,在某些情况下,理论上可以使用滤波器组,但这需要大量处理,因此需要处理大量数据。

可以将小波视为一组高效和相关的过滤器。用于音乐和音频分析的小波的问题在于,它们通常只能为您提供1个八度音阶的分辨率(尽管您可以对此进行各种操作,但我并没有真正看到小波在音频中特别有用)。

另一种方法是使用重叠的FFT窗口。您不仅可以查看幅度信息,还可以查看相位信息,从而提高FFT的频率分辨率。这样一来,您可以使用比原先使用的窗口短得多的窗口,从而获得更好的性能和更好的时间分辨率。重叠的窗口很难正确地重新合成,并且对相位进行过多的假设也很危险。不管怎样,这些技巧可能是解决复杂的时频分析问题的主要方法。

还有许多其他针对特定应用的工具。

评论


$ \ begingroup $
计算短期傅里叶变换(STFT)等效于使用滤波器组分析信号。令$ x_n $为信号。 STFT $ X $在频率$ k $和帧$ m $处具有分析窗口$ w_n $,通常计算如下:$$ X_ {fm} = \ sum_n x_ {n + m} w_n e ^ {- j2 \ pi \ frac {nk} {N}} $$,即,我们依次对偏移了$ m $个样本的$ x_n $计算$ N $个长度的傅立叶变换(FT)。这也可以表示为:$$ X_ {fm} = \ sum_p x_ {p} w_ {pm} e ^ {-j2 \ pi \ frac {(pm)k} {N}} = \ sum_p x_p h_ {mp } $$,其中$ h_n = w _ {-n} e ^ {j2 \ pi \ frac {nk} {N}} $,因此可以解释滤波器组!
$ \ endgroup $
–让·路易斯·杜里(Jean-louis Durrieu)
2012年10月10日20:45



$ \ begingroup $
STFT可能是一个滤波器组,但并非所有的滤波器组都是STFT。
$ \ endgroup $
–比约恩·罗氏(Bjorn Roche)
2012年10月10日21:31