2009-11-20 12 views
6

ECG信号からノイズを除去するのに最適なフィルタは何ですか?MATLAB:ノイズの多いEKG信号をフィルタ

+0

「heart.wav」とは何ですか?それはEKGですか? – gnovice

+0

はい。私は心音を分析したい – kristia

+0

あなたがEKG信号を意味する "心音"であれば、おそらくそのような質問を言い換えてください。 – Amro

答えて

16

シグナル処理ツールボックスにアクセスできる場合は、Savitzky-Golay filterの機能、つまりsgolayを確認してください。付随するデモがあります。を実行してください。


次は、信号にフィルタリングとノイズ除去を適用するさまざまな方法を示す例です。これらの機能の一部が存在すること、特定のツールボックスが必要です注意:あなたがチェックアウトすることがあり

% load ecg: simulate noisy ECG 
Fs=500; 
x = repmat(ecg(Fs), 1, 8); 
x = x + randn(1,length(x)).*0.18; 

% plot noisy signal 
figure 
subplot(911), plot(x), set(gca, 'YLim', [-1 1], 'xtick',[]) 
title('noisy') 

% sgolay filter 
frame = 15; 
degree = 0; 
y = sgolayfilt(x, degree, frame); 
subplot(912), plot(y), set(gca, 'YLim', [-1 1], 'xtick',[]) 
title('sgolayfilt') 

% smooth 
window = 30; 
%y = smooth(x, window, 'moving'); 
%y = smooth(x, window/length(x), 'sgolay', 2); 
y = smooth(x, window/length(x), 'rloess'); 
subplot(913), plot(y), set(gca, 'YLim', [-1 1], 'xtick',[]) 
title('smooth') 

% moving average filter 
window = 15; 
h = ones(window,1)/window; 
y = filter(h, 1, x); 
subplot(914), plot(y), set(gca, 'YLim', [-1 1], 'xtick',[]) 
title('moving average') 

% moving weighted window 
window = 7; 
h = gausswin(2*window+1)./window; 
y = zeros(size(x)); 
for i=1:length(x) 
    for j=-window:window; 
     if j>-i && j<(length(x)-i+1) 
      %y(i) = y(i) + x(i+j) * (1-(j/window)^2)/window; 
      y(i) = y(i) + x(i+j) * h(j+window+1); 
     end 
    end 
end 
subplot(915), plot(y), set(gca, 'YLim', [-1 1], 'xtick',[]) 
title('weighted window') 

% gaussian 
window = 7; 
h = normpdf(-window:window, 0, fix((2*window+1)/6)); 
y = filter(h, 1, x); 
subplot(916), plot(y), set(gca, 'YLim', [-1 1], 'xtick',[]) 
title('gaussian') 

% median filter 
window = 15; 
y = medfilt1(x, window); 
subplot(917), plot(y), set(gca, 'YLim', [-1 1], 'xtick',[]) 
title('median') 

% filter 
order = 15; 
h = fir1(order, 0.1, rectwin(order+1)); 
y = filter(h, 1, x); 
subplot(918), plot(y), set(gca, 'YLim', [-1 1], 'xtick',[]) 
title('fir1') 

% lowpass Butterworth filter 
fNorm = 25/(Fs/2);    % normalized cutoff frequency 
[b,a] = butter(10, fNorm, 'low'); % 10th order filter 
y = filtfilt(b, a, x); 
subplot(919), plot(y), set(gca, 'YLim', [-1 1]) 
title('butterworth') 

screenshot

+2

これは古い答えですが、表面ECGの診断精度のために保存する必要がある非常に特定の周波数範囲があることに留意してください。具体的には、忠実度の高いSTセグメントでは0.05-1Hz、ECGの残りの部分では大人の場合は40Hz、ペダルの場合は150Hzのローパスが必要です(ライン周波数の適切なノッチフィルタも同様に推奨されます) 。私はSavitzky-Golay FIRに精通していませんが、ECGの重要な周波数を確実に維持するように注意する必要があります。 – user7116

+1

+1ありがとうございます。私は、ECG信号の多くのドメイン知識を持っていないことを指摘する必要があります。上記の答えは、純粋な信号処理の観点からです(一般的に信号をフィルタリングするために使用できるさまざまな関数を列挙することによって)。真実は、私はSGフィルタにも精通していない、私はそれがECGに関連する文献でよく見てきたので、私はそれを言及した:http://www.uap-bd.edu/jcit_papers/vol-1_no- 2/IJCIT-110126.pdf – Amro

+0

ニートペーパー、参考にしていただきありがとうございます!得られたECGの形態学的比較は、フィルターを考慮するとき最も重要な要素である。しかし、単純な外来モニタリング(多くの場合「リズムの解釈」と呼ばれる)では、信号の歪みがあるため、フィルタ選択に幅があります。 – user7116

1

2つのフィルタ設計ツール/デモ:Signal Processing Toolbox

これらは、EKG/ECGデータでどのように動作するかを確認するために、さまざまなフィルタとフィルタパラメータを試す機会を与えます。

+0

フィルタを選択するときは、ECGの診断用途にSTセグメントの高い忠実度を保証するために、通常、0.05Hz以下のハイパスが必要です。 40Hz前後のローパスフィルターは、大人の場合はOK、ペダルの場合は150Hzです。ペースメーカーのインパルスを見たい場合は、150〜200Hzのものがあります。 – user7116