【发布时间】:2014-10-27 17:09:24
【问题描述】:
我正在尝试在 C 中实现简单的 IIR(直接形式 I)过滤器。
对于高通(10 Hz,每秒 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;
现在我想知道:这两种实现在数学上是否正确?
如果我想改变输入采样率(或滤波器频率),我该如何计算新的因子?
【问题讨论】:
-
您的代码中完全缺少的是时间。采样率很重要。一个实用的过滤器使用许多样本,而不仅仅是一个。使用谷歌查找答案,最佳查询是“iir 系数计算器”。
-
@HansPassant 我为每个样本调用该函数(每秒 256 个样本)
-
不是我的意思,您必须存储旧样本。记录在 T-1、T-2、T-3 等处。您需要一个数组。一旦你阅读了谷歌点击,这将非常明显,你将不得不花时间。
-
@HansPassant 我将过滤后的样本直接存储到磁盘,所以我没有可用历史记录的数组,但为什么这与过滤器有关?此外,历史记录间接包含在 HP_Output 和 LP_Output 中。
-
嗯,当然可以。甚至您的 sn-p 也有历史记录,它是 Previous_Sample。只有一个,你不能得到比一阶过滤器更好的东西。当然,存储更多内容完全是微不足道的,循环缓冲区使其高效。很难猜出心理障碍。
标签: c filter filtering signal-processing