Hallo, ich beschäftige mich gerade während eines Praktikums mit dem Goertzel Algorithmus. Ein Sinussignal bekannter Frequenz soll in einem Frequenzgemisch detektiert werden. Ich verwende den vereinfachten Goertzel von Kevin Banks: http://www.eetimes.com/design/signal-processing-dsp/4024443/The-Goertzel-Algorithm Als Ergebnis bekommt man ja da den relativen Betrag. Nun ist es aber für mich wichtig zu wissen, wie ich (mit Begründung) auf den genauen Amplitudenwert komme. Ich weiß, dass ich den relativen Betrag mit 2 multiplizieren und der Blockgröße dividieren muss, mir ist nur nicht klar wieso. Wahrscheinlich ist mein Problem sehr banal, DSP ist jedoch für mich jedoch völlig neu. Über eine Antwort würde ich mich sehr freuen. Thea
Ohja das habe ich. Da geht es aber fast immer um die Phasenbestimmung. Mit Amplitudenmessung hat da ja meist nie einer Probleme.
Thea schrieb: > Als Ergebnis bekommt man ja da den relativen Betrag. Was ist bei dir der "realtive" Betrag? Das Filter berechnet doch nur Real- und Imaginärteil oder Betrag und Phase?
Ich benutze den optimierten Goertzel. Da bekomm ich nur den qadrierten relativen Betrag. Das entspricht jedoch nicht meiner Signalamplitude die ich gern herrausbekommen möchte. Ich habe in einem Forum gelesen, dass man folgendes rechnen muss: Ausgangsamplitude = relativer Betrag * 2 / Blockgröße Ich versteh jedoch nicht wieso genau.
Thea schrieb: > Ich benutze den optimierten Goertzel. Wenn es dir nichts ausmacht, stelle doch einfach mal kurz den Code rein. Ansonsten wird es schwer deinen Fehler zu finden.
Ich habe den Goertzel in LabView implementiert. Hier mal der Code und ein Bild vom VI: k = N * f_target / f_sample; a = 2 * cos (2*PI*k/N); for i=1, N: { Q0 = Q1 = Q2 = 0; Q0=a*Q1 – Q2 +xi; Q2 = Q1; Q1 = Q0; } Magnitude^2 = Q1^2+Q2^2 – Q1*Q2*a; Im Programm folgt dann noch die oben beschriebene Rechnung. Es kommt dann auch das richtige Ergebnis raus. Ich hoffe mir kann da jemand helfen. Da wäre ich sehr sehr dankbar.
Thea schrieb: > Es kommt > > dann auch das richtige Ergebnis raus. Du möchtest wissen, woher der Korrekturfaktor kommt?
Thea schrieb: > Magnitude^2 = Q1^2+Q2^2 – Q1*Q2*a; > > Im Programm folgt dann noch die oben beschriebene Rechnung. Es kommt > dann auch das richtige Ergebnis raus. 1. Der letzte Wert im Messvektor MUSS eine Null sein! 2. Magnitude = Q1^2+Q2^2 - Q1*Q2*a Amplitude = 2*SQRT(Magnitude)/Blocklänge
Genau, woher kommt dann dieser Korrekturfaktor? Also die letzte Rechnung sozusagen
Das ist mit zwei Worten nicht so einfach zu beschreiben. Die Berechnung folgt aus der DFT. Einen guten Einstig dafür findest du hier: http://www.fbeit.htwk-leipzig.de/~reinhold/files/Beleg_jeschke.pdf
1. Blocklänge n durch Abtastfrequenz und Bandbreite festlegen. 2. Daten sampeln und in den Datenvektor der Länge n-1 einlesen. 3. Filtern Ist die Blocklänge ist z.B. n=20, dann läuft die Filterschleife von 1 - 19 und der letzte Wert im Datenvektor, also der zwanzigste wird Null gesetzt. Zum Verständnis dieser Ausage bitte mal das Blokschaltbild des Goertzel im z-Bereich ansehen. Da wird es dann sofort klar warum zum Schluss noch die Null durch das Filter geschoben werden muß.
Detlef schrieb: > Amplitude = 2*SQRT(Magnitude)/Blocklänge Hallo Zusammen, genau vor diesem Problem stehe ich momentan auch. Woher kommt der Faktor 2? Was genau liefert der Goertzel-Algorithmus (Leistungsquadrat?)? Wäre toll, wenn mir jemand helfen könnte. Gruß, Sven.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.