【问题标题】:Audio equalization resolution音频均衡分辨率
【发布时间】:2016-07-29 12:23:02
【问题描述】:

总之

我正在尝试用 C++ 制作均衡器。我必须处理(通常)256 个样本块中的音频。我使用 FFT 来获取样本块的频谱。我处理频率,然后使用 IFFT 在时域中获取处理后的音频块。我正在使用相关问题中提供的代码:FFT in a single C-file。

对于低通滤波器,将较低的系数设置为零应该会去除低频。但是,在处理后的音频中,我得到了一个改变的频谱,而不是一个低通滤波器(音频包含嗡嗡声)。

我已经阅读了以下相关文章:

我做错了吗?块大小是否太小而无法获得合理的频率分辨率?

我熟悉傅里叶变换的数学。但是,我不知道 FFT 和 IFFT 变换的细节。提供的代码可能未正确实现。但是,当 FFT 完成,然后对 FFT 的结果进行 IFFT 时,原始音频块被正确重建。

详情

我正在编写一个 VST,并在 processReplacing() 方法中进行所有处理。这就是为什么我受到块大小的限制。

我的想法是把最后n个块保留在内存中,对最后n个块计算FFT以获得更高的频率分辨率,然后对这些频率进行处理,在IFFT之后,只替换最后一个块。

对于这是否是实现均衡器的正确方法有什么建议吗?

【问题讨论】:

  • 您是否考虑过在时域中进行过滤?这就是大多数音频软件的做法,而且有充分的理由。时域的优点包括(过度简化):更低的延迟、更高效的处理、更平滑的频率响应(取决于您选择的滤波器类型)、无预回声的时域响应,以及通常模仿模拟音频滤波器的特性。这是一个很好的资源:@​​987654325@ 和我写的解释:blog.bjornroche.com/2012/08/basic-audio-eqs.html

标签: c++ audio fft vst


【解决方案1】:

让我猜猜(因为您遗漏了相关信息):您的采样率相当高,例如 44000 个样本/秒。这意味着您的块只有 6 毫秒,或者换句话说,您的块频率是 171 Hz。这是完全听得见的。

因此,问题不在于您的频率分辨率太低,而在于您每秒有太多块。

更深层次的问题是为什么这些块会引起轰动。对此还有一个简单的答案:您正在对有时间限制的信号进行 FFT。数学中的傅里叶变换适用于无限信号,在实际的 FFT 中,它通过 256 个样本块的无限重复来近似。但是该块的最后一个样本与第一个不对齐;会有一个跳跃。因此,该跳跃每秒发生 171 个计时器,这是一种嗡嗡声。

【讨论】:

  • 我认为问题可能与此有关。您能否建议一种不同的均衡方法(不一定使用 FFT)或克服此限制的方法?
  • IIR 或 FIR 滤波器。 FIR 可能更容易实现,但如果需要实时处理,则会有更长的群延迟。
【解决方案2】:

至少 3 个问题:

首先,过滤掉频率的方法不是将 FFT 箱清零。有关更多信息,请参阅此答案:https://dsp.stackexchange.com/questions/6220/why-is-it-a-bad-idea-to-filter-by-zeroing-out-fft-bins/6224#6224

其次,在计算出所需滤波器响应的脉冲响应长度后,您必须将 FFT 补零至少该额外长度,然后使用重叠相加或重叠保存(快速卷积算法)合并您的 IFFT 结果,而不仅仅是连接它们。

第三,44.1 kHz 采样率下的 256 个样本甚至不足以适应低于 170 Hz 的任何音高的 1 个完整周期。所以,是的,低频分辨率将受到您选择的块大小的限制。这是否合理取决于您对频率响应的要求。

如果您的均衡曲线具有较长的脉冲响应、足够的计算资源/功率/周期,并且不介意与块大小相关的延迟,则 FFT/IFFT 快速卷积是进行 DSP 均衡的一种常用方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-12
    • 2015-07-15
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    • 2022-01-27
    • 2018-01-18
    • 2015-02-28
    相关资源
    最近更新 更多