Digitale Filterung nach Analog-Digital-Wandlung (ADC)

Ich mache eine Leiterplatte, die ein Signal mit einem Frequenzband von 3-50 Hz und Spitzen von bis zu 10 uV empfängt. Ich habe geeignete analoge LP- und HP-Filter (Bandpass) implementiert und verwende einen isolierten 16-Bit-ADC, um die Daten an einen Computer zu senden.

Ich verwende Python, um die Zeilen (Derial-Kommunikation) vom ADC (der als Slave zu meiner MCU fungiert) zu lesen. Das Systemdiagramm würde ungefähr so ​​​​aussehen:

schematisch

Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan

Wenn ich meine Daten erhalte und eine Echtzeit-FFT durchführe (da es sich um ein nicht stationäres Signal handelt), ist ein offensichtliches Merkmal eine Spitze bei 50 Hz (das Netz hat in Großbritannien eine Frequenz von 50 Hz) und dafür kann ich Fügen Sie einen Kerbfilter hinzu, um die 50-Hz-Komponente zu unterdrücken, aber das würde zusätzliche Kosten und Zeit für die Implementierung bedeuten.

Ich habe nicht viel Erfahrung mit digitaler Filterung, aber ich dachte, anstatt einen hardwarebasierten analogen Filter zu implementieren, ist es möglich, das folgende Verfahren durchzuführen:

  1. Führen Sie die FFT durch.
  2. Verwerfen und unterdrücken Sie die 50-Hz-Komponente.
  3. Konvertieren Sie das Signal zurück in den Zeitbereich.
  4. Führen Sie die Analyse durch.

Wird die Zeitverzögerung für diese Art der Filterung nur die Anzahl der Maschinenzyklen sein, die der Computer durchläuft, um diese Aufgabe auszuführen?

Wenn dies plausibel ist, ist etwas falsch daran, das Signal nur zu verstärken und die hochfrequenten Geräusche und Spitzen mit einem passiven Filter zu beseitigen und alle erwähnten Filter (Notch, LP und HP) im Computer mit Python oder einem anderen durchzuführen Software-Methodik für diese Angelegenheit?

Ist es in Bezug auf die Auflösung richtig anzunehmen, dass die endgültige Signalauflösung, die analysiert wird, die Multiplikation der Auflösung des ADC mit der Auflösung der digitalen Filterung ist, da in meinem Code Werte als 32-Bit-Gleitkommazahlen gespeichert werden?

Normalerweise sind digitale Filter eher wie Softwaresimulationen von analogen Filtern. Es ist nicht erforderlich, eine ganze FFT durchzuführen, um eine Frequenz zu entfernen.
Was meinst du mit dem letzten Teil über die Auflösung? Wenn ich das richtig verstehe, gewinnen Sie keine Genauigkeit, weil Sie den Wert mit mehr Bits als der ADC speichern
Wenn die 50-Hz-Amplitude weniger als ein paar Prozent Ihres A/D-Bereichs beträgt, ist die digitale Filterung mit einem FIR-Filter höherer Ordnung wahrscheinlich die praktischste Lösung. Wenn die Rauschamplitude groß ist, könnte ich untersuchen, warum das so ist, und sicherstellen, dass es kein größeres Problem an anderer Stelle in Ihrem System gibt.
Sie könnten die Samples mit einem digitalen Biquad-Notch-Filter bei 50 Hz verarbeiten und sehen, was passiert. Es wäre auch eine gute Sache, zu versuchen, die 50 Hz aus Ihrem Eingang herauszuholen.
Wenn Sie einen PC verwenden, stehen Ihnen viele Bibliotheken für die digitale Signalverarbeitung zur Verfügung. Wenn Sie nicht bereit sind, Ihre eigene Software zu erstellen, können Sie Matlab oder Octave (Open Source) für FFT verwenden.

Antworten (3)

Wenn Ihr gewünschtes Band 3 bis 50 Hz beträgt, ist es nicht möglich, 50 Hz mit einem praktischen Filter auszublenden, ohne etwas vom oberen Ende Ihres Bandes zu verlieren.

Können Sie einen digitalen Filter verwenden oder müssen Sie einen analogen verwenden? Es hängt vom Signal-Rausch-Verhältnis am ADC ab. Wenn Ihre 50-Hz-Störung so hoch ist, dass Sie die Verstärkung vor dem ADC so weit herunterdrehen, dass Ihr Signal verrauscht wird, benötigen Sie davor einen analogen Filter. Wenn Sie sowohl Interferenzen als auch Signale mit einer angemessenen Verstärkung erhalten, ohne den ADC zu überlasten, können Sie nach dem ADC einen digitalen Filter verwenden.

Es gibt eine trivial einfache Implementierung einer 50-Hz-Kerbe, die Sie entweder in der MCU oder in Python anwenden können, es besteht keine Notwendigkeit, eine relativ teure FFT-Operation zu verwenden. Wenn Sie Samples über einen Zeitraum von 20 ms addieren, werden 50 Hz ausgeklinkt. Es besteht keine Notwendigkeit, alle diese Hinzufügungen für jedes Ausgangsmuster vorzunehmen. Es ist effizienter, ein 20 ms langes Schieberegister und einen Akkumulator zu haben, den aktuellen Abtastwert in den Akkumulator zu addieren und den Abtastwert von vor 20 ms zu subtrahieren.

Dieser einfache Filter gibt Ihnen einen fallenden Frequenzgang über Ihr Durchlassband. Muss es vor Ihrer Analyse korrigiert werden? Es hängt davon ab, was ist Ihre Analyse, was ist die Spezifikation für die Flachheit über das Band? Die Korrektur könnte von dem einfachen/schwergängigen Prozess reichen, der Antwort mit ein paar Fingertipps ein wenig Steigung hinzuzufügen, bis hin zum Entwerfen eines geeigneten Notch-Filters. Die Komplexität dieser Aufgabe hängt von Ihrer Abtastrate, Ihrer Flachheit und jeder Gruppenverzögerungsspezifikation ab. IIR-Filter sind gut, wenn etwas Oversampling und keine Gruppenverzögerungsspezifikation vorhanden ist.

Sollten Sie am Ende einen FIR-Filter haben, der mehr als ein Dutzend Taps lang ist, kann es angebracht sein, die Fourrier-Faltung zu verwenden, um ihn schneller zu implementieren als den naiveren Multiplikations-Akkumulations-Ansatz.

Sie müssen eine aktive Schutztechnik verwenden, um CM 50 Hz Ingress zu eliminieren und nicht so gute CMRR wie INA, aber gut genug für EEG zu erreichen.

Sie nennen dies Right Leg Guard oder fahren RLD. Um CM-Signalrückkopplung zum aktiven Körper GND zu verwenden, so dass 50-Hz-Rauschen an RLD zurückgekoppelt wird.

Wird die Zeitverzögerung für diese Art der Filterung nur die Anzahl der Maschinenzyklen sein, die der Computer durchläuft, um diese Aufgabe auszuführen?

Ja, es wird eine Verzögerung hinzufügen. Es hängt wirklich davon ab, ob die Daten in Echtzeit (mit minimaler Verzögerung) gefiltert werden müssen. Bei digitaler Echtzeitfilterung hängt die Verzögerung von der Geschwindigkeit des Prozessors ab, davon, wie lange der Prozessor für Multiplikations- und Additionsoperationen benötigt, ob der Prozessor Speicher für die FFT abrufen muss (Sie möchten, dass sich die FFT im Prozessor-Cache befindet). machen Sie die Verzögerung so klein wie möglich, wenn dies nicht der Fall ist, geht der Prozessor zum Speicher, der das Abrufen um mehrere Taktzyklen verzögern kann). Möglicherweise möchten Sie auch einen FIR- oder IIR-Bandpassfilter in Betracht ziehen, der für eine ähnliche Filterung viel weniger Rechenressourcen benötigen kann.

Wenn dies plausibel ist, ist etwas falsch daran, das Signal nur zu verstärken und die hochfrequenten Geräusche und Spitzen mit einem passiven Filter zu beseitigen und alle erwähnten Filter (Notch, LP und HP) im Computer mit Python oder einem anderen durchzuführen Software-Methodik für diese Angelegenheit?

Die Nachbearbeitung der Daten ist mit digitalen Filtern ziemlich einfach, das Schöne an der digitalen Filterung ist, dass sie über Software konfigurierbar ist. Die analoge Filterung ist nicht so konfigurierbar. Die eigentliche Frage ist: Müssen die Daten in Echtzeit gefiltert werden? (Für Regelkreise oder andere Rückkopplungen sind Verzögerungen schlecht, sodass digitales Filtern ein Problem sein kann). Ein Anti-Alasing-Filter vor einem ADC ist eine übliche Methode, um Rauschen zu reduzieren, bevor es an einen Computer gesendet wird.

Ist es in Bezug auf die Auflösung richtig anzunehmen, dass die endgültige Signalauflösung, die analysiert wird, die Multiplikation der Auflösung des ADC mit der Auflösung der digitalen Filterung ist, da in meinem Code Werte als 32-Bit-Gleitkommazahlen gespeichert werden?

Digitale Filter können Quantisierungsrauschen einführen, die Berechnung dieses Rauschens ist eine ganze Wissenschaft für sich. Abhängig von den verfügbaren Rechenressourcen kann die Umwandlung in Doubles oder Floats das Quantisierungsrauschen reduzieren.