ECG信号读出,检测QRS,P,T 波(小波去噪,并根据检测),基于BP辨识的神经网络...

该博客介绍了如何使用MATLAB进行ECG信号处理,包括小波去噪去除高频噪声和基线漂移,通过设定阈值检测QRS波,以及初步的P、T波检测。还提到了BP神经网络在ECG特征识别中的应用。
摘要由CSDN通过智能技术生成
   这学期的课程选择神经网络。最后的作业处理ECG信号,并利用神经网络识别。

1  ECG引进和阅读ECG信号

1)ECG介绍

   详细ECG背景应用就不介绍了,大家能够參考百度 谷歌。仅仅是简单说下ECG的结构:
   一个完整周期的ECG信号有 QRS P T 波组成,不同的人相应不用的波形,同一个人在不同的阶段波形也不同。我们须要依据各个波形的特点,提取出相应的特征,对不同的人进行身份识别。

2)ECG信号读取

首先须要到MIT-BIH数据库中下载ECG信号,具体的下载地址与程序读取内容介绍能够參考一下地址(讲述的非常具体):http://blog.csdn.net/chenyusiyuan/article/details/2027887
   读代替码(基于MATLAB)例如以下:
  
clc; clear all;
%------ SPECIFY DATA ------------------------------------------------------
%%选择文件名称
stringname='111';
%选择你要处理的信号点数
points=10000; 
PATH= 'F:\ECG\MIT-BIH database directory'; % path, where data are saved
HEADERFILE= strcat(stringname,'.hea');      % header-file in text format
ATRFILE= strcat(stringname,'.atr');        % attributes-file in binary format
DATAFILE=strcat(stringname,'.dat');        % data-file
SAMPLES2READ=points;         % number of samples to be read
                      % in case of more than one signal:
                            % 2*SAMPLES2READ samples are read
   
%------ LOAD HEADER DATA --------------------------------------------------
fprintf(1,'\\n$> WORKING ON %s ...\n', HEADERFILE);
signalh= fullfile(PATH, HEADERFILE);
fid1=fopen(signalh,'r');
z= fgetl(fid1);
A= sscanf(z, '%*s %d %d %d',[1,3]);
nosig= A(1);  % number of signals
sfreq=A(2);   % sample rate of data
clear A;
for k=1:nosig
    z= fgetl(fid1);
    A= sscanf(z, '%*s %d %d %d %d %d',[1,5]);
    dformat(k)= A(1);           % format; here only 212 is allowed
    gain(k)= A(2);              % number of integers per mV
    bitres(k)= A(3);            % bitresolution
    zerovalue(k)= A(4);         % integer value of ECG zero point
    firstvalue(k)= A(5);        % first integer value of signal (to test for errors)
end;
fclose(fid1);
clear A;

%------ LOAD BINARY DATA --------------------------------------------------
if dformat~= [212,212], error('this script does not apply binary formats different to 212.'); end;
signald= fullfile(PATH, DATAFILE);            % data in format 212
fid2=fopen(signald,'r');
A= fread(fid2, [3, SAMPLES2READ], 'uint8')';  % matrix with 3 rows, each 8 bits long, = 2*12bit
fclose(fid2);
M2H= bitshift(A(:,2), -4);
M1H= bitand(A(:,2), 15);
PRL=bitshift(bitand(A(:,2),8),9);     % sign-bit
PRR=bitshift(bitand(A(:,2),128),5);   % sign-bit
M( : , 1)= bitshift(M1H,8)+ A(:,1)-PRL;
M( : , 2)= bitshift(M2H,8)+ A(:,3)-PRR;
if M(1,:) ~= firstvalue, error('inconsistency in the first bit values'); end;
switch nosig
case 2
    M( : , 1)= (M( : , 1)- zerovalue(1))/gain(1);
    M( : , 2)= (M( : , 2)- zerovalue(2))/gain(2);
    TIME=(0:(SAMPLES2READ-1))/sfreq;
case 1
    M( : , 1)= (M( : , 1)- zerovalue(1));
    M( : , 2)= (M( : , 2)- zerovalue(1));
    M=M';
    M(1)=[];
    sM=size(M);
    sM=sM(2)+1;
    M(sM)=0;
    M=M';
    M=M/gain(1);
    TIME=(0:2*(SAMPLES2READ)-1)/sfreq;
otherwise  % this case did not appear up to now!
    % here M has to be sorted!!!
    disp('Sorting algorithm for more than 2 signals not programmed yet!');
end;
clear A M1H M2H PRR PRL;
fprintf(1,'\\n$> LOADING DATA FINISHED \n');

%------ LOAD ATTRIBUTES DATA ----------------------------------------------
atrd= fullfile(PATH, ATRFILE);      % attribute file with annotation data
fid3=fopen(atrd,'r');
A= fread(fid3, [2, inf], 'uint8')';
fclose(fid3);
ATRTIME=[];
ANNOT=[];
sa=size(A);
saa=sa(1);
i=1;
while i<=saa
    annoth=bitshift(A(i,2),-2);
    if annoth==59
        ANNOT=[ANNOT;bitshift(A(i+3,2),-2)];
        ATRTIME=[ATRTIME;A(i+2,1)+bitshift(A(i+2,2),8)+...
                bitshift(A(i+1,1),16)+bitshift(A(i+1,2),24)];
        i=i+3;
    elseif annoth==60
        % nothing to do!
    elseif annoth==61
        % nothing to do!
    elseif annoth==62
        % nothing to do!
    elseif annoth==63
        hilfe=bitshift(bitand(A(i,2),3),8)+A(i,1);
        hilfe=hilfe+mod(hilfe,2);
        i=i+hilfe/2;
    else
        ATRTIME=[ATRTIME;bitshift(bitand(A(i,2),3),8)+A(i,1)];
        ANNOT=[ANNOT;bitshift(A(i,2),-2)];
   end;
   i=i+1;
end;
ANNOT(length(ANNOT))=[];       % last line = EOF (=0)
ATRTIME(length(ATRTIME))=[];   % last line = EOF
clear A;
ATRTIME= (cumsum(ATRTIME))/sfreq;
ind= find(ATRTIME <= TIME(end));
ATRTIMED= ATRTIME(ind);
ANNOT=round(ANNOT);
ANNOTD= ANNOT(ind);

%------ DISPLAY DATA ------------------------------------------------------
figure(1); clf, box on, hold on ;grid on ;
plot(TIME, M(:,1),'r');
if nosig==2
    plot(TIME, M(:,2),'b');
end;
for k=1:length(ATRTIMED)
    text(ATRTIMED(k),0,num2str(ANNOTD(k)));
end;
xlim([TIME(1), TIME(end)]);
xlabel('Time / s'); ylabel('Voltage / mV');
string=['ECG signal ',DATAFILE];
title(string);
fprintf(1,'\\n$> DISPLAYING DATA FINISHED \n');
% -------------------------------------------------------------------------
fprintf(1,'\\n$> ALL FINISHED \n');

以MIT-BIH数据库中111.dat 为例。



2 去除高频噪声与基线漂移

   ECG读取完后,原始ECG信号含有高频噪声和基线漂移,利用小波方法能够去除对应噪声。

详细原理例如以下:将一维的ECG信号进行8层的小波分解后(MATLAB下wavedec函数,小波类型是bior2.6)得到对应的细节系数与近似系数。依据小波原理我们能够知道。1,2层的细节系数包括了大部分高频噪声,8层的近似系数包括了基线漂移。

基于此。我们将1,2层的细节系数(即高频系数置0),8成的近似系数(低频系数)置0。在对应进行小波重构,重构后我们能够明显得到去噪信号。信号无基线漂移。

以下通过图片与代码进一步解说:</

一、引言自适应噪声抵消技术是一种能够很好的消除背景噪声影响的信号处理技术,应用自适应噪声抵消技术,可在未知外界干扰源特征,传递途径不断变化,背景噪声和被测对象声相似的情况下,能够有效地消除外界声源的干扰获得高信噪比的对象信号。 从理论上讲,自适应干扰抵消器是基于自适应滤原理的一种扩展,简单的说,把自适应滤器的期望信号输入端改为信号加噪声干扰的原始输入端,而它的输入端改为噪声干扰端,由横向滤器的参数调节输出以将原始输入中的噪声干扰抵消掉,这时误差输出就是有用信号了。在数字信号采集、处理中,线性滤是最常用的消除噪声的方法。线性滤容易分析,使用均方差最小准则的线性滤器能找到闭合解,若噪声干扰类型为高斯噪声时,可达到最佳的线性滤效果。 计算机论文www.lunwendingzhi.com; 机械毕业论文www.lunwenwanjia.com 在实际的数字信号采集中,叠加于信号的噪声干扰往往不是单一的高斯噪声,而线性滤器所要求的中等程度噪声偏移,使线性滤器对非高斯噪声的滤性能下降,为克服线性滤器的缺点,往往采用非线性滤器,所以本文采用神经网络信号进行滤处理。二、基于BP算法和遗传算法相结合的自适应噪声抵消器在本文中,作者主要基于自适应噪声对消的原理对自适应算法进行研究,提出了一种新的算法,即BP算法和遗传算法相结合的自适应算法。 作者对BP网络的结构及算法作了一个系统的综述,分析了BP算法存在的主要缺陷及其产生的原因。传统的BP网络既然是一个非线性优化问题,这就不可避免地存在局部极小问题,网络的极值通过沿局部改善的方向一小步进行修正,力图达到使误差函数最小化的全局解,但实际上常得到的使局部最优点。 管理毕业论文网www.yifanglunwen.com; 音乐毕业论文www.xyclww.com; 英语毕业论文www.lanrenbanjia.com; 学习过程中,下降慢,学习速度缓,易出现一个长时间的误差平坦区,即出现平台。通过对遗传算法文献的分析、概括和总结,发现遗传算法与其它的搜索方法相比,遗传算法(GA)的优点在于:不需要目标函数的微分值;并行搜索,搜索效率高;搜索遍及整个搜索空间,容易得到全局最优解。所以用GA优化BP神经网络,可使神经网络具有进化、自适应的能力。 BP-GA混合算法的方法出发点为: 经济论文www.youzhiessay.com 教育论文www.hudonglunwen.com; 医学论文网www.kuailelunwen.com; (1)利用BP神经网络映射设计变量和目标函数、约束之间的关系;(2)用遗传算法作实现优化搜索;(3)遗传算法中适应度的计算采用神经网络计算来实现。BP-GA混合算法的设计步骤如下:(1)分析问题,提出目标函数、设计变量和约束条件;(2)设定适当的训练样本集,计算训练样本集;(3)训练神经网络;(4)采用遗传算法进行结构寻优;(5)利用训练好的神经网络检验遗传算法优化结果。若满足要求,计算结束;若误差不满足要求,将检验解加入到训练样本集中,重复执行3~5步直到满足要求。 通过用短时傅立叶信号和余弦信号进行噪声对消性能测试,在单一的BP算法中,网络的训练次数、学习速度、网络层数以及每层神经元的节点数都是影响BP网络的重要参数,通过仿真实验可以发现,适当的训练次数可以使误差达到极小值,但是训练次数过多,训练时间太长,甚至容易陷入死循环,或者学习精度不高。学习速度不能选择的太大,否则会出现算法不收敛,也不能选择太小, 会使训练过程时间太长,一般选择为0.01~0.1之间的值,再根据训练过程中梯度变化和均方误差变化值确定。基于梯度下降原理的BP算法,在解空间仅进行单点搜索,极易收敛于局部极小,而GA的众多个体同时搜索解空间的许多点,因而可以有效的防止搜索过程收敛于局部极小,只有算法的参数及遗传算子的操作选择得当,算法具有极大的把握收敛于全局最优解。使用遗传算法需要决定的运行参数中种群大小表示种群中所含个体的数量,种群较小时,可提高遗传算法的运算速度,但却降低了群体的多样性,可能找不出最优解;种群较大时,又会增加计算量,使遗传算法的运行效率降低。一般取种群数目为20~100;交叉率控制着交叉操作的频率,由于交叉操作是遗传算法中产生新个体的主要方法,所以交叉率通常应取较大值,但若过大的话,又可能破坏群体的优良模式,一般取0.4~0.99;变异率也是影响新个体产生的一个因素,变异率小,产生个体少,变异率太大,又会使遗传算法变成随机搜索,一般取变异率为0.0001~0.1。 由仿真结果得知,GA与BP算法的混合算法不论是在运行速度还是在运算精度上都较单纯的BP算法有提高,去噪效果更加明显,在信噪比的改善程度上,混合算法的信噪比针对傅立叶信号提高了16db左右,针对余弦信号提高了23db左右。三、结论用短时傅立叶信号和余弦信号进行噪声对消性能测试,通过分别使用单一的BP算法和混合算法作比较发现遗传算法具有很强的处理能力和优化能力,用它优化BP神经网络的权值,与原有单一的BP算法相比,可以节省大量的学习和计算时间,而且提高了信噪比。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值