滤波器的通用代码实现方法

一、引言

滤波器的设计和仿真可以使用MATLAB进行,十分方便高效,但是如何把仿真好的滤波器设计为可运行代码许多人不是很了解,因此这里介绍一下滤波器的代码实现方法,本文章采用C代码作为示例。

二、设计

2.1. 知识背景

MATLAB进行滤波器设计后,都会返回一个矩阵,矩阵形式为:

filter = [b, a];

这种表示来源于使用线性常系数差分方程来表征离散系统.

对于一个线性时不变系统而言,其输出 y[n] 和输入 x[n] 之间的线性常系数差分方程一般具有如下形式:

a0y[n] + a1y[n-1] + ... + aNy[n-N] = b0x[n] + b1x[n-1] + ... + bMx[n-M]
  a = [a0, a1, ..., aN], b = [b0, b1, ..., bM]
  

因此一旦知道了[b, a], 则离散系统的线性常系数差分方程就可以表示出来,使用此方程进行代码实现。

2.2. 设计举例

请参见代码 lowpass_filter.h lowpass_filter.c
下载 lowpass_filter.h
下载 lowpass_filter.c

论文 A Real-Time QRS Detection Algorithm 设计了一种可以用于心电信号滤波的滤波器,此滤波器的参数为

b = (1/32) .* [1, 0, 0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 1];
a = [1, -2, 1];
filter = [b, a];

根据其滤波器参数可知其差分方程为

y(n)-2y(n-1)+y(n-2) = (1/32)[x(n)-2x(n-6)+x(n-12)]

因此,最新的系统输出y[0], 取决于x[0...12]共13个输入及y[1...2]共两个过去的输出,因此代码设计时需要做如下工作:
1. 分配可以容纳 13 个输入及 2 个输出的缓冲器
2. 缓冲器初始化为0
3. 每次的y[0]按照差分方程计算(利用缓冲器记录的值)
4. 每次输入得到一个输出,此即为要设计的滤波器

详细情况请参考代码。

发表评论

电子邮件地址不会被公开。 必填项已用*标注