Datum:
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
Datum:
Ohja das habe ich. Da geht es aber fast immer um die Phasenbestimmung. Mit Amplitudenmessung hat da ja meist nie einer Probleme.
Datum:
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?
Datum:
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.
Datum:
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.
Datum:
Angehängte Dateien: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.
Datum:
Thea schrieb: > Es kommt > > dann auch das richtige Ergebnis raus. Du möchtest wissen, woher der Korrekturfaktor kommt?
Datum:
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
Datum:
Genau, woher kommt dann dieser Korrekturfaktor? Also die letzte Rechnung sozusagen
Datum:
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...
Datum:
Ich denke das bringt mich jetzt weiter. Vielen lieben Dank :)
Datum:
...oder such mal nach SDFT (Sliding DFT Algorithm)...
Datum:
Detlef schrieb: > 1. Der letzte Wert im Messvektor MUSS eine Null sein! Wie meinst du das genau?
Datum:
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ß.
