在matlab中检测原始心电图信号的QRS(峰值)

时间:2013-04-23 10:49:09

标签: matlab signal-processing

我想找到原始心电图信号的峰值,这样我就可以计算出每分钟的节拍数(bpm)。 我在matlab中编写了一个代码,我在下面附上。在下面的代码中,我无法正确找到阈值点,这有助于我找到峰值,从而找到bpm。

%input the signal into matlab

[x,fs]=wavread('heartbeat.wav');
subplot(2,1,1)
plot(x(1:10000),'r-')
grid on



%lowpass filter the input signal with cutoff at 100hz
h=fir1(30,0.3126);     %normalized cutoff freq=0.3126
y=filter(h,1,x);

subplot(2,1,2)
plot(y(1:10000),'b-')
grid on



% peaks are seen as pulses(heart beats)
beat_count=0;
for p=2:length(y)-1
    th(p)=abs(max(y(p)));
    if(y(p) >y(p-1) && y(p) >y(p+1) && y(p)>th(p))
        beat_count=beat_count+1;
    end
end

N = length(y);
duration_seconds=N/fs;
duration_minutes=duration_seconds/60;
BPM=beat_count/duration_minutes;
bpm=ceil(BPM);

请帮助我,因为我是matlab的新手

3 个答案:

答案 0 :(得分:2)

我建议您更改代码的这一部分

beat_count=0;
for p=2:length(y)-1
    th(p)=abs(max(y(p)));
    if(y(p) >y(p-1) && y(p) >y(p+1) && y(p)>th(p))
        beat_count=beat_count+1;
    end
end

这绝对是有缺陷的。我不确定你的逻辑,但是这个怎么样。我们正在寻找峰值,但只有高峰,所以首先设置一个阈值(你必须将其调整为一个合理的数字)并剔除该值以下的所有值以消除较小的峰值:

th = max(y) * 0.9; %So here I'm considering anything less than 90% of the max as not a real peak... this bit really depends on your logic of finding peaks though which you haven't explained
Yth = zeros(length(y), 1);
Yth(y > th) = y(y > th);

好的,所以我建议您现在绘制y和Yth以查看该代码的作用。现在为了找到峰值,我的逻辑是我们正在寻找局部最大值,即函数的一阶导数从正变为负的点。因此,我将通过找到信号上每个连续点之间的差异来找到对一阶导数的非常简单的数值近似:

Ydiff = diff(Yth);

不,我想找到信号从积极到消极的地方。因此,我将使所有正值等于零,并且所有负值等于1:

Ydiff_logical = Ydiff < 0;

最后我想找到这个信号从零变为一的地方(但不是相反)

Ypeaks = diff(Ydiff_logical) == 1;

现在计算峰值:

sum(Ypeaks)

请注意,由于使用了差异来绘制purpouse,我们应该在Ypeaks的任意一侧填写错误,所以

Ypeaks = [false; Ypeaks; false];

好的,那里有很多matlab,我建议你逐行运行每一行,并通过绘制每一行的结果并双击matlab工作区中的变量来检查变量,以了解什么正在发生每一步。

示例:(从http://www.mathworks.com/help/signal/ref/findpeaks.html获取信号PeakSig)并使用以下内容进行绘图:

plot(x(Ypeaks),PeakSig(Ypeaks),'k^','markerfacecolor',[1 0 0]);

enter image description here

答案 1 :(得分:1)

您如何看待内置

findpeaks(data,'Name',value)

功能?您可以选择不同的逻辑进行峰值检测:

'MINPEAKHEIGHT'
'MINPEAKDISTANCE'
'THRESHOLD'
'NPEAKS'
'SORTSTR'

我希望这会有所帮助。

答案 2 :(得分:0)

你知道,QRS波群并不总是具有最大振幅,对于病理性心电图,它可以作为几个轻微振荡而不是一个高振幅峰值出现。

因此,你可以尝试一个好的算法,由我测试:假设检测标准是信号的高绝对变化率,在给定的时间间隔内平均。

算法: - 50/60 Hz滤波器(例如20 Hz的50 Hz滑动窗口就可以了) - 自适应hipass滤波器(用于基线漂移) - 找到信号的第一个导数x' - fing平方导数(x')^ 2 - 应用具有QRS波群宽度的滑动平均窗口 - 大约100-150毫秒(您将获得一些带有“矩形”的信号,其宽度为QRS) - 使用简单阈值(例如前3秒的最大值的1/3)来确定近似位置或R. - 在源ECG中,在该R位置的+ -100毫秒内找到局部最大值。

但是,您仍然需要消除伪影和异常值(例如电极连接失败时的浪涌)。

此外,您可以从本书中找到很多有用的信息:“R.M。Rangayyan - 生物医学信号分析”