Inhaltsverzeichnis:

Bluetooth-Audio- und digitale Signalverarbeitung: ein Arduino-Framework - Gunook
Bluetooth-Audio- und digitale Signalverarbeitung: ein Arduino-Framework - Gunook

Video: Bluetooth-Audio- und digitale Signalverarbeitung: ein Arduino-Framework - Gunook

Video: Bluetooth-Audio- und digitale Signalverarbeitung: ein Arduino-Framework - Gunook
Video: Analog vs Digital Signalverarbeitung (Deutsch/German) 2024, November
Anonim
Image
Image
Bluetooth-Audio und digitale Signalverarbeitung: ein Arduino-Framework
Bluetooth-Audio und digitale Signalverarbeitung: ein Arduino-Framework

Zusammenfassung

Wenn ich an Bluetooth denke, denke ich an Musik, aber leider können die meisten Mikrocontroller keine Musik über Bluetooth abspielen. Der Raspberry Pi kann das, aber das ist ein Computer. Ich möchte ein Arduino-basiertes Framework für Mikrocontroller entwickeln, um Audio über Bluetooth abzuspielen. Um die Muskeln meines Mikrocontrollers vollständig zu spielen, werde ich dem Audio digitale Signalverarbeitung (DSP) in Echtzeit hinzufügen (Hochpassfilterung, Tiefpassfilterung und Dynamikkompression). Als Sahnehäubchen füge ich einen Webserver hinzu, mit dem der DSP drahtlos konfiguriert werden kann. Das eingebettete Video zeigt die Grundlagen von Bluetooth-Audio in Aktion. Es zeigt mir auch, wie ich den Webserver verwende, um Hochpassfilterung, Tiefpassfilterung und Dynamikbereichskomprimierung durchzuführen. Die erstmalige Verwendung der Dynamikbereichskompression verursacht absichtlich Verzerrungen als Beispiel für eine schlechte Parameterauswahl. Das zweite Beispiel eliminiert diese Verzerrung.

Für dieses Projekt ist der ESP32 der Mikrocontroller der Wahl. Es kostet weniger als 10 £ und ist mit ADCs, DACs, Wifi, Bluetooth Low Energy, Bluetooth Classic und einem 240-MHz-Dual-Core-Prozessor ausgestattet. Der integrierte DAC kann technisch Audio wiedergeben, aber es wird nicht großartig klingen. Stattdessen verwende ich den Adafruit I2S-Stereo-Decoder, um ein Line-Out-Signal zu erzeugen. Dieses Signal kann einfach an jedes HiFi-System gesendet werden, um Ihrem bestehenden HiFi-System sofort drahtloses Audio hinzuzufügen.

Lieferungen

Hoffentlich haben die meisten Hersteller Steckbretter, Jumper, USB-Kabel, Lötkolben für Netzteile und müssen nur 15 Pfund für den ESP32 und den Stereo-Decoder ausgeben. Wenn nicht, sind alle erforderlichen Teile unten aufgeführt.

  • Ein ESP32 - getestet auf ESP32-PICO-KIT und TinyPico - £ 9,50 / £ 24
  • Adafruit I2S Stereo-Decoder - 5,51 €
  • Steckbrett - 3 £ 5 pro Stück
  • Überbrückungsdrähte - £ 3
  • Kabelgebundene Kopfhörer/Hi-Fi-System - £££
  • Push-Header oder Lötkolben - £ 2,10 / £ 30
  • Micro-USB-Kabel - 2,10 € / 3 €
  • 3,5-mm-auf-Cinch-Anschluss / 3,5-mm-Klinke zu Buchse (oder was auch immer Ihr Lautsprecher benötigt) - £ 2,40 / £ 1,50
  • USB-Netzteil - £ 5

Schritt 1: Aufbau - das Steckbrett

Konstruktion - das Steckbrett
Konstruktion - das Steckbrett

Wenn Sie das ESP32-PICO-KIT gekauft haben, müssen Sie keine Pins löten, da es vorgelötet ist. Einfach auf das Steckbrett legen.

Schritt 2: Konstruktion - Steckleisten/Löten

Konstruktion - Steckleisten/Löten
Konstruktion - Steckleisten/Löten
Konstruktion - Steckleisten/Löten
Konstruktion - Steckleisten/Löten

Wenn Sie einen Lötkolben haben, löten Sie die Pins gemäß den Anweisungen auf der Adafruit-Website an den Stereo-Decoder. Zum Zeitpunkt des Schreibens war mein Lötkolben in Betrieb, der gesperrt war. Ich wollte nicht für einen temporären Lötkolben bezahlen, also habe ich einige Push-Header von Pimoroni geschnitten. Ich habe sie zerschnitten, damit sie in den Stereo-Decoder passen. Dies ist nicht die beste Lösung (und nicht die Art und Weise, wie die Stiftleisten verwendet werden sollten), aber es ist die billigste Alternative zu einem Lötkolben. Stecken Sie den geschnittenen Header auf das Steckbrett. Sie sollten nur 1 Zeile mit 6 Pins für den Decoder benötigen. Sie können der anderen Seite aus Stabilitätsgründen weitere sechs hinzufügen, dies ist jedoch für dieses Prototypsystem nicht erforderlich. Die Pins zum Einstecken der Header sind vin, 3vo, gnd, wsel, din und bclk.

Schritt 3: Aufbau - Verdrahten Sie die Power Pins

Konstruktion - Verdrahten Sie die Stromstifte
Konstruktion - Verdrahten Sie die Stromstifte

Setzen Sie den Stereo-Decoder auf die Steckleisten (vin, 3vo, gnd, wsel, din und bclk) und schieben Sie sie fest zusammen. Auch dies sollte idealerweise mit einem Lötkolben erfolgen, aber ich musste improvisieren. Sie werden feststellen, dass alle Drähte in diesem instructable blau sind. Das liegt daran, dass ich keine Überbrückungsdrähte hatte, also schneide ich 1 langen Draht in kleinere Stücke. Außerdem bin ich farbenblind und kümmere mich nicht wirklich um die Drahtfarbe. Die Power-Pins werden wie folgt befestigt:

3v3 (ESP32) -> zum vin auf Stereo-Decoder

gnd (ESP32) -> auf Stereo-Decoder gnd

Schritt 4: Aufbau - I2S-Verkabelung

Aufbau - I2S-Verkabelung
Aufbau - I2S-Verkabelung

Um das Bluetooth-Audio vom ESP32 an den Stereo-Decoder zu senden, verwenden wir eine digitale Kommunikationsmethode namens I2S. Der Stereo-Decoder nimmt dieses digitale Signal auf und wandelt es in ein analoges Signal um, das an einen Lautsprecher oder eine HiFi-Anlage angeschlossen werden kann. I2S benötigt nur 3 Drähte und ist relativ einfach zu verstehen. Die Bittaktleitung (bclk) wird hoch und niedrig, um anzuzeigen, dass ein neues Bit übertragen wird. Die Datenausgangsleitung (dout) wird hoch oder niedrig, um anzuzeigen, ob dieses Bit einen Wert von 0 oder 1 hat, und die Wortauswahlleitung (wsel) wird hoch oder niedrig, um anzuzeigen, ob der linke oder rechte Kanal übertragen wird. Nicht jeder Mikrocontroller unterstützt I2S, aber der ESP32 hat 2 I2S-Leitungen. Dies macht es zu einer offensichtlichen Wahl für dieses Projekt.

Die Verkabelung ist wie folgt:

27 (ESP32) -> wsel (Stereo-Decoder)

25 (ESP32) -> din (Stereo-Decoder)

26 (ESP32) -> bclk (Stereo-Decoder)

Schritt 5: Installieren der BtAudio-Bibliothek

Installieren der BtAudio-Bibliothek
Installieren der BtAudio-Bibliothek
Installieren der BtAudio-Bibliothek
Installieren der BtAudio-Bibliothek

Wenn Sie sie noch nicht installiert haben, installieren Sie die Arduino IDE und den Arduino Core für ESP32. Sobald Sie sie installiert haben, besuchen Sie meine Github-Seite und laden Sie das Repository herunter. Wählen Sie in der Arduino-IDE unter Sketch>>Bibliothek einschließen>> ". ZIP-Bibliothek hinzufügen" aus. Wählen Sie dann die heruntergeladene Zip-Datei aus. Dies sollte meine btAudio-Bibliothek zu Ihren Arduino-Bibliotheken hinzufügen. Um die Bibliothek zu verwenden, müssen Sie den entsprechenden Header in die Arduino-Skizze einfügen. Dies sehen Sie im nächsten Schritt.

Schritt 6: Verwenden der BtAudio-Bibliothek

Verwenden der BtAudio-Bibliothek
Verwenden der BtAudio-Bibliothek
Verwenden der BtAudio-Bibliothek
Verwenden der BtAudio-Bibliothek

Verbinden Sie Ihren ESP32 nach der Installation über Micro-USB mit Ihrem Computer und verbinden Sie dann Ihren Stereo-Decoder mit Ihrem 3,5-mm-Kabel mit Ihrem Lautsprecher. Bevor Sie die Skizze hochladen, müssen Sie einige Dinge im Arduino-Editor ändern. Nachdem Sie Ihr Board ausgewählt haben, müssen Sie das Partitionsschema unter Tools >> Partitionsschema bearbeiten und entweder "Kein OTA (Large APP)" oder "Minimal SPIFFS (Large APPS with OTA)" auswählen. Dies ist notwendig, da dieses Projekt sowohl WiFi als auch Bluetooth verwendet, die beide sehr speicherintensive Bibliotheken sind. Sobald Sie dies getan haben, laden Sie die folgende Skizze auf den ESP32 hoch.

#enthalten

// Setzt den Namen des Audiogeräts btAudio audio = btAudio("ESP_Speaker"); Void setup () {// streamt Audiodaten zum ESP32 audio.begin (); // gibt die empfangenen Daten an einen I2S-DAC aus int bck = 26; intws = 27; intdout = 25; audio. I2S(bck,dout,ws); } Leere Schleife () { }

Die Skizze lässt sich grob in 3 Schritte unterteilen:

  1. Erstellen Sie ein globales btAudio-Objekt, das den "Bluetooth-Namen" Ihres ESP32 festlegt
  2. Konfigurieren Sie den ESP32 für den Empfang von Audio mit der btAudio::begin-Methode
  3. Setzen Sie die I2S-Pins mit der btAudio::I2S-Methode.

Das war's auf der Softwareseite! Jetzt müssen Sie nur noch die Bluetooth-Verbindung zu Ihrem ESP32 herstellen. Suchen Sie einfach nach neuen Geräten auf Ihrem Telefon/Laptop/MP3-Player und "ESP_Speaker" wird angezeigt. Sobald Sie zufrieden sind, dass alles funktioniert (Musik läuft), können Sie den ESP32 von Ihrem Computer trennen. Versorgen Sie es mit dem USB-Netzteil und es wird sich der letzte Code merken, den Sie darauf hochgeladen haben. Auf diese Weise können Sie Ihren ESP32 für immer hinter Ihrer HiFi-Anlage versteckt lassen.

Schritt 7: DSP - Filterung

Erweitern des Empfängers mit digitaler Signalverarbeitung

Wenn Sie alle Schritte befolgt haben (und ich nichts ausgelassen habe), haben Sie jetzt einen voll funktionsfähigen Bluetooth-Empfänger für Ihre HiFi-Anlage. Das ist zwar cool, bringt den Mikrocontroller aber nicht wirklich an seine Grenzen. Der ESP32 hat zwei Kerne, die mit 240 MHz arbeiten. Das bedeutet, dass dieses Projekt weit mehr ist als nur ein Empfänger. Es hat die Fähigkeit, ein Bluetooth-Empfänger mit einem digitalen Signalprozessor (DSP) zu sein. DSPs führen im Wesentlichen mathematische Operationen an dem Signal in Echtzeit durch. Eine nützliche Operation wird als digitales Filtern bezeichnet. Dieser Prozess dämpft Frequenzen in einem Signal unterhalb oder oberhalb einer bestimmten Grenzfrequenz, je nachdem, ob Sie einen Hochpass- oder Tiefpassfilter verwenden.

Hochpassfilter

Hochpassfilter dämpfen Frequenzen unterhalb eines bestimmten Bandes. Ich habe eine Filterbibliothek für Arduino-Systeme basierend auf Code von earlevel.com erstellt. Der Hauptunterschied besteht darin, dass ich die Klassenstruktur geändert habe, um die Konstruktion von Filtern höherer Ordnung einfacher zu machen. Filter höherer Ordnung unterdrücken Frequenzen jenseits Ihrer Grenzfrequenz effektiver, erfordern jedoch viel mehr Berechnung. Mit der aktuellen Implementierung können Sie jedoch sogar Filter 6. Ordnung für Echtzeit-Audio verwenden!

Die Skizze ist die gleiche wie im vorherigen Schritt, außer dass wir die Hauptschleife geändert haben. Um die Filter zu aktivieren, verwenden wir die Methode btAudio::createFilter. Diese Methode akzeptiert 3 Argumente. Der erste ist die Anzahl der Filterkaskaden. Die Anzahl der Filterkaskaden entspricht der halben Ordnung des Filters. Bei einem Filter 6. Ordnung sollte das erste Argument 3 sein. Bei einem 8. Ordnung wäre es 4. Das zweite Argument ist die Filtergrenze. Ich habe dies auf 1000 Hz eingestellt, um einen wirklich dramatischen Effekt auf die Daten zu haben. Schließlich geben wir mit dem dritten Argument den Typ des Filers an. Dies sollte Hochpass für einen Hochpassfilter und Tiefpass für einen Tiefpassfilter sein. Das folgende Skript schaltet die Grenzfrequenz dieser Frequenz zwischen 1000 Hz und 2 Hz um. Sie sollten einen dramatischen Effekt auf die Daten hören.

#enthalten

btAudio-Audio = btAudio("ESP_Speaker"); Void setup () {audio.begin (); intbck = 26; intws = 27; intdout = 25; audio. I2S(bck,dout,ws); aufrechtzuerhalten. Void Schleife () { Verzögerung (5000); audio.createFilter(3, 1000, Hochpass); Verzögerung (5000); audio.createFilter(3, 2, Hochpass); }

Tiefpassfilter

Tiefpassfilter machen das Gegenteil von Hochpassfiltern und unterdrücken Frequenzen oberhalb einer bestimmten Frequenz. Sie können wie Hochpassfilter implementiert werden, außer dass sie das dritte Argument in Tiefpass ändern müssen. Für die folgende Skizze wechsele ich den Tiefpass-Cutoff zwischen 2000Hz und 20000Hz. Hoffentlich hört man den Unterschied. Es sollte ziemlich dumpf klingen, wenn der Tiefpassfilter auf 2000 Hz eingestellt ist.

#enthalten

btAudio-Audio = btAudio("ESP_Speaker"); Void setup () {audio.begin (); intbck = 26; intws = 27; intdout = 25; audio. I2S(bck,dout,ws); aufrechtzuerhalten. Void Schleife () { Verzögerung (5000); audio.createFilter(3, 2000, Tiefpass); Verzögerung (5000); audio.createFilter(3, 20000, Tiefpass); }

Schritt 8: DSP - Dynamikbereichskomprimierung

Hintergrund

Die Dynamikbereichskomprimierung ist eine Signalverarbeitungsmethode, die versucht, die Lautstärke des Audios auszugleichen. Er komprimiert laute Töne, die eine bestimmte Schwelle überschreiten, auf den Pegel leiser und verstärkt dann optional beide. Das Ergebnis ist ein viel gleichmäßigeres Hörerlebnis. Das war sehr nützlich, als ich eine Show mit sehr lauter Hintergrundmusik und sehr leisem Gesang sah. In diesem Fall hat es nicht geholfen, nur die Lautstärke zu erhöhen, da dies nur die Hintergrundmusik verstärkt. Mit der Dynamikkompression konnte ich die laute Hintergrundmusik auf das Niveau des Gesangs reduzieren und alles wieder richtig hören.

Der Code

Bei der Dynamikbereichskompression geht es nicht nur darum, die Lautstärke zu verringern oder das Signal mit Schwellenwerten zu versehen. Es ist ein bisschen cleverer als das. Wenn Sie die Lautstärke verringern, werden neben den lauten auch leise Töne reduziert. Eine Möglichkeit, dies zu umgehen, besteht darin, das Signal mit einem Schwellenwert zu versehen, dies führt jedoch zu starken Verzerrungen. Die Dynamikbereichskomprimierung umfasst eine Kombination aus weichem Schwellenwert und Filterung, um die Verzerrung zu minimieren, die beim Schwellenwert/Begrenzen des Signals auftreten würde. Das Ergebnis ist ein Signal, bei dem die lauten Töne ohne Verzerrung "abgeschnitten" werden und die leisen so belassen werden, wie sie sind. Der folgende Code schaltet zwischen drei verschiedenen Komprimierungsstufen um.

  1. Kompression mit Verzerrung
  2. Kompression ohne Verzerrung
  3. Keine Kompression

#enthalten

btAudio-Audio = btAudio("ESP_Speaker"); Void setup () {audio.begin (); intbck = 26; intws = 27; intdout = 25; audio. I2S(bck,dout,ws); aufrechtzuerhalten. Void Schleife () { Verzögerung (5000); audio.compress(30, 0,0001, 0,0001, 10, 10, 0); Verzögerung (5000); audio.compress(30, 0,0001, 0,1, 10, 10, 0); Verzögerung (5000); audio.decompress(); }

Die Komprimierung des Dynamikbereichs ist kompliziert und die btAudio::compress-Methode hat viele Parameter. Ich werde versuchen, sie (in der Reihenfolge) hier zu erklären:

  1. Schwellenwert – Der Pegel, bei dem der Ton reduziert wird (gemessen in Dezibel)
  2. Attack-Zeit - Die Zeit, die der Kompressor benötigt, um zu arbeiten, nachdem der Schwellenwert überschritten wurde
  3. Freigabezeit - Die Zeit, die der Kompressor benötigt, um zu arbeiten.
  4. Reduktionsverhältnis - der Faktor, um den das Audio komprimiert wird.
  5. Kniebreite - Die Breite (in Dezibel) um den Schwellenwert, bei dem der Kompressor teilweise arbeitet (natürlicherer Klang).
  6. Die dem Signal nach der Komprimierung hinzugefügte Verstärkung (Dezibel) (Lautstärke erhöhen/verringern)

Die sehr hörbare Verzerrung bei der ersten Verwendung der Kompression ist darauf zurückzuführen, dass der Schwellenwert sehr niedrig ist und sowohl die Attack- als auch die Release-Zeit sehr kurz sind, was effektiv zu einem harten Schwellenwertverhalten führt. Dies wird im zweiten Fall eindeutig gelöst, indem die Release-Zeit erhöht wird. Dies führt im Wesentlichen dazu, dass der Kompressor viel sanfter arbeitet. Hier habe ich nur gezeigt, wie sich die Änderung eines Parameters dramatisch auf das Audio auswirken kann. Jetzt sind Sie an der Reihe, mit verschiedenen Parametern zu experimentieren.

Die Implementierung (die magische Mathematik - optional)

Ich fand, dass die naive Implementierung der Dynamikbereichskomprimierung eine Herausforderung darstellt. Der Algorithmus erfordert die Konvertierung einer 16-Bit-Ganzzahl in Dezibel und die anschließende Rücktransformation in eine 16-Bit-Ganzzahl, sobald Sie das Signal verarbeitet haben. Mir ist aufgefallen, dass eine Codezeile 10 Mikrosekunden benötigt, um Stereodaten zu verarbeiten. Da mit 44,1 KHz abgetastetes Stereo-Audio nur 11,3 Mikrosekunden für den DSP übrig lässt, ist dies inakzeptabel langsam… Durch die Kombination einer kleinen Lookup-Tabelle (400 Byte) und einer Interpolation, die auf den geteilten Differenzen von Netwon basiert, können wir jedoch eine Genauigkeit von fast 17 Bit in 0,2 Mikrosekunden erreichen. Ich habe ein pdf-Dokument mit allen Mathematik für die wirklich Interessierten angehängt. Es ist kompliziert, Sie wurden gewarnt!

Schritt 9: Die Wifi-Schnittstelle

Die WLAN-Schnittstelle
Die WLAN-Schnittstelle
Die WLAN-Schnittstelle
Die WLAN-Schnittstelle

Jetzt haben Sie einen Bluetooth-Empfänger, der Echtzeit-DSP ausführen kann. Wenn Sie einen der DSP-Parameter ändern möchten, müssen Sie leider die Verbindung zu Ihrer HiFi-Anlage trennen, eine neue Skizze hochladen und dann erneut verbinden. Das ist klobig. Um dies zu beheben, habe ich einen Webserver entwickelt, mit dem Sie alle DSP-Parameter bearbeiten können, ohne sich erneut mit Ihrem Computer zu verbinden. Die Skizze zur Verwendung des Webservers ist unten.

#enthalten

#include btAudio-Audio = btAudio("ESP_Speaker"); webDSP-Web; Void setup () { Serial.begin (115200); audio.begin(); intbck = 26; intws = 27; intdout = 25; audio. I2S(bck,dout,ws); // Ersetzen Sie durch Ihre WLAN-ID und Ihr Passwort const char* ssid = "SSID"; const char* passwort = "PASSWORT"; web.begin(ssid, password, &audio); aufrechtzuerhalten. Void Schleife () { web._server.handleClient (); }

Der Code weist Ihrem ESP32 eine IP-Adresse zu, mit der Sie auf die Webseite zugreifen können. Wenn Sie diesen Code zum ersten Mal ausführen, sollten Sie ihn an Ihren Computer anhängen. Auf diese Weise können Sie die Ihrem ESP32 zugewiesene IP-Adresse auf Ihrem seriellen Monitor sehen. Wenn Sie auf diese Webseite zugreifen möchten, geben Sie einfach diese IP-Adresse in einen beliebigen Webbrowser ein (auf Chrome getestet).

Inzwischen sollten wir mit der Methode zum Aktivieren von Bluetooth und I2S vertraut sein. Der Hauptunterschied besteht in der Verwendung eines webDSP-Objekts. Dieses Objekt nimmt Ihre Wifi-SSID und Ihr Passwort als Argumente sowie einen Zeiger auf das btAudio-Objekt. In der Hauptschleife lassen wir das webDSP-Objekt ständig auf eingehende Daten von der Webseite warten und dann die DSP-Parameter aktualisieren. Als abschließender Punkt ist anzumerken, dass sowohl Bluetooth als auch Wifi dasselbe Radio auf dem ESP32 verwenden. Dies bedeutet, dass Sie möglicherweise bis zu 10 Sekunden warten müssen, nachdem Sie Parameter auf der Webseite eingegeben haben, bis die Informationen tatsächlich den ESP32 erreichen.

Schritt 10: Zukunftspläne

Hoffentlich haben Sie dieses anweisbare genossen und haben jetzt Bluetooth Audio und DSP zu Ihrem HiFi hinzugefügt. Ich denke jedoch, dass dieses Projekt viel Raum für Wachstum bietet, und ich wollte nur einige zukünftige Richtungen aufzeigen, die ich einschlagen könnte.

  • Aktivieren Sie das Wifi-Streaming von Audio (für die beste Audioqualität)
  • Verwenden Sie ein I2S-Mikrofon, um Sprachbefehle zu aktivieren
  • einen WiFi-gesteuerten Equalizer entwickeln
  • Mach es hübsch (Breadboard schreit nicht nach großartigem Produktdesign)

Wenn ich dazu komme, diese Ideen umzusetzen, werde ich mehr instructables machen. Oder vielleicht wird jemand anderes diese Funktionen implementieren. Das ist die Freude, alles Open Source zu machen!

Empfohlen: