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".
Wenn dich wirklich nur die oben angegebenen Frequenzen interessieren, wäre nicht Goertzel passender und effizienter?
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?
cc schrieb: > Kannst du erläutern was du hier mit Fensterung meinst? Mach mal das Fenster auf während der Messung.
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 ...?
Egon D. schrieb: > Was glaubst Du, was passendes "zero padding" bewirkt? Glaubst du, dass das "zero padding" passt? SCNR, WK
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.
Man kann eine Parabel durch die 3 höchsten Punkte berechnen. Das wird extrem genau, viel mehr wird idR nicht rauszuholen sein.
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
Alternativ könnte man die exakten Frequenzen über eine DFT und angepasster Messlänge direkt berechnen. WaSe
Abtastfrequenz: 5kHz Messlänge: 100 Samples Frequenzauflösung: 50Hz Aufwand DFT: O(N^2) = 10000 Aufwand FFT(8kHz, 2048Samples): O(N*Log2(N)) = 22528
Nimm doch einfach 1024 Samples und fenstere die mit (sin(x)/x)^2. Das ergibt im Frequenzbereich dann Pyramiden. Ausgleichsgeraden legen, Schnittpunkte berechnen, fertig.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.