由曲线定义的连续 EQ

信息处理 fft 参数方程
2022-02-26 22:28:50

我试图弄清楚如何实现一个连续的 EQ 滤波器。我过去构建了一个参数均衡器,然后使用其中的 10 个参数滤波器构建了一个 10 通道均衡器。这给出了很好的结果。

但是我现在正在尝试创建一个连续的 EQ 滤波器。这可以通过参数均衡器实现吗?通过选择 Q 因子,也许?如果是这样,我将如何将 Q 因子拟合到曲线?

如果做不到这一点,是否有另一种更好的方法来实现连续 EQ?是否可以通过基于曲线扩展每个 r,i bin 的幅度来从 FFT 实现?或者这会产生相当讨厌的情商?

任何想法表示赞赏。

编辑:回答评论并添加更多内容。

我一直在尝试定义 FFT 滤波器。基本上我定义了一条任意曲线。该曲线定义了 dB 的增加或减少。

我目前正在通过查找每个频率仓的曲线上的 y 截距来构建自己的 FFT。(好吧,我正在从 dB 转换为乘法因子)。

然后,稍后,我对一段音频进行 FFT,然后将其乘以“过滤器”FFT 中的值。当乘法因子纯为 1 时,我可以让音频正常通过。当我增加给定 bin 的乘法因子时,我会听到令人讨厌的噼啪声(尽管我确实听到了正确的频率提升)。

当然,在傅立叶域中必须有一种方法可以做到这一点。

顺便说一句,除非你能解释它们是如何工作的,否则请不要给我 matlab 函数,因为我正试图在移动设备上实现它,所以我不能使用 matlab。

2个回答

这是一个非常复杂的话题。关于如何在 MATLAB 中执行此操作的一个很好的概述在这里: https ://ccrma.stanford.edu/~jos/vguitar/Fitting_Filters_Matlab.html

FIR 拟合通常可以通过插值到完整的 FFT 网格并添加最小或零相位,然后进行逆 FFT 以获得脉冲响应来完成。然后,您可以尝试不同的过滤器长度来确定需要哪些长度来创建可接受的配合。

IIR 拟合要复杂得多。上面的例子使用了 MATLAB 的 invfreqz() ,它在某些情况下效果很好,而在其他情况下效果很差。一般来说,这些方法是迭代的,即有许多设计周期,并且在设计步骤之间有一些小的修改,这些修改应该是为了“改进”事物。这些通常使用“梯度”方法,即您需要评估误差函数相对于零点和极点(或您可能选择的任何其他表示)的导数。它们还涉及最小二乘误差方法。必须非常小心地根据频率间隔、权重函数、相对与绝对误差等来正确制定误差标准。误差函数的公式是特定应用程序可以容忍(或不能容忍)的直接表示)。

基于 OPs 问题编辑的编辑:如果你想进行频域滤波(即 FFT->mpy 和 Filter->inverse FFT),那么你需要正确处理所有的成帧、零填充和重叠处理。这是由于循环卷积与线性卷积的差异以及 FFT“按原样”假设定义为周期性信号。谷歌“重叠添加”了解更多信息。

您仍然需要决定过滤器的阶段。离开相位零会创建一个非因果过滤器,这将产生很多环绕问题。至少,您需要改变脉冲响应,使其成为因果关系。

  1. 请记住,FFT 总是增加窗口大小的延迟,而参数 EQ 只增加极点数的延迟。FFT 滤波就像一个 N 大小的图形均衡器,但在低频时分辨率较差,而在高频时分辨率过高。(FFT 是线性间距,而真正的图形 EQ 是对数间距。)你确定你真的需要那个吗?参数或图形均衡器通常更好。
  2. 您的问题很可能是由于将信号分成块并对每个块进行 FFT 滤波,这会导致每个块的末端彼此不对齐。诊断此类问题需要绘制波形并查看它。您会在每个帧边界看到故障。要修复它,您需要了解窗口函数、重叠相邻窗口等