Sommario:

Elaborazione del segnale audio e digitale Bluetooth: un framework Arduino: 10 passaggi
Elaborazione del segnale audio e digitale Bluetooth: un framework Arduino: 10 passaggi

Video: Elaborazione del segnale audio e digitale Bluetooth: un framework Arduino: 10 passaggi

Video: Elaborazione del segnale audio e digitale Bluetooth: un framework Arduino: 10 passaggi
Video: Ingoiare il latte del trallalero fa bene? #shorts 2024, Novembre
Anonim
Image
Image
Elaborazione audio e segnale digitale Bluetooth: un framework Arduino
Elaborazione audio e segnale digitale Bluetooth: un framework Arduino

Riepilogo

Quando penso al Bluetooth penso alla musica, ma purtroppo la maggior parte dei microcontrollori non può riprodurre musica tramite Bluetooth. Il Raspberry Pi può, ma quello è un computer. Voglio sviluppare un framework basato su Arduino per i microcontrollori per riprodurre l'audio tramite Bluetooth. Per flettere completamente i muscoli del mio microcontrollore, aggiungerò l'elaborazione del segnale digitale (DSP) in tempo reale all'audio (filtro passa-alto, filtro passa-basso e compressione della gamma dinamica). Per la ciliegina sulla torta, aggiungerò un server web che può essere utilizzato per configurare il DSP in modalità wireless. Il video incorporato mostra le basi dell'audio Bluetooth in azione. Mi mostra anche l'utilizzo del server web per eseguire alcuni filtri passa-alto, filtri passa-basso e compressione della gamma dinamica. Il primo utilizzo della compressione della gamma dinamica provoca intenzionalmente distorsione come esempio di scelte sbagliate dei parametri. Il secondo esempio elimina questa distorsione.

Per questo progetto, ESP32 è il microcontrollore preferito. Costa meno di £ 10 ed è ricco di funzionalità con ADC, DAC, Wifi, Bluetooth Low Energy, Bluetooth Classic e un processore dual-core da 240 MHz. Il DAC integrato può tecnicamente riprodurre l'audio ma non suonerà alla grande. Invece, userò il decoder stereo Adafruit I2S per produrre un segnale line-out. Questo segnale può essere facilmente inviato a qualsiasi sistema HiFi per aggiungere istantaneamente l'audio wireless al tuo sistema HiFi esistente.

Forniture

Si spera che la maggior parte dei produttori disponga di breadboard, ponticelli, cavi USB, saldatori di alimentazione e dovrà spendere solo £ 15 per ESP32 e il decoder stereo. In caso contrario, tutte le parti richieste sono elencate di seguito.

  • Un ESP32 - testato su ESP32-PICO-KIT e TinyPico - £ 9,50/ £ 24
  • Decodificatore stereo Adafruit I2S - £ 5,51
  • Tagliere - £ 3-£ 5 ciascuno
  • Cavi per ponticelli - £ 3
  • Cuffie cablate/Sistema Hi-Fi - £££
  • Intestazioni a spinta o saldatore - £ 2,10 / £ 30
  • Cavo micro USB - £ 2,10/ £ 3
  • Connettore da 3,5 mm a RCA / jack da 3,5 mm a jack (o qualunque cosa necessiti il tuo altoparlante) - £ 2,40/ £ 1,50
  • Alimentatore USB - £ 5

Fase 1: Costruzione - il tagliere

Costruzione - il tagliere
Costruzione - il tagliere

Se hai acquistato l'ESP32-PICO-KIT non dovrai saldare alcun pin poiché viene pre-saldato. Posizionalo semplicemente sulla breadboard.

Fase 2: Costruzione - Spingere le intestazioni/saldatura

Costruzione - Push Header/saldatura
Costruzione - Push Header/saldatura
Costruzione - Push Header/saldatura
Costruzione - Push Header/saldatura

Se hai un saldatore, salda i pin al decoder stereo secondo le istruzioni sul sito Web di Adafruit. Al momento della scrittura il mio saldatore era al lavoro ed era bloccato. Non volevo pagare per un saldatore temporaneo, quindi ho tagliato alcune intestazioni di spinta da pimoroni. Li ho tagliati in modo che si adattassero al decoder stereo. Questa non è la soluzione migliore (e non il modo in cui dovevano essere utilizzate le intestazioni) ma è l'alternativa più economica a un saldatore. Inserisci l'intestazione tagliata sulla breadboard. Dovresti aver bisogno solo di 1 linea di 6 pin per il decoder. Puoi aggiungerne altri sei sull'altro lato per stabilità, ma questo non è necessario per questo sistema prototipo. I pin in cui inserire le intestazioni sono vin, 3vo, gnd, wsel, din e bclk.

Passaggio 3: costruzione: cablaggio dei pin di alimentazione

Costruzione - Collegare i pin di alimentazione
Costruzione - Collegare i pin di alimentazione

Posizionare il decoder stereo sui pin push (vin, 3vo, gnd, wsel, din e bclk) e spingerli saldamente insieme. Anche in questo caso, idealmente dovrebbe essere fatto con un saldatore, ma ho dovuto improvvisare. Noterai che tutti i fili in questa istruzione sono blu. Questo perché non avevo cavi per i ponticelli, quindi ho tagliato 1 filo lungo in pezzi più piccoli. Inoltre, sono daltonico e non mi interessa molto il colore del filo. I pin di alimentazione sono collegati come segue:

3v3 (ESP32) -> per vin su decoder stereo

gnd (ESP32) -> per gnd su decoder stereo

Fase 4: Costruzione - Cablaggio I2S

Costruzione - Cablaggio I2S
Costruzione - Cablaggio I2S

Per inviare l'audio Bluetooth dall'ESP32 al decoder stereo utilizzeremo un metodo di comunicazione digitale chiamato I2S. Il decoder stereo prenderà questo segnale digitale e lo trasformerà in un segnale analogico che può essere collegato a un altoparlante o HiFi. I2S richiede solo 3 fili ed è ragionevolmente semplice da capire. La linea del bit clock (bclk) diventa alta e bassa per indicare che è stato trasmesso un nuovo bit. La linea di uscita dati (dout) diventa alta o bassa per indicare se quel bit ha un valore di 0 o 1 e la linea di selezione della parola (wsel) diventa alta o bassa per indicare se viene trasmesso il canale sinistro o destro. Non tutti i microcontrollori supportano I2S, ma ESP32 ha 2 linee I2S. Questo lo rende una scelta ovvia per questo progetto.

Il cablaggio è il seguente:

27 (ESP32) -> wsel (decodificatore stereo)

25 (ESP32) -> din (decodificatore stereo)

26 (ESP32) -> bclk (decodificatore stereo)

Passaggio 5: installazione della libreria BtAudio

Installazione della libreria BtAudio
Installazione della libreria BtAudio
Installazione della libreria BtAudio
Installazione della libreria BtAudio

Se non li hai già installati, installa l'IDE Arduino e il core Arduino per ESP32. Una volta installati, visita la mia pagina Github e scarica il repository. All'interno dell'IDE Arduino in Schizzo >> Includi libreria >> seleziona "Aggiungi libreria. ZIP". Quindi seleziona il file zip scaricato. Questo dovrebbe aggiungere la mia libreria btAudio alle tue librerie Arduino. Per utilizzare la libreria dovrai includere l'intestazione pertinente nello sketch di Arduino. Lo vedrai nel passaggio successivo.

Passaggio 6: utilizzo della libreria BtAudio

Utilizzo della libreria BtAudio
Utilizzo della libreria BtAudio
Utilizzo della libreria BtAudio
Utilizzo della libreria BtAudio

Una volta installato, collega il tuo ESP32 al computer tramite micro USB, quindi collega il decoder stereo all'altoparlante con il cavo da 3,5 mm. Prima di caricare lo schizzo dovrai modificare alcune cose nell'editor di Arduino. Dopo aver selezionato la tua scheda, dovrai modificare lo schema di partizione in Strumenti >> Schema di partizione e selezionare "Nessuna OTA (APP grande)" o "SPIFFS minimi (APP grandi con OTA)". Ciò è necessario perché questo progetto utilizza sia WiFi che Bluetooth, che sono entrambe librerie che richiedono molta memoria. Dopo averlo fatto, carica il seguente schizzo su ESP32.

#includere

// Imposta il nome del dispositivo audio btAudio audio = btAudio("ESP_Speaker"); void setup() { // trasmette i dati audio a ESP32 audio.begin(); // invia i dati ricevuti a un DAC I2S int bck = 26; int w = 27; int dout = 25; audio. I2S(bck, dout, ws); } ciclo vuoto() { }

Lo schizzo può essere sostanzialmente suddiviso in 3 fasi:

  1. Crea un oggetto btAudio globale che imposta il "nome Bluetooth" del tuo ESP32
  2. Configura ESP32 per ricevere l'audio con il metodo btAudio::begin
  3. Impostare i pin I2S con il metodo btAudio::I2S.

Questo è tutto dal lato software! Ora tutto ciò che devi fare è avviare la connessione Bluetooth al tuo ESP32. Basta cercare nuovi dispositivi sul tuo telefono/laptop/lettore MP3 e apparirà "ESP_Speaker". Una volta che sei soddisfatto che tutto funzioni (riproduzione di musica), puoi scollegare ESP32 dal tuo computer. Alimentalo con l'alimentatore USB e ricorderà l'ultimo codice che hai caricato su di esso. In questo modo, puoi lasciare il tuo ESP32 nascosto dietro il tuo sistema HiFi per sempre.

Passaggio 7: DSP - Filtraggio

Estensione del ricevitore con elaborazione digitale del segnale

Se hai seguito tutti i passaggi (e non ho tralasciato nulla) ora hai un ricevitore Bluetooth perfettamente funzionante per il tuo sistema HiFi. Anche se questo è bello, non spinge davvero il microcontrollore ai suoi limiti. L'ESP32 ha due core che operano a 240MHz. Ciò significa che questo progetto è molto più di un semplice ricevitore. Ha la capacità di essere un ricevitore Bluetooth con un processore di segnale digitale (DSP). I DSP essenzialmente eseguono operazioni matematiche sul segnale in tempo reale. Un'operazione utile si chiama Digital Filtering. Questo processo attenua le frequenze in un segnale al di sotto o al di sopra di una certa frequenza di taglio, a seconda che si utilizzi un filtro passa-alto o passa-basso.

Filtri passa alto

I filtri passa-alto attenuano le frequenze al di sotto di una certa banda. Ho creato una libreria di filtri per i sistemi Arduino basata sul codice di earlevel.com. La differenza principale è che ho cambiato la struttura della classe per consentire la costruzione di filtri di ordine superiore più facilmente. I filtri di ordine superiore sopprimono le frequenze oltre il limite in modo più efficace, ma richiedono molto più calcolo. Tuttavia, con l'attuale implementazione, puoi persino utilizzare i filtri del sesto ordine per l'audio in tempo reale!

Lo schizzo è lo stesso di quello trovato nel passaggio precedente, tranne per il fatto che abbiamo modificato il ciclo principale. Per abilitare i filtri utilizziamo il metodo btAudio::createFilter. Questo metodo accetta 3 argomenti. Il primo è il numero di cascate di filtri. Il numero di cascate di filtri è la metà dell'ordine del filtro. Per un filtro del 6° ordine, il primo argomento dovrebbe essere 3. Per un filtro dell'8° ordine, sarebbe 4. Il secondo argomento è il cutoff del filtro. L'ho impostato su 1000Hz per avere un effetto davvero drammatico sui dati. Infine, specifichiamo il tipo di filer con il terzo argomento. Dovrebbe essere passa-alto per un filtro passa-alto e passa-basso per un filtro passa-basso. Lo script seguente commuta il taglio di questa frequenza tra 1000Hz e 2Hz. Dovresti sentire un effetto drammatico sui dati.

#includere

btAudio audio = btAudio("ESP_Speaker"); void setup() { audio.begin(); int bck = 26; int w = 27; int dout = 25; audio. I2S(bck, dout, ws); } loop void() { delay(5000); audio.createFilter(3, 1000, passa-alto); ritardo (5000); audio.createFilter(3, 2, passa-alto); }

Filtri passa basso

I filtri passa basso fanno l'opposto dei filtri passa alto e sopprimono le frequenze al di sopra di una certa frequenza. Possono essere implementati allo stesso modo dei filtri passa-alto tranne per il fatto che richiedono la modifica del terzo argomento in passa-basso. Per lo schizzo qui sotto alterno il taglio passa-basso tra 2000Hz e 20000Hz. Spero che sentirai la differenza. Dovrebbe suonare abbastanza ovattato quando il filtro passa basso è a 2000Hz.

#includere

btAudio audio = btAudio("ESP_Speaker"); void setup() { audio.begin(); int bck = 26; int w = 27; int dout = 25; audio. I2S(bck, dout, ws); } loop void() { delay(5000); audio.createFilter(3, 2000, passabasso); ritardo (5000); audio.createFilter(3, 20000, passabasso); }

Passaggio 8: DSP - Compressione della gamma dinamica

Sfondo

La compressione della gamma dinamica è un metodo di elaborazione del segnale che cerca di uniformare il volume dell'audio. Comprime i suoni forti, che salgono al di sopra di una certa soglia, al livello di quelli deboli e quindi, facoltativamente, li amplifica entrambi. Il risultato è un'esperienza di ascolto molto più uniforme. Questo è stato davvero utile mentre guardavo uno spettacolo con musica di sottofondo molto rumorosa e voci molto tranquille. In questo caso, il solo aumento del volume non ha aiutato in quanto amplificava solo la musica di sottofondo. Con la compressione della gamma dinamica, ho potuto ridurre la musica di sottofondo ad alto volume al livello della voce e ascoltare di nuovo tutto correttamente.

Il codice

La compressione della gamma dinamica non comporta solo l'abbassamento del volume o la soglia del segnale. È un po' più intelligente di così. Se abbassi il volume, i suoni bassi verranno ridotti così come quelli alti. Un modo per aggirare questo è quello di limitare il segnale, ma questo si traduce in una grave distorsione. La compressione della gamma dinamica prevede una combinazione di soft thresholding e filtering per ridurre al minimo la distorsione che si otterrebbe se si dovesse limitare/tagliare il segnale. Il risultato è un segnale in cui i suoni forti vengono "tagliati" senza distorsioni e quelli deboli vengono lasciati così come sono. Il codice seguente alterna tre diversi livelli di compressione.

  1. Compressione con distorsione
  2. Compressione senza distorsione
  3. Nessuna compressione

#includere

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

La compressione della gamma dinamica è complicata e i metodi btAudio::compress hanno molti parametri. Cercherò di spiegarli (in ordine) qui:

  1. Soglia - Il livello al quale l'audio viene ridotto (misurato in decibel)
  2. Tempo di attacco - Il tempo impiegato dal compressore per entrare in funzione una volta superata la soglia
  3. Tempo di rilascio - Il tempo impiegato dal compressore per smettere di funzionare.
  4. Rapporto di riduzione: il fattore di compressione dell'audio.
  5. Knee Width - La larghezza (in decibel) intorno alla soglia alla quale il compressore funziona parzialmente (suono più naturale).
  6. Il guadagno (decibel) aggiunto al segnale dopo la compressione (aumento/diminuzione volume)

La distorsione molto udibile nel primo utilizzo della compressione è dovuta al fatto che la soglia è molto bassa e sia il tempo di attacco che il tempo di rilascio sono molto brevi, risultando effettivamente in un comportamento di sogliatura duro. Questo è chiaramente risolto nel secondo caso aumentando il tempo di rilascio. Ciò fa sì che il compressore agisca in modo molto più fluido. Qui, ho solo mostrato come la modifica di 1 parametro può avere un effetto drammatico sull'audio. Ora tocca a te sperimentare parametri diversi.

L'implementazione (la matematica magica - opzionale)

Ho scoperto che implementare ingenuamente la compressione della gamma dinamica è una sfida. L'algoritmo richiede la conversione di un numero intero a 16 bit in decibel e la successiva trasformazione in un numero intero a 16 bit una volta elaborato il segnale. Ho notato che una riga di codice impiegava 10 microsecondi per elaborare i dati stereo. Poiché l'audio stereo campionato a 44,1 KHz lascia solo 11,3 microsecondi per il DSP, questo è inaccettabilmente lento… Tuttavia, combinando una piccola tabella di ricerca (400 byte) e una procedura di interpolazione basata sulle differenze divise di Netwon possiamo ottenere una precisione di quasi 17 bit in 0,2 microsecondi. Ho allegato un documento pdf con tutta la matematica per i veri interessati. È complicato, sei stato avvertito!

Passaggio 9: l'interfaccia Wi-Fi

L'interfaccia Wi-Fi
L'interfaccia Wi-Fi
L'interfaccia Wi-Fi
L'interfaccia Wi-Fi

Ora hai un ricevitore Bluetooth in grado di eseguire DSP in tempo reale. Purtroppo, se desideri modificare uno qualsiasi dei parametri DSP, dovrai disconnetterti dal tuo HiFi, caricare un nuovo sketch e quindi riconnetterti. Questo è goffo. Per risolvere questo problema ho sviluppato un server web che puoi utilizzare per modificare tutti i parametri DSP senza riconnetterti al tuo computer. Di seguito è riportato lo schizzo per utilizzare il server web.

#includere

#include btAudio audio = btAudio("ESP_Speaker"); webDSP web; void setup() { Serial.begin(115200); audio.begin(); int bck = 26; int w = 27; int dout = 25; audio. I2S(bck, dout, ws); // sostituisci con il tuo ID WiFi e password const char* ssid = "SSID"; const char* password = "PASSWORD"; web.begin(ssid, password, &audio); } void loop() { web._server.handleClient(); }

Il codice assegna un indirizzo IP al tuo ESP32 che puoi utilizzare per accedere alla pagina web. La prima volta che esegui questo codice dovresti averlo collegato al tuo computer. In questo modo puoi vedere l'indirizzo IP assegnato al tuo ESP32 sul tuo monitor seriale. Se vuoi accedere a questa pagina web, inserisci semplicemente questo indirizzo IP in qualsiasi browser web (testato su Chrome).

Ormai dovremmo avere familiarità con il metodo per abilitare il Bluetooth e l'I2S. La differenza fondamentale è l'uso di un oggetto webDSP. Questo oggetto accetta l'SSID e la password Wi-Fi come argomenti e un puntatore all'oggetto btAudio. Nel ciclo principale, otteniamo continuamente che l'oggetto webDSP ascolti i dati in entrata dalla pagina Web e quindi aggiorni i parametri DSP. Come punto di chiusura, va notato che sia Bluetooth che Wifi utilizzano la stessa radio su ESP32. Ciò significa che potrebbe essere necessario attendere fino a 10 secondi da quando si immettono i parametri nella pagina Web a quando le informazioni raggiungono effettivamente ESP32.

Passaggio 10: piani futuri

Si spera che ti sia piaciuto questo istruttivo e ora hai Bluetooth Audio e DSP aggiunti al tuo HiFi. Tuttavia, penso che ci sia molto spazio per la crescita in questo progetto e volevo solo indicare alcune direzioni future che potrei prendere.

  • Abilita lo streaming Wi-Fi dell'audio (per la migliore qualità audio)
  • Usa un microfono I2S per abilitare i comandi vocali
  • sviluppare un equalizzatore controllato tramite WiFi
  • Rendilo carino (breadboard non urla un ottimo design del prodotto)

Quando riuscirò a implementare queste idee, creerò più istruzioni. O forse qualcun altro otterrà queste funzionalità implementate. Questa è la gioia di rendere tutto open source!

Consigliato: