Përmbajtje:

Përpunimi i sinjalit audio dhe dixhital Bluetooth: një kornizë Arduino: 10 hapa
Përpunimi i sinjalit audio dhe dixhital Bluetooth: një kornizë Arduino: 10 hapa

Video: Përpunimi i sinjalit audio dhe dixhital Bluetooth: një kornizë Arduino: 10 hapa

Video: Përpunimi i sinjalit audio dhe dixhital Bluetooth: një kornizë Arduino: 10 hapa
Video: TV TCL 43S525 4K UHD-Çfarë duhet të dini 2024, Nëntor
Anonim
Image
Image
Përpunimi i sinjalit audio dhe dixhital Bluetooth: një kornizë Arduino
Përpunimi i sinjalit audio dhe dixhital Bluetooth: një kornizë Arduino

Përmbledhje

Kur mendoj për Bluetooth mendoj për muzikën, por mjerisht shumica e mikrokontrolluesve nuk mund të luajnë muzikë përmes Bluetooth. Raspberry Pi mund, por ky është një kompjuter. Dua të zhvilloj një kornizë të bazuar në Arduino për mikrokontrolluesit për të luajtur audio përmes Bluetooth. Për të përkulur plotësisht muskujt e mikrokontrolluesit tim, unë do të shtoj përpunimin e sinjalit dixhital në kohë reale (DSP) në zë (filtrim me kalim të lartë, filtrim me kalim të ulët dhe kompresim të gamës dinamike). Për qershinë në krye, unë do të shtoj një server në internet që mund të përdoret për të konfiguruar DSP pa tel. Videoja e integruar tregon bazat e audios Bluetooth në veprim. Gjithashtu më tregon se përdor serverin e uebit për të kryer disa filtrime me kalim të lartë, filtrim me kalim të ulët dhe kompresim dinamik të diapazonit. Përdorimi i parë i kompresimit të diapazonit dinamik me qëllim shkakton shtrembërim si shembull i zgjedhjeve të dobëta të parametrave. Shembulli i dytë eliminon këtë shtrembërim.

Për këtë projekt, ESP32 është mikrokontrolluesi i zgjedhur. Kushton më pak se 10 £ dhe është i mbushur me veçori me ADC, DAC, Wifi, Bluetooth Low Energy, Bluetooth Classic dhe një procesor me dy bërthama 240MHz. DAC në bord mund të luajë teknikisht audio, por nuk do të tingëllojë mirë. Në vend të kësaj, unë do të përdor dekoderin stereo Adafruit I2S për të prodhuar një sinjal të daljes. Ky sinjal mund të dërgohet lehtësisht në çdo sistem HiFi për të shtuar menjëherë audio pa tel në sistemin tuaj ekzistues HiFi.

Furnizimet

Shpresojmë, shumica e prodhuesve do të kenë tabela me bukë, kërcyes, kabllo USB, pranga furnizimi me energji elektrike dhe do të duhet të shpenzojnë vetëm 15 paund për ESP32 dhe dekoderin stereo. Nëse jo, të gjitha pjesët e kërkuara janë listuar më poshtë.

  • Një ESP32 - i testuar në ESP32 -PICO -KIT dhe TinyPico - 9.50// 24 £
  • Dekodues stereo Adafruit I2S - 5.51
  • Breadboard - £ 3- £ 5 secila
  • Telat e kërcyesit - 3 £
  • Kufje me tela/Sistemi Hi -Fi -
  • Kokat e shtytjes ose hekuri i saldimit - 2.10 / / 30 £
  • Kabllo mikro USB - 2.10// £ 3
  • Lidhës 3.5mm në RCA/ fole 3.5mm në fole (ose çfarëdo që ka nevojë altoparlanti juaj) - 2.40// 1.50
  • Furnizimi me energji USB - 5

Hapi 1: Ndërtimi - bordi i bukës

Ndërtimi - bordi i bukës
Ndërtimi - bordi i bukës

Nëse keni blerë ESP32-PICO-KIT nuk do të keni nevojë të lidhni asnjë kunj pasi vjen para-ngjitur. Thjesht vendoseni në dërrasën e bukës.

Hapi 2: Ndërtimi - Shtylla shtyse/bashkim

Ndërtimi - Shtylla shtyse/bashkim
Ndërtimi - Shtylla shtyse/bashkim
Ndërtimi - Shtylla shtyse/bashkim
Ndërtimi - Shtylla shtyse/bashkim

Nëse keni një hekur bashkues, lidhni kunjat në dekoduesin stereo sipas udhëzimeve në faqen e internetit të Adafruit. Në kohën e shkrimit, hekuri im i saldimit ishte në punë i cili ishte mbyllur. Unë nuk doja të paguaja për një hekur bashkues të përkohshëm kështu që unë prerë disa kokë shtytje nga pimoroni. I kam prerë në mënyrë që të përshtaten me dekoderin stereo. Kjo nuk është zgjidhja më e mirë (dhe jo mënyra se si ishin menduar të përdoren titujt), por është alternativa më e lirë për një hekur bashkues. Vendoseni kokën e prerë në tabelën e bukës. Ju duhet vetëm 1 rresht me 6 kunja për deshifruesin. Ju mund të shtoni gjashtë të tjera në anën tjetër për stabilitet, por kjo nuk është e nevojshme për këtë sistem prototip. Kunjat për të futur titujt janë vin, 3vo, gnd, wsel, din dhe bclk.

Hapi 3: Ndërtimi - Lidhni kunjat e energjisë

Ndërtimi - Lidhni kunjat e energjisë
Ndërtimi - Lidhni kunjat e energjisë

Vendosni dekoderin Stereo në titujt e shtytjes (kunjat vin, 3vo, gnd, wsel, din dhe bclk) dhe shtyjini fort së bashku. Përsëri, kjo në mënyrë ideale duhet të bëhet me një hekur bashkues, por më duhej të improvizoja. Ju do të vini re se të gjitha telat në këtë udhëzues janë blu. Kjo sepse unë nuk kisha tela kërcyes, kështu që unë preva 1 tel të gjatë në copa më të vogla. Gjithashtu, unë jam verbuese e ngjyrave dhe nuk më intereson vërtet ngjyra e telit. Kunjat e rrymës janë bashkangjitur si më poshtë:

3v3 (ESP32) -> për të vin në dekoder stereo

gnd (ESP32) -> për të gnd në dekodues stereo

Hapi 4: Ndërtimi - Tela I2S

Ndërtimi - Instalime I2S
Ndërtimi - Instalime I2S

Për të dërguar audion Bluetooth nga ESP32 në dekoderin stereo ne do të përdorim një metodë të komunikimit dixhital të quajtur I2S. Dekoduesi stereo do të marrë këtë sinjal dixhital dhe do ta kthejë atë në një sinjal analog që mund të lidhet me një altoparlant ose HiFi. I2S kërkon vetëm 3 tela dhe është mjaft e thjeshtë për t'u kuptuar. Linja e orës së bitit (bclk) kthehet lart e poshtë për të treguar që një bit i ri është transmetuar. Linja e daljes së të dhënave (dout) kthehet e lartë ose e ulët për të treguar nëse ai bit ka një vlerë 0 ose 1 dhe linja e zgjedhjes së fjalës (wsel) kthehet e lartë ose e ulët për të treguar nëse kanali i majtë ose i djathtë po transmetohet. Jo çdo mikrokontrollues mbështet I2S por ESP32 ka 2 linja I2S. Kjo e bën atë një zgjedhje të dukshme për këtë projekt.

Instalimet elektrike janë si më poshtë:

27 (ESP32) -> wsel (dekodues stereo)

25 (ESP32) -> din (dekoder stereo)

26 (ESP32) -> bclk (dekoder stereo)

Hapi 5: Instalimi i Bibliotekës BtAudio

Instalimi i Bibliotekës BtAudio
Instalimi i Bibliotekës BtAudio
Instalimi i Bibliotekës BtAudio
Instalimi i Bibliotekës BtAudio

Nëse nuk i keni instaluar tashmë, instaloni Arduino IDE dhe bërthamën Arduino për ESP32. Pasi t'i keni instaluar, vizitoni faqen time në Github dhe shkarkoni depon. Brenda Arduino IDE nën Sketch >> Përfshi Bibliotekën >> zgjidhni "Shto bibliotekë. ZIP". Pastaj zgjidhni skedarin zip të shkarkuar. Kjo duhet të shtojë bibliotekën time btAudio në bibliotekat tuaja Arduino. Për të përdorur bibliotekën, duhet të përfshini titullin përkatës në skicën Arduino. Do ta shihni këtë në hapin tjetër.

Hapi 6: Përdorimi i Bibliotekës BtAudio

Përdorimi i Bibliotekës BtAudio
Përdorimi i Bibliotekës BtAudio
Përdorimi i Bibliotekës BtAudio
Përdorimi i Bibliotekës BtAudio

Pasi të jetë instaluar, lidhni ESP32 me kompjuterin tuaj përmes mikro USB dhe më pas lidhni dekoderin tuaj stereo me altoparlantin tuaj me tela tuaj 3.5 mm. Para se të ngarkoni skicën do t'ju duhet të ndryshoni disa gjëra në redaktorin Arduino. Pasi të keni zgjedhur tabelën tuaj, do t'ju duhet të redaktoni skemën e ndarjes nën Mjetet >> Skema e Ndarjes dhe të zgjidhni ose "Jo OTA (APP e Madhe)" ose "SPIFFS Minimal (APPS të Mëdha me OTA)". Kjo është e nevojshme sepse ky projekt përdor si WiFi ashtu edhe Bluetooth të cilat janë të dyja biblioteka shumë të rënda në memorie. Pasi ta keni bërë këtë, ngarkoni skicën e mëposhtme në ESP32.

#përfshi

// Vendos emrin e pajisjes audio btAudio audio = btAudio ("ESP_Speaker"); void setup () {// transmeton të dhëna audio në ESP32 audio.begin (); // nxjerr të dhënat e marra në një I2S DAC int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } void loop () {}

Skica mund të ndahet gjerësisht në 3 hapa:

  1. Krijoni një objekt global btAudio që vendos "emrin Bluetooth" të ESP32 tuaj
  2. Konfiguroni ESP32 për të marrë audio me metodën btAudio:: begin
  3. Vendosni kunjat I2S me metodën btAudio:: I2S.

Kjo është e gjitha në anën e softuerit! Tani gjithçka që duhet të bëni është të filloni lidhjen Bluetooth me ESP32 tuaj. Thjesht skanoni për pajisje të reja në telefonin tuaj/laptop/MP3 player dhe do të shfaqet "ESP_Speaker". Pasi të jeni të kënaqur që gjithçka po funksionon (muzika luan) mund ta shkëputni ESP32 nga kompjuteri juaj. Furnizojeni atë me furnizimin me energji USB dhe do të mbajë mend kodin e fundit që keni ngarkuar në të. Në këtë mënyrë, ju mund ta lini ESP32 tuaj të fshehur pas sistemit tuaj HiFi përgjithmonë.

Hapi 7: DSP - Filtrimi

Zgjatja e Marrësit me Përpunimin e Sinjalit Dixhital

Nëse ndiqni të gjitha hapat (dhe unë nuk lashë asgjë jashtë) tani keni një marrës Bluetooth plotësisht funksionues për sistemin tuaj HiFi. Ndërsa kjo është e ftohtë, me të vërtetë nuk e shtyn mikrokontrolluesin në kufijtë e tij. ESP32 ka dy bërthama që funksionojnë në 240MHz. Kjo do të thotë se ky projekt është shumë më tepër sesa thjesht një marrës. Ka kapacitetin për të qenë një marrës Bluetooth me një përpunues të sinjalit dixhital (DSP). DSP-të në thelb kryejnë operacione matematikore në sinjal në kohë reale. Një operacion i dobishëm quhet Filtrim Dixhital. Ky proces zbut frekuencat në një sinjal nën ose mbi një frekuencë të caktuar ndërprerjeje, në varësi të faktit nëse jeni duke përdorur një filtër me kalim të lartë ose të ulët kalimi.

Filtra me kalim të lartë

Filtrat me kalim të lartë zbutin frekuencat nën një brez të caktuar. Unë kam ndërtuar një bibliotekë filtri për sistemet Arduino bazuar në kodin nga earlevel.com. Dallimi kryesor është se unë kam ndryshuar strukturën e klasës për të lejuar ndërtimin e filtrave të rendit më të lartë më lehtë. Filtrat e rendit më të lartë shtypin frekuencat përtej kufirit tuaj në mënyrë më efektive, por ato kërkojnë shumë më tepër llogaritje. Sidoqoftë, me zbatimin aktual, madje mund të përdorni filtra të rendit të 6-të për audio në kohë reale!

Skica është e njëjtë me atë të gjetur në hapin e mëparshëm, përveç se ne kemi ndryshuar lakin kryesor. Për të mundësuar filtrat ne përdorim metodën btAudio:: createFilter. Kjo metodë pranon 3 argumente. E para është numri i kaskadave të filtrave. Numri i kaskadave të filtrit është gjysma e rendit të filtrit. Për një filtër të rendit të 6 -të, argumenti i parë duhet të jetë 3. Për një filtër të rendit të 8 -të, do të jetë 4. Argumenti i dytë është ndërprerja e filtrit. Unë e kam vendosur këtë në 1000Hz për të pasur një efekt vërtet dramatik në të dhënat. Së fundi, ne specifikojmë llojin e skedarit me argumentin e tretë. Ky duhet të jetë kalimi i lartë për një filtër me kalim të lartë dhe kalim i ulët për një filtër me kalim të ulët. Skenari më poshtë kalon ndërprerjen e kësaj frekuence midis 1000Hz dhe 2Hz. Ju duhet të dëgjoni një efekt dramatik në të dhënat.

#përfshi

audio btAudio = btAudio ("ESP_Speaker"); void setup () {audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } void loop () {vonesë (5000); audio.createFilter (3, 1000, kalim i lartë); vonesa (5000); audio.createFilter (3, 2, kalim i lartë); }

Filtra me kalim të ulët

Filtrat me kalim të ulët bëjnë të kundërtën e filtrave me kalim të lartë dhe shtypin frekuencat mbi një frekuencë të caktuar. Ato mund të zbatohen në të njëjtën mënyrë si filtrat me kalim të lartë, me përjashtim të faktit se ato kërkojnë ndryshimin e argumentit të tretë në kalim të ulët. Për skicën më poshtë alternoj ndërprerjen e kalimit të ulët midis 2000Hz dhe 20000Hz. Shpresoj, ju do të dëgjoni ndryshimin. Duhet të tingëllojë mjaft e mbytur kur filtri me kalim të ulët është në 2000Hz.

#përfshi

audio btAudio = btAudio ("ESP_Speaker"); void setup () {audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } void loop () {vonesë (5000); audio.createFilter (3, 2000, kalim i ulët); vonesa (5000); audio.createFilter (3, 20000, kalim i ulët); }

Hapi 8: DSP - Kompresimi i Rangut Dinamik

Sfondi

Kompresimi i diapazonit dinamik është një metodë e përpunimit të sinjalit që përpiqet të barazojë zërin e zërit. Ai ngjesh tingujt me zë të lartë, që ngrihen mbi një prag të caktuar, në nivelin e atyre të qetë dhe më pas, sipas dëshirës i amplifikon të dyja. Rezultati është një përvojë dëgjimi shumë më e barabartë. Kjo erdhi vërtet e dobishme ndërsa shikoja një shfaqje me muzikë në sfond shumë të lartë dhe vokale shumë të qeta. Në këtë rast, vetëm rritja e volumit nuk ndihmoi pasi kjo vetëm përforcoi muzikën në sfond. Me ngjeshjen dinamike të diapazonit, unë mund të zvogëloj muzikën me sfond të lartë në nivelin e vokalit dhe të dëgjoj përsëri gjithçka siç duhet përsëri.

Kodi

Kompresimi dinamik i diapazonit nuk përfshin vetëm uljen e volumit ose pragimin e sinjalit. Ashtë pak më e zgjuar se kaq. Nëse ulni volumin, tingujt e qetë do të zvogëlohen, si dhe ato me zë të lartë. Një mënyrë për ta bërë këtë është të kaloni pragun e sinjalit, por kjo rezulton në shtrembërim të rëndë. Kompresimi dinamik i diapazonit përfshin një kombinim të pragut të butë dhe filtrimit për të minimizuar shtrembërimin që do të kishit nëse do të mbyllnit/kapni sinjalin. Rezultati është një sinjal ku tingujt e fortë "prehen" pa shtrembërim dhe ata të qetë lihen ashtu siç janë. Kodi më poshtë kalon midis tre niveleve të ndryshme të kompresimit.

  1. Kompresimi me shtrembërim
  2. Kompresimi pa shtrembërim
  3. Pa Kompresim

#përfshi

audio btAudio = btAudio ("ESP_Speaker"); void setup () {audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } void loop () {vonesë (5000); audio.compress (30, 0.0001, 0.0001, 10, 10, 0); vonesa (5000); audio.compress (30, 0.0001, 0.1, 10, 10, 0); vonesa (5000); audio.decompress (); }

Kompresimi i diapazonit dinamik është i komplikuar dhe metodat e kompresimit btAudio:: kanë shumë parametra. Do të përpiqem t'i shpjegoj (me radhë) këtu:

  1. Pragu - Niveli në të cilin audio zvogëlohet (matet në decibel)
  2. Koha e sulmit - Koha që duhet që kompresori të fillojë të punojë pasi të jetë tejkaluar pragu
  3. Koha e lëshimit - Koha që duhet që kompresori të ndalojë së punuari.
  4. Raporti i Reduktimit - faktori me të cilin kompresohet audio.
  5. Gjerësia e Gjurit - Gjerësia (në decibel) rreth pragut në të cilin kompresori punon pjesërisht (tingull më natyral).
  6. Fitimi (decibel) i shtuar sinjalit pas kompresimit (rrit/ul volumin)

Shtrembërimi shumë i dëgjueshëm në përdorimin e parë të kompresimit është sepse pragu është shumë i ulët dhe koha e sulmit dhe koha e lëshimit janë shumë të shkurtra duke rezultuar në një sjellje të fortë të pragut. Kjo zgjidhet qartë në rastin e dytë duke rritur kohën e lëshimit. Kjo në thelb bën që kompresori të veprojë në një mënyrë shumë më të qetë. Këtu, unë kam treguar vetëm se si ndryshimi i 1 parametri mund të ketë një efekt dramatik në audio. Tani është radha juaj për të eksperimentuar me parametra të ndryshëm.

Zbatimi (matematika magjike - opsionale)

Kam gjetur se zbatimi naiv i kompresimit të diapazonit dinamik është sfidues. Algoritmi kërkon konvertimin e një numri të plotë 16-bit në decibel dhe pastaj transformimin e tij në një numër të plotë 16-bit pasi të keni përpunuar sinjalin. Vura re se një linjë kodi po merrte 10 mikrosekonda për të përpunuar të dhënat stereo. Ndërsa audio stereo e mostruar në 44.1 KHz lë vetëm 11.3 mikrosekonda për DSP kjo është e papranueshme e ngadaltë … Megjithatë, duke kombinuar një tabelë të vogël kërkimi (400 bajt) dhe një procedurë interpolimi bazuar në dallimet e ndara të Netwon, ne mund të marrim saktësi gati 17 bit në 0.2 mikrosekonda. Me Unë kam bashkangjitur një dokument pdf me të gjitha matematikat për të interesuarit e vërtetë. Complicatedshtë e ndërlikuar, ju jeni paralajmëruar!

Hapi 9: Ndërfaqja Wifi

Ndërfaqja Wifi
Ndërfaqja Wifi
Ndërfaqja Wifi
Ndërfaqja Wifi

Tani ju keni një marrës Bluetooth të aftë për të ekzekutuar DSP në kohë reale. Mjerisht, nëse doni të ndryshoni ndonjë nga parametrat e DSP, do t'ju duhet të shkëputeni nga HiFi, ngarkoni një skicë të re dhe pastaj lidheni përsëri. Kjo është e ngathët. Për të rregulluar këtë, unë zhvillova një server në internet që mund të përdorni për të redaktuar të gjithë parametrat DSP pa u lidhur përsëri me kompjuterin tuaj. Skica për të përdorur serverin në internet është më poshtë.

#përfshi

#përfshi audio btAudio = btAudio ("ESP_Speaker"); webDSP web; void setup () {Serial.begin (115200); audio.filloj (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); // zëvendësoni me ID -në tuaj WiFi dhe fjalëkalimin const char* ssid = "SSID"; const char* fjalëkalim = "Fjalëkalimi"; web.begin (ssid, fjalëkalim dhe audio); } void loop () {web._server.handleClient (); }

Kodi i cakton një adresë IP ESP32 -it tuaj të cilën mund ta përdorni për të hyrë në faqen në internet. Herën e parë që përdorni këtë kod, duhet ta keni të bashkangjitur në kompjuterin tuaj. Në atë mënyrë ju mund të shihni adresën IP të caktuar për ESP32 tuaj në monitorin tuaj serik. Nëse doni të hyni në këtë faqe interneti, thjesht futni këtë adresë IP në çdo shfletues uebi (i testuar në chrome).

Deri tani duhet të jemi njohur me metodën e aktivizimit të Bluetooth dhe I2S. Dallimi kryesor është përdorimi i një objekti webDSP. Ky objekt merr WIFI SSID dhe fjalëkalimin tuaj si argumente, si dhe një tregues në objektin btAudio. Në lakun kryesor, ne vazhdimisht marrim objektin webDSP për të dëgjuar të dhënat hyrëse nga faqja në internet dhe pastaj përditësojmë parametrat e DSP. Si pikë mbyllëse, duhet të theksohet se si Bluetooth ashtu edhe Wifi përdorin të njëjtën radio në ESP32. Kjo do të thotë që mund t'ju duhet të prisni deri në 10 sekonda nga momenti kur futni parametrat në faqen në internet deri kur informacioni të arrijë në të vërtetë në ESP32.

Hapi 10: Planet e së ardhmes

Shpresojmë, ju ka pëlqyer kjo udhëzues dhe tani keni Bluetooth Audio dhe DSP të shtuar në HiFi tuaj. Sidoqoftë, mendoj se ka shumë hapësirë për rritje në këtë projekt dhe thjesht doja të tregoja disa drejtime të ardhshme që mund të marr.

  • Aktivizo transmetimin e audios Wifi (për cilësinë më të mirë të audios)
  • Përdorni një mikrofon I2S për të aktivizuar komandat zanore
  • zhvilloni një barazues WiFi të kontrolluar
  • Bëni atë të bukur (buka nuk bërtet dizajn i shkëlqyeshëm i produktit)

Kur të arrij të zbatoj këto ide, do të bëj më shumë udhëzime. Ose ndoshta dikush tjetër do t'i zbatojë këto veçori. Ky është gëzimi për të bërë gjithçka me burim të hapur!

Recommended: