Forum: Digitale Signalverarbeitung / DSP / Machine Learning Goertzel Algorithmus ungenaue Ergebnisse


von Alexander K. (alex0311)


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)


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:

Lesenswert?

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

von Walter T. (nicolas)


Lesenswert?

Welchen Pegel Deiner Nutzfrequenz hat denn das Störsignal allein?

von Alexander K. (alex0311)


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)


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)


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)


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)


Lesenswert?

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

von Walter T. (nicolas)


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)


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)


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)


Lesenswert?

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

von Felix U. (ubfx)


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)


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)


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)


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)


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)


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.

von c-hater (Gast)


Angehängte Dateien:

Lesenswert?

Alexander K. schrieb:

> An sich habe ich ein Nutzsignal und zwei Störsignale. Deren Frequenzen
> sind Vielfache der Frequenz des Nutzsignals.

OMG

Hast du dir auch nur mal die Kennlinie eines Goertzel angeschaut? Dann 
springt dir die Erklärung für den Effekt mit dem nackten Arsch förmlich 
in Gesicht. Ja, man kann das natürlich auch mit komplexen Formeln, 
Nullstellen und Polen und dem ganzen Quatsch ausdrücken, aber ein 
kompetente Bildbetrachtung geht viel schneller...

Beispiel siehe Anhang.

von Jan (Gast)


Lesenswert?

Was willst du uns sagen? ?

von Wolfgang (Gast)


Lesenswert?

Alexander K. schrieb:
> 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?

Und welche Fensterfunktion benutzt du?

von Mdj (Gast)


Lesenswert?

Leider stimmt das mit Optimierung von simulink nicht. Das Formula welche 
hier genutzt wurde ist die optimierte Variante.

Hier wurden zwei Programmierung Trick angewandt

1- ganze Formula inkrementel berechnet (IIR Filter)
     Dadurch ist das Formel sehr kompakt und Optimiert für Embedded

2- Sqrt wurde vermieden durch Magnitude^2
    Hier sollte das Wert mit Schwelle verglichen werden


Gruss

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.