IIR零相移滤波器法去除心电信号中的基线漂移-课程
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
IIR零相移滤波器法去除心电信号中的基线漂移
在心电信号的采集过程中,会引入各种干扰噪声,如基线漂移。为了得到不失真的心电
信号,在诊断分析前要对信号进行预处理---数字滤波。
心电信号的能谱范围集中在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)
(8)
由(5)~(8)即可得:
(9)
从式(9)可见,输出与之间不存在附加相位。如果将所用的滤波器连
同上述方法看作组成某一系统的构件与逻辑,那么这一系统的频率响应是:
(10)
不管具有多么奇怪的相频特性,都可以实现具有式(10)所描述的频率特性的系统——零相位数字滤波器。
因为零相位数字滤波器必须将信号序列作“时间上反转”处理,因此从物理上这种方法无法实现,这种构造零相位数字滤波器的思想无法应用于靠硬件实现的滤波器设计,不过可以
通过软件来实现。
心电信号来自MIT-BIH数据库,数据采样频率为360Hz,如下图所示,实验中为文本文件baseline.txt;滤波器的设计可以用matlab 中的fdatool实现。
注意:在CCS中读数据需要在文本文件中加头:1651 2 0 1
1matlab IIR
1. matlab
对心电信号,我们如下给出指标:
通带:,幅度失真约为1%:
阻带:,衰减大于40dB
相对应的数字滤波器的指标:
通带截止频率:=0.012217rad
通带纹波:=0.005
阻带截止频率:=0.005236rad
阻带最小衰减:
调用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
IIR零相移滤波器法去除心电信号中的基线漂移 2.
Matlab的滤波程序:
在Matlab中,可直接调用函数filtfilt来实现信号的零相移滤波,程序如下:
load baseline.txt; %读取放在baseline.txt的心电数据 data = baseline;
result =filtfilt(b,a,data);
figure(2);
subplot(211);
plot(data);
subplot(212);
plot(result);
Matlab中IIR零相移滤波效果
2CCS
3CCS
经过反复试验,将ccs中滤波器系数调整为:
b=[0.991, -2.971, 2.971, -0.991]
a=[ 1, -2.9846, 2.9693, -0.98474]
所以ccs 中iir.c程序为: #include"math.h"
#define IIRNUMBER 4
#define SAMPLEF 360 //采样频率
float IIR();
, ,
int read_signals(int *input);
main()
{
nIn=0; nOut=0;
fInput=fOutput=0;
while ( 1 )
{
read_signals(fIn); //设置断点1
for(i = 0;i < 3600;i++) //设置断点2
{
fInput=fIn[i];
fIn[nIn]=fInput;
nIn++; nIn%=3600;
fOutput=IIR(i);
fOut[nOut]=fOutput;
nOut++; // break point
if ( nOut>=3600 )
{
nOut=0;
}
}
}
}
float IIR(int j)
{
switch(j)
{
case 0: fOut[j] = 9.92340;break;
case 1: fOut[j] = 9.77078;break;
case 2: fOut[j] = 9.61971;break;
case 3: fOut[j] = 9.47060;break;
default:fOut[j]=2.9846*fOut[j-1]-2.9693*fOut[j-2]+0.9847*fOut[j-3]+0.99*fIn[j]-2.97*f
In[j-1]+2.97*fIn[j-2]-0.99*fIn[j-3];break;
}
return(fOut[j]);
}
// 读取输入信号
int read_signals(int *fIn)
{
// 在此读取采集数据信号放到输入缓冲区input[]
return(1);
}
.cmd文件为:
-w
-stack 500
-sysstack 500
-l rts55x.lib
MEMORY
{
DARAM: o=0x100, l=0x7f00
VECT : o=0x8000, l=0x100
DARAM2: o=0x8100, l=0x200
DARAM3: o=0x8300, l=0x7d00
SARAM: o=0x10000, l=0x30000
SDRAM: o=0x40000, l=0x3e0000
}
SECTIONS
{
.text: {} > DARAM
.vectors: {} > VECT
.trcinit: {} > DARAM
.gblinit: {} > DARAM
frt: {} > DARAM
.cinit: {} > DARAM
.pinit: {} > DARAM
.sysinit: {} > DARAM
.bss: {} > DARAM3
.far: {} > DARAM3
.const: {} > DARAM3
.switch: {} > DARAM3
.sysmem: {} > DARAM3
.cio: {} > DARAM3
.MEM$obj: {} > DARAM3
.sysheap: {} > DARAM3
.sysstack {} > DARAM3
.stack: {} > DARAM3
}
通过matlab设计一个滤波器,其滤波效果较好,但在ccs中用matlab中所设计的滤波器的系数设计滤波器时其滤出的心电信号的效果并不好,经过反复微调ccs中滤波器的系数,得出的滤波效果逐渐趋向于要求的效果,与通过matlab中滤波器滤出的波形近似。可知,
同一个滤波器在matlab中和ccs中滤波的效果并不一样,要想要达到相同的效果,还需要调
整滤波器的系数,由于经验缺乏,在ccs中滤波器中的系数并不完美,滤波效果也没有matlab中的好,以后需要增加这方面的实践,并在实践中积累经验。
由于在ccs使用方面经验有限,在编程方面能力有限,课题完成得并不完全和完美,在
ccs中仅仅完成了数据读入、滤波器设计、一次滤波、图像输出的功能,没能进行数据逆转
和二次滤波。但滤波效果我觉得是能满足使用要求的。未能完成部分在下面的实验中将进一
步努力实现。观察上页所示试验结果,可知,设计的高通滤波器将低频信号基本滤除了,并
且相位也基本成线性了。
通过这次dsp课程设计,初步学会了使用matlab和比较熟练的掌握了ccs3.3的使用,熟悉了dsp软件编程和软件仿真的基本技能。提高了对dsp这门课程的兴趣和了解。比较全面的了解了怎么用matlab和dsp去解决实际问题,比较系统的的温习了以前学过的和此次课题
有关的知识,对知识的掌握很有益。对以后的学习也受益很大。