如何在C中实现IIR过滤器?

时间:2014-09-03 09:01:23

标签: c filter filtering signal-processing

我试图在C中实现简单的IIR(Direct Form I)过滤器。

对于高通(10赫兹,256个样本/秒),我这样做:

int Diff = Sample - Previous_Sample;

HP_Output = ((HP_Output + Diff) * 4) / 5;

对于低通(10 Hz @ 32样本/秒),我这样做:

int Diff = Sample - LP_Output ;

LP_Output = ((LP_Output + Diff) * 2) / 3; 

现在我想知道:这两种实现在数学上是否正确?

如果我想更改输入采样率(或滤波器频率),我该如何计算新因子?

1 个答案:

答案 0 :(得分:0)

高通输出对于一阶滤波器实现是正确的。 从high-pass filter realization on wikipedia开始,给定采样率fs并过滤截止频率fc,可以从以下关系中获取所需因子alpha
enter image description here

哪个收益率:
enter image description here

在提供的代码段中,结果为alpha ~ 4/5

对于一阶低通滤波器,您的代码基本上只输出缩放的输入样本(自LP_Output + Diff == LP_Output + Sample - LP_Output == Sample起)。相反,我希望:

LP_Output = LP_Output + Diff * 2 / 3;

现在,系数alpha同样可以从基于low-pass filter realization on wikipedia的派生获得: enter image description here

同样,在提供的代码段中,这会产生alpha ~ 2/3

最后,正如Hans在评论中指出的那样,对于更高阶滤波器实现,您应该看一下IIR滤波器设计工具来推导系数。