Forum: Digitale Signalverarbeitung / DSP Goertzel Algorithmus ungenaue Ergebnisse


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.
von Alexander K. (alex0311)


Bewertung
-1 lesenswert
nicht lesenswert
Hallo zusammen,

ich versuche mit Hilfe des Goertzel Algorithmus ein Signal mit einer 
bekannten Frequenz aus einem Frequenzspektrum herauszufiltern. Die 
anderen Störsignale mit unterschiedlichen Frequenzen kann ich einzeln 
zuschalten bzw. abschalten. Es handelt sich hierbei um eine Simulink 
Simulation. Habe ich kein Störsignal aufgeschaltet, gibt der Algorithmus 
den richtigen Wert für die Amplitude aus. Schalte ich die Störsignale 
zu, ergibt sich ein um bis 30 % überhöhter Wert. Hier bin ich auf der 
Suche nach möglichen Ursachen?

Hier habe ich meine Parameter:

%Goertzel Algorithm
N = 2000;
target_freq = 240;
sample_rate = 1000;
k = 0.5+(N*target_freq/sample_rate);
omega = 2*pi*k/N;
sine = sin(omega);
cosine = cos(omega);
coeff = 2.0 * cosine;

von Felix U. (ubfx)


Bewertung
0 lesenswert
nicht lesenswert
Leckeffekt, Aliasing, ...
Wieso zeigst du nicht dein Modell, dann müssten wir nicht die Glaskugel 
bemühen.

: Bearbeitet durch User
Beitrag #6355431 wurde vom Autor gelöscht.
von Alexander K. (alex0311)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier habe ich einen Screenshot von meinem Algorithmus. Auf der nicht 
verbundenen Leitung kommt das zu filternde Signal.

von Walter T. (nicolas)


Bewertung
0 lesenswert
nicht lesenswert
Welchen Pegel Deiner Nutzfrequenz hat denn das Störsignal allein?

von Alexander K. (alex0311)


Bewertung
0 lesenswert
nicht lesenswert
An sich habe ich ein Nutzsignal und zwei Störsignale. Deren Frequenzen 
sind Vielfache der Frequenz des Nutzsignals. Das eine Störsignal hat 
fast genau die gleiche Amplitude wie das Nutzsignal, das andere 
Störsignal ist ca. 1/4 kleiner.

von Felix U. (ubfx)


Bewertung
0 lesenswert
nicht lesenswert
Alexander K. schrieb:
> Deren Frequenzen
> sind Vielfache der Frequenz des Nutzsignals

Wie viel vielfach? Bei einer Samplerate von 1000 und Nutzfrequenz von 
240 wirst du ja schon bei 3-facher Frequenz Aliasing haben.

Mach mal was Walter geschrieben hat, trenne das Nutzsignal und füttere 
nur die Störsignale rein und dann schau nach wie viel Leistung bei der 
Nutzfrequenz liegt.

: Bearbeitet durch User
von Alexander K. (alex0311)


Bewertung
0 lesenswert
nicht lesenswert
Die Störungen besitzen die zweifache und dreifache Frequenz. Das heißt 
Aliasing dürfte tatsächlich ein Problem sein. Habe die Abtastrate um den 
Faktor 10 erhöht. Jetzt sind die Ergebnisse deutlich besser. Wenn ich 
jetzt die unterschiedlichen Störungen aufschalte, variieren die 
Ergebnisse nur noch um 0,01. Zum Vergleich, bei der davor gewählten 
Abtastfrequenz lag die Abweichung noch bei ca. 0,08 teilweise. Die 
tatsächliche Amplitude des Nutzsignals sollte bei o,15 liegen. Jetzt 
frage ich mich ob so eine gewisse Abweichung bei dem Goertzel 
Algorithmus normal ist oder ob, wenn er richtig arbeitet, er auch immer 
exakt das gleiche Ergebnis liefern sollte?
Ich hatte auch mal das Nutzsignal abgeschaltet und nur die Störsignale 
aufgeschaltet. Bei der alten Abtastfrequenz wie auch bei der neuen 
ergibt sich eine Amplitude von 0,04.
Weiteres erhöhen der Abtastrate brachte keine Verbesserung mehr.

von Walter T. (nicolas)


Bewertung
0 lesenswert
nicht lesenswert
Alexander K. schrieb:
> Jetzt
> frage ich mich ob so eine gewisse Abweichung bei dem Goertzel
> Algorithmus normal ist oder ob, wenn er richtig arbeitet, er auch immer
> exakt das gleiche Ergebnis liefern sollte?

Dann wäre jetzt das Verhältnis zwischen Abtastrate und den 
Signalfrequenzen interessant.

von Alexander K. (alex0311)


Bewertung
0 lesenswert
nicht lesenswert
Das Verhältnis zwischen Abtastrate und den jeweiligen Signalfrequenzen 
beträgt: 41,6 und 20,83 und 13,8

von Walter T. (nicolas)


Bewertung
0 lesenswert
nicht lesenswert
Dann kennst Du jetzt mal schauen, welche Mischfrequenzen zwischen 
Abtastrate und Nutz- und Störsignalen noch in die Bandbreite fallen.

von Alexander K. (alex0311)


Bewertung
0 lesenswert
nicht lesenswert
Die Bandbreite beim Goertzel Algorithmus berechnet sich doch mit Fs/N. 
Fs ist die Abtastrate und N die Anzahl der Messwerte. Dabei komme ich 
auf eine Bandbreite von nur 0,5 Hz. Von diesem Band um das Nutzsignal 
sind die anderen Frequenzen ja weit entfernt.

von Walter T. (nicolas)


Bewertung
0 lesenswert
nicht lesenswert
Walter T. schrieb:
> Mischfrequenzen zwischen Abtastrate und Nutz- und Störsignale


Nicht vergessen: Außerhalb der Bandbreite bedeutet nicht, dass das 
Signal auf Null abgefallen ist.

von Alexander K. (alex0311)


Bewertung
0 lesenswert
nicht lesenswert
Stimmt, das ist wohl ähnlich wie beim Hoch-/Tiefpassfilter. Aber wie 
kann ich beim Goertzel Algorithmus etwas dagegen machen?

von Felix U. (ubfx)


Bewertung
1 lesenswert
nicht lesenswert
Alexander K. schrieb:
> Die Bandbreite beim Goertzel Algorithmus berechnet sich doch mit Fs/N.
Das ist die Frequenzauflösung.

Es fällt mir schwer in diesem Thread die bruchstückhafte Information 
zusammenzukramen, aber du scheinst 2000 Samples bei einer Samplerate von 
10000/s zu haben. Keine deiner Frequenzen scheint aber genau periodisch 
mit 2000 Samples zu sein, also wirst du durch die Fensterung (ich nehme 
an, du schneidest einfach ab = Rechteckfenster) eine Faltung mit der 
si-Funktion im Frequenzbereich bekommen. Dadurch taucht auch Leistung 
auf deiner gesuchten Frequenz auf, die bei einem unendlichen 
Betrachtungszeitraum nicht da wäre.

von Detlef _. (detlef_a)


Bewertung
1 lesenswert
nicht lesenswert
Ja, die infos kommen spärlich vom TO.

Wie Felix sagte, wenn Du keine ganzzahlige Anzahl der Wellen der 
Fundamentalfrequenz erwischt, dann 'lecken' diese Welle und auch alle 
Oberwellen aus. Das ist dann im Spektrum keine Nadel mehr sondern wird 
breiter.

Bei 240Hz und samplefrequenz 1000samples/sec kiegst du 1000/240=25/6 
samples pro Welle, bei 25 samples Fensterbreite also genau 6 Wellen. Die 
Fensterbreite muss ganzzahliges Vielfaches von 25 sein, das ist für eine 
FFT natürlich nicht so günstig, weil 25 in doppelter Hinsicht keine 
Potenz von 2 ist :))).

Goertzel berechnet die FFT für EINE Spektrallinie, so kann man den auch 
testen. Das Gesagte gilt also auch für Goertzel.

Das 'Lecken' kann man durch eine geeignete Fensterfunktion beliebig hoch 
unterdrücken. Das Problem hat man immer, wenn die Abtastung nicht mit 
der Signalfrequenz synchron ist. Aber das ist Dir ja egal, weil Du ehe 
mit Goertzel rechnest. Du mußt nur nach der richtigen Anzahl Werte 
aufhören.

Dein Simulink Goertzel Modell kann man übrigens noch schicker machen, 
wenn man q1 und q2 anders wählt:
q1(n+1)=q1(n)*cosw-q2(n)*sinw
q2(n+1)=q1(n)*sinw+q2(n)*cosw
q1+j*q2 ist dann direkt der komplexe Phasor, von dem kann man einfach 
Betrag und Phase bestimmen aufkosten von 4 Multiplikationen statt einer.

math rulez!
Cheers
Detlef

von Walter T. (nicolas)


Bewertung
0 lesenswert
nicht lesenswert
Detlef _. schrieb:
> Wie Felix sagte, wenn Du keine ganzzahlige Anzahl der Wellen der
> Fundamentalfrequenz erwischt, dann 'lecken' diese Welle und auch alle
> Oberwellen aus

Sicher? Ich muss zugeben: So genau habe ich mir über den Goertzel noch 
nie Gedanken gemacht, weil ich ihn noch nie in einem Projekt verwendet 
habe, aber das sieht für mich erst einmal nach einer IIR-Struktur 2. 
Ordnung aus. Damit gäbe es - im Gegensatz zu einer FFT - kein echtes 
Fenster, weil nicht auf einer endlichen Sample-Größe gearbeitet wird.

: Bearbeitet durch User
von Alexander K. (alex0311)


Bewertung
0 lesenswert
nicht lesenswert
Also ich habe eine Simulationslaufzeit von 0.2 sec. Die Abtastrate 
beträgt 10000 Hz und die Anzahl der Samples 2000. Was meinst du mit 
periodisch? Meine Nutzfrequenz liegt bei 240 HZ. Die Störfrequenzen sind 
vielfache davon. Da passt doch meine Nutzsignal genau 48 mal in das 0.2 
sec Zeitfenster?

von Detlef _. (detlef_a)


Bewertung
0 lesenswert
nicht lesenswert
>>>Da passt doch meine Nutzsignal genau 48 mal in das 0.2 sec Zeitfenster?

Ja, paßt, 2000*240/10000=48, da leckt nichts.
Ist auch genügend hoch abgetastet.

>>>aber das sieht für mich erst einmal nach einer IIR-Struktur 2.
Ordnung aus.
Der Goertzel ist ein IIR 2.Ordnung mit konjugiert komplexen Polen auf 
dem Einheitskreis, also ein ungedämpft schwingfähiges System. Und genau 
das macht die FFT ja auch, die stellt ein System dar als Summe 
ungedämpfter harmonischer Schwingungen. Goertzel pickt Dir da einen 
einzigen raus. Die Funker nennen den gleichen hack 'Mischen mit 
komplexem Träger'.

Die Frequenzen 10000Hz und 240Hz stimmen auch gut, Promille oder so?
Der 'coeff' bei Deinem Goertzel ist richtig?

Wie gesagt, den Goertzel kann man testen indem man einfach ne komplette 
FFT von den 2000 Werten macht. Jedes Körbchen ist dann 10000/2000=5 Hz 
auseinander, an Stelle 48 steht der Wert für 240Hz, der muß auch bei 
Deinem Görtzel rauskommen. Vorsicht mit der Zählung bei Matlab, der Wert 
mit dem Index 1 ist DC entsprechend 0*5Hz, also bei Spektrum(49) 
schauen.

Zeig mal das Nutz- und Störsignal.

Cheers
Detlef

: Bearbeitet durch User
von Walter T. (nicolas)


Bewertung
0 lesenswert
nicht lesenswert
Detlef _. schrieb:
> Der Goertzel ist ein IIR 2.Ordnung mit konjugiert komplexen Polen auf
> dem Einheitskreis, also ein ungedämpft schwingfähiges System.

Den Blickpunkt hatte ich noch nie. So wird das ja richtig anschaulich.

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
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.