Forum: Digitale Signalverarbeitung / DSP / Machine Learning Amplitudenmessung Goertzel


von Thea (Gast)


Lesenswert?

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

von Gästle2 (Gast)


Lesenswert?

Hast mal hier im Forum gesucht? Gibt einiges dazu:

Beitrag "Goertzel Phasenbestimmung"

von Thea (Gast)


Lesenswert?

Ohja das habe ich. Da geht es aber fast immer um die Phasenbestimmung. 
Mit Amplitudenmessung hat da ja meist nie einer Probleme.

von Detlef (Gast)


Lesenswert?

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?

von Thea (Gast)


Lesenswert?

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.

von Detlef (Gast)


Lesenswert?

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.

von Thea (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Bodo (Gast)


Lesenswert?

Thea schrieb:
> Es kommt
>
> dann auch das richtige Ergebnis raus.

Du möchtest wissen, woher der Korrekturfaktor kommt?

von Detlef (Gast)


Lesenswert?

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

von Thea (Gast)


Lesenswert?

Genau, woher kommt dann dieser Korrekturfaktor?

Also die letzte Rechnung sozusagen

von Detlef (Gast)


Lesenswert?

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

von Thea (Gast)


Lesenswert?

Ich denke das bringt mich jetzt weiter.

Vielen lieben Dank :)

von Kai (Gast)


Lesenswert?

...oder such mal nach SDFT (Sliding DFT Algorithm)...

von A. M. (am85)


Lesenswert?

Detlef schrieb:
> 1. Der letzte Wert im Messvektor MUSS eine Null sein!

Wie meinst du das genau?

von Detlef (Gast)


Lesenswert?

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ß.

von Sven (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.