Campionamento da microfono

Salve a tutti ragazzi! Innanzi tutto colgo l'occasione per augurarvi auguri di buon Natale! E' ormai da un paio di settimane che per esigenze personali ed anche un po per curiosità che avevo pensato di realizzare un walkie talkie utilizzando arduino, ma di problemi ce n'è anche più di uno... Innanzi tutto volevo dei semplici chiarimenti e conferme sul campionamento che posso eseguire: ho letto che come massimo con la maggior parte degli ADC montati su schede arduino si può arrivare solamente a 10k con 10 bit di risoluzione... questi due valori sono abbastanza lontani dai minimi 44.1k e dai 16 bit della qualità di un CD, quindi la mia domanda è: "Esistono moduli o shield esterne dedicate che riescono a campionare anche alla minima frequenza e ad una risoluzione decente così da evitare rumore ed aliasing?"; magari moduli che comunicano con protocolli veloci come SPI, I2C o Seriale? In questo modo eviterei di costruire circuiti complessi come amplificatori, filtri ed altre cose strane, avrei in uscita i dati campionati belli e pronti per essere trasmessi o utilizzati in altri mille modi :smiley:
Premetto che io sono un informatico e studio elettronica analogica/digitale per conto mio da ormai più di un anno, molte cose le capisco, ma altrettante no, quindi potrei dire delle cose che non stanno né in cielo né in terra, perdonatemi in caso di questa eventualità e grazie a tutti in anticipo!

Un walkie talkie usando Arduino???...
È come chiedere che frullatore usare per affettare il panettone... :slight_smile:

È come chiedere che frullatore usare per affettare il panettone...

Questa te la rubo... :smiley:

Datman:
Un walkie talkie usando Arduino???...
È come chiedere che frullatore usare per affettare il panettone... :slight_smile:

Uno grande dove c'entra il panettone. :wink: :wink: :wink:
(Scusami non ho resistito)

LoZioo Ti stai sbagliando di grosso.

Ne un walkie talkie ne il vecchio telefono ne i cellulari odierni hanno una qualitá di una registrazione CD.
Il telefono tradizionale ha una banda di trasmissione da 300 a 3400 Hz.

Inoltre Arduino non é adatto per elaborare audio e di trasmetterlo.

Comprati dei walkie talkie da 20 E e avrai una cosa che funziona e nonm angia batterie come altri noccioline.

Ciao Uwe

Ho capito, solamente volevo fare una cosa un poco più carina e customizzata che fosse anche funzionale (ed anche per scopo didattico alla fine); una sorta di citofono sostanzialmente.. Per questo chidevo se esistono shield in grado di fare già tutto il lavoro in automatico hahah
Se poi mi dite che comunque il gioco non vale la candela in nessun modo, che alternative potrei avere? Il progetto più che ad un walkie talkie ora che ci penso è più simile ad un citofono (che poi è un walkie talkie fisso hahah).

Datman:
Un walkie talkie usando Arduino???...
È come chiedere che frullatore usare per affettare il panettone... :slight_smile:

PS Dopo questa hai vinto tutto. xD

Ringrazio tutti delle risposte semplici e coincise

Tanto tanto tempo fa, in una galassia lontana lontana, volevo provarci io, usando una sorta di modulazione delta (o delta sigma, avevo dubbi) e usare arduino per convertire il flusso di bit dal modulatore in un flusso di byte con parità verso una seriale o un modulo hc12 (poi mi sono reso conto che hc 12 non tiene il ritmo sostenuto)
vedi se ti basta come spunto....

Per un segnale vocale di bassa qualità (citofono/telefono/walkie/interfono) bastano campioni da 8bit presi a 8kHz (quindi ogni 125µs).

Prima dell'ADC andrebbero interposti un compressore audio (con funzione di trasferimento logaritmica per esaltare i suoni lievi e attenuare quelli forti) e un filtro passa basso ad elevata pendenza con frequenza di taglio sui 3500Hz (per eliminare le frequenze superiori alla metà frequenza di campionamento che causerebbero alee con frequenze spettralmente invertite). Il segnale ottenuto va poi "condizionato", cioè centrato come tensioni nel range di acquisizione dall'ADC.

Fatto tutto ciò, abbiamo un flusso dati a 64kbit/s netti da trasmettere e ricevere da un'altra parte.

Quindi: prima di tutto l'ADC interno va fatto lavorare a velocità molto maggiori di quella predefinita (sono da impostare manualmente i registri del micro), poi si dovrebbero prendere gli accorgimenti hardware detti prima a meno di accontentarsi della voce dei cyberuomini mescolata a fruscio di quantizzazione. Successivamnte c'è da affrontare la trasmissione 64kbit/s (un campione ogni 125µs esatti). E alla fine la riconversione in analogico, che non può essere effettuata con un'uscita PWM impostata in modo standard. O si usa un DAC esterno seguito da filtro integratore e amplificatore, o si dovrebbe come prima manipolare i registri del micro per ottenere un PWM con frequenza superiore ai 20kHz (poi resta sempre integratore e amplificatore).

Credo ci sia tutto :slight_smile:

Per assurdo, queste cose le ho fatte 30 anni fa con uno Z80 programmato in assembly (eco riverbero elettronico), ma adesso non so se riuscirei a farle con Arduino :confused:

Claudio_FF:
... uno Z80 programmato in assembly (eco riverbero elettronico) ...

Ecco la differenza di base fra un softwarista ed un hardwarista :wink: ... il mio primo eco lo ricavai dalla meccanica scassata di un vecchio registratore a nastro, aggiungendo sul pannello di supporto altre 4 testine ed usando un'anello di nastro ... un'incubo da regolare tutto, ma alla fine funzionava, perfino :smiley: :smiley: :smiley:

Poi venne il "glorioso" TDA1022, prima linea BBD a prezzo "quasi umano", i vari SAD512, SAD1024, e cosi via ... ma il primo esperimento riuscito fu piu meccanico, che elettronico :smiley:

Claudio_FF:
Per un segnale vocale di bassa qualità (citofono/telefono/walkie/interfono) bastano campioni da 8bit presi a 8kHz (quindi ogni 125µs).

Prima dell'ADC andrebbero interposti un compressore audio (con funzione di trasferimento logaritmica per esaltare i suoni lievi e attenuare quelli forti) e un filtro passa basso ad elevata pendenza con frequenza di taglio sui 3500Hz (per eliminare le frequenze superiori alla metà frequenza di campionamento che causerebbero alee con frequenze spettralmente invertite). Il segnale ottenuto va poi "condizionato", cioè centrato come tensioni nel range di acquisizione dall'ADC.

Fatto tutto ciò, abbiamo un flusso dati a 64kbit/s netti da trasmettere e ricevere da un'altra parte.

Quindi: prima di tutto l'ADC interno va fatto lavorare a velocità molto maggiori di quella predefinita (sono da impostare manualmente i registri del micro), poi si dovrebbero prendere gli accorgimenti hardware detti prima a meno di accontentarsi della voce dei cyberuomini mescolata a fruscio di quantizzazione. Successivamnte c'è da affrontare la trasmissione 64kbit/s (un campione ogni 125µs esatti). E alla fine la riconversione in analogico, che non può essere effettuata con un'uscita PWM impostata in modo standard. O si usa un DAC esterno seguito da filtro integratore e amplificatore, o si dovrebbe come prima manipolare i registri del micro per ottenere un PWM con frequenza superiore ai 20kHz (poi resta sempre integratore e amplificatore).

Credo ci sia tutto :slight_smile:

Per assurdo, queste cose le ho fatte 30 anni fa con uno Z80 programmato in assembly (eco riverbero elettronico), ma adesso non so se riuscirei a farle con Arduino :confused:

Wow. Più chiaro di così non potevi essere hahah
Ho capito un po tutto, ma vorrei capire tre cose:

Primo: il compressore audio (mai sentito) è un circuito che ti riquantizza logaritmicamente il segnale?

Secondo: come faccio a condizionare il segnale? (credo tu intenda rimappare la potenza del segnale per portarla da 0v a 5v compatibili con l'ADC dell'arduino)

Terzo: Come può servirmi modificare la frequenza interna dei pin PWM del microcontrollore? Cioè, un onda PWM è comunque un onda quadra, come può riprodurre un segnale audio pulito e preciso? (La soluzione con il DAC l'avevo già considerata)

Un altra cosa, ma usare un ADC esterno oltre ad un DAC esterno? Così da comprare i pezzi che lavorano ad una frequenza adatta da campionare bene la voce e così da disimpegnare l'arduino dall'ingrato compito? Magari appunto un componente che data l'oscillazione del clock interno dia in uscita gli n bit per impulso di clock che rappresentino un campione istantaneo del segnale in ingresso?
Così comunque anche lo sketch da scrivere si semplificherebbe (un array di interi dove ogni valore è composto dal numero composto dai rappresentati dalle n uscite dell'ADC esterno) e la sola parte complicata rimarrebbe quella elettronica (dove oltretutto è quella dove spesso ho più difficoltà).

Ultima domanda: alternativamente ad arduino, esistono per caso altre schede programmabili più potenti adatte allo scopo? Ho molta esperienza anche con il mondo Raspberry, ma mi sembra un esagerazione acquistarne un altra (ammesso che vada bene a fare questa cosa) solamente per usarla in questo modo. Non esiste una via di mezzo?

Spero di essermi spiegato bene :slight_smile:

primo e Secondo: sono circuiti analogici. praticamente dei amplificatori che modulano la loro amplificazione in funzione del segnale.

Terzo: con un segnale PWM si puó simulare un andamento di un segnale analogico. Gli amplificatore classe D lo fanno. https://it.wikipedia.org/wiki/Amplificatore_(elettronica)#Classe_D_(equivalentemente_Classe_S)

Ciao Uwe

Il compressore di dinamica è un controllo automatico di guadagno, per adattarlo automaticamente a voci deboli e a voci forti.

Tanti anni fa Nuova Elettronica pubblicò il progetto di un interfono multicanale, con i segnali che viaggiavano su un solo cavo coassiale in TDM (multiplazione a divisione di tempo: i segnali vengono "affettati" e multiplexati).