2009-11-20 8 views
6

Qual è il miglior filtro da utilizzare per rimuovere il rumore da un segnale ECG con matlab?MATLAB: filtro segnale ECG rumoroso

+0

Che cos'è un "heart.wav"? E 'un ECG? – gnovice

+0

sì. voglio analizzare i suoni del cuore – kristia

+0

se per "suono del cuore" intendevi il segnale ECG, quindi dovresti probabilmente ripetere la domanda in quanto tale .. – Amro

risposta

16

Se si ha accesso al Signal Processing Toolbox, quindi controllare la Savitzky-Golay filter, vale a dire la funzione sgolay. C'è una demo di accompagnamento, basta eseguire sgolaydemo.


Il seguente è un esempio per mostrare i vari modi in cui è possibile applicare il filtro e il de-noising a un segnale. Nota alcune di queste funzioni richiede alcune caselle degli strumenti per essere presenti:

% 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

So che questa è una vecchia risposta, ma tieni presente che esistono intervalli di frequenza molto specifici che devono essere preservati per l'accuratezza diagnostica di un ECG di superficie. In particolare, 0,05-1 Hz deve essere preservato per i segmenti ST a massima fedeltà e forse un passa-basso di 40 Hz per gli adulti e 150 Hz per i pedali nel resto dell'ECG (È consigliabile anche un filtro a intaglio appropriato per la frequenza di linea) . Non ho familiarità con il FIR di Savitzky-Golay, ma è necessario fare attenzione per garantire che conservi frequenze importanti nell'ECG. – user7116

+1

+1 grazie per l'informazione. Vorrei sottolineare che non ho molta conoscenza del dominio dei segnali ECG, la risposta di cui sopra era semplicemente da una prospettiva di elaborazione del segnale pura (elencando varie funzioni che si potrebbero usare per filtrare un segnale in generale). La verità è che non sono così familiare con il filtro SG, l'ho menzionato perché l'ho visto spesso nella letteratura relativa all'ECG: http://www.uap-bd.edu/jcit_papers/vol-1_no- 2/IJCIT-110126.pdf – Amro

+0

Carta pulita, grazie per il riferimento! Un confronto morfologico dell'ECG risultante è il fattore più importante quando si considerano i filtri. Tuttavia, per il semplice monitoraggio ambulatorio (che molti chiamerebbero "interpretazione del ritmo") si ha un'ampia latitudine nella selezione del filtro come si è in Ok con qualche distorsione del segnale. – user7116

1

Due filtro strumenti di progettazione/demo che si consiglia di controllare:

Questi dovrebbero darvi la possibilità di provare diversi filtri e parametri di filtro per vedere come si comportano con i dati ECG/ECG.

+0

Quando si scelgono i filtri, è in genere necessario un passa-alto non superiore a 0,05 Hz per garantire l'alta fedeltà dei segmenti ST per gli usi diagnostici dell'ECG. I filtri passa-basso intorno a 40 Hz sono Ok per gli adulti, 150 Hz per i peds e se desideri vedere gli impulsi del pacemaker, 150-200Hz è bello avere a disposizione. – user7116