一.实验目的:
在心电信号的采集过程中,会引入各种干扰噪声,如基线漂移。为了得到不失真的心电信号,在诊断分析前要对信号进行预处理---数字滤波。
心电信号的能谱范围集中在1~80Hz之间,基线漂移的频率一般是0~0.8Hz之间。故认为基线漂移是一个缓慢变化的超低频信号。所以,对基线漂移的剔除,可以认为是要去除心电信号中的低频信号,但又要不影响有价值的信号,包括幅度和相位等。心电信号的滤波一般要求线性相位。
IIR滤波器是非线性相位的,但可以通过逆滤波实现线性相位。
二.实验设备
PC 兼容机一台,操作系统为Windows2000(或Windows98,WindowsXP),安装Code Composer Studio 3.3 软件。
三.实验原理
零相位IIR数字滤波的流程图:
先将输入序列按顺序滤波(forward filter),然后将所得结果逆转后反向通过滤波器(reverse filter),再将所得结果逆转后输出(reverse output),即得精确零相位失真的输出序列。其时域表达式如下:
(1)
(2)
(3)
(4)
零相位滤波的频率描述即式(1)~(4)的相应频率响应:
(5)
(6)
(7)
由(5)~(8)即可得:
从式(9)可见,输出
(10)
不管
因为零相位数字滤波器必须将信号序列作“时间上反转”处理,因此从物理上这种方法无法实现,这种构造零相位数字滤波器的思想无法应用于靠硬件实现的滤波器设计,不过可以通过软件来实现。
四.实验数据说明
心电信号来自MIT-BIH数据库,数据采样频率为360Hz,如下图所示,实验中为文本文件baseline.txt;滤波器的设计可以用matlab 中的fdatool实现。
注意:在CCS中读数据需要在文本文件中加头:1651 2 0 1
五.实验步骤
1)先用matlab 仿真实现能去除基线的IIR零相移滤波器,观察滤波功能,保存滤波系数;
1. matlab中滤波器的设计
对心电信号,我们如下给出指标:
通带:
阻带:
相对应的数字滤波器
通带截止频率:
通带纹波:
阻带截止频率:
阻带最小衰减:
调用matlab中的ellip函数设计椭圆滤波器的程序清单如下:
clear all;
fs=360;
Wp=1.4/fs; %通带截止频率
Ws=0.6/fs; %阻带截止频率
devel=0.005; %通带纹波
Rp=20*log10((1+devel)/(1-devel)); %通带纹波系数
Rs=20; %阻带衰减
[N Wn]=ellipord(Wp,Ws,Rp,Rs); %求椭圆滤波器的阶次
[b a]=ellip(N,Rp,Rs,Wn,'high'); %求椭圆滤波器的系数
[hw,w]=freqz(b,a);
subplot(2,1,1); plot(w/pi,20*log10(abs(hw))); grid; axis([0 1 -80 5]);
xlabel('w/\pi'); ylabel('幅度(dB))');
subplot(2,1,2); plot(w/pi,angle(hw)); grid; axis([0 1 -1 4]);
xlabel('w/\pi'); ylabel('相位(rad))') ;
运行上面的程序,得到所设计的滤波器的系数如下:
N=3
Rp= 0.08686
Rs= 20
Wn= 0.0038889
Wp= 0.0038889
Ws= 0.0016667
a= 1 -2.9846 2.9693 -0.98474
b= 0.99234 -2.977 2.977 -0.99234
devel= 0.005
fs= 80