fft Bandpassfilter in Python

8

Was ich versuche ist, meine Daten mit fft zu filtern. Ich habe ein verrauschtes Signal mit 500Hz als 1d-Array aufgenommen. Meine Hochfrequenz sollte mit 20Hz und meine Niederfrequenz mit 10Hz abschneiden. Was ich versucht habe, ist:

%Vor%

Was ich jetzt bekomme, sind komplexe Zahlen. Also muss etwas falsch sein. Was? Wie kann ich meinen Code korrigieren?

    
men in black 01.10.2013, 17:15
quelle

2 Antworten

13

Es ist erwähnenswert, dass die Größe der Einheiten von bp nicht unbedingt in Hz liegt, sondern von der Abtastfrequenz des Signals abhängt. Sie sollten scipy.fftpack.fftfreq für die Konvertierung. Auch wenn Ihr Signal echt ist, sollten Sie % co_de verwenden % Hier ist ein minimales Arbeitsbeispiel, das alle Frequenzen unterhalb eines bestimmten Betrags herausfiltert:

%Vor%

Wir können die Entwicklung des Signals im Real- und Fourier-Raum darstellen:

%Vor%

    
Hooked 01.10.2013, 19:30
quelle
6

Es gibt einen fundamentalen Fehler in dem, was Sie hier versuchen - Sie wenden ein rechteckiges Fenster in der Frequenzdomäne an, was zu einem Zeitbereichssignal führt, das mit einer Sinc-Funktion gefaltet wurde. Mit anderen Worten, es wird eine große Menge an "Klingeln" in dem Zeitbereichssignal aufgrund der Schrittänderungen geben, die Sie in der Frequenzdomäne eingeführt haben. Der richtige Weg, um diese Art von Frequenzdomänenfilterung durchzuführen, besteht darin, eine geeignete Fensterfunktion in der Frequenzdomäne anzuwenden. Jedes gute DSP-Buch sollte dies abdecken.

    
Paul R 01.10.2013 17:39
quelle