从听诊器输入的心脏信号中寻找R峰值

时间:2013-04-25 08:46:01

标签: matlab signals signal-processing

给定使用听诊器通过硬件(主要是具有截止频率100hz的放大器和低通滤波器)测量计算机的音频卡的心跳信号。 现在信号用截止100hz过滤。下面给出了找到峰值和每分钟节拍的代码。该代码仅适用于某些情况。 请帮我找错误

clear all
%input the signal into matlab


[x,fs]=wavread('heartbeat.wav');
figure(1)
subplot(2,1,1)
x1=x(:,2);
plot(x1(500:10000),'r-');
title('unfiltered input x(n),cut off frequency 0.0270,passband 60hz,stopband 70hz');
ylabel('amplitude in volts');
xlabel('number of samples')
grid on

%to filter the signal above 50-60 hz
order=4;
h=fir1(4,0.0270,hamming(order+1));
y=filter(h,1,x1);
subplot(2,1,2)
plot(y(500:10000),'b-')
title('filtered output y(n),cut off frequency 0.0270,passband 50hz,stopband 60hz');
ylabel('amplitude in volts');
xlabel('number of samples')
grid on
%sound(y,5000)


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);

Ydiff = diff(Yth);
Ydiff_logical = Ydiff < 0;
Ypeaks = diff(Ydiff_logical) == 1;

p=sum(Ypeaks)

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




figure(2)
%frequency response of the filter
freqz(h,1)
title('Frequency response');
xlabel('normalized frequency (X pi) radians per sample');
ylabel('Magnitude');
grid on;

1 个答案:

答案 0 :(得分:0)

没有示例数据我只是猜测,但我认为阈值不会让你得到正确的数据:很可能每次峰值都是不同的高度(“每次”我的意思是每次运行和每个人的节拍)。因此,如果您使用太高的峰值,它将会错过一些真正的峰值,因为心跳会太低。如果你使用太低的峰值,你冒险重复计算一些心跳,每个心跳包含多个峰值(对不起,我不记得这些被称为什么)。事情也可能会随着时间的推移而发生变化,因此我甚至不会尝试设置单个录音的阈值并让它继续下去,甚至从数据中获取阈值可能会有问题。

你可能会对其他技术有更好的运气,例如互相关或某种经过修改的零交叉,或者专为心跳的独特功能设计的东西(我想有一些东西。你有没有搜索过文献?)