Hallo,
ich hab ein Nutzsignal bei welchem ich die Frequenzen 50 Hz, 100 Hz, 150
Hz...2500 Hz betrachten soll. Abgetastet wird dieses mit 8 kHz und die
Betrachtung soll alle 200ms erfolgen. Somit werden 1600 Samples
generiert. Ich habe das ganze mal in Python simuliert und kann nach
einer FFT die Einzelfrequenzen die ich als Testsignal addiere schön
sehen. Die Frequenzauflösung der FFT beträgt 5 Hz und somit sind alle
relevanten Frequenzen in der FFT als Wert vorhanden.
Nun muss ich das aber auf einem STM32F4 machen. Hier benötige ich ja für
die FFT eine passende Anzahl an Werte (2^x). Der nächste passende wäre
also 2048. Ich habe nun das Signal mal mit Nullen gepadded auf 2048
Werte und ne FFT in Python gerechnet. Nun liegt aber die
Frequenzauflösung bei ca. 3,9 Hz. Die gewünschten Frequenzen sind nun
nicht mehr exakt getroffen. Die Frequenzen im Bereich der Testsignale
lassen darauf schließen wie der Wert aussehen könnte. Ich weiss jedoch
nicht wie ich korrekt an den Wert komme. Gibt es hier ein
Mittelungsverfahren? An sich müssten die Frequenzen ja abhängig vom
Abstand der interessanten Frequenz gewichtet werden damit diese
aufaddiert werden können oder?
Kennt hier jemand ein Verfahren?
Im Bild habe ich die beiden Frequenzgänge geplottet. Die blaue Kurve mit
den roten Punkten ist die FFT mit 5 Hz Auflösung und die orange Kurve
mit den blauen Punkten ist die FFT mit den 3,9 Hz Auflösung. Das Signal
hat bei 50 Hz eine Amplitude von ca. 325V und bei 100 Hz eine Amplitude
von ca. 8V.
Viele Grüsse,
cc schrieb:> Die Frequenzen im Bereich der Testsignale lassen> darauf schließen wie der Wert aussehen könnte. Ich> weiss jedoch nicht wie ich korrekt an den Wert> komme. Gibt es hier ein Mittelungsverfahren?
Ein Zauberwort heißt "zero padding", ein anderes
"Fensterung".
1000V Dc schrieb:> Erhöhe doch die Abtastrate soweit das du wieder auf die 5Hz> kommst?
Kostet ja aber Rechenzeit und Speicher, daher nicht die Lösung die ich
suche...
Egon D. schrieb:> Ein Zauberwort heißt "zero padding", ein anderes> "Fensterung".
Zero padding mache ich ja schon - aber wenn ich nicht endlos viele Daten
bekommen möchte kann ich mich ja nur annähern an die Frequenzen.
Kannst du erläutern was du hier mit Fensterung meinst?
Zombie schrieb:> Wenn dich wirklich nur die oben angegebenen Frequenzen> interessieren,> wäre nicht Goertzel passender und effizienter?
Interessanter Ansatz, muss ich mir mal anschauen...
Moin,
Mal so ganz theoretisch: Du hast da ja einzelne Punkte mit hellblauen,
bzw. orangenen Geraden verbunden. Das haut so nicht hin.
Die sollten eigentlich mit einer um die Frequenz verschobenen sin(x)/x
Funktion verbunden sein. Bei der hellblauen Linie "gehts schoen auf",
d.h. der sin(x)/x ist fuer alle x ausser dem bei 50Hz dann 0. Die Punkte
in der orangenen sin(x)/x funktion treffen halt nicht immer 0 bzw. das
Maximum bei 50 Hz.
Gruss
WK
Dergute W. schrieb:> Das haut so nicht hin.> Die sollten eigentlich mit einer um die Frequenz> verschobenen sin(x)/x Funktion verbunden sein.
Genau.
Was glaubst Du, was passendes "zero padding" bewirkt?
Wenn die Frequenz zwischen zwei FFT "Bins" liegen, dann sieht man die
Leitung des Signals auf die beiden benachbarten Bins verteilt. Daraus
lässt sich dann die tatsächliche Frequenzlage interpolieren. Unter
https://indico.cern.ch/event/132526/contributions/128902/attachments/99707/142376/Meeting1-06-11_FFT_corrections_for_tune_measurements.pdf
Seite 7 und 8 sind die passenden Formeln zu finden.
Das klappt ganz gut und ist nur durch Rauschen und Frequenzstabilität
etc. begrenzt. Also peak suchen, das ist Ym dann schauen welcher
benachbarte Punkt größer am höchsten ist und damit Ym+1 oder Ym-1, damit
m bestimmen. m gibt an, um welchen bruchteil die tatsächliche Frequenz
vom "Bin" weg liegt.
Was willst du denn "betrachten"? Dass die Frequenzen noch da sind? :D
Spaß beiseite, wie du hier vorgehen musst hängt davon ab, an welchem
Messwert du eigentlich interessiert bist, sprich: geht es um
Mittenfrequenz, Amplitude, Phasenrauschen ...?
Dergute W. schrieb:> Egon D. schrieb:>> Was glaubst Du, was passendes "zero padding" bewirkt?>> Glaubst du, dass das "zero padding" passt?
Dass das "zero padding" passt, glaubst auch nur Du!
Schlaf gut :)
ED
Egon D. schrieb:>> Kannst du erläutern was du hier mit Fensterung meinst?>> Echt jetzt?
Durch eine Fensterung des Signals wird ja weder die Anzahl der Messwerte
noch die Abtastrate verändert, daher ist die Auflösung im
Frequenzbereich ja dadurch nicht beeinflusst. Oder meinst du etwas
anderes?
ABu schrieb:> Wenn die Frequenz zwischen zwei FFT "Bins" liegen, dann sieht man die> Leitung des Signals auf die beiden benachbarten Bins verteilt. Daraus> lässt sich dann die tatsächliche Frequenzlage interpolieren. Unter> https://indico.cern.ch/event/132526/contributions/128902/attachments/99707/142376/Meeting1-06-11_FFT_corrections_for_tune_measurements.pdf> Seite 7 und 8 sind die passenden Formeln zu finden.>> Das klappt ganz gut und ist nur durch Rauschen und Frequenzstabilität> etc. begrenzt. Also peak suchen, das ist Ym dann schauen welcher> benachbarte Punkt größer am höchsten ist und damit Ym+1 oder Ym-1, damit> m bestimmen. m gibt an, um welchen bruchteil die tatsächliche Frequenz> vom "Bin" weg liegt.
Das klingt interessant, muss ich mal testen...
Sven B. schrieb:> Was willst du denn "betrachten"? Dass die Frequenzen noch da sind?> :D>> Spaß beiseite, wie du hier vorgehen musst hängt davon ab, an welchem> Messwert du eigentlich interessiert bist, sprich: geht es um> Mittenfrequenz, Amplitude, Phasenrauschen ...?
Nein die Amplituden. Ich habe eine Grundfrequenz von 50 Hz und
harmonische Oberwellen dazu. Ich möchte schauen wie hoch diese im
Verhältnis zur Grundfrequenz sind.
Egon D. schrieb:> Dass das "zero padding" passt, glaubst auch nur Du!
Hab ein wenig im Buch "FFT Anwendungen" von E.O.Brigham gelesen. Hier
wird beschrieben, das reines Zeropadding die Auflösung nicht erhöht. Das
hilft mir jetzt gar nicht weiter.
Fakt ist, ich habe 8kHz Abtastfrequenz und möchte alle 200ms die
jeweiligen Harmonischen bestimmen, daher sind es 1600 Werte. Zur FFT
benötige ich ja dann eine Potenz von 2, also z.B. 2048. Das ist soweit
schon korrekt?
cc schrieb:> Egon D. schrieb:>>> [...]>> ABu schrieb:>> Wenn die Frequenz zwischen zwei FFT "Bins" liegen, dann sieht man die>> Leitung des Signals auf die beiden benachbarten Bins verteilt. Daraus>> lässt sich dann die tatsächliche Frequenzlage interpolieren. Unter>>> https://indico.cern.ch/event/132526/contributions/128902/attachments/99707/142376/Meeting1-06-11_FFT_corrections_for_tune_measurements.pdf>> Seite 7 und 8 sind die passenden Formeln zu finden.>>>> Das klappt ganz gut und ist nur durch Rauschen und Frequenzstabilität>> etc. begrenzt. Also peak suchen, das ist Ym dann schauen welcher>> benachbarte Punkt größer am höchsten ist und damit Ym+1 oder Ym-1, damit>> m bestimmen. m gibt an, um welchen bruchteil die tatsächliche Frequenz>> vom "Bin" weg liegt.>> Das klingt interessant, muss ich mal testen...>> [...]
Falls Du dieses Verfahren auch wieder simulierst, könntest Du dann bitte
auch einen Plot davon posten (oder was immer sich daraus ergibt)?
Das würde mich interessieren.
Für eine FFT braucht es nicht unbedingt eine 2er Potenz an
Daten. Schau dir man auf
https://de.wikipedia.org/wiki/Schnelle_Fourier-Transformation
unter "Algorithmus von Cooley und Tukey" die Rekursionsformel
an. Auf 1600 angewendet kommt man auf die Reihe
1600,800,400,200,100,50,25, die restlichen "25" muss händisch
ausgerechnet werden, man kann sie aber auch geschickt zerlegen.
D.h. ggü der FT eine Ersparnis von etwa 64.
Jetzt willst du aber nur jede 50te Frequenz, d.h. du betrachtest
nur 32 Frequenzen (von 50Hz bis 800Hz, alles darüber macht
ja aus Abtastgründen keinen Sinn!). Für alle zu betrachtenden
Frequenzen kannst du jetzt auch das obige Rekursionsschema
anwenden, sehr grob überschlagen kommst du auf unter 10.000
Operationen, mit FFT wäre es eher mehr. Und ganz wichtig,
du musst keine Fensteranpassung machen und erhälst auch numerisch
die bestmögliche Aussage.
Sven B. schrieb:> Man kann eine Parabel durch die 3 höchsten Punkte berechnen. Das wird> extrem genau, viel mehr wird idR nicht rauszuholen sein.
Hab ich mal versucht - siehe Anhang. Das Ergebnis ist eher nicht
zufriedenstellend...
Sigi schrieb:> Für eine FFT braucht es nicht unbedingt eine 2er Potenz an> Daten. Schau dir man auf> https://de.wikipedia.org/wiki/Schnelle_Fourier-Transformation> unter "Algorithmus von Cooley und Tukey" die Rekursionsformel> an. Auf 1600 angewendet kommt man auf die Reihe> 1600,800,400,200,100,50,25, die restlichen "25" muss händisch> ausgerechnet werden, man kann sie aber auch geschickt zerlegen.> D.h. ggü der FT eine Ersparnis von etwa 64.
Klingt interessant, das muss ich mir mal genauer anschauen
cc schrieb:> Sven B. schrieb:>> Man kann eine Parabel durch die 3 höchsten Punkte berechnen. Das wird>> extrem genau, viel mehr wird idR nicht rauszuholen sein.>> Hab ich mal versucht - siehe Anhang. Das Ergebnis ist eher nicht> zufriedenstellend...
Naja, die Position des Maxiums stimmt schon sehr gut, denke ich.
Die Amplitude nicht -- aber die ist auch relativ bedeutungslos, denn was
du möchtest ist ja nicht der Peak-Wert, sondern der Energieinhalt ...
Hallo,
mit einem Ringpuffer kannst Du beliebige Messlängen auswerten. Wenn Du
8192 Elemente nimmst, das geht auch alle 200ms, hast Du eine f-Auflösung
von 0,9766Hz. Das könnte mit einer einfachen FFT auch bessere Ergebnisse
bringen.
Waldo
Nimm doch einfach 1024 Samples und fenstere die mit (sin(x)/x)^2. Das
ergibt im Frequenzbereich dann Pyramiden. Ausgleichsgeraden legen,
Schnittpunkte berechnen, fertig.