我试图在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;
现在我想知道:这两种实现在数学上是否正确?
如果我想更改输入采样率(或滤波器频率),我该如何计算新因子?
答案 0 :(得分:0)
高通输出对于一阶滤波器实现是正确的。
从high-pass filter realization on wikipedia开始,给定采样率fs
并过滤截止频率fc
,可以从以下关系中获取所需因子alpha
:
哪个收益率:
在提供的代码段中,结果为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的派生获得:
同样,在提供的代码段中,这会产生alpha ~ 2/3
。
最后,正如Hans在评论中指出的那样,对于更高阶滤波器实现,您应该看一下IIR滤波器设计工具来推导系数。