音频均衡分辨率

Igo*_*evo 0 c++ audio fft vst

简而言之

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

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

我已阅读以下相关文章:

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

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

细节

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

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

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

MSa*_*ers 5

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

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

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