Einzelnen Beitrag anzeigen

Peter1999

Registriert seit: 13. Dez 2007
Ort: Dresden
88 Beiträge
 
Delphi XE2 Professional
 
#8

AW: Goertzel Algorithmus (Frequenz + Phase)

  Alt 21. Aug 2011, 20:44
Das Ergebnis im Bild wird doch (höchst wahrscheinlich sogar) stimmen.
Die ermittelte Frequenz liegt bei 193,6 Hz, die tatsächliche aber bei 200 Hz. Damit siehst du nicht die exakte Spektrallinie, sondern ein "verschmiertes" Nebenband. Dass dort die Amplitude deutlich geringer ist, ist ja bei einem einfachen Sinussignal normal. Wo soll die Signalleistung abseits der 200Hz auch herkommen. Nur wenn du die Frequenz besser bestimmst (also möglichst wirklich die 200Hz), bekommst du das exakte Ergebnis.

Gib mal für die Goertzel-Frequenz von Hand die 200Hz vor und klicke auf den Goertzel-Button, dann siehst du, dass es wirklich nur daran liegt, dass du auf dem Seitenband gelandet bist.

Zur besseren Bestimmung der Frequenz musst du aber ein Optimierungsproblem lösen. Das ist es, was ich mit verbesserter Frequenzsuche meinte.

Einfachstes Verfahren:
Der Algorithmus müsste also die 2 größten Amplituden finden. Den Bereich dazwischen wieder in äquidistante (im Frequenzbereich) Stücke einteilen --> da wieder die 2 größten Amplituden finden --> dann wieder neu einteilen usw. ...

Das ganze musst du dann machen bis ein Konvergenzkriterium erreicht ist, z.B. sich die Max.-Amplitude nicht mehr als 0,1% von der letzten Max.-Amplitude unterscheidet.

Wie gesagt, bei der Amplitude ist das durchaus sinnvoll. Die Phase ist aber immer nur die Phase eines Sinus bezüglich deines gewählten Zeitfensters. Was du also damit machen willst, ist mir noch schleierhaft, solange du nicht mehrere Kanäle oder synchrone Daten vergleichen willst.

Du schreibst von einer Korrektur, die nötig sein könnte. Das ist falsch! Die DFT, Goertzel oder FFT sind immer eindeutig und exakt umkehrbar! Was mit der Korrektur gemeint ist, ist folgendes: Man kann aus der Breite des verschmierten Spektrums den Maximalwert abschätzen (siehe Modalanalyse). Man kann auch durch geeignete Fensterfunktionen (Hanning, Blackman,...) das Verschmieren reduzieren. Das würde ich dir aber alles nicht empfehlen, sondern (wie gesagt) lieber die Frequenz richtiger bestimmen. Dann gibt es das Problem nämlich nicht.

Zusammenfassung:
Dein Problem ist die Frequenzauflösung. Wenn du diese verbesserst, triffst du die exakte Frequenz besser und bekommst auch bessere Ergebnisse! Ich empfehle dir also wirklich, diesen "einfachen" Weg zu gehen.



PS. Mein Programm liefert natürlich von der Phase unabhängige Amplituden!

Im übrigen liefert mein Programm auch deine 200 Hz exakt + Phase + Amplitude! Vorausgesetzt natürlich dein Zeitfenster ist nicht länger als dein Signal (0,05 s) siehe Bild
Miniaturansicht angehängter Grafiken
goertzel.jpg  
  Mit Zitat antworten Zitat