2014-09-03 122 views
0

我想(在256个样本10赫兹/秒),以实现简单的IIR(直接I型)过滤器C.如何在C中实现IIR滤波器?

对于高通我这样做:

int Diff = Sample - Previous_Sample; 

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

对于低(10赫兹@ 32采样/秒)我这样做:

int Diff = Sample - LP_Output ; 

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

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

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

+0

你的代码完全缺少的是* time *。采样率很重要。实用的过滤器使用许多样品,而不仅仅是一个。使用Google查找答案,最佳查询是“iir系数计算器”。 – 2014-09-03 09:24:40

+0

@HansPassant我为每个样本调用函数(每秒256个样本) – Muis 2014-09-03 09:32:42

+1

不是我的意思,您必须存储旧样本。记录在T-1,T-2,T-3等等。你需要一个数组。一旦你阅读谷歌点击,这将是非常明显的,你将不得不花费时间。 – 2014-09-03 09:41:19

回答

0

高通输出对于一阶滤波器实现是正确的。 从high-pass filter realization on wikipedia,和给定的采样率fs和滤波器的截止频率fcalpha可以从关系来获得所需的因子:
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

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

+0

我真的不明白你的建议改变'LP_Output =((LP_Output + Diff)* 2)/ 3'为'LP_Output = LP_Output + Diff * 2/3',因为它似乎没有任何影响的结果?两行代码输出相同的值? – Muis 2014-09-10 10:55:52

+0

'LP_Output + Diff * 2/3'相当于'LP_Output +(Diff * 2/3)'。例如,如果当前的'LP_Output'是42,并且新的输入'Sample'是6,那么你的代码会给出'Diff == 6-42 == -36',然后更新'LP_Output ==((42 + -36 )* 2)/ 3 ==((6)* 2)/ 3 == 4'。我的版本将'LP_Output'更新为'LP_Output == 42 + -36 * 2/3 == 42 +(-24)== 18。 – SleuthEye 2014-09-10 12:19:03