我正在尝试用C ++制作均衡器。我必须以(通常)256个样本的块为单位处理音频。我使用FFT来获得样本块的频谱。我处理频率,然后使用IFFT在时域中获得处理后的音频块。我使用的是相关问题中提供的代码:FFT in a single C-file。
对于低通滤波器,将较低系数设置为零应删除低频。但是,在处理过的音频中,我得到的是频谱变化,而不是低通滤波器(音频包含嗡嗡声)。
我已阅读以下相关文章:
我做错了什么吗?块大小是否太小而无法获得合理的频率分辨率?
我熟悉傅立叶变换的数学。但是,我不知道FFT和IFFT变换的细节。提供的代码可能未正确实现。然而,当完成FFT然后对FFT结果进行IFFT时,原始音频块被正确地重建。
我正在编写VST并正在使用processReplacing()
方法执行所有处理。这就是为什么我受到块大小的限制。
我的想法是将最后n个块保留在内存中并计算最后n个块上的FFT以获得更高的频率分辨率,然后在这些频率上进行处理,并在IFFT之后,仅替换最后一个块。
对于这是否是实现均衡器的正确方法有任何建议吗?
答案 0 :(得分:4)
让我猜一下(因为你省略了相关信息):你有一个相当高的采样率,比如说44000个样本/秒。这意味着你的块只有6毫秒,换句话说你的块频率是171赫兹。这听起来很完美。
所以,问题不在于你的频率分辨率太低,你每秒的块太多了。
更深层次的问题是为什么这些块会引起嗡嗡声。还有一个简单的答案:你在时间限制信号上进行FFT。数学中的傅立叶变换适用于无限信号,在实际FFT中,无限重复256个样本块。但是该块的最后一个样本与第一个没有对齐;会有一个跳跃。因此,跳跃发生在每秒171个定时器,这是一个嗡嗡声。
答案 1 :(得分:2)
至少有3个问题:
首先,过滤掉NOT中的频率的方法将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均衡方法,如果你有一个具有长脉冲响应,足够的计算资源/功率/周期的均衡曲线,并且不介意一些块大小相关的延迟。