Forum: Digitale Signalverarbeitung / DSP FFT-Frequenz mitteln


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von cc (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Erhöhe doch die Abtastrate soweit das du wieder auf die 5Hz kommst?

von Egon D. (egon_d)


Bewertung
0 lesenswert
nicht 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)


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

von cc (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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. (egon_d)


Bewertung
0 lesenswert
nicht 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. (egon_d)


Bewertung
0 lesenswert
nicht lesenswert
cc schrieb:

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

Echt jetzt?

von Sklavenvermittler (Gast)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


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

Glaubst du, dass das "zero padding" passt?

SCNR,
WK

von Egon D. (egon_d)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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:

Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


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

WaSe

von WaSe (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.