Turinys:

„Bluetooth“garso ir skaitmeninio signalo apdorojimas: „Arduino“sistema: 10 žingsnių
„Bluetooth“garso ir skaitmeninio signalo apdorojimas: „Arduino“sistema: 10 žingsnių

Video: „Bluetooth“garso ir skaitmeninio signalo apdorojimas: „Arduino“sistema: 10 žingsnių

Video: „Bluetooth“garso ir skaitmeninio signalo apdorojimas: „Arduino“sistema: 10 žingsnių
Video: Denon PMA 900HNE Bluetooth srautinio perdavimo stiprintuvo peržiūros garso testas su Focal Kanta N2 2024, Liepa
Anonim
Image
Image
„Bluetooth“garso ir skaitmeninio signalo apdorojimas: „Arduino“sistema
„Bluetooth“garso ir skaitmeninio signalo apdorojimas: „Arduino“sistema

Santrauka

Kai galvoju apie „Bluetooth“, galvoju apie muziką, bet, deja, dauguma mikrovaldiklių negali leisti muzikos per „Bluetooth“. „Raspberry Pi“gali, bet tai yra kompiuteris. Noriu sukurti „Arduino“pagrindą, skirtą mikrovaldikliams leisti garsą per „Bluetooth“. Norėdami visiškai sulenkti savo mikrovaldiklio raumenis, prie garso pridėsiu realaus laiko skaitmeninio signalo apdorojimą (DSP) (aukšto dažnio filtras, žemo dažnio filtras ir dinaminio diapazono suspaudimas). Dėl vyšnios viršuje pridėsiu žiniatinklio serverį, kurį galima naudoti belaidžiu būdu konfigūruoti DSP. Įterptame vaizdo įraše rodomi „Bluetooth“garso pagrindai veikiant. Tai taip pat rodo, kad naudoju žiniatinklio serverį tam tikram aukšto dažnio filtravimui, žemo dažnio filtravimui ir dinaminio diapazono glaudinimui. Pirmasis dinaminio diapazono glaudinimo naudojimas tikslingai sukelia iškraipymus, kaip netinkamo parametrų pasirinkimo pavyzdys. Antrasis pavyzdys pašalina šį iškraipymą.

Šiam projektui ESP32 yra pasirinktas mikrovaldiklis. Jis kainuoja mažiau nei 10 svarų sterlingų ir yra supakuotas su ADC, DAC, „Wifi“, „Bluetooth Low Energy“, „Bluetooth Classic“ir 240 MHz dviejų branduolių procesoriumi. Borto DAC gali techniškai atkurti garsą, tačiau jis neskambės puikiai. Vietoj to aš naudosiu „Adafruit I2S“stereo dekoderį, kad gaučiau linijos išvesties signalą. Šis signalas gali būti lengvai siunčiamas į bet kurią „HiFi“sistemą, kad akimirksniu pridėtų belaidį garsą prie esamos „HiFi“sistemos.

Prekės

Tikimės, kad dauguma gamintojų turės duonos lentas, trumpiklius, USB kabelius, maitinimo šaltinio lituoklius ir turės tik išleisti 15 svarų ESP32 ir stereo dekoderiui. Jei ne, visos reikalingos dalys yra pateiktos žemiau.

  • ESP32 - išbandytas naudojant ESP32 -PICO -KIT ir TinyPico - 9,50 £/ 24 £
  • „Adafruit I2S“stereo dekoderis - 5,51 svaro
  • Duonos lenta - nuo 3 iki 5 svarų sterlingų
  • Trumpieji laidai - 3 svarai
  • Laidinės ausinės/„Hi -Fi“sistema - £ £ £
  • Stumiamieji antgaliai arba lituoklis - 2,10 £ / 30 £
  • Mikro USB kabelis - 2,10 £/ 3 £
  • Nuo 3,5 mm iki RCA jungties/ 3,5 mm lizdo prie lizdo (ar ko reikia jūsų garsiakalbiui) - 2,40 £/ 1,50 £
  • USB maitinimo šaltinis - 5 svarai

1 žingsnis: Statyba - „Breadboard“

Konstrukcija - duonos lenta
Konstrukcija - duonos lenta

Jei nusipirkote ESP32-PICO-KIT, jums nereikės lituoti jokių kaiščių, nes jie yra iš anksto lituoti. Tiesiog padėkite jį ant duonos lentos.

2 žingsnis: Konstrukcija - stumiamieji antgaliai/litavimas

Konstrukcija - stūmimo antgaliai/litavimas
Konstrukcija - stūmimo antgaliai/litavimas
Konstrukcija - stūmimo antgaliai/litavimas
Konstrukcija - stūmimo antgaliai/litavimas

Jei turite lituoklį, lituokite kaiščius prie stereo dekoderio pagal „Adafruit“svetainėje pateiktas instrukcijas. Rašymo metu mano lituoklis dirbo ir buvo užrakintas. Nenorėjau mokėti už laikiną lituoklį, todėl iš pimoroni iškirpiau keletą stumdomųjų antraščių. Aš juos supjaustiau, kad jie tilptų į stereo dekoderį. Tai nėra geriausias sprendimas (ir ne tai, kaip buvo numatyta naudoti antraštes), tačiau tai yra pigiausia lituoklio alternatyva. Padėkite supjaustytą antraštę ant duonos lentos. Dekoderiui jums reikia tik 1 6 kaiščių eilutės. Norėdami pridėti stabilumą, galite pridėti dar šešis į kitą pusę, tačiau tai nėra būtina šiai prototipų sistemai. Smeigtukai, į kuriuos reikia įdėti antraštes, yra „vin“, „3vo“, „gnd“, „wsel“, „din“ir „bclk“.

3 žingsnis: Statyba - prijunkite maitinimo kaiščius

Konstrukcija - prijunkite maitinimo kaiščius
Konstrukcija - prijunkite maitinimo kaiščius

Padėkite stereofoninį dekoderį ant stūmimo antraščių (vin, 3vo, gnd, wsel, din ir bclk kaiščių) ir tvirtai stumkite juos kartu. Vėlgi, idealiu atveju tai turėtų būti padaryta su lituokliu, bet turėjau improvizuoti. Pastebėsite, kad visi šios instrukcijos laidai yra mėlyni. Taip yra todėl, kad neturėjau jokių trumpiklių, todėl perpjoviau 1 ilgą laidą į mažesnius gabalus. Be to, esu spalvota akla ir man visiškai nerūpi vielos spalva. Maitinimo kaiščiai pritvirtinami taip:

3v3 (ESP32) -> į vinį stereo dekoderiu

gnd (ESP32) -> gnd stereo dekoderiu

4 žingsnis: Statyba - I2S laidai

Konstrukcija - I2S laidai
Konstrukcija - I2S laidai

Norėdami siųsti „Bluetooth“garsą iš ESP32 į stereo dekoderį, mes naudosime skaitmeninio ryšio metodą, vadinamą I2S. Stereofoninis dekoderis perims šį skaitmeninį signalą ir pavers jį analoginiu signalu, kurį galima prijungti prie garsiakalbio ar HiFi. „I2S“reikia tik 3 laidų ir tai gana paprasta suprasti. Bitų laikrodžio (bclk) linija pasisuka aukštai ir žemai, nurodydama, kad perduodamas naujas bitas. Duomenų išvesties eilutė (dout) pasisuka aukštai arba žemai, nurodydama, ar šio bito reikšmė yra 0 ar 1, o žodžio pasirinkimo eilutė (wsel) pasisuka į aukštą ar žemą, nurodydama, ar perduodamas kairysis ar dešinysis kanalas. Ne kiekvienas mikrovaldiklis palaiko I2S, tačiau ESP32 turi 2 I2S linijas. Tai tampa akivaizdžiu šio projekto pasirinkimu.

Elektros instaliacija yra tokia:

27 (ESP32) -> wsel (stereo dekoderis)

25 (ESP32) -> din (stereo dekoderis)

26 (ESP32) -> bclk (stereo dekoderis)

5 veiksmas: „BtAudio“bibliotekos diegimas

„BtAudio“bibliotekos diegimas
„BtAudio“bibliotekos diegimas
„BtAudio“bibliotekos diegimas
„BtAudio“bibliotekos diegimas

Jei jų dar neįdiegėte, įdiekite „Arduino IDE“ir „Arduino“branduolį, skirtą ESP32. Įdiegę juos, apsilankykite mano „Github“puslapyje ir atsisiųskite saugyklą. „Arduino IDE“skiltyje Eskizas >> Įtraukti biblioteką >> pasirinkite „Pridėti. ZIP biblioteką“. Tada pasirinkite atsisiųstą zip failą. Tai turėtų pridėti mano „btAudio“biblioteką prie jūsų „Arduino“bibliotekų. Jei norite naudoti biblioteką, į „Arduino“eskizą turėsite įtraukti atitinkamą antraštę. Tai pamatysite kitame žingsnyje.

6 veiksmas: „BtAudio“bibliotekos naudojimas

„BtAudio“bibliotekos naudojimas
„BtAudio“bibliotekos naudojimas
„BtAudio“bibliotekos naudojimas
„BtAudio“bibliotekos naudojimas

Įdiegę prijunkite ESP32 prie kompiuterio per „micro USB“, o tada prijunkite stereo dekoderį prie garsiakalbio naudodami 3,5 mm laidą. Prieš įkeldami eskizą, turėsite pakeisti kai kuriuos dalykus „Arduino“redaktoriuje. Pasirinkę plokštę, turėsite redaguoti skaidinių schemą skiltyje Įrankiai >> Skirstymo schema ir pasirinkite „Nėra OTA (didelės APP)“arba „Minimalios SPIFFS (didelės APPS su OTA)“. Tai būtina, nes šis projektas naudoja tiek „WiFi“, tiek „Bluetooth“, kurios abi yra labai atminties reikalaujančios bibliotekos. Kai tai padarysite, įkelkite šį eskizą į ESP32.

#įtraukti

// Nustato garso įrenginio pavadinimą btAudio audio = btAudio ("ESP_Speaker"); void setup () {// perduoda garso duomenis į ESP32 audio.begin (); // išgauna gautus duomenis į I2S DAC int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } void loop () {}

Eskizą galima plačiai suskirstyti į 3 etapus:

  1. Sukurkite visuotinį „btAudio“objektą, nustatantį jūsų „ESP32“„Bluetooth“pavadinimą
  2. Konfigūruokite ESP32, kad gautų garsą naudodami metodą btAudio:: begin
  3. Nustatykite I2S kaiščius naudodami metodą btAudio:: I2S.

Tai viskas programinės įrangos pusėje! Dabar viskas, ką jums reikia padaryti, tai užmegzti „Bluetooth“ryšį su savo ESP32. Tiesiog ieškokite naujų įrenginių telefone/nešiojamajame kompiuteryje/MP3 grotuve ir pasirodys „ESP_Speaker“. Kai būsite patenkinti, kad viskas veikia (groja muzika), galite atjungti ESP32 nuo kompiuterio. Įjunkite jį naudodami USB maitinimo šaltinį ir jis prisimins paskutinį į jį įkeltą kodą. Tokiu būdu ESP32 galite amžinai paslėpti už savo HiFi sistemos.

7 žingsnis: DSP - filtravimas

Imtuvo išplėtimas naudojant skaitmeninį signalo apdorojimą

Jei atlikote visus veiksmus (o aš nieko nepraleidau), dabar turite visiškai veikiantį „HiFi“sistemos „Bluetooth“imtuvą. Nors tai yra šaunu, tai tikrai nespaudžia mikrovaldiklio iki savo ribų. ESP32 turi du branduolius, veikiančius 240 MHz dažniu. Tai reiškia, kad šis projektas yra kur kas daugiau nei tik imtuvas. Jis gali būti „Bluetooth“imtuvas su skaitmeniniu signalo procesoriumi (DSP). DSP iš esmės atlieka matematines signalo operacijas realiuoju laiku. Viena naudinga operacija vadinama skaitmeniniu filtravimu. Šis procesas susilpnina signalo dažnius žemiau arba virš tam tikro ribinio dažnio, priklausomai nuo to, ar naudojate aukšto dažnio, ar žemo dažnio filtrą.

Aukšto dažnio filtrai

Aukšto dažnio filtrai slopina dažnius žemiau tam tikros juostos. Sukūriau „Arduino“sistemų filtrų biblioteką pagal kodą iš earlevel.com. Pagrindinis skirtumas yra tas, kad pakeičiau klasės struktūrą, kad būtų lengviau sukurti aukštesnės eilės filtrus. Aukštesnės eilės filtrai efektyviau slopina dažnius, viršijančius jūsų ribą, tačiau jiems reikia daug daugiau apskaičiuoti. Tačiau naudojant dabartinį diegimą, jūs netgi galite naudoti 6-osios eilės filtrus garso įrašui realiuoju laiku!

Eskizas yra toks pat, kaip ir ankstesniame žingsnyje, išskyrus tai, kad pakeitėme pagrindinę kilpą. Norėdami įjungti filtrus, naudojame metodą btAudio:: createFilter. Šis metodas priima 3 argumentus. Pirmasis yra filtrų kaskadų skaičius. Filtrų kaskadų skaičius yra pusė filtro eilės. 6 -osios eilės filtro pirmasis argumentas turėtų būti 3. 8 -os eilės filtro atveju jis būtų 4. Antrasis argumentas yra filtro riba. Aš nustatiau tai 1000 Hz, kad būtų tikrai dramatiškas poveikis duomenims. Galiausiai trečiuoju argumentu nurodome rinkmenos tipą. Tai turėtų būti aukšto dažnio pralaidumas aukšto dažnio filtrui ir žemas pralaidumas žemo dažnio filtrui. Žemiau pateiktas scenarijus perjungia šio dažnio ribą tarp 1000 Hz ir 2 Hz. Turėtumėte išgirsti dramatišką poveikį duomenims.

#įtraukti

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, aukštas pralaidumas); vėlavimas (5000); audio.createFilter (3, 2, „highpass“); }

Žemo dažnio filtrai

Žemo dažnio filtrai veikia priešingai nei aukšto dažnio filtrai ir slopina dažnius, viršijančius tam tikrą dažnį. Jie gali būti įdiegti taip pat, kaip aukšto dažnio filtrai, išskyrus tai, kad jiems reikia pakeisti trečiąjį argumentą į žemą pralaidumą. Žemiau esančiam eskizui aš pakeičiu žemųjų dažnių ribą tarp 2000Hz ir 20000Hz. Tikimės, kad išgirsite skirtumą. Jis turėtų skambėti gana dusliai, kai žemo dažnio filtras yra 2000 Hz dažniu.

#įtraukti

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, žemas pralaidumas); vėlavimas (5000); audio.createFilter (3, 20000, žemas pralaidumas); }

8 žingsnis: DSP - dinaminio diapazono suspaudimas

Fonas

Dinaminio diapazono suspaudimas yra signalo apdorojimo metodas, kuriuo bandoma išlyginti garso stiprumą. Jis suspaudžia garsius garsus, kurie pakyla virš tam tikros slenksčio, iki ramaus lygio, o paskui pasirinktinai sustiprina abu. Rezultatas - tolygesnė klausymosi patirtis. Tai buvo labai naudinga, kai žiūrėjau laidą su labai garsia fonine muzika ir labai tyliu vokalu. Šiuo atveju tik garsumo padidinimas nepadėjo, nes tai tik sustiprino foninę muziką. Naudodamas dinaminio diapazono suspaudimą, galėčiau sumažinti garsią foninę muziką iki vokalo lygio ir vėl viską tinkamai išgirsti.

Kodas

Dinaminio diapazono suspaudimas apima ne tik garsumo mažinimą ar signalo ribos nustatymą. Tai šiek tiek protingiau. Jei sumažinsite garsumą, sumažės tylūs ir garsūs garsai. Vienas iš būdų yra sumažinti signalo slenkstį, tačiau tai sukelia stiprų iškraipymą. Dinaminio diapazono suspaudimas apima minkšto slenksčio ir filtravimo derinį, kad būtų sumažintas iškraipymas, kurį gautumėte, jei ribotumėte/nukirptumėte signalą. Rezultatas yra signalas, kai garsūs garsai yra „nukirpti“be iškraipymų, o tylieji paliekami tokie, kokie yra. Toliau pateiktas kodas perjungia tris skirtingus suspaudimo lygius.

  1. Suspaudimas su iškraipymu
  2. Suspaudimas be iškraipymų
  3. Nėra suspaudimo

#įtraukti

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); vėlavimas (5000); audio.compress (30, 0,0001, 0,1, 10, 10, 0); vėlavimas (5000); audio.decompress (); }

Dinaminio diapazono glaudinimas yra sudėtingas, o „btAudio:: compress“metodai turi daug parametrų. Pabandysiu juos paaiškinti (tvarka) čia:

  1. Slenkstis - garso sumažėjimo lygis (matuojamas decibelais)
  2. Atakos laikas - laikas, per kurį kompresorius pradeda veikti, kai viršijama riba
  3. Išleidimo laikas - laikas, per kurį kompresorius nustoja veikti.
  4. Sumažinimo koeficientas - koeficientas, kuriuo suspaudžiamas garsas.
  5. Kelio plotis - plotis (decibelais) aplink slenkstį, ties kuriuo kompresorius iš dalies veikia (natūralesnis garsas).
  6. Stiprinimas (decibelais) pridedamas prie signalo po suspaudimo (padidinti/sumažinti garsumą)

Labai girdimas iškraipymas pirmą kartą naudojant suspaudimą yra todėl, kad slenkstis yra labai mažas, o atakos ir išleidimo laikas yra labai trumpi, todėl susidaro sunkus slenksčio elgesys. Antruoju atveju tai aiškiai išsprendžiama padidinus išleidimo laiką. Iš esmės kompresorius veikia daug sklandžiau. Čia aš tik parodžiau, kaip 1 parametro keitimas gali dramatiškai paveikti garsą. Dabar jūsų eilė eksperimentuoti su skirtingais parametrais.

Įgyvendinimas (stebuklinga matematika - neprivaloma)

Radau, kad naiviai įgyvendinti dinaminio diapazono suspaudimą yra sudėtinga. Pagal algoritmą reikia konvertuoti 16 bitų sveikąjį skaičių į decibelus, o tada, kai apdorosite signalą, paversti jį atgal į 16 bitų sveiką skaičių. Pastebėjau, kad vienai kodo eilutei stereo duomenims apdoroti reikia 10 mikrosekundžių. Kadangi stereofoninis garsas, imamas 44,1 KHz dažniu, DSP lieka tik 11,3 mikrosekundės, tai yra nepriimtinai lėtai … Tačiau, sujungę nedidelę peržiūros lentelę (400 baitų) ir interpoliavimo procedūrą, pagrįstą „Netwon“padalintais skirtumais, galime pasiekti beveik 17 bitų tikslumą per 0,2 mikrosekundės. Pridėjau pdf dokumentą su visa matematika tikrai susidomėjusiems. Tai sudėtinga, jūs buvote įspėti!

9 veiksmas: „Wifi“sąsaja

„Wifi“sąsaja
„Wifi“sąsaja
„Wifi“sąsaja
„Wifi“sąsaja

Dabar turite „Bluetooth“imtuvą, galintį paleisti realaus laiko DSP. Deja, jei norite pakeisti bet kurį DSP parametrą, turėsite atsijungti nuo „HiFi“, įkelti naują eskizą ir vėl prisijungti. Tai negražu. Norėdami tai išspręsti, sukūriau žiniatinklio serverį, kurį galite naudoti norėdami redaguoti visus DSP parametrus, neprisijungdami prie kompiuterio. Žemiau pateiktas eskizas, kaip naudoti žiniatinklio serverį.

#įtraukti

#include btAudio audio = btAudio ("ESP_Speaker"); webDSP žiniatinklis; void setup () {Serial.begin (115200); audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); // pakeisti savo „WiFi“ID ir slaptažodžiu const char* ssid = "SSID"; const char* password = "PASSWORD"; web.begin (ssid, slaptažodis ir garso įrašas); } void loop () {web._server.handleClient (); }

Kodas priskiria jūsų ESP32 IP adresą, kurį galite naudoti norėdami pasiekti tinklalapį. Pirmą kartą paleidus šį kodą, jis turėtų būti prijungtas prie kompiuterio. Tokiu būdu serijiniame monitoriuje galite matyti ESP32 priskirtą IP adresą. Jei norite pasiekti šį tinklalapį, tiesiog įveskite šį IP adresą į bet kurią žiniatinklio naršyklę (išbandytą „Chrome“).

Iki šiol turėtume būti susipažinę su „Bluetooth“ir „I2S“įgalinimo metodu. Pagrindinis skirtumas yra webDSP objekto naudojimas. Šis objektas naudoja jūsų „Wifi“SSID ir slaptažodį kaip argumentus ir rodyklę į „btAudio“objektą. Pagrindinėje grandinėje mes nuolat gauname „webDSP“objektą, kad jis išklausytų gaunamus duomenis iš tinklalapio ir atnaujintų DSP parametrus. Baigiant reikia pažymėti, kad „Bluetooth“ir „Wifi“naudoja tą patį radiją ESP32. Tai reiškia, kad gali tekti palaukti iki 10 sekundžių nuo parametrų įvedimo tinklalapyje iki to laiko, kai informacija iš tikrųjų pasiekia ESP32.

10 žingsnis: ateities planai

Tikimės, kad jums patiko ši pamoka ir dabar prie „HiFi“pridėjote „Bluetooth Audio“ir DSP. Tačiau manau, kad šiame projekte yra daug galimybių augti, ir aš tik norėjau nurodyti kai kurias ateities kryptis, kurių galėčiau imtis.

  • Įgalinti „Wifi“garso transliaciją (kad būtų pasiekta geriausia garso kokybė)
  • Norėdami įjungti balso komandas, naudokite I2S mikrofoną
  • sukurti „WiFi“valdomą ekvalaizerį
  • Padarykite tai gražią (duonos lenta nerėkia puikaus gaminio dizaino)

Kai pradėsiu įgyvendinti šias idėjas, padarysiu daugiau pamokomų dalykų. O gal kažkas kitas įgyvendins šias funkcijas. Tai džiaugsmas padaryti viską atviru kodu!

Rekomenduojamas: