Ich versuche, einen Hochpassfilter für elektroenzephalografische (EEG) Datensätze zu erstellen, um sehr langsame Abweichungen zu vermeiden. Frequenzen um 0,3 Hz sind jedoch für die Forschung, der diese Daten dienen, sehr wichtig.
Ich benutze Matlab und habe verschiedene Dinge ausprobiert. Es scheint, dass eine sehr niedrige dB-Dämpfung von 3 dB für FIR-Filter in Ordnung ist. Zum Beispiel habe ich das benutzt:
h=fdesign.highpass('Fst,Fp,Ast,Ap',0.005,0.01,3,1,250); % i needed to cut
d=design(h,'butter');
fvtool(d)
Dieser Filter erzeugt jedoch zu Beginn der Daten eine Gleichstromdrift, und ich möchte diese ersten Datenpunkte nicht verlieren.
Ich habe Ihre Seiten durchgelesen, dass eine clevere Idee darin besteht, einen Tiefpassfilter zu entwerfen, den ich später von den realen Daten abziehen würde. Ich habe es mit einem Equiripple-Filter gemacht und es hat funktioniert, aber einen Grundlinienlift hinterlassen. Ich möchte jetzt keine durchschnittliche Entfernung ausführen, da dies ein nächster Schritt im Analyseprotokoll ist.
Irgendwelche Vorschläge?
Antworten:
Sie fragen nach einer Zeitmaschine: Um den Gleichstromstoß bei zu vermeiden , müssen Sie den Zustand des Filters kennen, als ob er vor Beginn der Aufnahme gelaufen wäre. Das wird nicht passieren, egal welche Art von Filter Sie verwenden.t = 0
Hier ist ein Trick, der kann für Sie nützlich sein. Angenommen , Sie haben ein Tap-FIR-Filter (oder ein IIR-Filter, dessen Impulsantwort nach Abtastwerten angemessen auf 0 abfällt ). Nehmen Sie die ersten Abtastwerte Ihres Signals, kehren Sie sie um und stellen Sie diese dem Beginn Ihres Signals voran. Tatsächlich definieren wir zum Filtern ein neues Signal . Wenn Sie das filtern, wurde der Filterzustand bereits mit dem Anfangssignal "vorbereitet": Löschen Sie die ersten Abtastwerte des Ausgangs, und der DC-Bump sollte hoffentlich verschwunden sein.N N g ( t ) = g ( - t ) = f ( t ) N.N. N. N. G( t ) = g( - t ) = f( t ) N.
Es ist unnötig zu erwähnen, dass dieses Schema zahlreiche Fallstricke aufweist. Für den Anfang ist es für die Echtzeitverarbeitung schwieriger, und wenn die Signalableitung bei hoch ist , treten bei den ersten Abtastwerten immer noch Vertrauensprobleme auf. Aber es sollte die Beule loswerden.t = 0
quelle
Schauen Sie sich die Filtfilt-Funktion an. Es gibt eine Nullphasenantwort und eine perfekte Sprungantwort. Insbesondere die Sprungantwort-Eigenschaft der Filtfilt-Filterung kann Ihr Problem lösen.
quelle
Ich habe den Trick gemacht, den Herr Rtollert erklärt hat, und dachte, es sei das Beste, was ich tun kann.
Wenn Sie den Weg der kontinuierlichen Abtastung / Hardwarekompensation beschreiten, könnte die Effizienz Sie an DC-Blockern interessieren, wie sie von Randy Yates und Richard Lyons in dsp Tips & Tricks März 2008 beschrieben wurden
quelle
Ich habe etwas ausprobiert, das gut funktioniert hat - für den angegebenen Verstärker. Der Matlab-Code ist hier: https://sites.google.com/site/marialstavrinou/home/dc-offset-removal-filter-in-matlab .
quelle
Der absolute Gleichstromwert ist Ihnen egal, richtig?
Warum fügen Sie Ihren Daten nicht einfach einen statischen Versatz hinzu, sodass der erste Datenpunkt bei Null liegt?
Sicher, Sie müssten den Offset zu jedem Datenpunkt hinzufügen, aber dies würde die großen Probleme mit der Sprungantwort, die Sie mit dem Filter haben, vollständig vermeiden.
Tatsächlich startet der Filter initialisiert auf Null. Wenn Ihre Daten beginnen, sieht der Filter daher einen großen Treppenschritt von Null zu dem DC-Pegel, den Sie haben.
Fügen Sie einfach einen Versatz hinzu, um die Treppenstufe zu entfernen.
quelle
Warum nicht durchschnittlich entfernen? Der spätere Schritt, der es "wieder" macht, hat einfach keine Wirkung (es würde Null subtrahieren).
quelle