Talaan ng mga Nilalaman:

Pagproseso ng Bluetooth Audio at Digital Signal: isang Arduino Framework: 10 Hakbang
Pagproseso ng Bluetooth Audio at Digital Signal: isang Arduino Framework: 10 Hakbang

Video: Pagproseso ng Bluetooth Audio at Digital Signal: isang Arduino Framework: 10 Hakbang

Video: Pagproseso ng Bluetooth Audio at Digital Signal: isang Arduino Framework: 10 Hakbang
Video: Беспроводной микрофон, приемник и передатчик, все в одном 2024, Nobyembre
Anonim
Image
Image
Pagproseso ng Bluetooth Audio at Digital Signal: isang Arduino Framework
Pagproseso ng Bluetooth Audio at Digital Signal: isang Arduino Framework

Buod

Kapag naiisip ko ang Bluetooth naisip ko ang musika ngunit nakalulungkot ang karamihan sa mga microcontroller ay hindi maaaring maglaro ng musika sa pamamagitan ng Bluetooth. Maaari ang Raspberry Pi ngunit iyon ay isang computer. Nais kong bumuo ng isang framework na nakabatay sa Arduino para sa mga microcontroller upang makapag-play ng audio sa pamamagitan ng Bluetooth. Upang ganap na ibaluktot ang mga kalamnan ng aking microcontroller ay magdaragdag ako ng real-time na Digital Signal Processing (DSP) sa audio (high-pass filtering, low-pass filtering at dynamic range compression). Para sa cherry sa itaas, magdaragdag ako ng isang webserver na maaaring magamit upang mai-configure ang DSP nang wireless. Ipinapakita ng naka-embed na video ang mga pangunahing kaalaman sa pagkilos na Bluetooth audio. Ipinapakita rin nito sa akin ang paggamit ng webserver upang magsagawa ng ilang high-pass na pag-filter, low-pass na pag-filter at pag-compress ng dynamic range. Ang unang paggamit ng Dynamic range compression ay sadyang nagdudulot ng pagbaluktot bilang isang halimbawa ng mga hindi magandang pagpipilian ng parameter. Tinatanggal ng pangalawang halimbawa ang pagbaluktot na ito.

Para sa proyektong ito, ang ESP32 ay ang pinili ng microcontroller. Ang gastos ay mas mababa sa £ 10 at tampok na naka-pack na may mga ADC, DAC, Wifi, Bluetooth Mababang Enerhiya, Bluetooth Classic at isang 240MHz dual-core na processor. Ang onboard DAC ay maaaring teknikal na maglaro ng audio ngunit hindi ito maganda ang tunog. Sa halip, gagamitin ko ang Adafruit I2S stereo decoder upang makagawa ng isang line-out signal. Madaling maipadala ang signal na ito sa anumang sistema ng HiFi upang agad na magdagdag ng wireless audio sa iyong umiiral nang HiFi system.

Mga gamit

Inaasahan ko, ang karamihan sa mga gumagawa ay magkakaroon ng mga breadboard, jumper, USB cable, iron iron ng power supply at gagasta lamang ng £ 15 sa ESP32 at ng stereo decoder. Kung hindi, ang lahat ng kinakailangang bahagi ay nakalista sa ibaba.

  • Isang ESP32 - nasubok sa ESP32-PICO-KIT at TinyPico - £ 9.50 / £ 24
  • Adafruit I2S Stereo Decoder - £ 5.51
  • Breadboard - £ 3- £ 5 bawat isa
  • Jumper wires - £ 3
  • Mga naka-wire na headphone / Hi-Fi system - £ $$$
  • Mga Push Header o Soldering Iron - £ 2.10 / £ 30
  • Micro USB cable - £ 2.10 / £ 3
  • 3.5mm sa RCA konektor / 3.5mm jack sa jack (o kung ano man ang kailangan ng iyong speaker) - £ 2.40 / £ 1.50
  • USB Power Supply - £ 5

Hakbang 1: Konstruksiyon - ang Breadboard

Konstruksiyon - ang Breadboard
Konstruksiyon - ang Breadboard

Kung binili mo ang ESP32-PICO-KIT hindi mo na kailangang maghinang ng anumang mga pin dahil ito ay paunang solder. Ilagay lamang ito sa breadboard.

Hakbang 2: Konstruksiyon - Itulak ang Mga Header / paghihinang

Konstruksiyon - Mga Push Header / paghihinang
Konstruksiyon - Mga Push Header / paghihinang
Konstruksiyon - Mga Push Header / paghihinang
Konstruksiyon - Mga Push Header / paghihinang

Kung mayroon kang isang panghinang, solder ang mga pin sa stereo decoder alinsunod sa mga tagubilin sa website ng Adafruit. Sa oras ng pagsulat ng aking soldering iron ay nasa trabaho na kung saan ay naka-lock down. Hindi ko nais na magbayad para sa isang pansamantalang bakal na panghinang kaya pinutol ko ang ilang mga push header mula sa pimoroni. Pinutol ko sila upang magkasya sila sa stereo decoder. Hindi ito ang pinakamahusay na solusyon (at hindi kung paano inilaan na gamitin ang mga header) ngunit ito ang pinakamura na kahalili sa isang panghinang na bakal. I-slot ang cut-up header sa breadboard. Kailangan mo lamang ng 1 linya ng 6 na mga pin para sa decoder. Maaari kang magdagdag ng isa pang anim sa kabilang panig para sa katatagan ngunit hindi ito kinakailangan para sa sistemang prototype na ito. Ang mga pin upang ipasok ang mga header ay vin, 3vo, gnd, wsel, din at bclk.

Hakbang 3: Konstruksiyon - I-wire ang Mga Power Pins

Konstruksiyon - I-wire ang Mga Power Pins
Konstruksiyon - I-wire ang Mga Power Pins

Ilagay ang decoder ng Stereo sa mga header ng push (vin, 3vo, gnd, wsel, din at bclk pin) at mahigpit na itutulak ang mga ito. Muli, perpektong ito ay dapat gawin sa isang panghinang ngunit kailangan kong mag-improvise. Mapapansin mo na ang lahat ng mga wire sa itinuturo na ito ay asul. Iyon ay dahil wala akong anumang mga wire ng jumper kaya't pinutol ko ang 1 mahabang kawad sa mas maliit na mga piraso. Gayundin, colourblind ako at wala akong pakialam sa kulay ng wire. Ang mga power pin ay nakakabit tulad ng sumusunod:

3v3 (ESP32) -> upang mag-vin sa stereo decoder

gnd (ESP32) -> upang gnd sa stereo decoder

Hakbang 4: Konstruksiyon - I2S Mga Kable

Konstruksiyon - I2S Mga Kable
Konstruksiyon - I2S Mga Kable

Upang maipadala ang audio ng Bluetooth mula sa ESP32 sa stereo decoder gagamit kami ng isang paraan ng digital na komunikasyon na tinatawag na I2S. Kukuha ng stereo decoder ang digital signal na ito at gagawing isang analogue signal na maaaring mai-plug sa isang speaker o HiFi. Nangangailangan lamang ang I2S ng 3 wires at makatwirang prangka upang maunawaan. Ang bit na orasan (bclk) na linya ay nagiging mataas at mababa upang ipahiwatig ang isang bagong bit ay naipadala. Ang linya ng data-out (dout) ay lumiliko mataas o mababa upang ipahiwatig kung ang bit na iyon ay may halagang 0 o 1 at ang salitang select line (wsel) ay lumiliko mataas o mababa upang ipahiwatig kung ang kaliwa o kanang channel ay naililipat. Hindi lahat ng microcontroller ay sumusuporta sa I2S ngunit ang ESP32 ay mayroong 2 mga linya ng I2S. Ginagawa nitong isang halatang pagpipilian para sa proyektong ito.

Ang mga kable ay ang mga sumusunod:

27 (ESP32) -> wsel (Stereo decoder)

25 (ESP32) -> din (Stereo decoder)

26 (ESP32) -> bclk (Stereo decoder)

Hakbang 5: Pag-install ng BtAudio Library

Pag-install ng BtAudio Library
Pag-install ng BtAudio Library
Pag-install ng BtAudio Library
Pag-install ng BtAudio Library

Kung hindi mo pa nai-install ang mga ito i-install ang Arduino IDE at ang Arduino core para sa ESP32. Kapag na-install mo na sila bisitahin ang aking pahina ng Github at i-download ang imbakan. Sa loob ng Arduino IDE sa ilalim ng Sketch >> Isama ang Library >> piliin ang "Magdagdag ng. ZIP library". Pagkatapos piliin ang na-download na zip file. Dapat nitong idagdag ang aking library ng btAudio sa iyong mga aklatan ng Arduino. Upang magamit ang library kailangan mong isama ang nauugnay na header sa Arduino sketch. Makikita mo ito sa susunod na hakbang.

Hakbang 6: Paggamit ng BtAudio Library

Paggamit ng BtAudio Library
Paggamit ng BtAudio Library
Paggamit ng BtAudio Library
Paggamit ng BtAudio Library

Kapag na-install, ikonekta ang iyong ESP32 sa iyong computer sa pamamagitan ng micro USB at pagkatapos ay ikonekta ang iyong stereo decoder sa iyong speaker sa iyong 3.5mm wire. Bago mo i-upload ang sketch kakailanganin mong baguhin ang ilang mga bagay sa Arduino editor. Matapos mong mapili ang iyong board kakailanganin mong i-edit ang iskema ng pagkahati sa ilalim ng Mga Tool >> Partition Scheme at piliin ang alinman sa "No OTA (Malaking APP)" o "Minimal SPIFFS (Malaking APPS na may OTA)". Ito ay kinakailangan sapagkat ang proyektong ito ay gumagamit ng parehong WiFi at Bluetooth na parehong memorya ng mabibigat na aklatan. Kapag nagawa mo na itong i-upload ang sumusunod na sketch sa ESP32.

# isama

// Itinatakda ang pangalan ng audio device btAudio audio = btAudio ("ESP_Speaker"); void setup () {// stream audio data to the ESP32 audio.begin (); // outputs the natanggap data sa isang I2S DAC int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } void loop () {}

Ang sketch ay maaaring malawak na nahahati sa 3 mga hakbang:

  1. Lumikha ng isang pandaigdigang bagay na btAudio na nagtatakda ng "Pangalan ng Bluetooth" ng iyong ESP32
  2. I-configure ang ESP32 upang makatanggap ng audio gamit ang btAudio:: simulang pamamaraan
  3. Itakda ang mga I2S pin gamit ang btAudio:: I2S na pamamaraan.

Iyon lang sa panig ng software! Ngayon ang kailangan mo lang gawin ay simulan ang koneksyon sa Bluetooth sa iyong ESP32. I-scan lamang para sa mga bagong aparato sa iyong telepono / laptop / MP3 player at lilitaw ang "ESP_Speaker." Sa sandaling masaya ka na gumagana ang lahat (pag-play ng musika) maaari mong idiskonekta ang ESP32 mula sa iyong computer. Patayin ito gamit ang suplay ng kuryente ng USB at maaalala nito ang huling code na na-upload mo dito. Sa ganitong paraan, maiiwan mo ang iyong ESP32 na nakatago sa iyong HiFi system magpakailanman.

Hakbang 7: DSP - Pagsala

Pagpapalawak ng Receiver gamit ang Pagproseso ng Digital Signal

Kung sinundan mo ang lahat ng mga hakbang (at hindi ko iniwan ang anumang bagay) mayroon ka na ngayong ganap na gumaganang Bluetooth receiver para sa iyong HiFi system. Habang cool ito hindi talaga nito itinutulak ang microcontroller sa mga limitasyon nito. Ang ESP32 ay may dalawang mga core na tumatakbo sa 240MHz. Nangangahulugan iyon na ang proyektong ito ay higit pa sa isang tagatanggap. Ito ay may kakayahang maging isang tagatanggap ng Bluetooth na may isang Digital Signal Processor (DSP). Mahalaga na isinasagawa ng mga DSP ang mga pagpapatakbo ng matematika sa signal sa real-time. Ang isang kapaki-pakinabang na operasyon ay tinatawag na Digital Filter. Ang prosesong ito ay nagpapalambing ng mga frequency sa isang senyas sa ibaba o sa itaas ng isang tiyak na dalas ng cutoff, depende sa kung gumagamit ka ng isang high-pass o low pass filter.

Mga filter na high-pass

Ang mga filter na High-Pass ay nagpapalambing ng mga frequency sa ibaba ng isang tiyak na banda. Bumuo ako ng isang filter library para sa mga system ng Arduino batay sa code mula sa earlevel.com. Ang pangunahing pagkakaiba ay binago ko ang istraktura ng klase upang payagan ang pagbuo ng mga filter na mas mataas ang order nang mas madali. Ang mga mas mataas na order ng filter ay pinipigilan ang mga frequency na lampas sa iyong cutoff nang mas epektibo ngunit nangangailangan sila ng mas maraming pagkalkula. Gayunpaman, sa kasalukuyang pagpapatupad, maaari mo ring gamitin ang mga filter ng ika-6 na order para sa real-time na audio!

Ang sketch ay kapareho ng nahanap sa nakaraang hakbang maliban sa binago namin ang pangunahing loop. Upang paganahin ang mga filter na ginagamit namin ang btAudio:: createFilter na pamamaraan. Tumatanggap ang pamamaraang ito ng 3 mga argumento. Ang una ay ang bilang ng mga cascade ng filter. Ang bilang ng mga cascade ng filter ay kalahati ng pagkakasunud-sunod ng filter. Para sa isang ika-6 na filter ng order, ang unang argumento ay dapat na 3. Para sa isang ika-8 na filter ng order, magiging 4. Ang pangalawang argumento ay ang cutoff ng filter. Itinakda ko ito sa 1000Hz upang magkaroon ng isang talagang dramatikong epekto sa data. Panghuli, tinukoy namin ang uri ng filer na may pangatlong argument. Dapat itong maging highpass para sa isang high-pass filter at lowpass para sa isang low-pass filter. Ang script sa ibaba ay inililipat ang cutoff ng dalas na ito sa pagitan ng 1000Hz at 2Hz. Dapat mong marinig ang isang dramatikong epekto sa data.

# isama

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 () {pagkaantala (5000); audio.createFilter (3, 1000, highpass); pagkaantala (5000); audio.createFilter (3, 2, highpass); }

Mga filter na low-pass

Ang mga filter ng low pass ay ginagawa ang kabaligtaran ng mga high pass filter at pinipigilan ang mga frequency sa itaas ng isang tiyak na dalas. Maaaring ipatupad ang mga ito sa parehong paraan tulad ng mga high pass filter maliban sa kailangan nila ng pagbabago ng pangatlong argumento sa lowpass. Para sa sketch sa ibaba ay kahalili ko ang low-pass cutoff sa pagitan ng 2000Hz at 20000Hz. Sana, marinig mo ang pagkakaiba. Dapat itong masyadong muffled kapag ang low-pass filter ay nasa 2000Hz.

# isama

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 () {pagkaantala (5000); audio.createFilter (3, 2000, lowpass); pagkaantala (5000); audio.createFilter (3, 20000, lowpass); }

Hakbang 8: DSP - Dynamic Range Compression

Background

Ang compression ng Dynamic na saklaw ay isang paraan ng pagpoproseso ng signal na sumusubok na pantay-pantay ang lakas ng audio. Pinipiga nito ang malalakas na tunog, na tumaas sa itaas ng isang tiyak na threshold, sa antas ng mga tahimik at pagkatapos, opsyonal na pinalalaki ang pareho. Ang resulta ay higit na karanasan sa pakikinig. Naging kapaki-pakinabang talaga ito habang nanonood ako ng isang palabas na may napakalakas na background music at tahimik na tinig. Sa kasong ito, ang pagtataas lamang ng lakas ng tunog ay hindi nakatulong dahil pinalakas lamang nito ang background music. Sa pamamagitan ng dinamikong compression ng saklaw, maaari kong bawasan ang malakas na background music sa antas ng mga vocal at marinig muli ang lahat nang maayos.

Ang Code

Ang pag-compress ng Dynamic na saklaw ay hindi lamang kasangkot sa pagbaba ng dami o pag-threshold ng signal. Medyo mas matalino pa ito. Kung babaan mo ang dami ng tahimik na mga tunog ay mababawasan pati na rin ang mga malakas. Ang isang paraan sa paligid nito ay ang pag-threshold ng signal ngunit nagreresulta ito sa matinding pagbaluktot. Ang pag-compress ng Dynamic na saklaw ay nagsasangkot ng isang kumbinasyon ng malambot na threshold at pag-filter upang mabawasan ang pagbaluktot na makukuha ng isang tao kung ikaw ay mag-threshold / i-clip ang signal. Ang resulta ay isang senyas kung saan ang malalakas na tunog ay "na-clip" nang walang pagbaluktot at ang mga tahimik ay naiwan na tulad nila. Ang code sa ibaba ay lumilipat sa pagitan ng tatlong magkakaibang antas ng compression.

  1. Ang compression ay may pagbaluktot
  2. Pag-compress nang walang pagbaluktot
  3. Walang Compression

# isama

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 () {pagkaantala (5000); audio.compress (30, 0.0001, 0.0001, 10, 10, 0); pagkaantala (5000); audio.compress (30, 0.0001, 0.1, 10, 10, 0); pagkaantala (5000); audio.decompress (); }

Ang pag-compress ng Dynamic na saklaw ay kumplikado at ang mga pamamaraan ng btAudio:: compress ay maraming mga parameter. Susubukan kong ipaliwanag ang mga ito (sa pagkakasunud-sunod) dito:

  1. Threshold - Ang antas kung saan nabawasan ang audio (sinusukat sa mga decibel)
  2. Oras ng pag-atake - Ang oras na kinakailangan upang magsimulang magtrabaho ang compressor sa sandaling lumampas ang threshold
  3. Paglabas ng oras - Ang oras na kinakailangan upang ihinto ang paggana ng tagapiga.
  4. Reduction Ratio - ang salik kung saan nai-compress ang audio.
  5. Lapad ng tuhod - Ang lapad (sa mga decibel) sa paligid ng threshold kung saan ang compressor ay bahagyang gumagana (mas natural na tunog).
  6. Ang nakuha (mga decibel) ay idinagdag sa signal pagkatapos ng compression (pagtaas / pagbawas ng dami)

Ang napaka-naririnig na pagbaluktot sa unang paggamit ng compression ay dahil ang threshold ay napakababa at ang parehong oras ng pag-atake at oras ng paglabas ay napakaliit na mabisang nagreresulta sa isang mahirap na pag-uugali ng threshold. Malinaw itong malulutas sa pangalawang kaso sa pamamagitan ng pagdaragdag ng oras ng paglabas. Mahalagang sanhi ito ng compressor upang kumilos sa isang mas makinis na paraan. Dito, ipinakita ko lamang kung paano ang pagbabago ng 1 parameter ay maaaring magkaroon ng isang dramatikong epekto sa audio. Ngayon ay ikaw na ang mag-eksperimento sa iba't ibang mga parameter.

Ang Pagpapatupad (ang magic matematika - opsyonal)

Natagpuan ko na walang kabuluhan ang pagpapatupad ng Dynamic range compression na maging isang mapaghamong. Nangangailangan ang algorithm ng pag-convert ng isang 16-bit integer sa mga decibel at pagkatapos ay ibabalik ito sa isang 16-bit integer sa sandaling naproseso mo ang signal. Napansin ko na ang isang linya ng code ay kumukuha ng 10 microseconds upang maproseso ang data ng stereo. Tulad ng sample ng stereo audio sa 44.1 KHz ay nag-iiwan lamang ng 11.3 microseconds para sa DSP na ito ay hindi katanggap-tanggap na mabagal … Gayunpaman, sa pamamagitan ng pagsasama-sama ng isang maliit na talahanayan ng pagtingin (400 bytes) at isang pamamaraang interpolation batay sa hinati na pagkakaiba-iba ng Netwon maaari tayong makakuha ng halos 17 piraso ng katumpakan sa 0.2 microseconds. Nag-attach ako ng isang dokumentong pdf kasama ang lahat ng matematika para sa tunay na interesado. Ito ay kumplikado, nabigyan ka ng babala!

Hakbang 9: Ang Wifi Interface

Ang Wifi Interface
Ang Wifi Interface
Ang Wifi Interface
Ang Wifi Interface

Ngayon mayroon kang isang tatanggap ng Bluetooth na may kakayahang magpatakbo ng real-time DSP. Nakalulungkot, kung nais mong baguhin ang anuman sa mga parameter ng DSP kakailanganin mong magdiskonekta mula sa iyong HiFi, mag-upload ng isang bagong sketch at pagkatapos ay muling kumonekta. Clunky ito Upang ayusin ito, bumuo ako ng isang webserver na maaari mong gamitin upang mai-edit ang lahat ng mga parameter ng DSP nang hindi kumonekta muli sa iyong computer. Ang sketch na gagamitin ang webserver ay nasa ibaba.

# isama

# isama ang 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); // palitan ang iyong WiFi ID at password const char * ssid = "SSID"; const char * password = "PASSWORD"; web.begin (ssid, password, & audio); } void loop () {web._server.handleClient (); }

Nagtatalaga ang code ng isang IP address sa iyong ESP32 na maaari mong gamitin upang ma-access ang webpage. Sa unang pagkakataon na patakbuhin mo ang code na ito dapat ay naka-attach mo ito sa iyong computer. Sa ganoong paraan makikita mo ang IP address na nakatalaga sa iyong ESP32 sa iyong serial monitor. Kung nais mong ma-access ang webpage na ito ipasok lamang ang IP address na ito sa anumang web browser (nasubukan sa chrome).

Sa ngayon dapat ay pamilyar tayo sa pamamaraan ng pagpapagana ng Bluetooth at I2S. Ang pangunahing pagkakaiba ay ang paggamit ng isang webDSP object. Dadalhin ng object na ito ang iyong Wifi SSID at password bilang mga argumento pati na rin isang pointer sa btAudio object. Sa pangunahing loop, patuloy naming nakukuha ang object ng webDSP upang makinig para sa papasok na data mula sa webpage at pagkatapos ay i-update ang mga parameter ng DSP. Bilang isang punto ng pagsasara, dapat pansinin na ang parehong Bluetooth at Wifi ay gumagamit ng parehong radyo sa ESP32. Nangangahulugan ito na maaaring maghintay ka ng hanggang sa 10 segundo mula kapag nagpasok ka ng mga parameter sa webpage hanggang sa talagang naabot ng impormasyon ang ESP32.

Hakbang 10: Mga Plano sa Hinaharap

Inaasahan ko, nasiyahan ka sa pagtuturo na ito at mayroon nang idinagdag na Bluetooth Audio at DSP sa iyong HiFi. Gayunpaman, sa palagay ko mayroong maraming silid para sa paglaki sa proyektong ito at nais ko lamang ituro ang ilang mga tagubilin sa hinaharap na maaari kong kunin.

  • Paganahin ang Wifi streaming ng audio (para sa pinakamahusay na kalidad ng audio)
  • Gumamit ng isang I2S microphone upang paganahin ang mga utos ng boses
  • bumuo ng isang kinokontrol na pang-pantay ng WiFi
  • Gawin itong maganda (ang breadboard ay hindi sumisigaw ng mahusay na disenyo ng produkto)

Kapag napunta ako sa pagpapatupad ng mga ideyang ito ay makakagawa ako ng mas maraming itinuturo. O baka may ibang makakapagpatupad ng mga tampok na ito. Iyon ang kagalakan ng paggawa ng lahat ng bukas na mapagkukunan!

Inirerekumendang: