INHOUDSOPGAWE:

Bluetooth -klank en digitale seinverwerking: 'n Arduino -raamwerk: 10 stappe
Bluetooth -klank en digitale seinverwerking: 'n Arduino -raamwerk: 10 stappe

Video: Bluetooth -klank en digitale seinverwerking: 'n Arduino -raamwerk: 10 stappe

Video: Bluetooth -klank en digitale seinverwerking: 'n Arduino -raamwerk: 10 stappe
Video: Digital signal processing 2024, November
Anonim
Image
Image
Bluetooth -klank en digitale seinverwerking: 'n Arduino -raamwerk
Bluetooth -klank en digitale seinverwerking: 'n Arduino -raamwerk

Opsomming

As ek aan Bluetooth dink, dink ek aan musiek, maar ongelukkig kan die meeste mikrobeheerders nie musiek via Bluetooth speel nie. Die Raspberry Pi kan maar dit is 'n rekenaar. Ek wil 'n Arduino -gebaseerde raamwerk ontwikkel vir mikrobeheerders om klank via Bluetooth te speel. Om die spiere van my mikrobeheerder volledig te buig, gaan ek intydse digitale seinverwerking (DSP) by die klank voeg (hoëpasfiltering, laagdeurlaatfiltering en dinamiese omvangkompressie). Vir die kersie bo -op, voeg ek 'n webbediener by wat gebruik kan word om die DSP draadloos op te stel. Die ingeslote video toon die basiese beginsels van Bluetooth -klank in aksie. Dit wys my ook hoe ek die webbediener gebruik om 'n hoëpasfiltering, laagdeurlaatfiltering en dinamiese omvangkompressie uit te voer. Die eerste gebruik van Dynamic range -kompressie veroorsaak doelbewus vervorming as 'n voorbeeld van swak parameterkeuses. Die tweede voorbeeld elimineer hierdie vervorming.

Vir hierdie projek is die ESP32 die gekose mikrobeheerder. Dit kos minder as £ 10 en is toegerus met ADC's, DAC's, Wifi, Bluetooth Low Energy, Bluetooth Classic en 'n 240MHz dual-core verwerker. Die ingeboude DAC kan tegnies klank speel, maar dit klink nie goed nie. In plaas daarvan sal ek die Adafruit I2S-stereo-dekodeerder gebruik om 'n lynlyn-sein te lewer. Hierdie sein kan maklik na enige HiFi -stelsel gestuur word om onmiddellik draadlose klank by u bestaande HiFi -stelsel te voeg.

Voorrade

Hopelik sal die meeste vervaardigers broodborde, springers, USB -kabels, soldeerboute vir kragtoevoer hê en slegs £ 15 aan die ESP32 en die stereo -dekodeerder hoef te spandeer. Indien nie, is die onderstaande lys van al die benodigde onderdele.

  • 'N ESP32 - getoets op ESP32 -PICO -KIT en TinyPico - £ 9,50/ £ 24
  • Adafruit I2S Stereo Decoder - £ 5.51
  • Broodbord - £ 3 - £ 5 elk
  • Trude - £ 3
  • Bedrade koptelefoon/Hi -Fi -stelsel - £ £
  • Drukkoppe of soldeerbout - £ 2,10 / £ 30
  • Mikro -USB -kabel - £ 2,10/ £ 3
  • 3,5 mm na RCA -aansluiting/ 3,5 mm -aansluiting na aansluiting (of wat u luidspreker ook al benodig) - £ 2,40/ £ 1,50
  • USB -kragbron - £ 5

Stap 1: Konstruksie - die broodbord

Konstruksie - die broodbord
Konstruksie - die broodbord

As u die ESP32-PICO-KIT gekoop het, hoef u geen penne te soldeer nie, aangesien dit vooraf gesoldeer is. Plaas dit eenvoudig op die broodbord.

Stap 2: Konstruksie - Drukkoppe/soldeer

Konstruksie - Drukkoppe/soldeer
Konstruksie - Drukkoppe/soldeer
Konstruksie - Drukkoppe/soldeer
Konstruksie - Drukkoppe/soldeer

As u 'n soldeerbout het, soldeer die penne aan die stereo -dekodeerder volgens die instruksies op die Adafruit -webwerf. By die skryf van my soldeerbout was by die werk wat gesluit was. Ek wou nie betaal vir 'n tydelike soldeerbout nie, en ek sny 'n paar drukkoppe van pimoroni af. Ek het hulle opgesny sodat hulle by die stereo -dekodeerder pas. Dit is nie die beste oplossing nie (en nie hoe die kopstukke bedoel was om gebruik te word nie), maar dit is die goedkoopste alternatief vir 'n soldeerbout. Plaas die snyopskrif op die broodbord. U benodig slegs 1 reël van 6 penne vir die dekodeerder. U kan nog ses by die ander kant voeg vir stabiliteit, maar dit is nie nodig vir hierdie prototipe stelsel nie. Die penne om die kopstukke in te steek, is vin, 3vo, gnd, wsel, din en bclk.

Stap 3: Konstruksie - Bedraad die kragpenne

Konstruksie - Bedraad die kragpenne
Konstruksie - Bedraad die kragpenne

Plaas die Stereo -dekodeerder op die drukkoppe (vin, 3vo, gnd, wsel, din en bclk penne) en druk dit stewig saam. Weereens, dit moet ideaal gedoen word met 'n soldeerbout, maar ek moes improviseer. U sal sien dat al die drade in hierdie instruksies blou is. Dit is omdat ek geen draaddrade gehad het nie, so ek het 1 lang draad in kleiner stukkies gesny. Ek is ook kleurblind en gee nie regtig om oor die draadkleur nie. Die kragpenne word soos volg aangebring:

3v3 (ESP32) -> na vin op stereo -dekodeerder

gnd (ESP32) -> na gnd op stereo -dekodeerder

Stap 4: Konstruksie - I2S -bedrading

Konstruksie - I2S Bedrading
Konstruksie - I2S Bedrading

Om die Bluetooth -klank van die ESP32 na die stereo -dekodeerder te stuur, gaan ons 'n metode gebruik vir digitale kommunikasie genaamd I2S. Die stereo -dekodeerder neem hierdie digitale sein en verander dit in 'n analoog sein wat in 'n luidspreker of HiFi gekoppel kan word. I2S benodig slegs 3 drade en is redelik eenvoudig om te verstaan. Die bit klok (bclk) lyn draai hoog en laag om aan te dui dat 'n nuwe bietjie oorgedra word. Die data-out lyn (dout) draai hoog of laag om aan te dui of die bit 'n waarde van 0 of 1 het en die woord selekteer lyn (wsel) draai hoog of laag om aan te dui of die linker of regter kanaal oorgedra word. Nie elke mikrobeheerder ondersteun I2S nie, maar die ESP32 het 2 I2S -lyne. Dit maak dit 'n duidelike keuse vir hierdie projek.

Die bedrading is soos volg:

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

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

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

Stap 5: Die installering van die BtAudio -biblioteek

Die installering van die BtAudio -biblioteek
Die installering van die BtAudio -biblioteek
Die installering van die BtAudio -biblioteek
Die installering van die BtAudio -biblioteek

As u dit nog nie geïnstalleer het nie, installeer die Arduino IDE en die Arduino -kern vir ESP32. Sodra u dit geïnstalleer het, besoek my Github -bladsy en laai die bewaarplek af. Kies "Voeg. ZIP -biblioteek by" in die Arduino IDE onder Skets >> Sluit biblioteek in >>. Kies dan die afgelaaide zip -lêer. Dit moet my btAudio -biblioteek by u Arduino -biblioteke voeg. Om die biblioteek te gebruik, moet u die relevante opskrif in die Arduino -skets insluit. U sal dit in die volgende stap sien.

Stap 6: Gebruik die BtAudio -biblioteek

Gebruik die BtAudio -biblioteek
Gebruik die BtAudio -biblioteek
Gebruik die BtAudio -biblioteek
Gebruik die BtAudio -biblioteek

Sodra dit geïnstalleer is, koppel u ESP32 via u USB aan u rekenaar en koppel dan u stereo -dekodeerder aan u luidspreker met u 3,5 mm -draad. Voordat u die skets oplaai, moet u 'n paar dinge in die Arduino -redakteur verander. Nadat u u bord gekies het, moet u die partisieskema onder Tools >> Partition Scheme wysig en óf "No OTA (Large APP)" óf "Minimal SPIFFS (Large APPS with OTA)" kies. Dit is nodig omdat hierdie projek beide WiFi en Bluetooth gebruik, wat albei baie geheue -swaar biblioteke is. Laai die volgende skets na die ESP32 nadat u dit gedoen het.

#insluit

// Stel die naam van die klanktoestel btAudio audio = btAudio ("ESP_Speaker") in; leemte -opstelling () {// stroom klankdata na die ESP32 audio.begin (); // stuur die ontvangde data na 'n I2S DAC int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } leemte lus () {}

Die skets kan breedweg in 3 stappe verdeel word:

  1. Skep 'n globale btAudio -voorwerp wat die "Bluetooth -naam" van u ESP32 stel
  2. Stel die ESP32 op om klank te ontvang met die btAudio:: begin -metode
  3. Stel die I2S -penne vas met die btAudio:: I2S -metode.

Dit is alles aan die sagtewarekant! U hoef net die Bluetooth -verbinding met u ESP32 te begin. Soek net nuwe toestelle op u telefoon/skootrekenaar/MP3 -speler en 'ESP_Speaker' verskyn. As u tevrede is dat alles werk (musiek speel), kan u die ESP32 van u rekenaar ontkoppel. Skakel dit aan met die USB -kragbron, en dit onthou die laaste kode wat u opgelaai het. Op hierdie manier kan u u ESP32 vir altyd agter u HiFi -stelsel verberg.

Stap 7: DSP - Filter

Uitbreiding van die ontvanger met digitale seinverwerking

As u al die stappe gevolg het (en ek het niks uitgelaat nie), het u nou 'n volledig funksionerende Bluetooth -ontvanger vir u HiFi -stelsel. Alhoewel dit cool is, stoot dit nie regtig die mikrobeheerder tot sy uiterste nie. Die ESP32 het twee kerns wat op 240MHz werk. Dit beteken dat hierdie projek veel meer is as net 'n ontvanger. Dit het die vermoë om 'n Bluetooth -ontvanger met 'n Digital Signal Processor (DSP) te wees. DSP's voer in wese wiskundige bewerkings op die sein in real-time uit. Een handige handeling word Digital Filtering genoem. Hierdie proses verswak frekwensies in 'n sein onder of bo 'n sekere afsnyfrekwensie, afhangende van of u 'n hoë- of laagdeurlaatfilter gebruik.

Hoogdeurlaatfilters

Hoogpasfilters verswak frekwensies onder 'n sekere band. Ek het 'n filterbiblioteek vir Arduino -stelsels gebou op grond van kode van die earlevel.com. Die belangrikste verskil is dat ek die klasstruktuur verander het sodat dit makliker is om filters van hoër orde te bou. Filters van hoër orde onderdruk frekwensies buite u afsnypunt meer effektief, maar dit verg baie meer berekening. Met die huidige implementering kan u egter selfs filters uit die 6de orde gebruik vir intydse klank!

Die skets is dieselfde as die in die vorige stap, behalwe dat ons die hooflus verander het. Om die filters in staat te stel, gebruik ons die btAudio:: createFilter -metode. Hierdie metode aanvaar 3 argumente. Die eerste is die aantal filterkaskades. Die aantal filterkaskades is die helfte van die volgorde van die filter. Vir 'n 6de orde filter moet die eerste argument 3. Vir 'n 8ste orde filter is dit 4. Die tweede argument is die filter afsny. Ek het dit op 1000Hz gestel om 'n baie dramatiese uitwerking op die data te hê. Laastens spesifiseer ons die tipe lêer met die derde argument. Dit moet 'n hoëpasfilter vir 'n hoogdeurlaatfilter en 'n laagdeur vir 'n laagdeurlaatfilter wees. Die onderstaande skrif skakel die afsny van hierdie frekwensie tussen 1000Hz en 2Hz. U behoort 'n dramatiese effek op die data te hoor.

#insluit

btAudio audio = btAudio ("ESP_Speaker"); ongeldige opstelling () {audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } leemte -lus () {vertraging (5000); audio.createFilter (3, 1000, highpass); vertraging (5000); audio.createFilter (3, 2, highpass); }

Laagdeurlaatfilters

Laagdoorlaatfilters doen die teenoorgestelde van hoëpasfilters en onderdruk frekwensies bo 'n sekere frekwensie. Dit kan op dieselfde manier as hoëpasfilters geïmplementeer word, behalwe dat dit die derde argument na laagpas moet verander. Vir die onderstaande skets wissel ek die laagdoorlaat-afsny tussen 2000Hz en 20000Hz af. Hopelik hoor u die verskil. Dit moet nogal gedemp klink as die laagdeurlaatfilter op 2000Hz is.

#insluit

btAudio audio = btAudio ("ESP_Speaker"); ongeldige opstelling () {audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } leemte -lus () {vertraging (5000); audio.createFilter (3, 2000, lowpass); vertraging (5000); audio.createFilter (3, 20000, lowpass); }

Stap 8: DSP - Dynamic Range Compression

Agtergrond

Kompressie van dinamiese omvang is 'n seinverwerkingsmetode wat die hardheid van die klank probeer gelykmaak. Dit pers harde geluide, wat bo 'n sekere drempel styg, tot die vlak van stilte en versterk dan opsioneel albei. Die resultaat is 'n baie meer egalige luisterervaring. Dit was baie nuttig terwyl ek 'n program kyk met baie harde agtergrondmusiek en 'n baie stil stem. In hierdie geval help dit net nie om die volume te verhoog nie, aangesien dit slegs die agtergrondmusiek versterk. Met kompressie van dinamiese omvang kon ek die harde agtergrondmusiek tot die vlak van die sang verminder en weer alles behoorlik hoor.

Die kode

Kompressie in dinamiese omvang behels nie net die verlaging van die volume of die drempel van die sein nie. Dit is 'n bietjie slimmer as dit. As u die volume verlaag, word stil geluide sowel as die harde geluide verminder. Een manier om dit te voorkom is om die sein te drempel, maar dit lei tot ernstige vervorming. Kompressie in dinamiese omvang behels 'n kombinasie van sagte drempelwaarde en filter om die vervorming wat u sou kry, te verminder as u die sein sou drempel/knip. Die gevolg is 'n sein waar die harde geluide sonder verdraaiing "geknip" word en die stiles soos hulle is. Die onderstaande kode skakel tussen drie verskillende kompressievlakke.

  1. Kompressie met vervorming
  2. Kompressie sonder vervorming
  3. Geen kompressie

#insluit

btAudio audio = btAudio ("ESP_Speaker"); ongeldige opstelling () {audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } leemte -lus () {vertraging (5000); audio.compress (30, 0,0001, 0,0001, 10, 10, 0); vertraging (5000); audio.compress (30, 0.0001, 0.1, 10, 10, 0); vertraging (5000); audio.decompress (); }

Die kompressie van die dinamiese reeks is ingewikkeld en die btAudio:: compress -metodes het baie parameters. Ek sal hulle hier (in volgorde) probeer verduidelik:

  1. Drempel - Die vlak waarop die klank verminder word (gemeet in desibel)
  2. Aanval tyd - die tyd wat dit neem voordat die kompressor begin werk sodra die drempel oorskry is
  3. Vrystellingstyd - die tyd wat dit neem voordat die kompressor ophou werk.
  4. Verminderingsverhouding - die faktor waarmee die klank saamgepers word.
  5. Kniebreedte - Die breedte (in desibel) rondom die drumpel waarteen die kompressor gedeeltelik werk (meer natuurlike klank).
  6. Die versterking (desibel) bygevoeg na die sein na kompressie (verhoog/verlaag volume)

Die baie hoorbare vervorming by die eerste gebruik van kompressie is omdat die drempel baie laag is en die aanvalstyd sowel as die vrylatingstyd baie kort is, wat lei tot 'n harde drempelgedrag. Dit word in die tweede geval duidelik opgelos deur die vrylatingstyd te verleng. Dit veroorsaak in wese dat die kompressor baie gladder werk. Hier het ek net getoon hoe die verandering van 1 parameter 'n dramatiese uitwerking op die klank kan hê. Nou is dit jou beurt om met verskillende parameters te eksperimenteer.

Die implementering (die magiese wiskunde - opsioneel)

Ek het gevind dat die naïewe implementering van die Dynamic range -kompressie uitdagend is. Die algoritme vereis dat 'n 16-bis-heelgetal na desibel omgeskakel word en dit dan na 'n 16-bis-heelgetal omskakel sodra u die sein verwerk het. Ek het opgemerk dat een reël kode 10 mikrosekondes neem om stereodata te verwerk. Aangesien stereo -klank wat by 44,1 KHz bemonster is, slegs 11,3 mikrosekondes vir die DSP oorbly, is dit onaanvaarbaar stadig … Maar deur 'n klein opsoekstabel (400 grepe) en 'n interpolasieprosedure te kombineer gebaseer op Netwon se verdeelde verskille, kan ons byna 17 bisse presisie in 0,2 mikrosekondes verkry. Ek het 'n pdf -dokument met al die wiskunde aangeheg vir die werklik belangstellendes. Dit is ingewikkeld, u is gewaarsku!

Stap 9: Die Wifi -koppelvlak

Die Wifi -koppelvlak
Die Wifi -koppelvlak
Die Wifi -koppelvlak
Die Wifi -koppelvlak

Nou het u 'n Bluetooth-ontvanger wat intydse DSP kan gebruik. Ongelukkig, as u een van die DSP -parameters wil verander, moet u van u HiFi -verbinding ontkoppel, 'n nuwe skets oplaai en dan weer koppel. Dit is lomp. Om dit reg te stel, het ek 'n webbediener ontwikkel wat u kan gebruik om al die DSP -parameters te wysig sonder om weer aan te sluit op u rekenaar. Die skets om die webbediener te gebruik, is hieronder.

#insluit

#sluit btAudio audio in = btAudio ("ESP_Speaker"); webDSP web; ongeldige opstelling () {Serial.begin (115200); audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); // vervang met u WiFi -ID en wagwoord const char* ssid = "SSID"; const char* password = "PASSWORD"; web.begin (ssid, wagwoord en klank); } leemte -lus () {web._server.handleClient (); }

Die kode ken 'n IP -adres aan u ESP32 toe wat u kan gebruik om toegang tot die webblad te verkry. Die eerste keer dat u hierdie kode gebruik, moet u dit aan u rekenaar koppel. Op hierdie manier kan u die IP -adres wat aan u ESP32 toegeken is, op u seriële monitor sien. As u toegang tot hierdie webblad wil verkry, tik hierdie IP -adres in enige webblaaier (getoets op chroom).

Teen hierdie tyd behoort ons vertroud te wees met die metode om Bluetooth en I2S in te skakel. Die belangrikste verskil is die gebruik van 'n webDSP -voorwerp. Hierdie voorwerp neem u Wifi SSID en wagwoord as argumente sowel as 'n wyser na die btAudio -voorwerp. In die hooflus kry ons voortdurend die webDSP -voorwerp om na inkomende data van die webblad te luister en dan die DSP -parameters op te dateer. As afsluiting moet daarop gelet word dat beide Bluetooth en Wifi dieselfde radio op die ESP32 gebruik. Dit beteken dat u moontlik tot 10 sekondes moet wag totdat u parameters op die webblad ingevoer het totdat die inligting die ESP32 bereik het.

Stap 10: Toekomstige planne

Hopelik het u hierdie instruksies geniet en het u nou Bluetooth Audio en DSP by u HiFi gevoeg. Ek dink egter daar is baie ruimte vir groei in hierdie projek, en ek wou net 'n paar toekomstige rigtings aandui wat ek kan volg.

  • Aktiveer Wifi -stroom van klank (vir die beste klankgehalte)
  • Gebruik 'n I2S -mikrofoon om stemopdragte moontlik te maak
  • ontwikkel 'n WiFi -beheerde gelykmaker
  • Maak dit mooi (broodbord skree nie 'n goeie produkontwerp nie)

As ek klaar is met die implementering van hierdie idees, sal ek meer instruksies maak. Of miskien kry iemand anders hierdie funksies geïmplementeer. Dit is die vreugde om alles open source te maak!

Aanbeveel: