心电信号的PQRST模拟matlab代码(转载+自己调研汇总)
目前PQRST網上現成的代碼有兩份[1][2]
我們采用[2],原因是[1]中采用了lowpass這個函數,
[3]中提到:"注意,只有2018年之后的matlab才有lowpass, bandpass 函數。"
只想說[1]的代碼略坑,難不成為了lowpass重裝matlab嗎?劃不來。
所以還是用[2]吧
------------------------------------------------------------------------------------------------------------------------------------------------------
說下PQRST啥意思?
其實就是給一堆數據,進行離散點擬合。
但是不能亂擬合,需要體現一些醫學特征
所以可以把PQRST理解為一種"滿足醫學需要的曲線擬合"。
------------------------------------------------------------------------------------------------------------------------------------------------------
數據集來自[4]
完整代碼如下(下面其實包含了三種濾波器,最后一部分才是PQRST模擬):
close all;clear;clc; sig=load('ecg_60hz_200.dat'); % sig=load('100.dat');% data=importdata('/home/appleyuchi/桌面/心電信號處理算法設計/data4.txt'); % sig=data'; % % TIME=linspace(0,18.68,1868);%時間N=length(sig); fs=100; t=[0:N-1]/fs; figure(1);subplot(4,2,1);plot(sig) title('Original Signal') %%% Low Pass Filter b=1/32*[1 0 0 0 0 0 -2 0 0 0 0 0 1]; a=[1 -2 1]; sigL=filter(b,a,sig); subplot(4,2,3);plot(sigL) title('Low Pass Filter') subplot(4,2,4);zplane(b,a) %%% High Pass Filter b=[-1/32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1/32]; a=[1 -1]; sigH=filter(b,a,sigL); subplot(4,2,5);plot(sigH) title('High Pass Filter') subplot(4,2,6);zplane(b,a) %%% Derivative Base Filter b=[1/4 1/8 0 -1/8 -1/4]; a=[1]; sigD=filter(b,a,sigH); subplot(4,2,7);plot(sigD) title('Derivative Base Filter') subplot(4,2,8);zplane(b,a) %%% be tavane 2 miresanim sigD2=sigD.^2; %%% normalization signorm=sigD2/max(abs(sigD2)); %%h=ones(1,31)/31; sigAV=conv(signorm,h); sigAV=sigAV(15+[1:N]); sigAV=sigAV/max(abs(sigAV)); figure(2);plot(sigAV) title('Moving Average filter') %% treshold=mean(sigAV); P_G= (sigAV>0.01); figure(3);plot(P_G) title('treshold Signal') figure;plot(sigL) %% difsig=diff(P_G); left=find(difsig==1); raight=find(difsig==-1); %%% run cancel delay% 6 sample delay because of LowPass filtering% 16 sample delay because of HighPass filtering left=left-(6+16); raight=raight-(6+16); %%size(left) size(raight)% P-QRS-t for i=1:length(left);[R_A(i) R_t(i)]=max(sigL(left(i):raight(i)));R_t(i)=R_t(i)-1+left(i) %add offset[Q_A(i) Q_t(i)]=min(sigL(left(i):R_t(i)));Q_t(i)=Q_t(i)-1+left(i)[S_A(i) S_t(i)]=min(sigL(left(i):raight(i)));S_t(i)=S_t(i)-1+left(i)[P_A(i) P_t(i)]=max(sigL(left(i):Q_t(i)));P_t(i)=P_t(i)-1+left(i)[T_A(i) T_t(i)]=max(sigL(S_t(i):raight(i)));T_t(i)=T_t(i)-1+left(i)+47end %% figure;plot(t,sigL,t(Q_t),Q_A,'*g',t(S_t),S_A,'^k',t(R_t),R_A,'ob',t(P_t),P_A,'+b',t(T_t),T_A,'+r'); for i=1:((length(P_t))-1)HRV=P_t(i+1)-P_t(i) end------------------------------------------------------------------------------------------------------------------------------------------------------
運行結果如下:
注意,上述的PQRST代碼適用信號有一個局限性,就是輸入的數據"比較光滑比較密集",如下圖中的Original Signal?
-------------------------------------------------不適合情形--------------------------------------------------------------------------------------------
因為這種信號噪聲沒有濾除,所以不適合直接套用
-------------------------------------------------------故障分析-----------------------------------------------------------------------------------------------
另外注意,如果更換成自己的數據集報錯的話。
原始信號不要有接入噪聲,否則會導致[2]中程序報錯:
Subscripted assignment dimension mismatch.
Error in PQRSTdetection (line 131)
? ? [R_A(i) R_t(i)]=max(sigL(left(i):right(i)));
?
?
這個原因是代碼中有對離散序列進行微分的操作.
最終要求left中的每個數值小于right
下面是故障現場:
P_G =
? Columns 1 through 20
? ? ?1 ? ? 1 ? ? 1 ? ? 1 ? ? 1 ? ? 1 ? ? 1 ? ? 1 ? ? 1 ? ? 1 ? ? 1 ? ? 1 ? ? 1 ? ? 1 ? ? 1 ? ? 1 ? ? 1 ? ? 1 ? ? 1 ? ? 1
? Columns 21 through 40
? ? ?1 ? ? 1 ? ? 1 ? ? 1 ? ? 1 ? ? 1 ? ? 1 ? ? 1 ? ? 1 ? ? 1 ? ? 1 ? ? 1 ? ? 1 ? ? 1 ? ? 1 ? ? 1 ? ? 1 ? ? 1 ? ? 1 ? ? 1
? Columns 41 through 60
? ? ?1 ? ? 1 ? ? 1 ? ? 1 ? ? 1 ? ? 1 ? ? 1 ? ? 1 ? ? 1 ? ? 1 ? ? 1 ? ? 1 ? ? 1 ? ? 0 ? ? 0 ? ? 0 ? ? 0 ? ? 0 ? ? 0 ? ? 0(看到沒?這里離散波形微分是-1)
....
?
也就是說P_G序列中必須上升沿先出現,上面的故障場景是下降沿先出現,
就會導致后面的left和right變量不存在left<right 的關系(故障時會有left>right),從而最終導致PQRST圖形窗口無法繪制。
------------------------------------------------------------------------------------------------------------------------------------------------------
Reference:
[1]ECG SIGNAL PQRST PEAK DETECTION
[2]ECG P QRS T wave detecting matlab code
[3]MATLAB 低通濾波器 low pass filter
[4]http://people.ucalgary.ca/~ranga/enel563/SIGNAL_DATA_FILES/
總結
以上是生活随笔為你收集整理的心电信号的PQRST模拟matlab代码(转载+自己调研汇总)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 崩坏三多久算回归
- 下一篇: matlab人脸追踪,求大神帮助我这个菜