Amplitudenmessung Goertzel

Gast #2704353
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
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
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
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
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ß.
Gast
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.