【发布时间】:2016-07-29 12:23:02
【问题描述】:
总之
我正在尝试用 C++ 制作均衡器。我必须处理(通常)256 个样本块中的音频。我使用 FFT 来获取样本块的频谱。我处理频率,然后使用 IFFT 在时域中获取处理后的音频块。我正在使用相关问题中提供的代码:FFT in a single C-file。
对于低通滤波器,将较低的系数设置为零应该会去除低频。但是,在处理后的音频中,我得到了一个改变的频谱,而不是一个低通滤波器(音频包含嗡嗡声)。
我已经阅读了以下相关文章:
- What Are High-Pass and Low-Pass Filters?
- Primary FFT Coefficients vs Low-Pass Filter
- How to implement an Equalizer
我做错了吗?块大小是否太小而无法获得合理的频率分辨率?
我熟悉傅里叶变换的数学。但是,我不知道 FFT 和 IFFT 变换的细节。提供的代码可能未正确实现。但是,当 FFT 完成,然后对 FFT 的结果进行 IFFT 时,原始音频块被正确重建。
详情
我正在编写一个 VST,并在 processReplacing() 方法中进行所有处理。这就是为什么我受到块大小的限制。
我的想法是把最后n个块保留在内存中,对最后n个块计算FFT以获得更高的频率分辨率,然后对这些频率进行处理,在IFFT之后,只替换最后一个块。
对于这是否是实现均衡器的正确方法有什么建议吗?
【问题讨论】:
-
您是否考虑过在时域中进行过滤?这就是大多数音频软件的做法,而且有充分的理由。时域的优点包括(过度简化):更低的延迟、更高效的处理、更平滑的频率响应(取决于您选择的滤波器类型)、无预回声的时域响应,以及通常模仿模拟音频滤波器的特性。这是一个很好的资源:@987654325@ 和我写的解释:blog.bjornroche.com/2012/08/basic-audio-eqs.html