实时以接近人类的准确性提取音频信号频率分量的最有效方法


14

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

FFT存在3个问题:

  1. 因为FFT二进制分辨率等于您的窗口大小,所以要获得相当合理的精度(例如1 Hz),您需要一个不合理的长窗口(例如1秒)。这意味着您无法快速检测到瞬态或新引入的频率。这也意味着使用更快的CPU和更高的采样率无法解决问题-限制本质上与时间有关。

  2. 人们对数地感知频率,但是FFT仓是线性间隔的。例如,在我们听力的低端,相差20hz 很大,而在高端处,相差20hz是不可察觉的。因此,要获得低频所需的精度,我们必须计算的远远超过高频所需的精度。

  3. 这些问题中的一些可以通过在FFT区间之间进行插值来解决。这可能适用于许多音乐音频,因为频率通常会相隔很远,因此不会有超过1个频率泄漏到一对音槽中。但这并非总是如此,特别是对于打击乐器之类的非谐音。因此,插值实际上只是猜测。

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

我想我也可以通过在每个感兴趣的频率上关联正弦/余弦来用蛮力解决问题。这可能吗?什么样的效率?能解决我的问题吗?

是否有其他方法可以实现信号的更准确,实时的频率分解?CPU效率是一个关注点,但不是主要关注点-我对在理论上是否可以做到这一点感兴趣。但是,在现代台式机上实时可行的方法是理想的。


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

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

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

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

Answers:


5

正如我在上一篇文章中评论的那样,时频分析方法称为“短期傅立叶变换” 等效于滤波器组,用于分析信号x。对于给定的分析窗口瓦特Ñ,大小Ñ,在频率滤波器ķ / Ñ是: ħ ñ = 瓦特- ñ ë Ĵ 2 π Ñ ķXXwññķ/ñ

Hñ=w-ñËĴ2πñķñ

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

在这一点上,为了直接回答您对反映人类感知的关注,一些人派生了[“ constant-Q transform”(CQT)] [Brown91]。在其滤波器组的解释中,它依赖于与FT相同的原理。然而,中心并不像“正常” FT那样线性间隔,而是log2间隔。规模然后密切相关的一个西方音阶:如果一个选˚F ķ + 1 = 2 1 / 12 ˚F ķ,那么我们得到每倍频程12次的频率(摇铃:-)?),带宽被设置为,说,2 1 / 12 - 1FķFķ+1个=21个/12Fķ。您也可以选择其他最适合您需要的中心。21个/12-1个2Fķ

你可以在这里和那里找到CQT的实现,通过Klapuri教授最近的一个,有一个相当不错的逆可以发现来这里。巴黎科技电信公司的音频小组也有Prado教授的实现,但是我还没有尝试过。

[Brown91] J. Brown,“恒定Q频谱变换的计算”,美国声学学会杂志,1991,89,425-434

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

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

    还请考虑有多少顶级研究人员(F. Pachet法国IRCAM的推特团队,举了几个)正在就即兴创作和伴奏进行研究:这项任务并非不可能,但需要许多领域的专业知识。总而言之,一个典型的系统至少需要模仿人类的听觉系统,实现声音/音乐/音高/节奏感知,了解音乐理论,并根据所有先前步骤的估算做出决策。傅立叶变换,或任何信号表示,只是朝着最终目标迈出的一小步-在我看来,这可能是迄今为止最好的理解。

    也就是说,仍然有可能每个人的视线都远远超出实际发生的情况,并且您可以通过一个简单而优雅的解决方案来解决这个问题!完成后,别忘了发布它!:-)

  2. 以44kHz采样0.1s就足以包含各种各样的频率

    Fs/ñ=44100/4410=10Hž

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

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

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

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

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

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

    ñķ=FsFķ21个/-1个
    =48Fķ=100Hž需要大约0.7s长的窗户。没什么可说的是我们随后失去了一些时间分辨率……但是,正如前面提到的,只有当我们忘记声音的结构时,这才是一个问题。此外,心理声学认为,在500Hz以下,人类并不能很好地区分正弦波:即使人类也在那里受到挑战。当然,我们可以希望我们的计算机能够比我们做得更好,但是在这里,我们面临着一个棘手的问题!

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

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


一点说明:CQT可能有助于解决您所关注的第1点和第2点,但不能解决第3点。至于第3点,在时间和频率分辨率之间总是需要权衡取舍,如果您想以较低的频率获得良好的频率分辨率频率分量,您很可能需要接受以失去时间分辨率。现在,对于音高估计,可能还有其他解决方案,如果您有兴趣,可以阅读我的博士学位论文:D
Jean-louis Durrieu 2012年

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

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

5

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

s[RFFŤ_s一世žË

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

ķ

  • ķ
  • 它们在存在白噪声的情况下表现良好-这要求在分析之前将信号白化;在滤波器组的各个通道中执行分析也有帮助。

这些计算量很大,但如果模型阶数和/或噪声较低,则可以在较短的窗口中在线运行。


4

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

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

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

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

有关性能的问题的最后一部分可能是一个红色的鲱鱼。如今,人们可以在手机处理器上实时执行数十个FFT和数十个不同的滤波器组。给定CPU供应商提供的非常高效的FFT库,具有1000个“多余”仓位的FFT可能比明显更小但更幼稚的编码器组更高效。


非常翔实的答案,谢谢。我知道音高和频率之间的差异,但是您的回答确实有助于突出人的准确度取决于满足特定要求的声音。据我对和谐的了解,人类在提取并非音调基本要素的频率方面非常糟糕。我可以准确区分彼此的音调间隔和失调的间隔(辅音间隔比不谐音更容易)。但是我很难区分两个失调的时间间隔(“平坦”,“非常平坦”,“锐利”等)。
bryhoyt 2012年

2

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

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

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

对于特定的应用程序,还有许多其他工具。


1
XñXķwñ
XF=ñXñ+wñË-Ĵ2πñķñ
ñXñ
XF=pXpwp-Ë-Ĵ2πp-ķñ=pXpH-p
Hñ=w-ñËĴ2πñķñ

1
STFT可以是一个滤波器组,但并非所有的滤波器组都是STFT。
比约恩·罗奇
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.