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

信息处理 fft 声音的 频率 音乐 即时的
2022-01-09 04:28:31

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

FFT 存在 3 个问题:

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

  2. 人类以对数方式感知频率,但 FFT 箱是线性间隔的。例如,我们听力低端的 20hz 差异是巨大的,而高端 20hz 的差异是难以察觉的。因此,为了获得我们在低频下所需的精度,我们必须计算远远超过我们在高频下所需的精度。

  3. 其中一些问题可以通过在 FFT bin 之间进行插值来解决。这可能适用于许多音乐音频,因为频率通常会相距很远,因此不会超过 1 个频率会泄漏到一对 bin 中。但情况并非总是如此,尤其是对于像打击乐器这样的不和谐声音。所以插值实际上只是猜测。

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

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

是否有不同的方法来实现信号的更准确、实时的频率分解?CPU 效率是一个问题,但不是主要问题——我对理论上是否可以完成部分感兴趣。但是,在现代台式机上实时可行的东西将是理想的。

4个回答

正如我在上一篇文章中评论的那样,称为“短期傅立叶变换”的时频分析方法相当于一个滤波器组,用于分析您的信号对于给定的分析窗口,大小为,频率的滤波器为: XxwnNk/N

hn=wnej2πnkN

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

至此,为了直接回答你对反映人类感知的担忧,有人推导出了["constant-Q transform" (CQT)][Brown91]。在其滤波器组解释中,它依赖于与 FT 相同的原理。然而,中心不像“正常”FT 那样是线性间隔的,而是 log2 间隔的。该音阶与西方音乐音阶密切相关:如果选择,那么我们获得每个八度音阶 12 个频率(敲响钟声?:-)),并且带宽设置为,例如您也可以选择最适合您需要的其他中心。fkfk+1=21/12fk21/1212fk

你可以在这里和那里找到 CQT 的实现,Klapuri 教授最近的一个,带有相当不错的逆可以在这里找到。Telecom ParisTech 的音频小组也有 Prado 教授的实现,但我还没有尝试过。

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

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

  1. 只是对您自己对主要问题的评论的一般想法:您似乎对许多应用程序感兴趣,对我来说,这些应用程序并不是很容易解决的问题。“音色建模”在我看来与语音识别等更相关,音高或频率分辨率或精度不是什么大问题(考虑通常如何计算 MFCC)。

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

    也就是说,仍然有可能每个人都在远远超出实际发生的事情,并且您可以通过一个简单而优雅的解决方案来解决它!完成后不要忘记发布它!:-)

  2. 44kHz 的 0.1 秒样本足以包含广泛的频率范围

    在 FT 的情况下,这将导致在 FT的所有频率区间的分辨率为这在 100Hz 时几乎是 2 个半音!有待改善...Fs/N=44100/4410=10Hz

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

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

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

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

  4. 有哪些权衡?更具体地说,对于一个相当短的窗口,我可以期望什么水平的频率精度?(我知道 CQT 中的窗口大小是可变的 - 有多少?)更具体地说,我能多接近我的近似值。0.5% 频率差的目标是 0.005 秒的窗口?

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

    至于窗口的大小,可以参考[Schoerkhuber2010],帧长等于: 其中是频率数CQT 所需的每倍频程的 bin。这意味着非常长的窗口:需要大约 0.7s 长的窗口。没什么好说的,我们会失去一点时间分辨率……但如前所述,只有当我们忘记声音的结构时,这才是问题。此外,心理声学认为,在 500Hz 以下,人类并不能真正区分正弦曲线:即使是人类也面临挑战。当然,我们可以希望我们的电脑能比我们做得更好,但在这里,我们面临一个棘手的问题!

    Nk=Fsfk(21/B1)
    BB=48fk=100Hz

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

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

首先,使用经典的短期傅立叶变换方法,可以替代插值 - 特别是利用相位信息恢复瞬时频率的技术(参见这个问题),它可以非常准确地为您提供频谱峰值的位置,而无需FFT 大小的增加。正如您正确所说的那样,缺点是您没有增加系统区分相邻峰的能力 - 但与使用 FFT bin 索引的中心频率相比,这已经是一个很大的改进。

关于您的蛮力方法... FFT 具有此分辨率限制(在处使用 bin ),因为它使用在分析窗口上具有零积分的复指数“探测”信号 - 并且这些必须有一个周期,它是分析窗口长度的整数除法。如果您尝试天真地使用相同的方法来“探测”其他比率的频率,它将不起作用,因为您将使用不包含完整周期的函数“探测”您的信号。如果你想让它工作,你必须将你的分析窗口增加到你的蛮力搜索中所有信号周期的最小公倍数,这正是你想要避免的!srFFT_size

还有另一种可行的蛮力方法:使用加窗复指数(Gabor 小波)“探测”您的信号。它们的特征是中心频率、中心时间和带宽(测量小波如何随时间或随频率传播)。您必须以所需的时间偏移、频率和带宽评估信号与这些小波之间的许多、许多、许多相关性。结果将与非常灵活的“平铺”STFT 相同,其中为每个时间范围和每个频带选择最佳窗口大小。除了计算成本之外,缺点是没有有效的算法,也没有因果算法(您需要提前知道与字典中最长的小波一样多的样本)。如果你想尝试这些技术,MPTK

最后一类对音乐信号效果很好的方法是子空间跟踪/高分辨率方法。他们从模型估计角度解决问题——“假设这个信号是个指数阻尼正弦曲线的总和,那么给出最小二乘误差的最佳幅度/频率是多少?”,因此需要获得准确的样本数估计仅取决于噪声水平。但是,要使它们发挥作用有一些障碍:k

  • 理想情况下,必须预先知道分量已经提出了像 ESTER 这样的阶数估计方法来优化选择模型阶数。k
  • 它们在存在白噪声的情况下表现良好——这需要在分析之前对信号进行白化;在滤波器组的各个通道中执行分析也有帮助。

这些计算成本很高,但如果模型阶数和/或噪声低,它们可以在线工作,窗口短。

频率还是音高?已经有大量关于人类音高感知的研究论文和书籍。但是,IIRC,人类往往不擅长准确地“提取”频率,除非它们恰好是基音。“临界频带”内的多个频率峰值往往被视为噪声。因此,任何具有“接近人类准确性”的方法也可能必须包括一些人类感知估计失败。

FFT 只是一组滤波器,除非需要正交性和可逆性,否则它们对于许多目的都不是最优的。如果您不需要这两个(人类感知显然不需要),则可以使用其他滤波器组,例如 MEL 频率滤波器组。一旦 MEL 频率滤波器组识别出频率峰值,通过 FFT 插值或相位声码器技术进行的进一步分析可能有助于细化任何孤立频谱频率峰值的频率估计。

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

从一组频率估计音高是一个完全不同的问题,同样是一个有许多研究论文和听力学等书籍章节的主题。

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

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

可以将小波视为一组特别有效且相关的滤波器。用于音乐和音频分析的小波的问题在于它们通常只给你 1 个八度音程的分辨率(尽管你可以对此做各种事情,但我还没有真正看到小波在音频中特别有用)。

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

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