Einzelnen Beitrag anzeigen

Peter1999

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

AW: Goertzel Algorithmus (Frequenz + Phase)

  Alt 22. Aug 2011, 11:51
Hallo,

ich versuchs nochmal ganz von Anfang .
Ich muss aber dazu sagen, ich bin KEIN Mathematiker, es kann also alles falsch sein, was ich hier von mir gebe.

1. Du brauchst unbedingt eine Fensterung! Ich weiß ja nicht, wie lang deine Signale sind, aber die DFT (bzw.) der Gortzel benötigt N^2 Rechenoperationen. Wenn du da das ganze Signal als Fenster nimmst, bist du bei 5min*60sek/min*48000samples/sek ganz schnell am Ende des machbaren. HINWEIS: Auch das ganze Signal ist ein Zeitfenster, eben ein Rechteckfenster der max. Größe.
Daher wurde ja die FFT erfunden mit "nur" NlogN Rechenoperationen.

2. Der Goertzel ist KEIN Verfahren zur Frequenzbestimmung! Es ist ein einfacher Algorithmus zur Transformation aus dem Zeit- in den Frequenzbereich. Was hier gemacht wird ist eigentlich eine "Vergewaltigung" des Verfahrens. ANNAHME: es existiert genau EIN (oder mehrere, dann aber im Frequnzbereich weit von einander eintfernte, typischer Fall: Analogtechnik) Signal, einer Frequenz, dessen Amplitude deutlich größer ist als die der Störungen. Was wir hier machen ist also: Suche den gesamten Amplitudengang ab bis du das Maximum gefunden hast und merke dir die zugehörige Frequenz.

3. Da du es IMMER mit einem Zeitfenster zu tun hast (größe hin oder her), hast du es auch IMMER mit den typischen Problemen zu tun. Das wäre in erster Linie die Periodisierung aufgrund der Disketisierung. Daraus folgt der "Abschneidefehler", der mit verschiedenen Fensterfunktionen reduziert werden kann. Häufigstes Beispiel: Hanning. Du hast es also IMMER mit Seitenbändern zu tun. (Schau dir dazu mal den Amplitudengang eines normierten Rechteckfensters an (numerisch oder Laplacetransformierte...ist egal), dann siehst du das Abklingen mit dem Abstand von der "echten" Frequenz.

4. Ich vermute, was du hier geplottet hast ist genau der Effekt der Nebenbänder. Das kann ich aber nicht sicher sagen, da ich deine Parameter nicht genau kenne. Ich habe in meinem Programm mal etwas gespielt, da lande ich bei höheren Frequenzen in der Größenordnung 1% der "echten" Amplitude. Vielleicht ist bei dir aber auch noch ein Fehler im Quelltext

5. Nein, es ist nicht möglich, zu einer Phase die Amplitude zu finden. Jedenfalls ist es nicht sinnvoll. Dann müsstest du den gesamten Phasengang bestimmen (so wie wir es jetzt für die Amplitude machen), bei einer bestimmten Phasenüberschreitung anhalten und dir dann die Amplitude und Frequenz ausgeben lassen. Wenn man so etwas machen will, ist man wieder bei der FFT, die da deutlich schneller ist.

6. Den Goeztzel würde ich eigentlich nur verwenden, wenn ich die Frequenz schon vorher kenne (z.B. Sender-Frequenz) oder wenn ich zwischen zwei Spektrallinien einer FFT eine Interpolation durchführen möchte. Dann kann man sich schnell und mit wenig Aufwand ein paar Stützstellen berechnen, aber KEIN ganzes Spektrum!

7. Du beachtest aber schon die ganze Zeit deinen max. Frequenzinhalt? Es gilt natürlich Shannon! Also Abtastfrequenz / 2 ist deine maximal auswertbare Frequenz. Danach greift wieder die Periodisierung des Spektrums und du bekommst die berühmten Spiegelfrequenzen. Also niedrige Frequenzen tauchen bei höheren Frequenten wieder auf. (vielleicht ist das auch das Problem deiner Amplituden)

8. Die Frequenzauflösung ist immer fest mit der Fenstergröße verbunden! Wenn du also nicht genau auf der richtigen Frequenz landest, geht deine Amplitude nach unten und die Phase läuft dir weg. delta f = 1 / T .

9. Willst du auch diesen Fall absichern, musst du, wie gesagt, ganz anders vorgehen und aus dem Verlauf des Amplitudengangs das Maximum und dem Phasengang die zugehörige Phase bestimmen. (Damit wären wir bei der Eigenfrequenzbestimmung und der modalen Dämpfung ) Das ist dann aber ein ganz anderes Kapitel.

10. Probier mal, ob dein Problem mit den Amplituden auch in meinem Programm auftritt (wenn du die Sachen wie Shannon & Fenstergröße beachtest).

11. Ich habe mein Programm mit Delphi 2009 UND Delphi 7 geschrieben und kompiliert, es funktionieren beide EXEn gleich.

12. Was mir heute morgen eingefallen ist: Es ist natürlich logisch, das die Phasen falsch werden, wenn man am falschen Ende des Zeitfensters anfängt. Das ist dann ja von der Signalfrequenz und der Fenstergröße abhängig. Und deine Buchseite sagte ja auch, man solle rückwärts Summieren.


So, damit habe nun eigentlich alles aufgeschrieben, was ich dir so aus dem Kopf sagen kann. Viel mehr kann ich dir dann sicher auch nicht helfen. Ich kann dir aber noch ein altes DDR-Buch empfehlen: "Experimentelle Festkorpermechanik", VEB Fachbuchverlag, Leipzig 1986. Da ist die Frequenzbereichstransformation schön übersichtlich mit vielen Bildchen für Dummies (damit meine ich mich) erklärt

Viel Glück
  Mit Zitat antworten Zitat