www.mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP Amplitudenmessung Goertzel


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Thea (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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-ds...

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

Autor: Gästle2 (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hast mal hier im Forum gesucht? Gibt einiges dazu:

Beitrag "Goertzel Phasenbestimmung"

Autor: Thea (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Ohja das habe ich. Da geht es aber fast immer um die Phasenbestimmung. 
Mit Amplitudenmessung hat da ja meist nie einer Probleme.

Autor: Detlef (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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?

Autor: Thea (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Detlef (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Thea (Gast)
Datum:
Angehängte Dateien:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Bodo (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Thea schrieb:
> Es kommt
>
> dann auch das richtige Ergebnis raus.

Du möchtest wissen, woher der Korrekturfaktor kommt?

Autor: Detlef (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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

Autor: Thea (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Genau, woher kommt dann dieser Korrekturfaktor?

Also die letzte Rechnung sozusagen

Autor: Detlef (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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/B...

Autor: Thea (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Ich denke das bringt mich jetzt weiter.

Vielen lieben Dank :)

Autor: Kai (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
...oder such mal nach SDFT (Sliding DFT Algorithm)...

Autor: André M. (am85)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Detlef schrieb:
> 1. Der letzte Wert im Messvektor MUSS eine Null sein!

Wie meinst du das genau?

Autor: Detlef (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net