für ein Kunstprojekt, bei dem ESP8266 WS2812B-Ledstreifen ansteuern,
soll zusätzlich ein bestimmter Ton (ein Ping, ~8kHz, ~10ms, siehe
Anhang) trotz Nebengeräuschen erkannt werden. Das WLAN des ESP8266 ist
dabei aktiv. Die WS2812B werden mit der NeoPixelBus-Bibliothek
(https://github.com/Makuna/NeoPixelBus) über I2S und DMA angesteuert.
Elektret-Module mit MAX4466 und MAX9814 sind vorhanden. Einzelne
Elektret-Mikrofonkapseln und NE567D sind im Zulauf. Gibt es noch andere
Optionen?
Der ADC des ESP8266 scheint ungeeignet zu sein, da er bei aktivem WLAN
nur 1kHz Samplingrate hat?
Statt analoger Mikrofone könnte ich INMP441-Module verwenden und das
Signal digital filtern, z.B mit dem
https://de.wikipedia.org/wiki/Goertzel-Algorithmus. Aber kann ich auf
dem ESP8266 sowohl I2S-Ausgabe mit DMA als auch I2S-Empfang mit DMA
gleichzeitig nutzen?
Ich habe da meine Zweifel.
Das Ping ist nicht genug einzigartig, das es nicht auch in beliebigen Sounds erkannt werden würde. Ist ja praktisch nur ein kurzes 'klick', als wenn jemand auf eine Glasflasche mit einem Nagel tippt.
Entweder gleich mit einem Kontaktmikro auf der Glasplatte aufnehmen, oder einen mehr einzigartigen Ton verwenden. DTMF ist z.B. so ein Sound.
Due koenntest eine FFT machen und dann das Bin bei 8khz naeher betrachten.
Es waere vielleicht auch klug vorher im Analogbereich einen
Bandpass zu haben oder sogar eine ALC damit du mit dem Dynamikbereich
der Umgebung besser klarkommst.
Um eine ziemlich sichere akustische Erkennungsrate zu erreichen, erfanden die Telefongesellschaften schon in den 60er Jahren das "DTMF-Verfahren". Das bedeutet, dass immer zwei ganz bestimmte Frequenzen GEMINSAM auftreten müssen ...
Hast du Einfluss/Zugriff auf den "Ping"? Nimm zwei Frequenzen, evtl. sogar welche aus dem DTMF-Konzept. Dafür gibts reichlich Lösungen in Hard- und Software ...
Hier liegt der (Oster)Hase im Pfeffer.
Wie genau sieht dieses "Ping" auf dem Oszi aus?
Ist es immer exakt gleich?
Also von wem oder was wird dieses Ping erzeugt?
Um eine ziemlich sichere akustische Erkennungsrate zu erreichen,
erfanden die Telefongesellschaften schon in den 60er Jahren das
"DTMF-Verfahren". Das bedeutet, dass immer zwei ganz bestimmte
Frequenzen GEMINSAM auftreten müssen ...
Jepp! Die Rundfunkgesellschaften haben für eine noch zuverlässigere Erkennung den "Hinz Triller" erfunden. Der wurde auch inmitten von Musikstücken oder gesprochenen Worten erkannt, um damit den Verkehsfunkempfänger im Autoradio zu triggern.
Ich schüttle da nur den Schlüsselbund und habe hunderte solcher
Geräusche.
Die lassen sich aber trotzdem zerlegen.
Die FFT wird im 3D gebildet, hat also das Abklingverhalten in sich. Das ist sehr genau bestimmbar. Wir unterscheiden Motorcharacteristiken und Anschlagsverhalten damit. Deren Störgeräusche hören sich fürs Ohr alle gleich an.
Wie genau sieht dieses "Ping" auf dem Oszi aus?
Ist es immer exakt gleich?
Also von wem oder was wird dieses Ping erzeugt?
Die Art des Geräuschs ist durch das Objekt vorgegeben. Je nach Modell variiert die Frequenz zwischen 7850Hz und 8000Hz, und die Lautstärke variiert auch ein wenig.
Mit einem ESP8266? Kann sein, das er nach nur wenigen Minuten ein
Ergebnis hat. Vergiss es...
Ein Atmega328P ist mit einer Fließkommaversion der Goertzel tatsächlich überfordert. Für einen Audioblock von 128 Samples bei 38462Hz (500kHz ADC-Clock, free-running, 13 ADC clock ticks per sample) braucht der Algorithmus 5ms, die Blöcke laufen aber alle 3.3ms ein. Ein ESP8266 sollte das aber schaffen.
Es waere vielleicht auch klug vorher im Analogbereich einen
Bandpass zu haben oder sogar eine ALC damit du mit dem Dynamikbereich
der Umgebung besser klarkommst.
Mit einem Teensy 4.0 erkennt das angehängte Programm das Geräusch recht sicher. Schlüsselklappern oder allergisches Niesen allerdings ebenfalls, da könnte man noch die Intensität anpassen und/oder die Form der Lautstärkekurve auswerten:
Jepp! Die Rundfunkgesellschaften haben für eine noch zuverlässigere
Erkennung den "Hinz Triller" erfunden. Der wurde auch inmitten von
Musikstücken oder gesprochenen Worten erkannt, um damit den
Verkehsfunkempfänger im Autoradio zu triggern.
Der Hinz-Triller hat aber nur indirekt die Radios getriggert.
Eigentlich war er nur dazu da, um vom Studio aus den ARI bzw. später auch RDS im Sender zu aktivieren, und DADURCH wurde dann das Radio getriggert.
Daher war der Aufwand zur Erkennung auch ehr Nebensächlich.
Vom Prinzip her aber:
Audiosignal -> Bandpass (2,2-2,5kHz) -> FM demodulator -> Schwingkreisfilter (123Hz) -> Pegeldetektor.
Der Hinz-Triller hat aber nur indirekt die Radios getriggert.
Das stimmt so nicht ganz.
Heute ja. OK.
Aber früher, zu Zeiten der ersten Einführung wurde tatsächlich direkt durch die Modulation auf UKW/FM ein Relais im Autoradio geschaltet. Bei meinem Clarion war das jedenfalls noch so.
Drückte einfach Cassettenwiedergabe zu, schaltete auf UKW um.
Bei einigen wurde dann auch auf "extra laut" umgeschaltet.
Die ganze Sache hatte auch noch einen anderen Hintergrund:
Es wurde dikutiert, ob der Einbau eines Autoradios zur Pflicht werden sollte und das Einschalten auch. Damit auf Verkehrsstaus besser hingewiesen werden konnte. Da hat aber die gesetzlichen Hürden nicht geschafft. Statt dessen kam DLF auf die Idee, erst mit den an Autobahnraststätten errichteten Info-Ständen und dann mit dem D-Dur Akkord, der die Durchsage triggerte. Weil das damit nicht so klappte, kam dann das mit dem Hinz-Triller.
Später wurde das zum ARI-System und RDS weiterentwickelt. Der Trick:
Der Hinz-Triller ist nicht mehr im Basisband und damit auch nicht zu hören.
Wenn man den noch hört, ist das eine Notlösung, weil was in der UKW-Zuführung nicht stimmt, RDS ne Panne hat. Oder der Ballempfänger das nicht kann.
Ja, offenbar welche, die ich noch nicht kannte und auch keine Infos in der Hilfe dazu gefunden habe: wavefile=ping.wav TRIGGER V(start)>0.5
Zu der Triggerfunktion fand ich nichts ...
Vielleicht gibst du mir einen Tipp?
Ich kann mich dunkel an eine Schaltung von vor etwa 50 Jahren erinnern, da wurde das Signal durch einen Bandpass geleitet und der Pegel A gemessen (Gleichrichter). Das Signal wurde auch durch eine komplementäre Bandsperre geleitet und dort wurde der Pegel B gemessen. Die beiden Pegel wurden subtrahiert. Wenn die Differenz A-B groß genug war, so war der Ton erkannt. Rein analog, passend zu diesem Unterforum.
Mit einem Teensy 4.0 erkennt das angehängte Programm das Geräusch recht
sicher. Schlüsselklappern oder allergisches Niesen allerdings ebenfalls,
Genau was die anderen sagen: ein einfacher kurzer 8kHz-Sinus kommt ständig vor - da bekommst du laufend Fehlmeldungen.
Allerdings würde ich ungern auf den Teensy-Prozessor wechseln (BGA, kein
WLAN).
Das kann auch ein AVR - schmeiß einfach mal die floats raus. Dein Filter hat nur ein paar mul-adds, zum Teil mit Faktor 0 (coef=2*cos(pi/2)=0), den sqrt am Ende brauchst du nicht. Trivialer Kram ...
I2S ist doch perfekt. Wieso muss gleichzeitig
IN/OUT möglich sein?
I2S OUT wird zur Ansteuerung der Leds verwendet, daher die Frage ob der
ESP8266 gleichzeitig auch noch I2S IN betreiben kann.
Ok, die INMP441-Mikrofone sind angekommen, und ich habe erste Versuche unternommen. Anschluß an den ESP8266 und Goertzel-Erkennung der Ping-Frequenz funktionieren.
Allerdings scheint die I2S-Hardware des ESP8266 für I2SO und I2SI nur eine gemeinsame I2S-BCK-Frequenz, nur eine gemeinsame Anzahl Kanäle, und nur eine gemeinsame Bitlänge der Daten, und dabei nur entweder 16 Bit oder 24 Bit zu unterstützen. Wenn ich also I2SO weiter für die WS2812B-Ansteuerung verwenden möchte, dann bin ich auf eine I2S-BCK-Frequenz von 3.2MHz (4 I2S-Bits kodieren jeweils ein WS2812B-Bit bei 800kHz) festgelegt. Das ergibt bei zwei Kanälen a 16 Bit eine I2S-WS-Frequenz von 100kHz (und bei 24 Bit eine I2S-WS-Frequenz von 75kHz). Und das INMP441 unterstützt zwar eine BCK-Frequenz bis 3.2MHz, aber nur eine WS-Frequenz bis maximal 50kHz, und braucht zwingend zwei Kanäle in der Übertragung. Das geht also nach meinen bisherigen Erkenntnissen nicht zusammen.
To be continued ...
LG, Sebastian
PS: Jetzt wird es hier im Analogforum doch ein wenig digital ...
hier ein kurzer Fortschrittsbericht, und eine sich daran anschließende Frage.
Ich habe die ESP8266-Software so umgestellt, dass die NeoPixelBus-Bibliothek jetzt UART anstatt I2SO zur Ausgabe des WS2812B-Bitstroms nutzt. So kann ich das INMP441-Mikrofon an I2SI anschließen und eine Samplingrate des vierfachen der Suchfrequenz verwenden, so dass der Goertzel-Filter tatsächlich nur Additionen verwendet. Das funktioniert so weit. Allerdings kämpfe ich immer noch mit zwei Problemen, a) dem Verlust der seriellen Ausgabe von Lognachrichten, und b) dass der OTA-Update von Software über das WLAN anscheinend nicht mehr funktioniert.
Parallel dazu sind NE567D als LM567CM (https://www.reichelt.de/de/de/ton-dekoder-1-schaltkreis-so-8-ne-567-d-smd-p18804.html) angekommen, und ich versuche die Tonerkennung auch damit zu realisieren. Ich scheitere bisher allerdings daran, ein Ausgangssignal zu erzeugen. Anbei meine jetzige Schaltung und eine Aufzeichnung der (fehlenden) Reaktion auf einen meiner Pings.
Was mache ich da falsch? Der Oszillator läuft mit 7890Hz. Das Signal hat 7910Hz und auch über ~50 Zyklen einen Hub >100mV. Ist das Signal trotzdem zu kurz und/oder zu schwach?
Was mache ich da falsch? Der Oszillator läuft mit 7890Hz. Das Signal hat
7910Hz und auch über ~50 Zyklen einen Hub >100mV. Ist das Signal
trotzdem zu kurz und/oder zu schwach?
Keiner?
Ich habe den 47nF-Keramikkondensator gegen einen Folientyp getauscht, und parallel zu dem 3k3-Widerstand noch einen 18k-Widerstand verbaut. fO ist jetzt unangeregt recht stabil bei ~8kHz.
Wenn ich mit einem Samsung S8 über Phyphox einen 7960Hz-Ton erzeuge und direkt an das Mikrofon halte, bekomme ich einen Spannungshub von 230mV an Pin 3, also ~80mVrms. Die PLL lockt auch wieder zügig auf das Signal. Dennoch fällt der Pegel an Pin 1 nur um ~20mV ab, und Pin 8 schließt nicht zu GND.