Obsah:

Zpracování zvuku a digitálního signálu Bluetooth: Rámec Arduino: 10 kroků
Zpracování zvuku a digitálního signálu Bluetooth: Rámec Arduino: 10 kroků

Video: Zpracování zvuku a digitálního signálu Bluetooth: Rámec Arduino: 10 kroků

Video: Zpracování zvuku a digitálního signálu Bluetooth: Rámec Arduino: 10 kroků
Video: Sdružení českých spotřebitelů - sluchadla - část 6. 2024, Listopad
Anonim
Image
Image
Zpracování zvuku a digitálního signálu Bluetooth: Rámec Arduino
Zpracování zvuku a digitálního signálu Bluetooth: Rámec Arduino

souhrn

Když přemýšlím o Bluetooth, myslím na hudbu, ale bohužel většina mikrokontrolérů neumí přehrávat hudbu přes Bluetooth. Raspberry Pi může, ale to je počítač. Chci vyvinout rámec založený na Arduinu pro mikrokontroléry pro přehrávání zvuku přes Bluetooth. Abych plně natáhl svaly svého mikrokontroléru, přidám do zvuku digitální zpracování signálu (DSP) v reálném čase (filtrování horního průchodu, filtrování nízkého průchodu a komprese dynamického rozsahu). Jako třešničku nahoře přidám webový server, pomocí kterého lze bezdrátově konfigurovat DSP. Vložené video ukazuje základy zvuku Bluetooth v akci. Také mi ukazuje, že pomocí webového serveru provádím filtrování horní propusti, filtrování dolní propusti a kompresi dynamického rozsahu. První použití komprese dynamického rozsahu záměrně způsobuje zkreslení jako příklad špatných voleb parametrů. Druhý příklad eliminuje toto zkreslení.

Pro tento projekt je ESP32 zvoleným mikrokontrolérem. Stojí méně než 10 GBP a je vybaven funkcemi ADC, DAC, Wifi, Bluetooth Low Energy, Bluetooth Classic a dvoujádrového procesoru 240 MHz. Integrovaný DAC může technicky přehrávat zvuk, ale nebude to znít skvěle. Místo toho použiji stereo dekodér Adafruit I2S k vytvoření signálu line-out. Tento signál lze snadno odeslat do jakéhokoli HiFi systému a okamžitě přidat bezdrátový zvuk do vašeho stávajícího HiFi systému.

Zásoby

Naštěstí většina výrobců bude mít prkénka, propojky, USB kabely, páječky napájecích zdrojů a bude muset utratit pouze 15 GBP za ESP32 a stereo dekodér. Pokud ne, všechny požadované součásti jsou uvedeny níže.

  • ESP32 - testováno na ESP32 -PICO -KIT a TinyPico - 9,50 GBP/ 24 GBP
  • Stereo dekodér Adafruit I2S - 5,51 GBP
  • Breadboard - 3–5 £ za kus
  • Propojovací vodiče - 3 £
  • Kabelová sluchátka/Hi -Fi systém - £$$
  • Záhlaví nebo páječka - 2,10 GBP / 30 GBP
  • Micro USB kabel - 2,10 GBP/ 3 GBP
  • Konektor 3,5 mm na RCA/ 3,5 mm konektor na konektor (nebo cokoli, co váš reproduktor potřebuje) - 2,40 GBP/ 1,50 GBP
  • USB napájecí zdroj - 5 liber

Krok 1: Konstrukce - prkénko

Konstrukce - prkénko
Konstrukce - prkénko

Pokud jste si zakoupili ESP32-PICO-KIT, nebudete muset pájet žádné piny, protože jsou předpájeny. Jednoduše jej položte na prkénko.

Krok 2: Konstrukce - zatlačte záhlaví/pájení

Konstrukce - tlačné hlavice/pájení
Konstrukce - tlačné hlavice/pájení
Konstrukce - tlačné hlavice/pájení
Konstrukce - tlačné hlavice/pájení

Pokud máte páječku, připájejte piny k stereo dekodéru podle pokynů na webu Adafruit. V době psaní byla moje páječka v práci, která byla zamčená. Nechtěl jsem platit za dočasnou páječku, a tak jsem odřízl pár tlačných hlaviček od pimoroni. Rozřezal jsem je, aby se vešly do stereo dekodéru. Toto není nejlepší řešení (a ne, jak byly hlavičky určeny k použití), ale je to nejlevnější alternativa k páječce. Umístěte rozřezanou hlavičku na prkénko. Pro dekodér byste měli potřebovat pouze 1 řádek 6 pinů. Můžete přidat dalších šest na druhou stranu kvůli stabilitě, ale to není nutné pro tento prototypový systém. Kolíky, do kterých lze zasunout záhlaví, jsou vin, 3vo, gnd, wsel, din a bclk.

Krok 3: Konstrukce - Zapojte napájecí kolíky

Konstrukce - Zapojte napájecí kolíky
Konstrukce - Zapojte napájecí kolíky

Umístěte dekodér Stereo na kolíky (vin, 3vo, gnd, wsel, din a bclk piny) a pevně je přitlačte k sobě. Opět by to ideálně mělo být provedeno pomocí páječky, ale musel jsem improvizovat. Všimnete si, že všechny vodiče v tomto návodu jsou modré. To proto, že jsem neměl žádné propojovací vodiče, a tak jsem 1 dlouhý drát nastříhal na menší kousky. Také jsem barvoslepý a barva drátu mě opravdu nezajímá. Napájecí kolíky jsou připevněny následovně:

3v3 (ESP32) -> vin na stereo dekodéru

gnd (ESP32) -> gnd na stereo dekodéru

Krok 4: Výstavba - I2S Wiring

Konstrukce - elektroinstalace I2S
Konstrukce - elektroinstalace I2S

K odeslání zvuku Bluetooth z ESP32 do stereo dekodéru použijeme metodu digitální komunikace zvanou I2S. Stereo dekodér převezme tento digitální signál a převede jej na analogový signál, který lze zapojit do reproduktoru nebo HiFi. I2S vyžaduje pouze 3 vodiče a je rozumné ho snadno pochopit. Linka bitových hodin (bclk) se otáčí vysoko a nízko, což indikuje, že je vyslán nový bit. Datová výstupní linka (dout) se změní na vysokou nebo nízkou, aby indikovala, zda má tento bit hodnotu 0 nebo 1, a řádek pro výběr slova (wsel) se změní na vysokou nebo nízkou, aby indikoval, zda se přenáší levý nebo pravý kanál. Ne každý mikrokontrolér podporuje I2S, ale ESP32 má 2 linky I2S. To z něj činí jasnou volbu pro tento projekt.

Zapojení je následující:

27 (ESP32) -> wsel (stereo dekodér)

25 (ESP32) -> din (Stereo dekodér)

26 (ESP32) -> bclk (stereo dekodér)

Krok 5: Instalace knihovny BtAudio

Instalace knihovny BtAudio
Instalace knihovny BtAudio
Instalace knihovny BtAudio
Instalace knihovny BtAudio

Pokud je ještě nemáte nainstalované, nainstalujte Arduino IDE a jádro Arduino pro ESP32. Jakmile je budete mít nainstalované, navštivte moji stránku Github a stáhněte si úložiště. V Arduino IDE v části Sketch >> Include Library >> vyberte "Add. ZIP library". Poté vyberte stažený soubor zip. To by mělo přidat moji knihovnu btAudio do vašich knihoven Arduino. Abyste mohli knihovnu používat, musíte do skici Arduina zahrnout příslušné záhlaví. Uvidíte to v dalším kroku.

Krok 6: Použití knihovny BtAudio

Pomocí knihovny BtAudio
Pomocí knihovny BtAudio
Pomocí knihovny BtAudio
Pomocí knihovny BtAudio

Po instalaci připojte ESP32 k počítači pomocí micro USB a poté připojte stereofonní dekodér k reproduktoru pomocí 3,5 mm kabelu. Než nahrajete skicu, budete muset v editoru Arduino změnit některé věci. Poté, co vyberete svou desku, budete muset upravit schéma oddílů v části Nástroje >> Schéma oddílů a vybrat buď „Žádný OTA (velká APP)“, nebo „Minimální SPIFFS (velká APPS s OTA)“. Je to nutné, protože tento projekt využívá WiFi i Bluetooth, což jsou knihovny velmi náročné na paměť. Jakmile to uděláte, nahrajte následující skicu do ESP32.

#zahrnout

// Nastaví název zvukového zařízení btAudio audio = btAudio ("ESP_Speaker"); void setup () {// streamuje zvuková data do ESP32 audio.begin (); // vydá přijatá data do I2S DAC int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } void loop () {}

Skicu lze obecně rozdělit do 3 kroků:

  1. Vytvořte globální objekt btAudio, který nastaví „název Bluetooth“vašeho ESP32
  2. Pomocí metody btAudio:: begin nakonfigurujte ESP32 pro příjem zvuku
  3. Nastavte piny I2S pomocí metody btAudio:: I2S.

To je po softwarové stránce! Nyní vše, co musíte udělat, je zahájit připojení Bluetooth k vašemu ESP32. Stačí v telefonu/notebooku/MP3 přehrávači vyhledat nová zařízení a objeví se „ESP_Speaker“. Jakmile jste rádi, že vše funguje (hraje hudba), můžete ESP32 odpojit od počítače. Napájejte jej pomocí napájecího zdroje USB a pamatuje si poslední kód, který jste do něj nahráli. Tímto způsobem můžete svůj ESP32 nechat navždy skrytý za svým HiFi systémem.

Krok 7: DSP - filtrování

Rozšíření přijímače o zpracování digitálního signálu

Pokud jste dodrželi všechny kroky (a nic jsem nevynechal), máte nyní plně funkční Bluetooth přijímač pro váš HiFi systém. I když je to skvělé, ve skutečnosti to neposouvá mikrokontrolér na své hranice. ESP32 má dvě jádra pracující na 240 MHz. To znamená, že tento projekt je mnohem víc než jen přijímač. Má kapacitu být přijímačem Bluetooth s procesorem digitálního signálu (DSP). DSP v podstatě provádějí matematické operace se signálem v reálném čase. Jedna užitečná operace se nazývá digitální filtrování. Tento proces zeslabuje frekvence v signálu pod nebo nad určitou mezní frekvencí, v závislosti na tom, zda používáte horní propust nebo dolní propust.

High-pass filtry

High-Pass filtry tlumí frekvence pod určitým pásmem. Postavil jsem knihovnu filtrů pro systémy Arduino na základě kódu z earlevel.com. Hlavní rozdíl je v tom, že jsem změnil strukturu třídy, aby bylo možné snáze vytvářet filtry vyššího řádu. Filtry vyššího řádu efektivněji potlačují frekvence nad hranicí, ale vyžadují mnohem více výpočtu. Při současné implementaci však můžete dokonce použít filtry 6. řádu pro zvuk v reálném čase!

Skica je stejná jako ta, která byla nalezena v předchozím kroku, kromě toho, že jsme změnili hlavní smyčku. K povolení filtrů používáme metodu btAudio:: createFilter. Tato metoda přijímá 3 argumenty. První je počet kaskád filtrů. Počet kaskád filtrů je poloviční oproti pořadí filtru. U filtru 6. řádu by měl být první argument 3. U filtru 8. řádu by to byl 4. Druhým argumentem je omezení filtru. Nastavil jsem to na 1000 Hz, aby to mělo na data opravdu dramatický účinek. Nakonec specifikujeme typ archivátoru třetím argumentem. To by mělo být horní propust pro horní propust a dolní propust pro dolní propust. Níže uvedený skript přepíná mezní hodnotu této frekvence mezi 1 000 Hz a 2 Hz. Měli byste slyšet dramatický účinek na data.

#zahrnout

btAudio audio = btAudio ("ESP_Speaker"); neplatné nastavení () {audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } void loop () {zpoždění (5000); audio.createFilter (3, 1000, horní propust); zpoždění (5000); audio.createFilter (3, 2, horní propust); }

Nízkoprůchodové filtry

Filtry s nízkým průchodem dělají opak filtrů s vysokým průchodem a potlačují frekvence nad určitou frekvencí. Mohou být implementovány stejným způsobem jako filtry s vysokým průchodem, kromě toho, že vyžadují změnu třetího argumentu na dolní propust. Pro níže uvedený náčrt střídám dolní propust mezi 2000 Hz a 20 000 Hz. Snad ten rozdíl uslyšíte. Mělo by to znít dost tlumeně, když je dolní propust na 2000 Hz.

#zahrnout

btAudio audio = btAudio ("ESP_Speaker"); neplatné nastavení () {audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } void loop () {zpoždění (5000); audio.createFilter (3, 2000, dolní propust); zpoždění (5000); audio.createFilter (3, 20 000, dolní propust); }

Krok 8: DSP - komprese dynamického rozsahu

Pozadí

Komprese dynamického rozsahu je metoda zpracování signálu, která se snaží vyrovnat hlasitost zvuku. Komprimuje hlasité zvuky, které vystoupají nad určitou prahovou hodnotu, na úroveň tichých a poté případně zesílí oba. Výsledkem je mnohem rovnoměrnější zážitek z poslechu. To přišlo opravdu užitečné, když jsem sledoval show s velmi hlasitou hudbou na pozadí a velmi tichými vokály. V tomto případě nepomohlo pouhé zvýšení hlasitosti, protože to jen zesílilo hudbu na pozadí. S kompresí dynamického rozsahu jsem mohl snížit hlasitou hudbu na pozadí na úroveň vokálů a znovu všechno pořádně slyšet.

Kód

Komprese dynamického rozsahu nezahrnuje pouze snížení hlasitosti nebo práh signálu. Je to o něco chytřejší. Pokud snížíte hlasitost, ztlumí se tiché i hlasité zvuky. Jedním ze způsobů, jak to obejít, je prah signálu, ale to má za následek vážné zkreslení. Komprese dynamického rozsahu zahrnuje kombinaci měkkého prahování a filtrování, aby se minimalizovalo zkreslení, které by se dostalo, kdybyste prahovali/ořezávali signál. Výsledkem je signál, kde jsou hlasité zvuky „oříznuty“bez zkreslení a ty tiché jsou ponechány tak, jak jsou. Níže uvedený kód přepíná mezi třemi různými úrovněmi komprese.

  1. Komprese se zkreslením
  2. Komprese bez zkreslení
  3. Žádná komprese

#zahrnout

btAudio audio = btAudio ("ESP_Speaker"); neplatné nastavení () {audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } void loop () {zpoždění (5000); audio.compress (30, 0,0001, 0,0001, 10, 10, 0); zpoždění (5000); audio.compress (30, 0,0001, 0,1, 10, 10, 0); zpoždění (5000); audio.decompress (); }

Komprese dynamického rozsahu je komplikovaná a metody btAudio:: compress mají mnoho parametrů. Pokusím se je vysvětlit (v pořadí) zde:

  1. Threshold - Úroveň, na které se zvuk snižuje (měřeno v decibelech)
  2. Attack time - Doba, po kterou kompresor začne pracovat, jakmile bude překročena prahová hodnota
  3. Čas uvolnění - doba, po kterou kompresor přestane fungovat.
  4. Redukční poměr - faktor, o který je zvuk komprimován.
  5. Šířka kolena - Šířka (v decibelech) kolem prahu, při kterém kompresor částečně pracuje (přirozenější zvuk).
  6. Zisk (decibely) přidaný k signálu po kompresi (zvýšení/snížení hlasitosti)

Velmi slyšitelné zkreslení při prvním použití komprese je proto, že práh je velmi nízký a jak doba útoku, tak doba uvolnění jsou velmi krátké, což má za následek tvrdé prahové chování. To je v druhém případě jasně vyřešeno prodloužením doby vydání. To v podstatě způsobuje, že kompresor působí mnohem plynuleji. Zde jsem pouze ukázal, jak změna 1 parametru může mít dramatický účinek na zvuk. Nyní je řada na vás experimentovat s různými parametry.

Implementace (magická matematika - volitelně)

Zjistil jsem, že naivně implementovat kompresi dynamického rozsahu je náročné. Algoritmus vyžaduje převést 16bitové celé číslo na decibely a poté jej zpracovat zpět na 16bitové celé číslo. Všiml jsem si, že jeden řádek kódu trval 10 mikrosekund na zpracování stereo dat. Protože stereofonní zvuk vzorkovaný na 44,1 KHz ponechává DSP pouhých 11,3 mikrosekundy, je to nepřijatelně pomalé … Kombinací malé vyhledávací tabulky (400 bajtů) a postupu interpolace založeného na dělených rozdílech společnosti Netwon můžeme získat přesnost téměř 17 bitů za 0,2 mikrosekundy. Pro opravdové zájemce jsem připojil dokument ve formátu pdf se všemi matematikami. Je to složité, byli jste varováni!

Krok 9: Rozhraní Wifi

Rozhraní Wifi
Rozhraní Wifi
Rozhraní Wifi
Rozhraní Wifi

Nyní máte přijímač Bluetooth, který dokáže spouštět DSP v reálném čase. Je smutné, že pokud chcete změnit některý z parametrů DSP, budete se muset odpojit od HiFi, nahrát nový náčrt a poté znovu připojit. To je neohrabané. Abych to vyřešil, vytvořil jsem webový server, který můžete použít k úpravě všech parametrů DSP bez opětovného připojení k počítači. Skica k použití webového serveru je níže.

#zahrnout

#include btAudio audio = btAudio ("ESP_Speaker"); webDSP web; neplatné nastavení () {Serial.begin (115200); audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); // nahraďte svým WiFi ID a heslem const char* ssid = "SSID"; const char* heslo = "HESLO"; web.begin (ssid, heslo a zvuk); } void loop () {web._server.handleClient (); }

Kód přiřadí vašemu ESP32 IP adresu, kterou můžete použít pro přístup na webovou stránku. Při prvním spuštění tohoto kódu byste jej měli mít připojený k počítači. Tímto způsobem můžete vidět IP adresu přiřazenou vašemu ESP32 na vašem sériovém monitoru. Chcete -li se dostat na tuto webovou stránku, jednoduše zadejte tuto IP adresu do libovolného webového prohlížeče (testováno na chromu).

Nyní bychom měli být obeznámeni se způsobem povolení Bluetooth a I2S. Klíčovým rozdílem je použití objektu webDSP. Tento objekt bere SSID a heslo Wifi jako argumenty a také jako ukazatel na objekt btAudio. V hlavní smyčce neustále získáváme objekt webDSP, aby naslouchal příchozím datům z webové stránky a poté aktualizoval parametry DSP. Na závěr je třeba poznamenat, že Bluetooth i Wifi používají na ESP32 stejné rádio. To znamená, že budete muset počkat až 10 sekund od zadání parametrů na webové stránce do okamžiku, kdy se informace skutečně dostanou do ESP32.

Krok 10: Plány do budoucna

Doufejme, že se vám tento návod líbil a nyní máte do HiFi přidané Bluetooth Audio a DSP. Myslím si však, že v tomto projektu je velký prostor pro růst a jen jsem chtěl poukázat na některé budoucí směry, kterými bych se mohl ubírat.

  • Povolit Wifi streamování zvuku (pro nejlepší kvalitu zvuku)
  • Pomocí mikrofonu I2S povolte hlasové příkazy
  • vyvinout WiFi řízený ekvalizér
  • Udělejte to hezky (prkénko nekřičí skvělý design produktu)

Až se dostanu k implementaci těchto myšlenek, udělám další instruktážní materiály. Nebo možná někdo jiný implementuje tyto funkce. To je radost ze všeho dělat open source!

Doporučuje: