Cuprins:

Procesarea semnalului audio și digital Bluetooth: un cadru Arduino: 10 pași
Procesarea semnalului audio și digital Bluetooth: un cadru Arduino: 10 pași

Video: Procesarea semnalului audio și digital Bluetooth: un cadru Arduino: 10 pași

Video: Procesarea semnalului audio și digital Bluetooth: un cadru Arduino: 10 pași
Video: ET@TC 004 - Prelucrarea semnalelor 2024, Noiembrie
Anonim
Image
Image
Audio Bluetooth și procesare digitală a semnalului: un cadru Arduino
Audio Bluetooth și procesare digitală a semnalului: un cadru Arduino

rezumat

Când mă gândesc la Bluetooth, mă gândesc la muzică, dar, din păcate, majoritatea microcontrolerelor nu pot reda muzică prin Bluetooth. Raspberry Pi poate, dar acesta este un computer. Vreau să dezvolt un cadru bazat pe Arduino pentru ca microcontrolerele să redea audio prin Bluetooth. Pentru a-mi flexa complet mușchii microcontrolerului, voi adăuga procesarea digitală a semnalului în timp real (DSP) la audio (filtrare trecere înaltă, filtrare trecere joasă și compresie cu interval dinamic). Pentru cireșul de deasupra, voi adăuga un server web care poate fi utilizat pentru a configura DSP fără fir. Videoclipul încorporat prezintă elementele de bază ale sunetului Bluetooth în acțiune. De asemenea, îmi arată că folosesc serverul de web pentru a efectua o filtrare trecere înaltă, filtrare trecere joasă și compresie cu interval dinamic. Prima utilizare a compresiei Dynamic Range determină distorsiunea în mod intenționat, ca exemplu de alegeri slabe ale parametrilor. Al doilea exemplu elimină această distorsiune.

Pentru acest proiect, ESP32 este microcontrolerul ales. Costă mai puțin de 10 GBP și este dotat cu caracteristici ADC, DAC, Wifi, Bluetooth Low Energy, Bluetooth Classic și un procesor dual-core de 240 MHz. DAC-ul integrat poate reda tehnic sunetul, dar nu va suna grozav. În schimb, voi folosi decodorul stereo Adafruit I2S pentru a produce un semnal de ieșire de linie. Acest semnal poate fi trimis cu ușurință către orice sistem HiFi pentru a adăuga instantaneu sunet wireless la sistemul dvs. HiFi existent.

Provizii

Sperăm că majoritatea producătorilor vor avea panouri, jumperi, cabluri USB, surse de alimentare și vor trebui să cheltuiască doar 15 GBP pentru ESP32 și decodor stereo. Dacă nu, toate piesele necesare sunt listate mai jos.

  • Un ESP32 - testat pe ESP32-PICO-KIT și TinyPico - 9,50 GBP / 24 GBP
  • Decodor Stereo Adafruit I2S - 5,51 GBP
  • Panou - 3 GBP - 5 GBP fiecare
  • Sârme jumper - 3 GBP
  • Căști cu fir / sistem Hi-Fi - £££
  • Anteturi sau fier de lipit - 2,10 GBP / 30 GBP
  • Cablu micro USB - 2,10 GBP / 3 GBP
  • Conector de 3,5 mm la RCA / jack de 3,5 mm la jack (sau orice altceva are nevoie de difuzorul dvs.) - 2,40 GBP / 1,50 GBP
  • Sursă de alimentare USB - 5 GBP

Pasul 1: Construcție - panoul de panificatie

Construcție - Breadboard
Construcție - Breadboard

Dacă ați cumpărat ESP32-PICO-KIT, nu va trebui să lipiți niciun pin, deoarece este pre-lipit. Pur și simplu așezați-l pe panou.

Pasul 2: Construcție - Push Headers / lipire

Construcție - Push Headers / lipire
Construcție - Push Headers / lipire
Construcție - Push Headers / lipire
Construcție - Push Headers / lipire

Dacă aveți un fier de lipit, lipiți pinii pe decodor stereo conform instrucțiunilor de pe site-ul web Adafruit. La momentul scrierii, lipitorul meu lucra, care era blocat. Nu am vrut să plătesc pentru un fier de lipit temporar, așa că am tăiat niște anteturi push de la pimoroni. Le-am tăiat astfel încât să se potrivească decodorului stereo. Aceasta nu este cea mai bună soluție (și nu modul în care se intenționează utilizarea antetelor), ci este cea mai ieftină alternativă la un fier de lipit. Introduceți antetul tăiat pe tablă. Ar trebui să aveți nevoie doar de o linie de 6 pini pentru decodor. Puteți adăuga încă șase cealaltă parte pentru stabilitate, dar acest lucru nu este necesar pentru acest sistem prototip. Știfturile pentru a introduce sloturile în vin sunt vin, 3vo, gnd, wsel, din și bclk.

Pasul 3: Construcție - conectați știfturile de alimentare

Construcție - conectați știfturile de alimentare
Construcție - conectați știfturile de alimentare

Așezați decodorul stereo pe antetele de împingere (vin, 3vo, gnd, wsel, din și bclk pins) și împingeți-le ferm împreună. Din nou, acest lucru ar trebui să se facă în mod ideal cu un fier de lipit, dar a trebuit să improvizez. Veți observa că toate firele din acest instructable sunt albastre. Asta pentru că nu aveam fire jumper, așa că am tăiat 1 fir lung în bucăți mai mici. De asemenea, sunt daltonist și nu prea îmi pasă de culoarea firului. Pinii de alimentare sunt atașați după cum urmează:

3v3 (ESP32) -> să vin pe decodor stereo

gnd (ESP32) -> la gnd pe decodor stereo

Pasul 4: Construcție - Cablare I2S

Construcție - Cablare I2S
Construcție - Cablare I2S

Pentru a trimite audio Bluetooth de la ESP32 la decodor stereo vom folosi o metodă de comunicare digitală numită I2S. Decodorul stereo va prelua acest semnal digital și îl va transforma într-un semnal analog care poate fi conectat la un difuzor sau HiFi. I2S necesită doar 3 fire și este destul de simplu de înțeles. Linia de ceas de biți (bclk) devine înaltă și joasă pentru a indica transmiterea unui nou bit. Linia de ieșire a datelor (dout) devine înaltă sau scăzută pentru a indica dacă bitul respectiv are o valoare de 0 sau 1, iar cuvântul de selectare a liniei (wsel) se înalță sau scade pentru a indica dacă se transmite canalul stâng sau drept. Nu fiecare microcontroler acceptă I2S, dar ESP32 are 2 linii I2S. Acest lucru îl face o alegere evidentă pentru acest proiect.

Cablarea este după cum urmează:

27 (ESP32) -> wsel (Decodor stereo)

25 (ESP32) -> din (decodor stereo)

26 (ESP32) -> bclk (decodor stereo)

Pasul 5: Instalarea Bibliotecii BtAudio

Instalarea Bibliotecii BtAudio
Instalarea Bibliotecii BtAudio
Instalarea Bibliotecii BtAudio
Instalarea Bibliotecii BtAudio

Dacă nu le aveți deja instalate, instalați Arduino IDE și nucleul Arduino pentru ESP32. După ce le-ați instalat, vizitați pagina mea Github și descărcați depozitul. În cadrul IDE Arduino din Sketch >> Include Library >> selectați "Add. ZIP library". Apoi selectați fișierul zip descărcat. Aceasta ar trebui să adauge biblioteca mea btAudio la bibliotecile dvs. Arduino. Pentru a utiliza biblioteca, va trebui să includeți antetul relevant în schița Arduino. Veți vedea acest lucru în pasul următor.

Pasul 6: Utilizarea Bibliotecii BtAudio

Folosind Biblioteca BtAudio
Folosind Biblioteca BtAudio
Folosind Biblioteca BtAudio
Folosind Biblioteca BtAudio

Odată instalat, conectați ESP32 la computer prin micro USB și apoi conectați decodorul stereo la difuzor cu firul de 3,5 mm. Înainte de a încărca schița, va trebui să schimbați unele lucruri în editorul Arduino. După ce ați selectat placa dvs., va trebui să editați schema de partiții din Instrumente >> Schemă de partiție și să selectați „Fără OTA (aplicație mare)” sau „SPIFFS minime (APLIZĂRI mari cu OTA)”. Acest lucru este necesar, deoarece acest proiect utilizează atât WiFi, cât și Bluetooth, care sunt ambele biblioteci foarte grele de memorie. După ce ați făcut acest lucru, încărcați următoarea schiță pe ESP32.

#include

// Setează numele dispozitivului audio btAudio audio = btAudio ("ESP_Speaker"); void setup () {// transmite date audio către ESP32 audio.begin (); // scoate datele primite într-un DAC I2S int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } bucla nulă () {}

Schița poate fi în general împărțită în 3 pași:

  1. Creați un obiect global btAudio care setează „numele Bluetooth” al ESP32
  2. Configurați ESP32 pentru a primi sunet cu metoda btAudio:: begin
  3. Setați pinii I2S cu metoda btAudio:: I2S.

Asta e pe partea de software! Acum tot ce trebuie să faceți este să inițiați conexiunea Bluetooth la ESP32. Doar căutați dispozitive noi pe telefon / laptop / MP3 player și va apărea „ESP_Speaker”. Odată ce vă bucurați că totul funcționează (redarea muzicii), puteți deconecta ESP32 de la computer. Alimentează-l cu sursa de alimentare USB și își va aminti ultimul cod pe care l-ai încărcat. În acest fel, puteți lăsa ESP32 ascuns în spatele sistemului HiFi pentru totdeauna.

Pasul 7: DSP - Filtrare

Extinderea receptorului cu procesare digitală a semnalului

Dacă ați urmat toți pașii (și nu am lăsat nimic în afara), aveți acum un receptor Bluetooth complet funcțional pentru sistemul dvs. HiFi. Deși acest lucru este cool, nu prea împinge microcontrolerul la limitele sale. ESP32 are două nuclee care funcționează la 240 MHz. Asta înseamnă că acest proiect este mult mai mult decât un simplu receptor. Are capacitatea de a fi un receptor Bluetooth cu un procesor de semnal digital (DSP). DSP-urile efectuează în esență operații matematice pe semnal în timp real. O operațiune utilă se numește filtrare digitală. Acest proces atenuează frecvențele unui semnal sub sau peste o anumită frecvență de întrerupere, în funcție de faptul dacă utilizați un filtru trece-sus sau trece-jos.

Filtre high-pass

Filtrele High-Pass atenuează frecvențele sub o anumită bandă. Am construit o bibliotecă de filtre pentru sistemele Arduino bazată pe cod de pe earlevel.com. Principala diferență este că am schimbat structura clasei pentru a permite construirea mai ușoară a filtrelor de ordin superior. Filtrele de ordin superior suprima frecvențele dincolo de limita dvs. mai eficient, dar necesită mult mai mult calcul. Cu toate acestea, odată cu implementarea actuală, puteți folosi chiar și filtre de ordinul 6 pentru sunet în timp real!

Schița este aceeași cu cea găsită în pasul anterior, cu excepția faptului că am schimbat bucla principală. Pentru a activa filtrele folosim metoda btAudio:: createFilter. Această metodă acceptă 3 argumente. Primul este numărul de cascade de filtru. Numărul de cascade de filtrare este la jumătate din ordinea filtrului. Pentru un filtru de ordinul 6, primul argument ar trebui să fie 3. Pentru un filtru de ordinul 8, ar fi 4. Al doilea argument este întreruperea filtrului. Am setat acest lucru la 1000Hz pentru a avea un efect dramatic asupra datelor. În cele din urmă, specificăm tipul de fișier cu al treilea argument. Acesta ar trebui să fie high-pass pentru un filtru high-pass și low-low pentru un filtru low-pass. Scriptul de mai jos comută limitarea acestei frecvențe între 1000Hz și 2Hz. Ar trebui să auziți un efect dramatic asupra datelor.

#include

btAudio audio = btAudio ("ESP_Speaker"); void setup () {audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } void loop () {delay (5000); audio.createFilter (3, 1000, highpass); întârziere (5000); audio.createFilter (3, 2, highpass); }

Filtre low-pass

Filtrele de trecere joasă fac opusul filtrelor de trecere înaltă și suprimă frecvențele peste o anumită frecvență. Acestea pot fi implementate în același mod ca filtrele de trecere înaltă, cu excepția faptului că necesită schimbarea celui de-al treilea argument în trecere joasă. Pentru schița de mai jos alternez limita de trecere joasă între 2000Hz și 20000Hz. Sperăm că veți auzi diferența. Ar trebui să sune destul de înăbușit atunci când filtrul trece-jos este la 2000Hz.

#include

btAudio audio = btAudio ("ESP_Speaker"); void setup () {audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } void loop () {delay (5000); audio.createFilter (3, 2000, lowpass); întârziere (5000); audio.createFilter (3, 20000, lowpass); }

Pasul 8: DSP - Compresie dinamică

fundal

Compresia dinamică a gamei este o metodă de procesare a semnalului care încearcă să uniformizeze intensitatea sunetului. Comprimă sunete puternice, care se ridică deasupra unui anumit prag, la nivelul celor liniștite și apoi, amplifică opțional amândouă. Rezultatul este o experiență de ascultare mult mai uniformă. Acest lucru a venit foarte util în timp ce vizionam un spectacol cu muzică de fundal foarte tare și voci foarte liniștite. În acest caz, doar creșterea volumului nu a ajutat, deoarece acest lucru a amplificat doar muzica de fundal. Cu compresia dinamică a intervalului, aș putea reduce muzica de fundal puternică la nivelul vocii și aș auzi totul din nou în mod corespunzător.

Codul

Compresia dinamică nu implică doar scăderea volumului sau pragul semnalului. Este ceva mai inteligent decât atât. Dacă reduceți volumul, sunetele silențioase vor fi reduse, precum și cele puternice. O modalitate de a rezolva acest lucru este de a pragul semnalului, dar acest lucru are ca rezultat o distorsiune severă. Compresia dinamică a gamei implică o combinație de praguri soft și filtrare pentru a reduce la minimum distorsiunea pe care ar obține-o dacă ar fi pragul / clipirea semnalului. Rezultatul este un semnal în care sunetele puternice sunt „tăiate” fără distorsiuni și cele liniștite sunt lăsate așa cum sunt. Codul de mai jos comută între trei niveluri diferite de compresie.

  1. Compresie cu distorsiune
  2. Compresie fără distorsiuni
  3. Fără compresie

#include

btAudio audio = btAudio ("ESP_Speaker"); void setup () {audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } void loop () {delay (5000); audio.compress (30, 0.0001, 0.0001, 10, 10, 0); întârziere (5000); audio.compress (30, 0,0001, 0,1, 10, 10, 0); întârziere (5000); audio.decompress (); }

Comprimarea dinamică a intervalului este complicată, iar metodele btAudio:: compress au mulți parametri. Voi încerca să le explic (în ordine) aici:

  1. Prag - Nivelul la care sunetul se reduce (măsurat în decibeli)
  2. Timp de atac - Timpul necesar pentru ca compresorul să înceapă să funcționeze după ce pragul a fost depășit
  3. Timp de eliberare - timpul necesar pentru ca compresorul să nu mai funcționeze.
  4. Reduction Ratio - factorul prin care sunetul este comprimat.
  5. Lățimea genunchiului - Lățimea (în decibeli) în jurul pragului la care funcționează parțial compresorul (sunet mai natural).
  6. Câștigul (decibeli) adăugat semnalului după comprimare (creștere / scădere volum)

Distorsiunea foarte audibilă în prima utilizare a compresiei se datorează faptului că pragul este foarte scăzut și atât timpul de atac, cât și timpul de eliberare sunt foarte scurte, rezultând efectiv un comportament greu de prag. Acest lucru este clar rezolvat în al doilea caz prin creșterea timpului de eliberare. Acest lucru determină în esență compresorul să acționeze într-un mod mult mai lin. Aici am arătat doar cum modificarea unui parametru poate avea un efect dramatic asupra sunetului. Acum este rândul dvs. să experimentați cu diferiți parametri.

Implementarea (matematica magică - opțional)

Am constatat că implementarea naivă a compresiei Dynamic Range este o provocare. Algoritmul necesită conversia unui număr întreg de 16 biți în decibeli și apoi transformarea acestuia înapoi într-un număr întreg de 16 biți după ce ați procesat semnalul. Am observat că o linie de cod ia 10 microsecunde pentru a procesa date stereo. Deoarece sunetul stereo eșantionat la 44,1 KHz lasă doar 11,3 microsecunde pentru DSP, acest lucru este inacceptabil de lent … Cu toate acestea, combinând un mic tabel de căutare (400 octeți) și o procedură de interpolare bazată pe diferențele împărțite ale Netwon, putem obține o precizie de aproape 17 biți în 0,2 microsecunde.. Am atașat un document pdf cu toate matematica pentru cei cu adevărat interesați. Este complicat, ai fost avertizat!

Pasul 9: interfața Wifi

Interfața Wifi
Interfața Wifi
Interfața Wifi
Interfața Wifi

Acum aveți un receptor Bluetooth capabil să ruleze DSP în timp real. Din păcate, dacă doriți să modificați oricare dintre parametrii DSP, va trebui să vă deconectați de la HiFi, încărcați o schiță nouă și apoi reconectați-vă. Acest lucru este neîndemânatic. Pentru a remedia acest lucru, am dezvoltat un server web pe care îl puteți utiliza pentru a edita toți parametrii DSP fără a vă reconecta la computer. Schița de utilizare a serverului web este mai jos.

#include

#include btAudio audio = btAudio ("ESP_Speaker"); webDSP web; void setup () {Serial.begin (115200); audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); // înlocuiți cu ID-ul WiFi și parola const char * ssid = "SSID"; const char * password = "PAROLA"; web.begin (ssid, parolă și audio); } void loop () {web._server.handleClient (); }

Codul atribuie o adresă IP ESP32-ului dvs. pe care îl puteți utiliza pentru a accesa pagina web. Prima dată când rulați acest cod, ar trebui să îl atașați la computer. În acest fel puteți vedea adresa IP atribuită ESP32-ului dvs. pe monitorul dvs. serial. Dacă doriți să accesați această pagină web, introduceți pur și simplu această adresă IP în orice browser web (testat pe Chrome).

Până acum ar trebui să fim familiarizați cu metoda de activare a Bluetooth și I2S. Diferența cheie este utilizarea unui obiect webDSP. Acest obiect ia SSID-ul și parola Wifi ca argumente, precum și un pointer către obiectul btAudio. În bucla principală, obținem continuu obiectul webDSP pentru a asculta datele primite de pe pagina web și apoi actualiza parametrii DSP. Ca punct de închidere, trebuie remarcat faptul că atât Bluetooth, cât și Wifi folosesc același radio pe ESP32. Aceasta înseamnă că poate fi necesar să așteptați până la 10 secunde de la introducerea parametrilor pe pagina web până la momentul în care informațiile ajung efectiv la ESP32.

Pasul 10: Planuri de viitor

Sperăm că v-a plăcut acest lucru instructiv și acum ați adăugat Bluetooth Audio și DSP la HiFi. Cu toate acestea, cred că există mult spațiu pentru creștere în acest proiect și am vrut doar să subliniez câteva direcții viitoare pe care aș putea să le iau.

  • Activați fluxul audio Wifi (pentru cea mai bună calitate audio)
  • Utilizați un microfon I2S pentru a activa comenzile vocale
  • dezvoltați un egalizator controlat de WiFi
  • Faceți-o drăguță (panoul de testare nu țipă designul produsului excelent)

Când ajung să pun în aplicare aceste idei, voi face mai multe instructabile. Sau poate că altcineva va implementa aceste funcții. Aceasta este bucuria de a face totul open source!

Recomandat: