mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP Tonerkennung in unbekannter Umgebung / Goertzel


Autor: R.P. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo liebe DSPler,

habe am letzten und vorletztem langen Wochenende wohl ein paar graue 
Haare mehr bekommen. Eines vorweg: Ich bin überhaupt nicht der 
DSP-Spezi, also bitte nicht steinigen wenn mein Anliegen zu primitiv 
etc. ist.

Ich möchte einen ca. z.B. 250 ms langen Ton (Länge bekannt, kann auch 
deutlich länger sein) mit einer ebenso bekannten Frequenz (z.B. 4 KHz) 
mit einem Mikrofon aus unbekannter akustischer Umgebung möglichst sicher 
erkennen. Mit sampeln und der Erkennung mit dem Goertzel – Algorithmus 
funktioniert das wunderbar, d.h. ich bekomme eine deutliche 
Amplitudenänderung bei Detektion des Signals über die Zeitachse. Nur 
leider kenne ich die Amplitude (= Ergebnis Goertzel) vorher nicht, so 
dass ich keinen einfachen Schwellwert zur Auswertung einstellen könnte. 
Dieser würde ggf. auch überschritten werden, wenn’s mal laut in der 
Umgebung ohne Piepton wird bzw. nie erreicht werden, wenn der erkannte 
Ton leiser ist.

Nun habe ich folgendes gemacht: Ich schreibe in einen Ring-Speicher (20 
Werte / 50ms) die Goertzel-Ergebnisse, bilde den Mittelwert und 
anschließend den Koeffizienten (entspricht Variationskoeffizient; 
relative Standardabweichung) zw. letztem Messergebnis und eben diesem 
Mittelwert. Liegt der zwischen 0.9 und 0.99, dann ist der Ton wohl 
erkannt. Dieses Ergebnis wiederum zähle ich und wenn es häufig genug 
hintereinander aufgetreten ist, dann ist der Ton erkannt. (siehe 
Diagramm, absichtlich ohne Bemaßungsangabe)

Es funktioniert zwar, aber irgendwie ist mir das zu abenteuerlich 
("unwissenschaftlich"). Gibt es hier einen besseren, prof. Ansatz (den 
man auch verstehen kann)?

Beste Grüße

Autor: Analog OPA (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es wird Dir gar nichts anderes über bleiben, als einen Schwellenwert zu 
nehmen, weil ab einer gewissen Distanz der Ton so oder so im Rauschen 
unter geht.

Autor: R.P. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Analog OPA schrieb:
> Es wird Dir gar nichts anderes über bleiben, als einen Schwellenwert zu
> nehmen, weil ab einer gewissen Distanz der Ton so oder so im Rauschen
> unter geht.

Danke für die schnelle Antwort: Aber das ist ja das Problem, ich kenne 
den Schwellenwert nicht absolut. Beim Erkennen des Tons gibt es aber 
einen deutlich höheren Wert, der über dem (derzeitigem) Rauschen liegt. 
Klar, wenn's im Rauschen untergeht, dann geht es halt nicht.

Und das ist eben mein Problem, diesen "Pegelsprung" zuverlässig zu 
detektieren, ohne die absoluten Werte zu kennen.

Autor: Typ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was ist daran "unwissenschaftlich"?

Soweit ich verstanden habe, misst du wie "stark" deine Signalform in der 
Aufzeichnung vertreten ist und falls sich dieser Anteil sprunghaft 
erhöht, gilt dein Signal als erkannt.

Ist meiner Meinung nach ein fundierter Ansatz.

Zu Prüfen wäre, ob und wie wahrscheinlich false positives sind und wie 
man diese gegebenenfalls (z.B. durch Codierung) los wird.

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>> dass ich keinen einfachen Schwellwert zur Auswertung einstellen könnte.

Standard SNR Ding: Du nimmst das Verhältnis der Energie des Tons aus dem 
Goertzel ( = Quadrat der Amplitude ) zur Gesamtenergie der samples ( = 
Summe aller samplequadrate). Dann machst Du auf den Quotienten einen 
Schwellwert, z.B. 10 Prozent aller Energie im Ton.

Cheers
Detlef

Autor: (º°)·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.· (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du koenntest einen zweiten Goertzel 500 Hz tiefer laufen lassen.

Breitbandige Umgebungsgeraeusche wuerden dann beide ausloesen.
Dein zu erkennender Ton nur einen.

Den zweiten Kanal koennte eventuell auch gut als Schwellwertgeber 
dienen.

Autor: Jürgen Schuhmacher (engineer) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ganz richtig wäre das mit nicht nur einem Ton, sondern eben dem 
vollständigen Restspektrum (eben das, was nicht "Ton" ist) unter 
Veranschlagung dessen Spektralverlaufes und Amplitudengrenzen. Das läuft 
dann auch einen sich in der Amplitude anpassenden Filter hinaus.

Die Alternative ist das Prozessieren indirekt in der Frequenzebene, um 
sich von der Amplitude unabhängig zu machen. Das ist dann so etwas wie 
ein "Multifrequenz-Görtzel" mit autoadaptiven Frequenzen.

Autor: Manfred M. (bittbeisser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im Prinzip hast Du das selbe Problem, wie ich mit meinem Morsedekoder. 
Du brauchst einen langfristigen Mittelwert als Vergleichswert. Und 
dieser Wert sollte über einen deutlich längeren Zeitraum ermittelt 
werden, als der zu erwartende Impuls.

Ich mache das, indem ich einen gleitenden Mittelwert über das 
"Grungderäusch" ermittle. Alles was eine gewisse Zeit darüber liegt, 
wird als mögliches Signal betrachtet.

Autor: R.P. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Herzlichen Dank für die schnellen und vor allem qualifizierten 
Antworten!!!

Besonders interessant finde ich die Anwort von Detlef_a,
das werde ich alsbald (WE?) mal ausprobieren.

Lieber Jürgen Schuhmacher, Deinen Text habe ich ganz oft gelesen und 
immer ein bisschen mehr verstanden, aber nicht alles. Geht der Ansatz 
dahin, über (bspw. eine FFT) das gesamte Spektrum zu erfassen um zu 
sehen, was da amplitudenmäßig überhaupt los ist und dann mit dem 
Goertzel auf der Zielfrequenz zu vergleichen?

Manfred: Wie ermittelst du den langfristigen Mittelwert? Den Morseton 
erkennst du über Goertzel oder nur am Amplitudenanstieg des 
Gesamtsignals?

Autor: Manfred M. (bittbeisser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Den langfristigen Mittelwert erhalte ich dadurch, dass ich das 
Ausgangssignal des Goertzel's parallel zur übrigen Auswertung in einen 
gleitenden Mittelwert laufen lasse. Das ist dann mein Vergleichswert.

Für die eigentliche Signalauswertung wird das Ausgangssignal aber auch 
noch einmal gemittelt (über 1 bis 6 Samples - einstellbar) damit nicht 
jeder Knacks als Ton erkannt wird.

Allerdings verwende ich in der aktuellen Version keinen Goertzel mehr. 
Bei längerer Auswertezeit ist der einfach zu schmalbandig, was bei 
schnell wechselnden Frequenzen zu unpraktisch ist.

Zum Vergleich: ich arbeite mit einer Abtastrate von 8kHz, die gesuchte 
Frequenz ist 800Hz und der Ringpuffer fasst 40 Samples. Daraus ergibt 
sich eine Auswertezeit von 5ms. Die geschätzte Bandbreite liegt dann bei 
etwa 200Hz, der Durchlassbereich ist aber nicht flach.

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@bitbeisser: Der Goertzel implementiert ein ungedämpftes System mit der 
auszuwertenden Frequenz als Resonanzfrequenz. In dieses System fütterst 
du die samples ein. Das ist sehr schmalbandig, an der Resonanzstelle 
wird die Verstärkung unendlich hoch, das System ist nicht stabil und die 
Ausgangsamplitude des Goertzel wird immer größer je mehr samples 
reinlaufen. Man kann die Bandbreite aber auch größer machen, indem man 
ein System nimmt das ein wenig gedämpft und damit stabil ist (Mehr 
Dämfung ist grössere Bandbreite).

Wenn man einen Ton sucht aber die Frequenz nicht weiss geht das anders. 
Dazu habe ich mich hier mal ausführlichst geäußert:

Beitrag "Frequenz, Amplitude und Phase eines Sinussignals bestimmen"


Cheers
Detlef

: Bearbeitet durch User
Autor: Manfred M. (bittbeisser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das der Goertzel sehr schmalbandig sein kann, kann ich bestätigen. Wenn 
ich auf 80 Samples erhöhe, ist das für den Kurzwellenempfang nicht mehr 
handhabbar. Aber wenn sich die Frequenzen nicht ändern, wie z.B. bei den 
Wahltönen beim Telefon, kann das ja gewünscht sein.

Aber das der nicht stabil sein soll, kann ich nicht nachvollziehen. Ich 
bin bisher immer von folgender Überlegung ausgegangen: Wenn ich einen 
Sinus der gesuchten Frequenz mit maximaler Amplitude habe, kann am 
Ausgang nicht mehr raus kommen als die Summe aller Beträge über die 
gegebene Anzahl von Taps.

Das würde dann auch der Sichtweise entsprechen, wo der Goertzel als 
Spezialfall der Fourier Transformation betrachtet wird. Aber vielleicht 
sprichst Du von einer Variante, die mir unbekannt ist.

> Man kann die Bandbreite aber auch größer machen, indem man
> ein System nimmt das ein wenig gedämpft und damit stabil ist...
Ich habe mal versucht die Eingangsdaten zu fenstern, so wie man es bei 
der FFT auch manchmal macht (wodurch der eigentliche Vorteil natürlich 
verloren geht). Das Funktioniert. Dabei verbessert sich auch die 
Dämpfung der Nebenzipfel, aber so breit und mit einem Durchlassbereich 
so rund wie eine Sinus Halbwelle, will man das Ding bestimmt nicht 
haben.

> Wenn man einen Ton sucht aber die Frequenz nicht weiss geht das anders.
Also ich mache das jetzt so, dass ich nebenbei eine FFT mitlaufen lasse 
und mir aus der Darstellung mittels Mausklick die Frequenz bestimme. 
Andere Programme suchen da innerhalb festgelegter Grenzen einfach nach 
dem stärksten Signal (und benötigen dann keine Grafik Ausgabe).

Aber wenn die gesuchte Frequenz ausreichend genau bekannt und konstant 
ist, kann man diesen Aufwand sparen.

Autor: R.P. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Detlef_a:

> Standard SNR Ding: Du nimmst das Verhältnis der Energie des Tons aus ...

Genau das war's!!! Habe es am WE getestet und klappt GAAAAAANZ Prima!

Vielen Dank!!!!!!

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Yo, das klappt. Freut mich.

Cheers
Detlef

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.