音频均衡分辨率

Audio equalization resolution

简而言之

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

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

我已阅读以下相关文章:

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

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

详情

我正在编写 VST 并在 processReplacing() 方法中进行所有处理。这就是我受块大小限制的原因。

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

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

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

所以,问题不在于您的频率分辨率太低,而是您每秒处理的块太多。

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

至少3个问题:

首先,滤除频率的方法不是将 FFT bin 归零。有关详细信息,请参阅此答案: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 如果您的均衡曲线具有较长的脉冲响应、足够的计算 resource/power/cycles,并且不介意一些与块大小相关的延迟,那么快速卷积是一种常见的 DSP 均衡方法。