Kazalo:

Obdelava avdio in digitalnega signala Bluetooth: okvir Arduino: 10 korakov
Obdelava avdio in digitalnega signala Bluetooth: okvir Arduino: 10 korakov

Video: Obdelava avdio in digitalnega signala Bluetooth: okvir Arduino: 10 korakov

Video: Obdelava avdio in digitalnega signala Bluetooth: okvir Arduino: 10 korakov
Video: CS50 2015 – 10-я неделя 2024, November
Anonim
Image
Image
Obdelava zvočnega in digitalnega signala Bluetooth: okvir Arduino
Obdelava zvočnega in digitalnega signala Bluetooth: okvir Arduino

Povzetek

Ko pomislim na Bluetooth, pomislim na glasbo, žal večina mikrokrmilnikov ne more predvajati glasbe prek Bluetootha. Raspberry Pi lahko, a to je računalnik. Želim razviti ogrodje, ki temelji na Arduinu, za mikrokrmilnike za predvajanje zvoka prek Bluetootha. Za popolno razgibavanje mišic mikrokrmilnika bom zvoku dodal digitalno obdelavo signalov v realnem času (DSP), visokofrekvenčno filtriranje, nizkoprepustno filtriranje in stiskanje dinamičnega obsega. Za češnjo na vrhu bom dodal spletni strežnik, s katerim lahko brezžično konfigurirate DSP. Vdelani videoposnetek prikazuje osnove zvoka Bluetooth v akciji. Prikaže mi tudi uporabo spletnega strežnika za izvajanje nekaj visokoprepustnega filtriranja, nizkoprepustnega filtriranja in stiskanja dinamičnega obsega. Prva uporaba stiskanja dinamičnega obsega namerno povzroči popačenje kot primer slabe izbire parametrov. Drugi primer odpravlja to popačenje.

Za ta projekt je ESP32 izbrani mikrokrmilnik. Stane manj kot 10 funtov in je opremljen z ADC-ji, DAC-ji, Wifi, Bluetooth Low Energy, Bluetooth Classic in dvojedrnim procesorjem 240 MHz. Vgrajeni DAC lahko tehnično predvaja zvok, vendar se ne sliši odlično. Namesto tega bom za izdelavo signala linijskega izhoda uporabil stereo dekoder Adafruit I2S. Ta signal lahko preprosto pošljete v kateri koli sistem HiFi, da takoj dodate brezžični zvok obstoječemu sistemu HiFi.

Zaloge

Upajmo, da bo večina proizvajalcev imela plošče, skakalce, kable USB, spajkalnike za napajanje in bodo morali porabiti le 15 funtov za ESP32 in stereo dekoder. Če ne, so spodaj navedeni vsi potrebni deli.

  • ESP32 - preizkušeno na ESP32 -PICO -KIT in TinyPico - 9,50 £/ 24 £
  • Stereo dekoder Adafruit I2S - 5,51 £
  • Okvir - 3 £ 5 £ vsak
  • Mostične žice - 3 £
  • Ožičene slušalke/Hi -Fi sistem - £$$
  • Potisne glave ali spajkalnik - 2,10 £ / 30 £
  • Kabel mikro USB - 2,10 £/ 3 £
  • Priključek 3,5 mm na RCA/ 3,5 mm priključek v vtičnico (ali karkoli drugega, kar vaš zvočnik potrebuje) - 2,40 £/ 1,50 £
  • Napajanje USB - 5 funtov

1. korak: Gradnja - plošča

Gradbeništvo - plošča
Gradbeništvo - plošča

Če ste kupili ESP32-PICO-KIT, vam ne bo treba spajkati nožic, saj je vnaprej spajkan. Preprosto ga postavite na mizo.

2. korak: Konstrukcija - potisne glave/spajkanje

Konstrukcija - potisne glave/spajkanje
Konstrukcija - potisne glave/spajkanje
Konstrukcija - potisne glave/spajkanje
Konstrukcija - potisne glave/spajkanje

Če imate spajkalnik, spajajte nožice na stereo dekoder v skladu z navodili na spletnem mestu Adafruit. V času pisanja je deloval moj spajkalnik, ki je bil zaklenjen. Nisem hotel plačati začasnega spajkalnika, zato sem iz pimoronov odrezal nekaj potisnih glav. Izrezala sem jih, da se prilegajo stereo dekoderju. To ni najboljša rešitev (in ne to, kako so bile glave namenjene uporabi), je pa najcenejša alternativa spajkalniku. Izrezano glavo vstavite na ploščo. Za dekodiranje potrebujete le 1 vrstico s 6 zatiči. Za stabilnost lahko na drugo stran dodate še šest, vendar to ni nujno za ta prototipni sistem. Zatiči, v katere lahko vstavite glave, so vin, 3vo, gnd, wsel, din in bclk.

3. korak: Konstrukcija - ožičite napajalne zatiče

Konstrukcija - ožičite napajalne zatiče
Konstrukcija - ožičite napajalne zatiče

Stereo dekoder postavite na potisne glave (vin, 3vo, gnd, wsel, din in bclk) in jih trdno potisnite skupaj. Še enkrat, v idealnem primeru bi to morali narediti s spajkalnikom, vendar sem moral improvizirati. Opazili boste, da so vse žice v tem navodilu modre. To je zato, ker nisem imel nobenih mostičnih žic, zato sem 1 dolgo žico razrezal na manjše kose. Prav tako sem slep za barve in mi ni vseeno za barvo žice. Napajalni zatiči so pritrjeni na naslednji način:

3v3 (ESP32) -> za vin na stereo dekoderju

gnd (ESP32) -> za gnd na stereo dekoderju

4. korak: Gradnja - ožičenje I2S

Konstrukcija - ožičenje I2S
Konstrukcija - ožičenje I2S

Za pošiljanje zvoka Bluetooth iz ESP32 v stereo dekoder bomo uporabili metodo digitalne komunikacije, imenovano I2S. Stereo dekoder bo sprejel ta digitalni signal in ga spremenil v analogni signal, ki ga je mogoče priključiti na zvočnik ali HiFi. I2S potrebuje le 3 žice in je razumljivo preprost za razumevanje. Vrstica bitne ure (bclk) se obrne visoko in nizko, kar kaže na prenos novega bita. Vrstica za izhod podatkov (dout) se obrne visoko ali nizko, da pokaže, ali ima ta bit vrednost 0 ali 1, vrstica za izbiro besede (wsel) pa visoko ali nizko, da označi, ali se prenaša levi ali desni kanal. Vsak mikrokrmilnik ne podpira I2S, vendar ima ESP32 2 liniji I2S. Zaradi tega je očitna izbira za ta projekt.

Ožičenje je naslednje:

27 (ESP32) -> wsel (stereo dekoder)

25 (ESP32) -> din (stereo dekoder)

26 (ESP32) -> bclk (stereo dekoder)

5. korak: Namestitev knjižnice BtAudio

Namestitev knjižnice BtAudio
Namestitev knjižnice BtAudio
Namestitev knjižnice BtAudio
Namestitev knjižnice BtAudio

Če še nimate nameščenih, namestite Arduino IDE in jedro Arduino za ESP32. Ko jih namestite, obiščite mojo stran Github in prenesite skladišče. V Arduino IDE pod Sketch >> Include Library >> izberite "Add. ZIP library". Nato izberite preneseno datoteko zip. To bi moralo dodati mojo knjižnico btAudio v vaše knjižnice Arduino. Če želite uporabljati knjižnico, morate v skico Arduino vključiti ustrezno glavo. To boste videli v naslednjem koraku.

6. korak: Uporaba knjižnice BtAudio

Uporaba knjižnice BtAudio
Uporaba knjižnice BtAudio
Uporaba knjižnice BtAudio
Uporaba knjižnice BtAudio

Ko je nameščen, povežite svoj ESP32 z računalnikom prek mikro USB -ja in nato s 3,5 -milimetrskim kablom povežite stereo dekoder z zvočnikom. Preden naložite skico, boste morali nekaj spremeniti v urejevalniku Arduino. Ko izberete svojo ploščo, boste morali urediti shemo particij pod Orodja >> Shema particij in izbrati "No OTA (Large APP)" ali "Minimal SPIFFS (Large APPS with OTA)". To je potrebno, ker ta projekt uporablja WiFi in Bluetooth, ki sta zelo težki knjižnici. Ko to storite, naložite naslednjo skico v ESP32.

#vključi

// Nastavi ime zvočne naprave btAudio audio = btAudio ("ESP_Speaker"); void setup () {// pretaka zvočne podatke v ESP32 audio.begin (); // oddaja prejete podatke v I2S DAC int bck = 26; int ws = 27; int dout = 25; avdio. I2S (bck, dout, ws); } void loop () {}

Skico lahko na splošno razdelimo v 3 korake:

  1. Ustvarite globalni objekt btAudio, ki nastavi "ime Bluetooth" vašega ESP32
  2. Konfigurirajte ESP32 za sprejemanje zvoka z metodo btAudio:: begin
  3. Zatiče I2S nastavite z metodo btAudio:: I2S.

To je to na strani programske opreme! Zdaj morate le vzpostaviti povezavo Bluetooth z vašim ESP32. Samo poiščite nove naprave v telefonu/prenosnem računalniku/MP3 predvajalniku in prikazal se bo "ESP_Speaker". Ko ste zadovoljni, da vse deluje (predvaja glasba), lahko ESP32 odklopite iz računalnika. Napajajte ga z napajalnikom USB in zapomnil si bo zadnjo kodo, ki ste jo naložili vanj. Tako lahko svoj ESP32 za vedno pustite skrit za sistemom HiFi.

7. korak: DSP - filtriranje

Razširitev sprejemnika z digitalno obdelavo signalov

Če ste sledili vsem korakom (in nisem ničesar izpustil), imate zdaj popolnoma delujoč sprejemnik Bluetooth za vaš sistem HiFi. Čeprav je to kul, mikrokontrolerja v resnici ne premika do meja. ESP32 ima dve jedri, ki delujeta pri 240 MHz. To pomeni, da je ta projekt veliko več kot le sprejemnik. Zmogljiv je kot sprejemnik Bluetooth z digitalnim procesorjem signalov (DSP). DSP v bistvu izvajajo matematične operacije nad signalom v realnem času. Ena uporabna operacija se imenuje digitalno filtriranje. Ta proces oslabi frekvence v signalu pod ali nad določeno mejno frekvenco, odvisno od tega, ali uporabljate visokoprepustni ali nizkoprepustni filter.

Visokoprepustni filtri

Visokoprepustni filtri oslabijo frekvence pod določenim pasom. Knjižnico filtrov za sisteme Arduino sem izdelal na podlagi kode iz earlevel.com. Glavna razlika je v tem, da sem spremenil strukturo razredov, da sem olajšal izdelavo filtrov višjega reda. Filtri višjega reda učinkoviteje zavirajo frekvence, ki presegajo vašo mejo, vendar zahtevajo veliko več izračuna. Vendar pa lahko pri trenutni izvedbi uporabite celo filtre 6. reda za zvok v realnem času!

Skica je enaka tisti, ki smo jo našli v prejšnjem koraku, le da smo spremenili glavno zanko. Za omogočanje filtrov uporabljamo metodo btAudio:: createFilter. Ta metoda sprejema 3 argumente. Prvi je število filtrirnih kaskad. Število kaskad filtrov je polovica vrstnega reda filtra. Za filter šestega reda bi moral biti prvi argument 3. Za filter osmega reda bi bil 4. Drugi argument je mejna vrednost filtra. To sem nastavil na 1000Hz, da bo imel res dramatičen učinek na podatke. Nazadnje s tretjim argumentom določimo vrsto vložka. To bi moralo biti visokoprepustni filter za visokoprepustni filter in nizkoprehodni za nizkoprepustni filter. Spodnji skript preklopi mejo te frekvence med 1000Hz in 2Hz. Morali bi slišati dramatičen učinek na podatke.

#vključi

btAudio audio = btAudio ("ESP_Speaker"); void setup () {audio.begin (); int bck = 26; int ws = 27; int dout = 25; avdio. I2S (bck, dout, ws); } void loop () {delay (5000); audio.createFilter (3, 1000, visoki prehod); zamuda (5000); audio.createFilter (3, 2, visoke pasove); }

Nizkoprepustni filtri

Nizkoprepustni filtri delujejo nasprotno od visokofrekvenčnih filtrov in zavirajo frekvence nad določeno frekvenco. Izvajajo se lahko na enak način kot visokoprepustni filtri, le da potrebujejo spremembo tretjega argumenta v nizkoprepustni. Za skico spodaj zamenjam nizkoprepustno mejo med 2000Hz in 20000Hz. Upajmo, da boste slišali razliko. Ko je nizkoprepustni filter na 2000Hz, bi se moral slišati precej prigušeno.

#vključi

btAudio audio = btAudio ("ESP_Speaker"); void setup () {audio.begin (); int bck = 26; int ws = 27; int dout = 25; avdio. I2S (bck, dout, ws); } void loop () {delay (5000); audio.createFilter (3, 2000, nizki prehod); zamuda (5000); audio.createFilter (3, 20000, nizkoprepustni); }

8. korak: DSP - stiskanje dinamičnega razpona

Ozadje

Stiskanje dinamičnega obsega je metoda obdelave signala, ki poskuša izravnati glasnost zvoka. Stisne glasne zvoke, ki se dvignejo nad določen prag, na raven tihih in nato po želji ojača oba. Rezultat je veliko bolj enakomerna izkušnja poslušanja. To je bilo zelo koristno, ko sem gledal predstavo z zelo glasno glasbo v ozadju in zelo tihim vokalom. V tem primeru samo povečanje glasnosti ni pomagalo, saj je to samo še povečalo glasbo v ozadju. S stiskanjem dinamičnega obsega bi lahko glasno glasbo v ozadju znižal na raven vokala in spet vse pravilno slišal.

Kodeks

Stiskanje dinamičnega območja ne vključuje le zmanjšanja glasnosti ali praga signala. To je nekoliko bolj pametno. Če zmanjšate glasnost, se bodo tihi zvoki in glasni zmanjšali. Eden od načinov za to je prag signala, vendar to povzroči močno popačenje. Stiskanje dinamičnega območja vključuje kombinacijo mehkega praga in filtriranja, da bi zmanjšali popačenje, ki bi ga dobili, če bi prag/izrezali signal. Rezultat je signal, kjer se glasni zvoki "postrižejo" brez popačenja, tihi pa ostanejo takšni, kot so. Spodnja koda preklaplja med tremi različnimi stopnjami stiskanja.

  1. Stiskanje s popačenjem
  2. Stiskanje brez popačenja
  3. Brez stiskanja

#vključi

btAudio audio = btAudio ("ESP_Speaker"); void setup () {audio.begin (); int bck = 26; int ws = 27; int dout = 25; avdio. I2S (bck, dout, ws); } void loop () {delay (5000); avdio.kompresija (30, 0,0001, 0,0001, 10, 10, 0); zamuda (5000); avdio.kompresija (30, 0,0001, 0,1, 10, 10, 0); zamuda (5000); audio.decompress (); }

Stiskanje dinamičnega obsega je zapleteno in metode btAudio:: compress imajo številne parametre. Poskušal jih bom razložiti (po vrstnem redu) tukaj:

  1. Prag - raven, pri kateri se zvok zmanjša (merjeno v decibelih)
  2. Čas napada - čas, ko kompresor začne delovati, ko je prag presežen
  3. Čas sproščanja - čas, ki traja, da kompresor preneha delovati.
  4. Reduction Ratio - faktor, zaradi katerega se zvok stisne.
  5. Širina kolena - Širina (v decibelih) okoli praga, pri katerem kompresor delno deluje (bolj naraven zvok).
  6. Dobiček (decibeli), dodan signalu po stiskanju (povečanje/zmanjšanje glasnosti)

Zelo slišno popačenje pri prvi uporabi stiskanja je zato, ker je prag zelo nizek, čas napada in čas sproščanja pa sta zelo kratka, kar ima za posledico trdo obnašanje praga. To se v drugem primeru očitno reši s podaljšanjem časa sproščanja. To v bistvu povzroči, da kompresor deluje veliko bolj gladko. Tukaj sem samo pokazal, kako lahko sprememba enega parametra dramatično vpliva na zvok. Zdaj ste na vrsti, da preizkusite različne parametre.

Izvajanje (čarobna matematika - neobvezno)

Ugotovil sem, da je naivno izvajanje stiskanja dinamičnega razpona zahtevno. Algoritem zahteva pretvorbo 16-bitnega celega števila v decibele in nato pretvorbo nazaj v 16-bitno celo število, ko obdelate signal. Opazil sem, da ena vrstica kode potrebuje 10 mikrosekund za obdelavo stereo podatkov. Ker stereo zvok, vzorčen pri 44,1 KHz, pusti le 11,3 mikrosekund za DSP, je to nesprejemljivo počasno … Vendar pa s kombinacijo majhne iskalne tabele (400 bajtov) in interpolacijskega postopka, ki temelji na deljenih razlikah Netwona, lahko v 0,2 mikrosekundah dosežemo skoraj 17 -bitno natančnost. Priložil sem pdf dokument z vso matematiko za resnično zainteresirane. Komplicirano je, opozorili ste!

9. korak: Vmesnik Wifi

Vmesnik Wifi
Vmesnik Wifi
Vmesnik Wifi
Vmesnik Wifi

Zdaj imate sprejemnik Bluetooth, ki lahko izvaja DSP v realnem času. Na žalost, če želite spremeniti katerega koli parametra DSP, boste morali prekiniti povezavo s HiFi, naložiti novo skico in se nato znova povezati. To je neumno. Da bi to odpravil, sem razvil spletni strežnik, ki ga lahko uporabite za urejanje vseh parametrov DSP brez ponovne povezave z računalnikom. Skica za uporabo spletnega strežnika je spodaj.

#vključi

#include btAudio audio = btAudio ("ESP_Speaker"); webDSP splet; void setup () {Serial.begin (115200); audio.begin (); int bck = 26; int ws = 27; int dout = 25; avdio. I2S (bck, dout, ws); // zamenjajte z vašim ID -jem WiFi in geslom const char* ssid = "SSID"; const char* geslo = "GESO"; web.begin (ssid, geslo in zvok); } void loop () {web._server.handleClient (); }

Koda vašemu ESP32 dodeli naslov IP, s katerim lahko dostopate do spletne strani. Ko prvič zaženete to kodo, jo morate priložiti računalniku. Tako lahko na svojem serijskem monitorju vidite naslov IP, dodeljen vašemu ESP32. Če želite dostopati do te spletne strani, preprosto vnesite ta naslov IP v kateri koli spletni brskalnik (preizkušeno na Chromu).

Doslej bi morali biti že seznanjeni z načinom omogočanja Bluetootha in I2S. Ključna razlika je uporaba predmeta webDSP. Ta predmet vzame vaš SSID in geslo Wifi kot argumente ter kazalec na objekt btAudio. V glavni zanki neprestano pridobivamo objekt webDSP, da posluša dohodne podatke s spletne strani in nato posodobi parametre DSP. Kot zaključno točko je treba opozoriti, da Bluetooth in Wifi uporabljata isti radio na ESP32. To pomeni, da boste morda morali počakati do 10 sekund od vnosa parametrov na spletno stran do trenutka, ko podatki dejansko dosežejo ESP32.

10. korak: Načrti za prihodnost

Upajmo, da ste uživali v tem navodilu, zdaj pa imate v HiFi dodani Bluetooth Audio in DSP. Vendar menim, da je v tem projektu veliko prostora za rast in želel sem le opozoriti na nekatere prihodnje smernice, ki bi jih lahko sprejel.

  • Omogoči pretakanje zvoka Wifi (za najboljšo kakovost zvoka)
  • Za omogočanje glasovnih ukazov uporabite mikrofon I2S
  • razviti izenačevalnik z nadzorom WiFi
  • Naj bo lepo (plošča ne kriči odličnega oblikovanja izdelka)

Ko se bom lotil izvajanja teh idej, bom naredil več navodil. Ali pa bo morda kdo drug izvedel te funkcije. To je veselje, da je vse odprtokodno!

Priporočena: