给定截止频率,廉价地生成 IIR/FIR 系数

信息处理 过滤器
2022-02-05 10:07:44

我正在从事一个基于 DSP 的高级项目,我们希望允许用户即时为 IIR/FIR 高通和低通滤波器提供 20-20kHz 截止规范。这在台式机上是一个简单的问题,但我们正在开发 TI 5535 DSP 芯片。所以我们正在寻找一个用于生成系数的 C 库。我们目前正在考虑将此代码从 C++ 改编为 C 并删除输入内容,但如果有更好的解决方案,我们很乐意听到。

对于 IIR - Butterworth / Bessel / Chebyshev 中的任何一个都可以。任何具有最快运行时间/最低复杂性的东西都是最佳的。准确性并不重要(教育产品,只要输出在更改截止时发生更改,我们就可以了)。

对于 FIR - 不太确定在这里做什么。低通的升余弦,?? 为高通。

我们以 44.1kHz/声道采样立体声音频。我不确定我们可以将哪些其他参数设置为常数以使计算更简单。极数可以保持不变,滚降和其他规格对我们来说并不是非常重要。

问题 - 有哪些现有方法或 C 库可以从听觉范围内的截止频率生成滤波器系数?

2个回答

生成快速且脏的 FIR 滤波器系数的一种计算成本低廉的方法是评估加窗 Sinc 函数。频域中的任何矩形(低/高/带通)在时域中都具有 Sinc 脉冲响应,可以将其窗口化到与所需过渡带宽度大致成反比的长度,然后对一些 FIR 进行采样系数。

我的网页上大约有十几行 BASIC 伪代码可以轻松转换为纯 C:http ://www.nicholson.com/rhn/dsp.html#2

我不熟悉 TI 5535,所以我不确定你对便宜的定义有多便宜 :-)

然而,Kaiser 滤波器似乎被认为相当便宜,尤其是当您将窗口代码与理想脉冲代码分开时。换句话说,如果您的抽头计数保持不变,并且您不更改旁瓣电平,则可以预先计算和存储窗口值。然后只需要计算理想的低通、带通、高通或陷波脉冲值。

这是低通脉冲的代码。高通和其他代码类似。

double LPF_Impulse(int m, int M, double Omega)
{
 double Arg;
 Arg = (double)m - (double)(M-1) / 2.0;
 return( Omega * Sinc(Omega * Arg * M_PI) );
}

这只是教科书代码。其余部分在这里: http: //www.iowahills.com/A7ExampleCodePage.html

这里还有双线性变换代码,用于根据 H(s) 的归一化二阶系数计算 IIR 系数。