所以我正在尝试编写一个程序,能够生成复制给定频率响应的滤波器的 FIR 系数。该程序最终将用于音频处理应用程序。
我正在使用 Matlab,如果所需的响应与经典的 LP、BP 或 HP 相匹配,那就很好。内置的 Matlab 函数允许设计一个像样的 FIR 滤波器,其目标频率响应的误差最小。
但是,我的项目要求我模拟“奇怪的”频率响应,例如:
这已被证明是一个挑战。我正在使用的内置函数正在产生具有巨大波纹的滤波器。我尝试使用遗传算法来生成复制给定频率响应的 FIR 系数,但没有成功。
那么有人知道最好的方法是什么吗?我应该尝试不同的算法吗?我应该坚持遗传算法吗? FIR 滤波器是一个不错的选择吗(假设这是在音频处理程序上实现的)?
您可以非常轻松地生成有效的 FIR 滤波器。假设您的上述规格是 N/2 个抽头。假设您的规格被指定为变量名称 S,并在直流到奈奎斯特频率下指定。我们必须生成高于奈奎斯特的频率和线性相位分量。
在 matlab 中,您可以对滤波器进行零填充并指定您想要对称 FIR(时域实数)。要生成零相位滤波器,请执行以下操作:
N = 2*length(S);
s = ifft(S, N, 'symmetric');
现在您有了零相位信号 s,并且您想要移动零相位信号以产生线性相位分量。我们可以像这样简单地在时域中循环移动:
s = circshift(s, N/2);
您可以改变移位量来指定过滤器的起始位置。
信号 s 现在是一个线性相位信号,与您在频域中的规格完全匹配。
请查看这个 GitHub 存储库,它是一个开源软件(也可以作为桌面应用程序提供),以促进多频带 FIR、线性相位数字滤波器的设计。它创建最佳 FIR 滤波器(最小二乘法),并具有许多功能,例如自动生成 MATLAB 代码、绘图进行分析和延迟/性能测量。