AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Goertzel Algorithmus (Frequenz + Phase)

Ein Thema von stoxx · begonnen am 20. Aug 2011 · letzter Beitrag vom 4. Okt 2011
Antwort Antwort
Peter1999

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

AW: Goertzel Algorithmus (Frequenz + Phase)

  Alt 21. Aug 2011, 19: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
Angehängte Grafiken
Dateityp: jpg Goertzel.jpg (213,0 KB, 49x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#2

AW: Goertzel Algorithmus (Frequenz + Phase)

  Alt 21. Aug 2011, 20:21
Hi Peter,

Dein Text trägt zum Verständnis bei, trotzdem funktioniert es nicht

ich hab jetzt mal Deine Normierung unten beim Goertzel Button rausgenommen, so dass man auch eine Frequenz eingeben kann, ohne dass sie verändert wird.

ich gebe ein
300 Hz
3 Amplituede
45 Phase
48000 Abtastfrequenz
0,02 Signaldauer

er findet dann erstmal 288
das änder ich auf 300 und drücke den Goertzel Button

errechnen tut er:

0,0038360000 Amplitude
450 Phase


Hat es einen bestimmten wichtigen Grund, warum Du die den Zähler im Goertzer rückwärts zählst?
(btw wäre besser von Fenstergröße-1 bis null zu iterieren)
Angehängte Grafiken
Dateityp: png 2011 (08) 21.Aug [21-20-56].png (29,4 KB, 26x aufgerufen)
Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.
  Mit Zitat antworten Zitat
Peter1999

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

AW: Goertzel Algorithmus (Frequenz + Phase)

  Alt 21. Aug 2011, 20:43
Das kann ja auch nicht gehen

Wenn du mit 48000 Punkten / Sek eine Signaldauer von 0,02 Sek vorgibst, dann sind das nur 960 Stützstellen! Die Fenstergröße muss dann also kleiner als 960 sein. (Es wundert mich, dass das nicht in eine Exception läuft, aber egal, da müsste ich jetzt mal den Debugger anwerfen). Nimm mal 800 und schon geht's. Sowas habe ich hier in dem Beispiel noch nicht abgefangen.

Das ist ja gerade das Problem bei allen Frequenzbereichsverfahren: höhere Frequenzauflösung benötigt immer längere Signale.
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#4

AW: Goertzel Algorithmus (Frequenz + Phase)

  Alt 21. Aug 2011, 21:12
es funktioniert auch mit 800 nicht, warum glaubt mir niemand
(wie Du schon sagst, wenn die Fenstergröße zu groß ist, rechnet er einfach ins leere weiter ..)


ich überlege gerade, ob es entscheidend ist, rückwärts zu zählen.
aus einem Buch über Numerische Mathematik bei google books hab ich entnommen, das es wohl so ist.
Da drin sieht man auch, ich nehme an, dass der Autor Ahnung hat, dass man um den Real Teil auszurechnen, cosine mit Q1 multiplizieren muss. in dem Link ist es gerade vertauscht (und falsch) und führt also auch zu diesen Problemen.

http://www.eetimes.com/design/embedd...tzel-Algorithm

Trotzdem geht aber die Phase immer noch nicht

Vielleicht probier ich das mal, mit dem Index rückwärts laufen lassen.

In dem Buch für Numerische Mathematik steht auch, dass der Algorithmus nicht gutartig wäre, was auch immer das heißt.
Es wird der Algorithmus von Reinsch empfohlen.
der macht bei kleinem Epsilon ? weniger Fehler .. ob das wichtig ist?
oder sind das trotzdem nur kleine Fehler?
was denkst Du?
Angehängte Grafiken
Dateityp: jpg numMathematik_03.jpg (61,7 KB, 35x aufgerufen)
Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.

Geändert von stoxx (21. Aug 2011 um 21:14 Uhr)
  Mit Zitat antworten Zitat
Peter1999

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

AW: Goertzel Algorithmus (Frequenz + Phase)

  Alt 21. Aug 2011, 21:28
Doch, ich glaube dir schon .
Man macht sich ja nicht freiwillig das Leben schwer .

Ich kann das Problem nur nicht nachvollziehen, da es ja mit deinen Werten funktioniert, wenn ich mit einer Fenstergröße von 800 Punkten rechne (siehe Bild).

Ob man rückwärts zählen muss (oder nur kann) weiß ich nicht, ich habe den Algorithmus nicht erfunden. Und ich glaube, es ist jetzt auch zu spät, um noch schnell die Herleitung zu verstehen (Habe auch gerade kein vollständiges Lehrbuch zur Hand ).

Willst du nicht einfach die Variante aus meinem Beispiel übernehmen und gut ist's?
Ich habe jedenfalls noch keinen Fall gefunden (der plausibel ist) der nicht funktioniert.
Angehängte Grafiken
Dateityp: jpg goertzel.jpg (235,2 KB, 21x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#6

AW: Goertzel Algorithmus (Frequenz + Phase)

  Alt 21. Aug 2011, 21:47
tut mir Leid .. ich hatte mich vorhin bei den Zahlen verschrieben.

(wegen unzureichend getesteter Software wird irgendwann sicher nochmal die Welt untergehen

gib mal ein
Frequenz 300
Amplitude 3
Phase 50
abtastfrequenz 8000
Signaldauer 0,04 oder so

dann Du sehen
Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.
  Mit Zitat antworten Zitat
Peter1999

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

AW: Goertzel Algorithmus (Frequenz + Phase)

  Alt 21. Aug 2011, 21:56
Das geht auch !!

8000 Punkte / Sek * 0,04 Sek = 320 Punkte

--> gewählt Fenstergröße 300 Punkte (weil < 320)

--> gefundene Frequenz 292,333 Hz, das ist natürlich nicht so gut (daher mein Vorschlag mit der Optimierung)

--> Häckchen entfernt: 300 Hz vorgegeben (die würde die Optimierung dann ja auch automatisch finden)

und schwups: Korrektes Ergebnis für Ampl + Phase!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz