Acquisizione audio generale

Salve a tutti, sono appena arrivato sul forum. Vorrei fare una domanda agli esperti:

Posso acquisire un segnale audio con il mio Arduino UNO? Non mi interessa che sia particolarmente dettagliato, 1024 livelli mi bastano, per ogni campione, però devo raggiungere una frequenza di campionamento adeguata. Non trovo niente su internet, qualcuno per caso sa dirmi a che frequenza viene campionato il segnale sugli ingressi analogici?

Dite che dovrei cercare nelle specifiche dell'ATMega328?

Yeeees... nel datasheet.... an tieni conto che il campo umano udibile va da 800Hz(forse meno) a 20Khz se non ricordo male

ratto93: Yeeees... nel datasheet.... an tieni conto che il campo umano udibile va da 800Hz(forse meno) a 20Khz se non ricordo male

Sì, grazie, lo sapevo, anche perché studio Ingegneria Elettronica e più o meno le nozioni di base le ho tutte, solo che non ho ancora iniziato a lavorare con i microcontrollori, o meglio, sono proprio agli esordi ma con un altro controllore ATmel, non quello di Arduino.

La frequenza di campionamento però deve essere il doppio di quella udibile, quindi devo raggiungere almeno i 40 kHz per avere qualcosa di ascoltabile. Altrimenti arrivano delle distorsioni tremende. I campionamenti audio classici si fanno a 44 kHz però io per esempio ho una pedalina per basso elettrico che arriva a 96!

an.... però se la pedalina arriva a 96Khz ma noi non possiamo udirla che te ne frega di riportare tutto ?? :):):) comunque forse dovresti aspettare i maestri io l'elettronica la sto imparando e i micro anche percui non vorrei dire stupidate mi faccio da parte volentieri :P:P

ratto93: an.... però se la pedalina arriva a 96Khz ma noi non possiamo udirla che te ne frega di riportare tutto ?? :):):) comunque forse dovresti aspettare i maestri io l'elettronica la sto imparando e i micro anche percui non vorrei dire stupidate mi faccio da parte volentieri :P:P

Ma che da parte? Sei impazzito? :) Qui contribuiamo tutti! Hai detto per esempio una cosa giusta sulla quale sia io che un mio amico abbiamo dubbi. A che serve campionare a 96 kHz? Me lo chiedo da un po' e non trovo una motivazione decente. Ora però non vorrei andare off-topic...

Ok dai :) comunque in effetti il capionamento con un ampiezze così alta ti serve per gli amplificatori ad esempio in modo da riportare il suono il più fedele possibile in uscita ma a voi questo non serve.... spiegami... cosa devi farci con questo segnale una volta letto dall'MCU?

WiFau: La frequenza di campionamento però deve essere il doppio di quella udibile, quindi devo raggiungere almeno i 40 kHz per avere qualcosa di ascoltabile. Altrimenti arrivano delle distorsioni tremende. I campionamenti audio classici si fanno a 44 kHz però io per esempio ho una pedalina per basso elettrico che arriva a 96!

Scordatelo con Arduino. L'ADC interno può al massimo campionare a poco più di 15 kHz (10 bit) un solo canale, se ne usi due la velocità si dimezza, se ne usi tre diventa un terzo e così via. Arduino è impostato per utilizzare l'ADC a circa 10 kHz, è possibile cambiare questo valore, ma non è una cosa semplicissima da mettere in pratica.

beh astrobeed già con 15Khz si dovrebbe riuscire a fare qualcosa…
e se usasse un ADC esterno ?

WiFau: A che serve campionare a 96 kHz? Me lo chiedo da un po' e non trovo una motivazione decente.

La risposta è molto semplice, più veloce campioni e migliore è la qualità finale della ricostruzione, sopratutto quando si parla di inviluppi. Lo standard dei 44kHz introdotto con i CD non è che sia il massimo della qualità, offre un buon risultato, ma una registrazione a 96kHz, o più, è nettamente migliore come qualità e fedeltà.

ratto93: beh astrobeed già con 15Khz si dovrebbe riuscire a fare qualcosa..... e se usasse un ADC esterno ?

Se parliamo di audio con 15ksps e 10 bit non vai da nessuna parte, la sonorità sarebbe semplicemente pietosa.

Ho visto sul datasheet che: By default, the successive approximation circuitry requires an input clock frequency between 50 kHz and 200 kHz to get maximum resolution. If a lower resolution than 10 bits is needed, the input clock frequency to the ADC can be higher than 200 kHz to get a higher sample rate. The ADC module contains a prescaler, which generates an acceptable ADC clock frequency from any CPU frequency above 100 kHz.

Quindi l'adc potrebbe arrivare fino a 200khz ma non ho capito se il prescaler dell'ADC divida la frequenza a partire dai 100Khz o dal clock della CPU (non penso perchè non arriverebbe a 10khz). Potete illuminarmi?

astrobeed:

ratto93: beh astrobeed già con 15Khz si dovrebbe riuscire a fare qualcosa..... e se usasse un ADC esterno ?

Se parliamo di audio con 15ksps e 10 bit non vai da nessuna parte, la sonorità sarebbe semplicemente pietosa.

Appunto per quello chiedevo cosa devono farne dell'audio perchè se non hanno grandi pretese giusto per giocare qualcosa possono fare... e comunque mi riferivo ad ADC flash di quelli molto veloci magari paralleli però non avendoli mai usati non so che prestazioni possono avere...

Allora, tanto per contribuire alla comunità, visto che scendiamo nei dettagli, provo a spiegare quel che ho capito: ho letto il Data Sheet del microcontrollore alla sezione sull'ADC:

• 10-bit Resolution • 0.5 LSB Integral Non-linearity • ± 2 LSB Absolute Accuracy • 13 - 260 ?s Conversion Time • Up to 76.9 kSPS (Up to 15 kSPS at Maximum Resolution) • 6 Multiplexed Single Ended Input Channels • 2 Additional Multiplexed Single Ended Input Channels (TQFP and QFN/MLF Package only) • Temperature Sensor Input Channel • Optional Left Adjustment for ADC Result Readout • 0 - VCC ADC Input Voltage Range • Selectable 1.1V ADC Reference Voltage • Free Running or Single Conversion Mode • Interrupt on ADC Conversion Complete • Sleep Mode Noise Canceler

Come si vede, può generare fino a 76.9 kSPS cioè 76900 campioni al secondo, purché non alla massima risoluzione. Alla massima risoluzione, 10 bit, il microcontrollore acquisisce al massimo 15000 campioni al secondo.

In sintesi, l'unico modo per raggiungere almeno i 44 kHz (il minimo per non vomitare dalle distorsioni) è quello di abbassare i bit di risoluzione. L'aliasing si riduce ma il rumore diventa molto alto. Si ottiene quindi un suono molto rumoroso, rumore di quantizzazione. In sintesi, con Arduino, niente acquisizione audio, nemmeno di scarso livello.

Siete d'accordo?

Stavo pensando a una possibilità ma non so se sia possibile.

Fino a qui abbiamo dato per scontato di dover acquisire un segnale a banda di 20 kHz. In verità non è detto che il segnale che sto acquisendo debba avere una tale banda.

Inserendo una rete di filtraggio passa basso in ingresso all’ ADC posso eliminare le componenti in alta frequenza del segnale audio e quindi avere un segnale senza aliasing anche con frequenze di campionamento inferiori (teorema di Nyquist).

A quel punto si possono aumentare i bit di risoluzione, abbassando il rumore. Che ne pensate di questa idea?

WiFau: A quel punto si possono aumentare i bit di risoluzione, abbassando il rumore. Che ne pensate di questa idea?

Che con 15ksps, a 10 bit, al massimo campioni un segnale di 7.5 kHz, ammesso che parliamo di un segnale sinusoidale altrimenti non puoi applicare Nyquist.

astrobeed:

WiFau: A quel punto si possono aumentare i bit di risoluzione, abbassando il rumore. Che ne pensate di questa idea?

Che con 15ksps, a 10 bit, al massimo campioni un segnale di 7.5 kHz, ammesso che parliamo di un segnale sinusoidale altrimenti non puoi applicare Nyquist.

Il segnale che devo acquisire ha una banda di 1 kHz e non è vero che Nyquist si estende solo a segnali sinusoidali. Il teorema dice che per un segnale a banda rigorosamente limitata B la frequenza di campionamento deve essere al minimo 2B per non introdurre aliasing. Quindi per un segnale a banda non rigorosamente limitata possiamo esagerare e considerare una frequenza di campionamento di un po' più di 4B per esempio (è il caso dei 96 kHz spesso ricercati nelle registrazioni di qualità)...se il mio segnale ha banda 1kHz quindi 15 kHz per il campionamento potrebbero essere sufficienti, con un filtro passa basso in ingresso per essere sicuri del risultato (cioè per eliminare le componenti in alta frequenza). Non pensi?

WiFau: non è vero che Nyquist si estende solo a segnali sinusoidali. Il teorema dice che per un segnale a banda rigorosamente limitata B la frequenza di campionamento deve essere al minimo 2B per non introdurre aliasing.

Se ti vuoi riscrivere i teoremi a tuo comodo liberissimo di farlo, però mi spieghi come fai a ricostruire un segnale che campioni al doppio della sua frequenza con solo due punti se non è sinusoidale ? Non è un problema di aliasing, è un problema di ricostruzione del segnale originale, non ti dimenticare che quando si parla di banda il riferimento è sempre ad un segnale sinusoidale. Se un apparato audio ha una banda compresa tra 20 Hz e 20 kHz vuol dire che un segnale sinusoidale viene riprodotto agli estremi banda con un'attenuazione di -3db, qualunque altra forma d'onda subirebbe distorsioni e maggiore attenuazione.

Sono sicuro di quello che dico per il semplice fatto che ho fatto l'esame di Telecomunicazioni un mese fa, mi ricordo bene le cose. Comunque resta la libertà di pensiero, non voglio certo mettere in dubbio i tuoi teoremi.

WiFau:
Sono sicuro di quello che dico per il semplice fatto che ho fatto l’esame di Telecomunicazioni un mese fa

Non posso sapere in cosa consiste attualmente l’esame di telecomunicazioni, anche perché io ho scelto ben altro ramo di studio, sono un cibernetico con specializzazione in robotica, però Nyquist lo conosco molto bene.
Ti prego di documentarmi con un testo, quelli veri non wikipedia, dove si afferma,parlando di campionamento, che il doppio della frequenza è una condizione sufficiente per un segnale non sinusoidale.
Ti rammento che solo con le sinusoidi è possibile parlare di segnale con una precisa frequenza massima, se non ci credi vai a riguardarti la definizione di banda passante, quindi per poter parlare di un “segnale a banda rigorosamente limitata” è obbligatorio parlare di un segnale sinusoidale.

Ma non doppio della frequenza. Della banda!!! Leggi tu prima di parlare.