Parameter für low-pass fir filter mit scipy
Ich versuche zu schreiben, einen einfachen low-pass-filter mit scipy, aber ich brauche Hilfe die Definition der Parameter.
Habe ich 3,5 Millionen Datensätze in die Zeitreihen-Daten, die gefiltert werden, und die Daten abgetastet bei 1000 hz.
Ich bin mit signal.firwin und signal.lfilter aus der scipy-Bibliothek.
Die Parameter wähle ich im code unten nicht filter meine Daten an alle. Stattdessen den code unten einfach produziert etwas, das grafisch aussieht wie die gleichen Daten, außer für eine Zeit, phase-distortion, verschiebt sich der graph nach rechts um etwas weniger als 1000 Datenpunkte (1 Sekunde).
In einem anderen software-Programm, das ausführen eines Tiefpass-fir-filter durch die grafische Benutzer-Schnittstelle Befehle, erzeugt eine Ausgabe, die ähnlich wie bedeutet, für jede 10 Sekunde (10,000 Datenpunkt) segment, aber das hat sich drastisch niedrigeren Standardabweichungen, so dass wir im wesentlichen zu verlieren, die Lärm in dieser bestimmten Daten-Datei und ersetzen Sie es mit etwas behält, dass der Mittelwert während mit längerfristigen trends, die sind nicht belastet durch die höheren Frequenz-Lärm. Die anderen software-Parameter das Dialogfeld enthält ein Kontrollkästchen, die Sie auswählen, die Anzahl der Koeffizienten, so dass es "optimiert, basierend auf sample-Größe und die sampling-Frequenz." (Meine sind 3,5 Millionen Proben, die bei 1000 hz, aber ich würde gerne eine Funktion, die verwendet diese Eingänge als Variablen.)
*Kann jemand mir zeigen, wie Sie den code unten, so dass es entfernt alle Frequenzen oberhalb von 0,05 hz?* Ich möchte sehen, wie glatte Wellen in der Grafik, anstatt nur die Zeit, die Verzerrung des gleichen Graphen, die bekomme ich aus dem code unten jetzt.
class FilterTheZ0():
def __init__(self,ZSmoothedPylab):
#------------------------------------------------------
# Set the order and cutoff of the filter
#------------------------------------------------------
self.n = 1000
self.ZSmoothedPylab=ZSmoothedPylab
self.l = len(ZSmoothedPylab)
self.x = arange(0,self.l)
self.cutoffFreq = 0.05
#------------------------------------------------------
# Run the filter
#------------------------------------------------------
self.RunLowPassFIR_Filter(self.ZSmoothedPylab, self.n, self.l
, self.x, self.cutoffFreq)
def RunLowPassFIR_Filter(self,data, order, l, x, cutoffFreq):
#------------------------------------------------------
# Set a to be the denominator coefficient vector
#------------------------------------------------------
a = 1
#----------------------------------------------------
# Create the low pass FIR filter
#----------------------------------------------------
b = signal.firwin(self.n, cutoff = self.cutoffFreq, window = "hamming")
#---------------------------------------------------
# Run the same data set through each of the various
# filters that were created above.
#---------------------------------------------------
response = signal.lfilter(b,a,data)
responsePylab=p.array(response)
#--------------------------------------------------
# Plot the input and the various outputs that are
# produced by running each of the various filters
# on the same inputs.
#--------------------------------------------------
plot(x[10000:20000],data[10000:20000])
plot(x[10000:20000],responsePylab[10000:20000])
show()
return
InformationsquelleAutor MedicalMath | 2010-11-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Cutoff ist normiert auf die Nyquist-Frequenz, die der Hälfte der Abtastrate. Also mit FS = 1000 und FC = 0.05, Sie wollen cutoff = 0.05/500 = 1e-4.
Die filter-Ausgang wird verzögert eine halbe Sekunde (der filter ist zentriert auf Tippen Sie auf 500). Beachten Sie, dass der DC-offset Hinzugefügt, durch den Lärm beibehalten werden, indem die low-pass-filter. Auch, 0.025 Hz ist gut im pass-Bereich, so der output-swing von Spitze zu Spitze ist etwa 2.
InformationsquelleAutor eryksun
Den Einheiten der cutoff-freq, sind wahrscheinlich [0,1), wo 1.0 ist äquivalent zu FS (sampling-Frequenz). Also, wenn Sie wirklich meinen, 0,05 Hz und FS=1000Hz, würden Sie wollen, um pass
cutoffFreq /1000
. Sie müssen möglicherweise einen längeren filter zu bekommen, wie ein low cutoff.(BTW Sie auf der Durchreise sind einige Argumente, die aber dann mit dem Objekt-Attribute anstelle, aber ich sehe nicht, dass die Einführung offensichtliche bugs noch nicht...)
InformationsquelleAutor Ben Jackson