x=ecg1; %——心电信号去噪完成后—— yabs=abs(x); sigtemp=x; siglen=length(x); sigmax=[]; for i=1:siglen-2 if (x(i+1)>x(i)&&x(i+1)>x(i+2))||(x(i+1)<x(i)&&x(i+1)<x(i+2)) sigmax=[sigmax;sigtemp(i+1),i+1]; end end thrtemp=sort(sigmax); thrlen=length(sigmax); thr=0; for i=(thrlen-7):thrlen thr=thr+thrtemp(i); end thrmax=thr/8; %最大幅度平均值,8个最大幅值点的平均值 zerotemp=sort(x); zerovalue=0; for i=1:100 zerovalue=zerovalue+zerotemp(i); end zerovalue=zerovalue/100; %最小幅度平均值,对消幅度,100个最小幅值点的平均值 thr=(thrmax-zerovalue)0.26; %最大、最小幅度的差值的30%为判别R波的阈值 %定位R波 rvalue=[]; for i=1:thrlen if sigmax(i,1)>thr rvalue=[rvalue;sigmax(i,2)]; end end rvalue_1=rvalue; %排除误检,如果相邻两个极大值间距小于0.4s,则去掉幅度较小的一个 lenvalue=length(rvalue); i=2; while i<=lenvalue if (rvalue(i)-rvalue(i-1))(1/800)<0.4 if yabs(rvalue(i))>yabs(rvalue(i-1)) rvalue(i-1)=[]; else rvalue(i)=[]; end lenvalue=length(rvalue); i=i-1; end i=i+1; end lenvalue=length(rvalue); % 在原信号上精确校准 for i=1:lenvalue if (x(rvalue(i))>0) k=(rvalue(i)-5):(rvalue(i)+5); [a,b]=max(x(k)); rvalue(i)=rvalue(i)-6+b; else k=(rvalue(i)-5):(rvalue(i)+5); [a,b]=min(x(k)); rvalue(i)=rvalue(i)-6+b; end end %提取R波展示 figure subplot(211); plot(t_1min/fs,x); hold on; plot(rvalue/fs,x(rvalue),'r^'); xlim([0 10]);
时间: 2023-12-30 07:04:14 浏览: 80
xindianxinhao.rar_MATLAB心电信号分析_filter for ecg_心电 滤波_高频信号_高频去噪
5星 · 资源好评率100%
这段代码是R波检测的MATLAB代码,其中 `ecg1` 是原始心电信号,经过去噪之后的信号。该代码首先将信号转换为绝对值形式,然后通过寻找极大值的方法检测R波峰值位置。具体步骤如下:
1. 遍历信号中每三个相邻的点,如果中间点是极大值或极小值,则将该点的幅度和位置记录下来。
2. 对所有的极大值点按照幅度大小进行排序,并选取最大的8个点计算它们的平均值,作为最大幅度平均值。
3. 对所有的幅度值按大小进行排序,并选取最小的100个点计算它们的平均值,作为最小幅度平均值。
4. 将最大幅度平均值和最小幅度平均值的差值的30%作为R波的阈值。
5. 遍历所有的极大值点,如果幅度大于阈值,则将其记录为R波峰值位置。
6. 排除误检,如果相邻两个R波峰值的间距小于0.4秒,则去掉幅度较小的一个。
7. 在原始信号上对R波峰值位置进行精确校准。
8. 提取R波并展示结果。
该代码的展示结果是在一个2x1的subplot中显示原始信号和R波峰值标记。其中,红色三角形表示检测到的R波峰值位置。
阅读全文