MATLAB, Wie filtere ich ein diskretes Signal?


8

Ich habe eine 1-mal-10000-Matrix von Double`s in einer Datei namens "fecg.mat" gespeichert. Die Matrix repräsentiert die Größe eines aufgezeichneten FECG-Signals.

Ich habe es gegen die Zeit geplottet (von 0 bis 9999):

Geben Sie hier die Bildbeschreibung ein

Zum Entfernen der Grundlinie frage ich mich, ob ich einen Hochpassfilter verwenden kann. Wie entwerfe ich einen richtigen Filter?

PS Signalverarbeitung ist nicht mein Fachgebiet. Ich habe keine Ahnung, wie man ein diskretes Zeitbereichssignal filtert.


1
Ich würde bemerken, dass es für einige komplexe Wellenformen (wie Videosignale) effektiver ist, ein Merkmal der Wellenform zu "klemmen", als zu versuchen, das Signal zu "filtern", um niederfrequentes Rauschen zu entfernen. In diesem Fall gibt es jedoch keine offensichtliche Funktion, an der geklemmt werden kann.
Daniel R Hicks

1
Sie möchten also ein fetales EKG aus dem EKG der Mutter herausfiltern, und das fetale EKG hat eine hohe Frequenz. Ich würde das Signal mithilfe eines Fensterfilters in den Frequenzbereich (FFT) übertragen, um die Frequenz in verschiedenen Zeitrahmen zu erhalten, und dann die resultierenden Frequenzen über die verschiedenen Zeitfenster betrachten, um festzustellen, bei welcher Frequenz gefiltert werden soll. Wenn Sie die numerischen Werte der Zeit und der Frequenzen kennen möchten, benötigen Sie weiterhin die Abtastrate. Wenn Sie nur sehen möchten, dass es konstant ist, brauchen Sie es möglicherweise nicht.
Danny Varod

Antworten:


6

Der einfachste Weg, die Basislinie zu entfernen, besteht darin, den Durchschnitt zu entfernen:

filtered = original - mean(original);

Tatsächlich ist der Durchschnitt der erste Koeffizient der Fourier-Transformation, es handelt sich also um eine sehr scharfe Filterung: Sie eliminieren den Gleichstromkoeffizienten.

Wenn Sie eine klassischere Filterung wünschen, überprüfen Sie Funktionen wie butterund Freunde, die einen IIR-Filter synthetisieren, und filterfiltern Sie dann Ihr Signal heraus.

Matlab enthält auch ein Filterdesign-Tool.


3

MATLAB verfügt über ein Filterdesign-Tool namens fdatool. Führen Sie das fdatool in MATLAB aus. Es bietet Ihnen eine visuelle Benutzeroberfläche, in der Sie die Filterparameter ändern können. Wählen Sie dort einen Hochpassfilter und eine Grenzfrequenz. Wenn Sie mit der Filterform zufrieden sind, exportieren Sie sie in den MATLAB-Arbeitsbereich. Angenommen, Ihr Filtername ist myFilter und Ihr Signalname ist mySignal. Um das Signal in MATLAB zu filtern, geben Sie Folgendes ein: filteredSignal = conv (mySignal, myFilter).


3

Wenn Sie den Frequenzinhalt des gewünschten Signals kennen, können Sie etwas unter dieser Frequenz hochpassieren. Angenommen, Sie interessieren sich nur für Signale über 2 Hz und Ihre Abtastrate beträgt 100 Hz. Dann können Sie dies wie folgt tun:

[b,a] = butter(3,2/(100/2),'high');
outputData = filter(b,a,inputData);

In diesem speziellen Beispiel wird ein Butterworth-Hochpass 3. Ordnung verwendet.


Vielen Dank. Ich habe keine Frequenz und Abtastrate, aber ich denke, ich sollte sie schätzen, da die Frequenz der EKG-Signale meist im Bereich von 0,1 bis 250 Hz liegt.
hoo_man

1
@hoo_man Wenn Sie die Abtastrate nicht kennen, sind die Informationen bedeutungslos. Sie müssen fragen, wer Ihnen die Messung gegeben hat. PS Die Abtastrate sollte mindestens 2 * der maximalen Signalfrequenz betragen.
Danny Varod

@DannyVarod: Also unter diesen Umständen ist der einzige Weg, die Abtastrate durch Versuch und Irrtum zu finden ... Ich beginne mit 500Hz
hoo_man

Es muss keine runde Zahl sein. Was möchten Sie mit den Daten machen?
Danny Varod

@DannyVarod: Meistens beträgt die Abtastrate für die Aufzeichnung von EKGs etwa 400 Hz bis 500 Hz. Ich möchte das fetale EKG aus dem mütterlichen EKG extrahieren. Zuerst muss ich die Grundlinie entfernen.
hoo_man

1

Welcher Filter wirklich verwendet werden soll, hängt von der jeweiligen Anwendung ab. - Ein zu grober Filter könnte die gesuchten Informationen entfernen!

Der weit verbreitete Pan-Tompkins-Algorithmus (zur QRS-Erkennung) spezifiziert einen Filter zum Entfernen der Basislinie in EKG-Daten. Anhand der begrenzten Informationen, die Sie angegeben haben, ist es jedoch schwierig festzustellen, ob dieser Filter für Ihre Anwendung geeignet ist. Bitte erläutern Sie eine genauere Antwort.


4
Tiefpass zum Erkennen der Grundlinie. Um es zu entfernen, sollten Sie das Ergebnis des Tiefpasses vom ursprünglichen Signal subtrahieren und so effektiv einen Hochpassfilter erzeugen, nicht wahr?
Castilho

Du hast recht - ich habe diesen Teil auf den Kopf gestellt. Danke, dass du das korrigiert hast.
Mola

Ich gab das Signal durch ein, LPFwie Castilho sagte. aber die Grundlinie, die ich erhielt, war verzögert. Wenn ich die Grundlinie und das ursprüngliche Signal abgleichen möchte, um sie zu subtrahieren, sollte ich eines davon verschieben, oder gibt es einen besseren Weg?
hoo_man

1

Ich würde Ihnen empfehlen, einen adaptiven Filter zum Entfernen des 50-Hz-Grundrauschens zu verwenden. Ein lms adaptiver Filter würde gut funktionieren:

xk = sin(2*pi*50*t1);
dk = ecg1; 
bk = [0 0 0];                       %Gewichteter Vektor (FIR Koefizienten mit Anfangswert 0)
                                    %Die Werte ändern sich ständig bis sich
                                    %das System adaptiert hat

mu = .1;                            %Konvergenzgeschwindigkeit des Algorithmes.
                                    %( 0 < mu < 1/(20*(L+1)*Potenz_xk); L Filterorder)                                
Pot_x=mean(xk.*xk);
%mu=1/(100*(L+1)*Pot_x);            % Konvergenzgeschwindigkeit des Algorithmus.
                                    % Bei den Prädiktiven Adaptiven filter
                                    % gilt die Potenz nicht




yk=zeros(size(xk));                 % Ausgangssignal zum Zeitpunkt t=0 von der FIR.
ek=zeros(size(xk));                 % Fehlersignal zum ZEitpunkt t=0.

%Algorithmus für FIR Adaptiven Filter:
for n = 3:(punkte - 1)                          %Arranca en 3 porque tiene que almacenar las dos muestras anteriores y la actual (FIR de 2 coeficientes)
    xkn = [xk( n ) xk( n - 1 ) xk( n - 2 )];    %Vector niésimo (2 posiciones porque son dos coeficientes).
    yk(n) = xkn * bk';                          %Resultado parcial de la salida por el vector bk traspuesto.
    ek(n) = dk(n) - yk(n);                      %Señal de error parcial.
    bk = bk + 2*mu*ek(n)*xkn;                   %Actualización instante a instante del vector de pesos.  
end                                             %Ende des adaptiven Algorithmes.

Eje1 = figure(1);
set(Eje1,'name','Übung 1: FIR Adaptive Filter','position',[10 10 900 650]);
subplot( 2, 1, 1 );
plot( t1, xk, 'r');
xlabel('n');
ylabel('EKG mit Rauschen');
title('Eingangssignal: Bewegungsartifakt zu filtern');
subplot( 2, 1, 2 );
plot( t1, ek, '-k');
xlabel('n');
ylabel('d[k] - y[k]');
title('Ausgangssignal: EKG ohne Rauschen');
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.