2

1 分あたりの拍数 (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が初めてなので、助けてください

4

3 に答える 3

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

いいえ、信号が正から負になる場所を見つけたいです。そこで、すべての正の値を 0 に等しくし、すべての負の値を 1 に等しくします。

Ydiff_logical = Ydiff < 0;

最後に、この信号が 0 から 1 に変化する場所を見つけたい (ただし、その逆ではない)

Ypeaks = diff(Ydiff_logical) == 1;

次に、ピークを数えます。

sum(Ypeaks)

diff を使用するために目的をプロットするには、Ypeaks の両側に false をパディングする必要があることに注意してください。

Ypeaks = [false; Ypeaks; false];

そこには非常に多くのmatlabがあります。各行を1つずつ実行し、各行の結果をプロットし、matlabワークスペースで変数をダブルクリックして変数を調べ、何が起こっているのかを理解することをお勧めします各ステップ。

例: (信号PeakSighttp://www.mathworks.com/help/signal/ref/findpeaks.htmlから取得) とプロット:

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

ここに画像の説明を入力

于 2013-04-23T11:24:08.800 に答える
2

組み込みについてどう思いますか

findpeaks(data,'Name',value)

関数?ピーク検出のさまざまなロジックから選択できます。

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

これが役立つことを願っています。

于 2013-04-23T11:24:20.003 に答える
0

ご存じのとおり、QRS群は常に最大振幅を持っているわけではありません.病理学的ECGでは、1つの高振幅ピークではなく、いくつかの小さな振動として存在する可能性があります.

したがって、私がテストした 1 つの優れたアルゴリズムを試すことができます。検出基準は、指定された間隔内で平均化された信号の高い絶対変化率であると想定されます。

アルゴリズム: - 50/60 Hz フィルター (たとえば、20 ミリ秒の 50 Hz スライディング ウィンドウの場合は問題ありません) - 適応型ヒップ フィルター (ベースライン ドリフト用) - 信号の最初の導関数 x' を見つけます - fing 二乗導関数 (x')^2 - 適用しますQRS コンプレックスの幅を持つスライド平均ウィンドウ - 約 100 ~ 150 ミリ秒 (QRS の幅を持つ「長方形」でいくつかの信号を取得します) - 単純なしきい値 (たとえば、最初の 3 秒の最大値の 1/3) を使用します。おおよその位置または R を決定します - ソース ECG で、その R 位置の +-100 ミリ秒以内に極大値を見つけます。

ただし、アーティファクトと外れ値 (電極接続が失敗したときのサージなど) を排除する必要があります。

また、この本から多くの役立つ情報を見つけることができます: 「RM Rangayyan - Biomedical Signal Analysis」

于 2014-02-23T21:38:32.130 に答える