Scipy FFT-Frequenz-Analyse von sehr verrauschtes signal
Habe ich laut Daten, für die ich berechnen wollen, Frequenz und amplitude. Die Proben wurden alle 1/100stel Sek. Von trends, ich glaube, die Frequenz auf ~ 0.3
Wenn ich numpy
fft
Modul, ich am Ende immer sehr hohe Frequenz (36.32 /sec) und das ist eindeutig nicht korrekt. Ich habe versucht, die Daten zu filtern mit pandas
rolling_mean
die Geräusche zu beseitigen, bevor fft, aber auch das hat nicht funktioniert.
import pandas as pd
from numpy import fft
import numpy as np
import matplotlib.pyplot as plt
Moisture_mean_x = pd.read_excel("signal.xlsx", header = None)
Moisture_mean_x = pd.rolling_mean(Moisture_mean_x, 10) # doesn't helps
Moisture_mean_x = Moisture_mean_x.dropna()
Moisture_mean_x = Moisture_mean_x -Moisture_mean_x.mean()
frate = 100. #/sec
Hn = fft.fft(Moisture_mean_x)
freqs = fft.fftfreq(len(Hn), 1/frate)
idx = np.argmax(np.abs(Hn))
freq_in_hertz = freqs[idx]
Kann jemand mich leiten, wie man dieses Problem beheben?
- 1) der code ist in Ordnung. 2) warum rechnen Sie 0,3 Hz? Ich zähle 6/8 Gipfeln in 2500 Sekunden, für eine Schätzung der dominanten low-freq von über 0.0024 zu 0.0032 Hz. 3) Was ist falsch mit 36.32 Hz, also warum sind Sie sicher, dass das nicht richtig? 4) Wenn Sie wirklich wollen, um den Vorfilter das signal mit einer sanften bedeutet, wählen Sie eine Fenstergröße von 1 abweichender. So wie es jetzt ist, wird der Anruf zu
rolling_mean()
ist nichts zu tun. - Ich nehme an, das Bild zeigt 2500 Proben, nicht 2500 Sekunden. Das macht eine Reichweite von 0,24 auf 0,32 Hz, was sicherlich enthält 0.3.
- gut erkannt
- sorry, war Tippfehler mit
rolling_mean
, es jetzt behoben.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du hast Recht, es ist etwas falsch. Man braucht, um explictiy Fragen pandas für die nullte Spalte:
Sonst etwas falsch passieren, das Sie sehen können, durch die Tatsache, dass die FFT-Ergebnis war nicht symmetrisch, das sollte der Fall sein, die real-Eingang.
Scheint, wie @tillsten bereits Ihre Frage beantwortet, aber hier ist einige zusätzliche Bestätigung. Die erste Handlung ist, Ihre Daten (Mittelwert null, und ich änderte es in eine csv). Die zweite ist die spektrale Leistungsdichte, und Sie können sehen, eine Fettmasse mit einem peak bei ~0,3 Hz. Ich 'gezoomt' auf den Dritten plot zu sehen, ob es einen zweiten versteckten Frequenz in der Nähe der wichtigsten Frequenz.
Diese Drucke:
freqs = fft.fftfreq(len(Hn), 1/frate) ; ind = np.arange(1,len(Hn)/2+1 ) ; psd = np.abs(Hn[ind])**2+ np.abs(Hn[-ind])**2 ; cut = 0.7*psd.max() ; ind1 = np.where(psd > cut) ; freq_in_hertz = freqs[ind[ind1]].mean()
.idx =np.argmax(np.abs(Hn)[:5])
freq_in_hertz = freqs[idx]
und es stellt sich heraus, dass 0.16006402561 (genau die Hälfte 0.32012...).Einer FFT ist eine Filterbank. Suchen Sie einfach den Umfang peak nur im Rahmen der zu erwartenden Frequenzbereich der FFT-Ergebnis (anstatt das gesamte Ergebnis-Vektor), und die meisten anderen Spektrum wird im wesentlichen herausgefiltert werden.
rolling mean(...,100)
wodurch ich schön geglätteten signal[1], das Ergebnis bleibt 34.8 Hz! Das gibt mir das Gefühl, dass mir etwas fehlt. [1]dropbox.com/s/75e0pgdcdzue9a5/smooth_signal.png?dl=0Es ist nicht notwendig, das signal zu filtern vorher, da die FFT ist einen filter. Überspringen Sie einfach jene Teile der FFT entsprechen Frequenzen wissen Sie enthalten eine Menge Lärm - null, Sie aus, oder andernfalls ausgeschlossen werden.
Ich hoffe das kann dir helfen.
http://wiki.scipy.org/Cookbook/ButterworthBandpass
Sollte man filter nur die band um die erwartete Häufigkeit und verbessern den signal-Rausch-Verhältnis vor der Anwendung der FFT.
Edit:
Mark Lösegeld gab eine intelligentere Antwort, wenn Sie zu tun haben, die FFT können Sie einfach schneiden Sie das Rauschen nach der transformation. Es wird nicht geben, ein schlechteres Ergebnis, als würde ein filter.
rolling_mean( .., 10)
und bekam 36.4 Hz.Sollten Sie einen low-pass-filter, die halten, sollten die größeren periodische Variationen und glätten einige der größeren Häufigkeit Zeug zuerst. Danach dann tun können, FFT, um die Gipfel. Hier ist ein Rezept für FIR-filter typisch für diese genaue Art der Sache.