Forum: Digitale Signalverarbeitung / DSP / Machine Learning FFT-Frequenz mitteln


von cc (Gast)


Angehängte Dateien:

Lesenswert?

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,

von 1000V Dc (Gast)


Lesenswert?

Erhöhe doch die Abtastrate soweit das du wieder auf die 5Hz kommst?

von Egon D. (Gast)


Lesenswert?

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".

von Zombie (Gast)


Lesenswert?

Wenn dich wirklich nur die oben angegebenen Frequenzen interessieren, 
wäre nicht Goertzel passender und effizienter?

von cc (Gast)


Lesenswert?

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...

von Dergute W. (derguteweka)


Lesenswert?

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

von Egon D. (Gast)


Lesenswert?

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?

von Egon D. (Gast)


Lesenswert?

cc schrieb:

> Kannst du erläutern was du hier mit Fensterung meinst?

Echt jetzt?

von Sklavenvermittler (Gast)


Lesenswert?

cc schrieb:
> Kannst du erläutern was du hier mit Fensterung meinst?

Mach mal das Fenster auf während der Messung.

von ABu (Gast)


Lesenswert?

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.

von Sven B. (scummos)


Lesenswert?

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 ...?

von Dergute W. (derguteweka)


Lesenswert?

Egon D. schrieb:
> Was glaubst Du, was passendes "zero padding" bewirkt?

Glaubst du, dass das "zero padding" passt?

SCNR,
WK

von Egon D. (Gast)


Lesenswert?

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

von cc (Gast)


Lesenswert?

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?

von Theor (Gast)


Lesenswert?

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.

von Sven B. (scummos)


Lesenswert?

Man kann eine Parabel durch die 3 höchsten Punkte berechnen. Das wird 
extrem genau, viel mehr wird idR nicht rauszuholen sein.

von Sigi (Gast)


Lesenswert?

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.

von cc (Gast)


Angehängte Dateien:

Lesenswert?

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

von Sven B. (scummos)


Lesenswert?

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 ...

von WaSe (Gast)


Lesenswert?

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

von WaSe (Gast)


Lesenswert?

Alternativ könnte man die exakten Frequenzen über eine DFT und 
angepasster Messlänge direkt berechnen.

WaSe

von WaSe (Gast)


Lesenswert?

Abtastfrequenz: 5kHz
Messlänge: 100 Samples
Frequenzauflösung: 50Hz
Aufwand DFT: O(N^2) = 10000
Aufwand FFT(8kHz, 2048Samples): O(N*Log2(N)) = 22528

von Gst (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.