Amplitudenmessung Goertzel

Gast #2704353
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
Gast #2717561
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.
Gast #2717659
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.
Angehängte Dateien:
Gast #2718040
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
Gast #2765890
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ß.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren