Perché non puoi semplicemente campionare ADC nella media per ottenere una risoluzione maggiore da un ADC?


8

Sto cercando di ottenere più di 10 bit di precisione dal mio ADC Arduino ma non riesco davvero a capire la teoria alla base. Una nota di applicazione Atmel spesso citata ( http://www.atmel.com/Images/doc8003.pdf ) afferma che

È importante ricordare che la media normale non aumenta la risoluzione della conversione. La decimazione, o interpolazione, è il metodo di calcolo della media, combinato con il sovracampionamento, che aumenta la risoluzione

Quindi quello che propongono per la "Decimazione" sta spostando il punto decimale. Il che equivale a dimezzare la lettura binaria per ogni posto in cui la sposti, in modo da poter dividere il valore di base 10 per 2 o 4 o 8 o cosa hai. Comprendo che la decimazione è sbagliata?


"In combinazione con il sovracampionamento, che aumenta la risoluzione" - Penso che stiano dicendo che per avere una maggiore risoluzione devi prendere più campioni. (Al contrario di cosa, non lo so. Forse pensano che qualcuno sarà abbastanza stupido da fare una media dello stesso campione con se stesso ancora e ancora?)
user253751

Nell'area di DSP (Digital Signal Processing), il termine "decimazione" indica un algoritmo regolare di rimozione (caduta) di campioni se non cambiano molto (quando si sovrascrive molto al di sopra del confine di Nyquist del segnale o dopo un filtro di livellamento). Il termine deriva da una pratica nell'antica Roma (?) Per uccidere ogni, diciamo, terzo soldato in un reggimento fallito in un campo di battaglia.
Ale..chenski,

E non vedo dove l'articolo di Atmel suggerisce di spostare i punti decimali, sebbene possa far parte dell'algoritmo di calcolo della media.
Ale..chenski,

Risposte:


7

Ho dato un'occhiata alla nota e questa è davvero una strana affermazione (o un modo confuso di dire cosa significano realmente).

Forse ciò che realmente significano è che se si desidera ottenere una maggiore risoluzione, non è possibile dividere / spostare il numero successivamente sulla stessa scala di un singolo campione perché (in aritmetica intera) che eliminerebbe i bit acquisiti.

Se i tuoi campioni ADC sono rumorosi , ovviamente puoi dividerli per ottenere un valore meno rumoroso nella scala originale.


L'altra cosa che ho pensato da solo la tua domanda è stato il punto che per fare sovracampionamento destra è necessario utilizzare un filtro passa-basso efficace, e una media mobile semplice non è come bravo a essere un filtro passa-basso come FIR progettato correttamente (o IIR) - ma questo non sembra essere supportato dal testo della nota.


Un filtro passa basso o un filtro a media mobile non filtrerà il rumore 1 / f, che è la maggior parte del motivo per cui i bit inferiori sono rumorosi, se i filtri lo facessero sarei senza lavoro
Voltage Spike

16

Se chiedi a qualcuno di misurare una tavola di 45.2 cm con precisione al centimetro più vicino, risponderà (o dovrebbe) a 45. Se chiedi quindi di misurarla di nuovo, risponderebbe di nuovo a 45. Ripeti l'esercizio altre 8 volte e la media di tutte le misurazioni dovrebbe essere esattamente 45. Indipendentemente dal numero di volte in cui si campiona l'input, si otterrà un valore di 45. La media di tutte queste letture sarebbe, ovviamente, essere 45 (anche se la tavola è lunga 45.2 cm).

Se la persona avesse regolato l'apparato di misurazione in modo da leggere 0,45 cm prima della prima misurazione, 0,35 cm prima della seconda, 0,05 cm prima della quinta, 0,05 cm prima della sesta, ecc. Fino a 0,45 cm prima la decima, quindi due delle misure avrebbero letto 46 e le altre otto avrebbero letto 45. La media di tutte sarebbe stata 45,2.

In pratica, riuscire a distorcere le cose in modo così preciso è difficile. Se uno regola casualmente l'apparato di misurazione prima di ogni misurazione per leggere da qualche parte tra 0,5 cm di lunghezza e 0,5 cm di lunghezza, circa 1/5 delle misurazioni legge 46 e il resto 45, ma poiché le regolazioni sono casuali la frazione effettiva potrebbe essere maggiore o inferiore. Effettuare dieci misurazioni non aggiungerebbe una cifra significativa e significativa, ma una media di circa 100.

Non sono sicuro di aver ben compreso la logica del documento per la distinzione tra media e spostamento giusto. Bisogna essere consapevoli del fatto che l'apparente precisione raggiunta dalla media può superare il livello significativo di precisione, ma dalla mia esperienza la domanda su quando e quanto a spostamento a destra dovrebbe essere guidata dai limiti della gamma numerica del processore. Lavorare con numeri che possono essere ridimensionati il ​​più possibile senza causare overflow generalmente riduce al minimo gli effetti degli errori di arrotondamento, a condizione che non si attribuisca un significato indebito a piccole quantità di rumore.

Per inciso, nell'uso originale, "decimare" un esercito significava uccidere 1/10 dei soldati ivi presenti. Decimare i dati da un ADC significa scartarne una parte. Il prefisso comune con la frase "punto decimale" non implica un'associazione.


14

La risposta breve è il rumore, e non è necessariamente il rumore che conta, ma il tipo di rumore . L'altro problema sono gli effetti non lineari come INL che eliminano il valore medio

Prima il rumore:

Se dovessimo provare una distribuzione gaussiana sarebbe simile a questa:

inserisci qui la descrizione dell'immagine

La linea rossa è più vicina alla distribuzione termica effettiva (mediata nel tempo) e l'istogramma blu rappresenta molti campioni ADC. Se dovessimo campionare continuamente questa distribuzione otterremmo statistiche migliori e saremmo in grado di trovare il valore medio o la media con una maggiore precisione (che di solito è ciò che era dopo, sì, mi rendo conto che i segnali si muovono, c'è il filtraggio e il segnale al rumore a seconda del contenuto della frequenza, ma consideriamo solo il caso DC in cui il segnale non si sta muovendo per ora).

μ=1ni=1nxi

Il problema è il rumore di sfarfallio o rumore 1 / f, sposta la media gaussiana attorno e provoca il crollo delle statistiche, perché la distribuzione non è più gaussiana.

Questo è un modello scadente, ma si potrebbe considerare che apparire come questo INL è anche un problema perché può introdurre alcuni bit di errore che gettano via anche la media.

μ=1ni=1nxi+error

Questo è probabilmente confuso, guardiamo il dominio del tempo come mostrato di seguito

Nell'immagine in alto puoi vedere un segnale con rumore gaussiano sarebbe facile "tracciare una linea" attraverso il centro e trovare la media. Più campioni ottieni da un segnale come questo, migliore sarà l'accuratezza e la conoscenza della media.

Nell'immagine inferiore puoi vedere come appare il rumore dello sfarfallio, la media non ti aiuterà qui.

Il problema è che la maggior parte dei componenti elettronici ha un rumore di sfarfallio, i resistori no (supponendo che non vi sia influenza dalla temperatura ambiente), ma i transistor e i circuiti integrati lo fanno. Ci sono amplificatori chiamati chopping amplifiers che superano questi effetti.

Un'altra cosa da sapere è che ci sono ADC (linear ha un nuovo core SAR) in cui gli ingegneri hanno lavorato per eliminare gli effetti del rumore 1 / f (e altri effetti non lineari di ADC come INL) a un livello molto più basso del bit degli ADC valore. È possibile utilizzare un forte sovracampionamento e ottenere valori a 32 bit da un core a 14 bit.

Fonte: EDN- 1 / f Noise: la candela tremolante inserisci qui la descrizione dell'immagine


Molto interessante ma non credo che la nota applicativa si riferisse al rumore dello sfarfallio
Plumpie,

Tutti i punti positivi; un semplice filtro per la media è un SINC (tutti i coefficienti sono uguali) ma non può mai convergere completamente (citazione più avanti - usando il telefono in questo momento).
Peter Smith,

6

Quindi quello che propongono per la "Decimazione" sta spostando il punto decimale.

non esattamente. la parte relativa alla decimazione sostiene che, a mio avviso, la normale "media" di più campioni, pur mantenendo la larghezza dei bit, non conserva altrettante informazioni. Quindi, se in media letture ADC m n-bit, la media risultante è ancora una lettura adc n-bit.

l'approccio proposto è, per dirla in parole povere, la media delle letture ADC n-bit in modo che la media risultante abbia una larghezza di bit maggiore. Ad esempio, sommando 4 letture adc a 10 bit e dividendo la somma per 2 si ottiene una lettura adc a 11 bit.

Ho pensato che sia sempre stato il modo in cui il sovracampionamento è stato effettuato a livello professionale. Questa semplice media da parte di persone in rete è ampiamente considerata come l'approccio sbagliato.

l'altro punto che per ridurre il rumore, il sovracampionamento è efficace solo se c'è il rumore giusto. Se avessi un ADC a 10 bit progettato da God (cioè ogni lettura è la lettura vera assoluta, senza variazioni), il sovracampionamento non avrebbe funzionato.

il particolare circuito verso la fine dell'articolo sull'uso di un pwm per aggiungere rumore non è corretto: il pin che aggiunge rumore dovrebbe avere un condensatore di blocco CC. e un punto meno sostanziale è che non deve essere un pin PWM. Un normale pin GPIO funzionerebbe.


> Questa semplice media da parte di persone in rete è ampiamente considerata un approccio sbagliato. non se li consideri come galleggianti
Plumpie il

4

Innanzitutto, un ADC è valido solo quanto il suo riferimento di tensione. Se il tuo arduino utilizza + 5 V come riferimento, puoi dimenticare qualsiasi tipo di precisione, poiché il regolatore + 5 V è piuttosto rumoroso, bassa precisione come 1-5% e la sua tensione di uscita dipenderà dalla quantità di corrente prelevata da esso, sia al momento della misurazione, sia negli ultimi millisecondi.

Quindi, se hai bisogno di accuratezza o precisione, seleziona un riferimento di tensione che soddisfi i tuoi requisiti. Se non hai bisogno di un'accuratezza assoluta sulla tensione, sarà più economico, poiché avrai solo bisogno che sia stabile, anziché accurato e stabile.

Non ho testato l'ADC SAR all'interno di Arduino. Ho esperienza con quello in AT90PWM3B che è un parente stretto. È abbastanza buono Con una tensione di ingresso costante, si ottiene la stessa lettura ADC, ripetutamente, con 1 LSB che oscilla se la tensione è compresa tra valori. Non posso aspettarmi un risultato migliore da un ADC SAR. (Ho usato un riferimento di tensione esterna di buona qualità)

Quindi, il rumore non è un problema qui ...

In effetti, il rumore è tuo amico ...

Supponiamo che la tensione che si desidera misurare cada sul valore ADC 100.1

Fai 10 misurazioni, ma dato che l'ADC è buono, ne ottieni 100 ogni volta!

Quindi hai bisogno di un po 'di rumore sul tuo segnale, come un LSB di rumore, per assicurarti che se misuri 100.1, otterrai 100 nove volte su dieci e 101 una volta su dieci. Quindi avrà una media di 100.1, capito?

Se proviene da un sensore, di solito avrai abbastanza rumore gratis.


Aspetti positivi su tutti i modi in cui sto perdendo precisione e precisione con il mio metodo attuale. Ho un tl431 (shunt regolabile di precisione) in giro e proverò ad agganciarlo.
Plumpie,

I regolatori di tensione lineari hanno tempi di risposta nella gamma MHz e sono quindi abbastanza stabili nella gamma di frequenza dell'ADC.
JimmyB,

Quindi potresti voler misurare solo le tensioni relative allo stesso Vcc (potenziometro, sensori di tipo divisori di tensione).
JimmyB,

LDO con risposta "Nell'intervallo MHz" ???? Invia i fogli dati amico, mi piacerebbe incontrarne uno! Molto probabilmente l'arduino viene fornito con un 1117 scadente o simile, che ha una risposta transitoria lenta del cane ... L'uso della fornitura come riferimento non è comunque inteso per precisione.
peufeu,

4

Quello che ti manca è il significato di "decimazione".

A rigor di termini, la "decimazione" è la riduzione a 1/10. Cioè, da 10 riducono a 1.

La "decimazione" utilizzata nel campionamento perde il significato rigoroso. Invece di 1/10, significa "ridurre il numero".

Ciò significa che si calcola la media di un numero di campioni e si riduce il numero di campioni dello stesso numero.

Ad esempio, se campionate a 1000Hz e in media 4 campioni, mantenete solo la media. Alla fine, hai solo 250 campioni al secondo invece di 1000. Hai perso la risoluzione del tempo, ma hai guadagnato un po 'di risoluzione della tensione.

Per ogni fattore 4, guadagni 1 bit. Media e decimale di 4 e passa da 10 bit di risoluzione a 11 bit di risoluzione.

Un altro fattore di 4 (4 * 4 = 16 in totale) ti porta da 10 bit a 12 bit. Un altro fattore di 4 ti porta a 13 bit di risoluzione.

Tuttavia, nota che ora stai sovracampionando di un fattore 64. La tua frequenza di campionamento effettiva diminuisce dello stesso fattore. Utilizzando l'esempio della frequenza di campionamento di 1000Hz, si arriva a circa 15 campioni effettivi al secondo.

Questa è una decimazione, ed è quanti ADC a bit alto ottengono la loro alta risoluzione. Campionano a una velocità elevata, media (o usano un filtro passa basso digitale) e decimano.

All'estremo, si ha un singolo bit ADC (un semplice comparatore) che esegue il supercampionamento di diversi millioni di volte per fornire una profondità di bit effettiva di 16 bit.

Una cosa che devi tenere a mente affinché questo funzioni è che hai bisogno di un rumore nel tuo segnale approssimativamente uguale al valore più piccolo che il tuo ADC può misurare. Per un ADC a 10 bit che utilizza una tensione di riferimento di 5 V, sarebbe un rumore di circa 5 mV da picco a picco.

La media del rumore è da dove provengono effettivamente i guadagni dei bit. Immagina di avere un segnale (DC) che si trova esattamente tra il valore di 512 conteggi ADC e 513 conteggi ADC. Senza rumore, il valore misurato sarà sempre lo stesso - la media ti darà lo stesso valore dei campioni.

Aggiungi rumore quasi al più piccolo valore misurabile e sembra molto diverso. Sebbene il segnale stesso non cambi, i valori misurati "oscillano" attorno al valore reale del segnale. La media ora è diversa dai campioni e più campioni usi più si avvicina al valore reale del segnale


Ho usato questa tecnica con un Arduino (che utilizza un processore Atmel con un ADC a 10 bit) per ottenere una migliore risoluzione per alcune misurazioni che stavo facendo.

Ho ottenuto fino a 13 bit, ma ho scoperto che avevo bisogno di più. Avrei potuto scegliere un altro fattore 4, ma ciò avrebbe richiesto troppo tempo per ogni campione e mi avrebbe procurato solo un altro bit.

Gli esperimenti con il sovracampionamento hanno mostrato che ciò che stavo facendo poteva funzionare (ho ottenuto risultati riconoscibili ma rumorosi) senza dover spendere tempo e denaro per ottenere un ADC migliore. Con la prova del concetto, potrei andare avanti e ottenere un ADC migliore - e ottenere quella prova mi è costato solo poche righe di codice e un po 'di tempo.

Ho scoperto che avevo bisogno di almeno 16 bit. Ciò avrebbe significato una media di 4096 campioni.
Sono circa mezzo secondo usando il campionamento più veloce possibile con il software Arduino.

Dato che avevo bisogno di 14400 misurazioni, la corsa completa avrebbe richiesto 2 ore.

Non sono così paziente e le cose che stavo misurando non sarebbero rimaste costanti per così tanto tempo. Ho dovuto passare all'utilizzo di un ADC che utilizza internamente un tasso di sovracampionamento molto più elevato e che fornisce campioni con risoluzione più elevata a un tasso inferiore.

Come per molte altre cose, la decimazione è un compromesso che può offrirti prestazioni migliori in una direzione (profondità di bit) mentre ti costa prestazioni in un'altra direzione (frequenza di campionamento).


3
Dal momento che prendi il tempo necessario per capire cosa significa decimazione : rigorosamente significa riduzione di 1/10, mantenendo il 9/10 degli articoli.
pipe

2

Quindi puoi studiare la teoria, ma posso dirti che in pratica conta solo un modello semplice. Puoi fare una media, purché il segnale sia nel rumore. Quindi la media del componente di rumore verrà azzerata, mentre il segnale rimarrà. In questo modo otterrai una risoluzione a scapito della larghezza di banda.

Se ad esempio hai un adc a 16 bit e gli ultimi quattro bit sono rumorosi, puoi filtrarli e ottenere il segnale lì. Ma se hai solo un po 'di rumore, non c'è molto nella media, quindi non otterrai molte nuove informazioni.

Se hai bisogno di una risoluzione davvero elevata (e di una larghezza di banda ridotta), osserva come funziona ADC sigma-delta. Hanno un segnale ad alta velocità da 1 bit che viene quindi filtrato fino a una larghezza di banda con una risoluzione più elevata, a volte 20 bit e più.


2

Perché non puoi Puoi , ma devi considerare tutte le fonti di errore e rumore per assicurarti che il tuo piano funzioni.

La media lavora per migliorare la risoluzione riducendo l'errore di deviazione standard, σ. Il criterio da soddisfare è che il rumore gaussiano deve semplicemente superare l'errore di quantizzazione. La specifica da definire è l'errore totale e fare in modo che l'errore di quantizzazione o la risoluzione contribuiscano solo a una piccola parte del budget totale dell'errore.

Ad esempio, se si desidera migliorare la risoluzione di 2 bit, ma il rumore era già di 3 bit, è necessario considerare come ridurre il rumore di 2 + 3 = 5 bit, aumentando contemporaneamente la risoluzione di 2 bit.

  • Questa potrebbe essere una soluzione digitale con una media di> 25 campioni con il costo della latenza o una soluzione analogica mediante filtro di reiezione del rumore, bilanciamento dei segnali per rifiutare il rumore di modo comune e / o schermare meglio il segnale insieme alla media digitale.

Dove n è il bit desiderato desiderato di risoluzione, quindi spostando a destra un numero binario (o decimando) x1 è uguale a / 2.

Per media si intende il σ del rumore è ridotto di x per x campioni ma anche che la latenza è aumentata di x campioni di tempo, quindi è necessario un sovracampionamento per ridurre la latenza.

Si noti che il termine "decimazione" si applica sia ai valori decimali che ai numeri decimali con codice binario. È possibile visualizzare se si dispone di un contatore che legge valori interi e quindi facendo una media di 10 risultati, si divide per 10 per ottenere un miglioramento con un decimale aggiuntivo ma il valore σ del rumore è ridotto solo di 1/10=1/3.3 per x campioni ma anche che la latenza aumenta di x campioni di tempo, quindi è necessario un sovracampionamento per ridurre la latenza,

foversampling=4nfNyquist

Tuttavia il rumore a quella frequenza di campionamento,fs deve essere appena sufficiente per dithering di +/- 1 bit su alcuni dei campioni x, per ottenere il miglior miglioramento nella risoluzione.

  • Ad esempio, se il BW è 10kHz allora fNyquist= 20kHz
  • e se si desidera convertire una risoluzione da 10 bit a 12 bit, allora n = 2 L'aumento della risoluzione da 10 bit a 12 bit richiede la somma di 16 valori da 10 bit. Una somma di 16 valori a 10 bit genera un risultato a 14 bit in cui non si prevede che gli ultimi due bit contengano informazioni preziose.

Troppo errore di quantizzazione o troppo rumore casuale richiedono una media maggiore per ridurre l'errore e una maggiore media aumenta la latenza del risultato.

Per ottimizzare un ADC per velocità ed errore, è necessario definire il budget totale dell'errore e la risoluzione disponibile (bit), SNR desiderato o errore assoluto per ogni dato segnale nell'intero intervallo di misurazione. La definizione iniziale di tutte le fonti di errore può sembrare difficile, ma necessaria anche;

ad es. errore di guadagno, errore di offset, errore di quantizzazione, errore di rumore CM, errore di rumore DM, rumore di Vref o errore di offset, rumore ambientale, ecc., errore di latenza (dalla media)

Quindi determinare quanti più bit di risoluzione sono necessari per raggiungere il budget degli errori di progettazione sopra indicato dopo che tutte le altre fonti di errore sono state ridotte al minimo.

Lo stesso vale per la media (per segnali lenti) e il sovracampionamento della larghezza di banda del segnale e la decimazione per l'ADC in tempo reale.

Ciò non correggerà per errori di guadagno o offset e se il rumore casuale è insufficiente, è necessario aggiungere un disturbo al dithering del segnale. Idealmente, tutte le altre fonti di rumore ed errore non superano 1 bit in modo tale che la deviazione standard o il dithering siano solo +/- 1 rispetto al numero di campioni. Tuttavia, deve esserci un rumore sufficiente in modo che la stessa lettura non sia ottenuta da campioni successivi in ​​entrambi i metodi.


1

La teoria alla base può essere presa, in breve, da questa frase sull'articolo di Wikipedia sul sovracampionamento :

Tuttavia, il SNR aumenta di sqrt (N) (...). Sommando il rumore non correlato aumenta la sua ampiezza di sqrt (N), mentre sommando un segnale coerente aumenta la sua media di N. Di conseguenza, il SNR (o segnale / rumore) aumenta di sqrt (N). Nell'esempio, ciò significa che mentre con N = 256 c'è un aumento della gamma dinamica di 8 bit e il contenuto di "segnale coerente" aumenta di N, ma il rumore cambia di un fattore di sqrt (N) = sqrt (256 ) = 16 nell'esempio (da non confondere con un aumento di 16 bit), quindi il SNR cambia di un fattore 16.

Quindi, a condizione che il tuo segnale corrisponda a determinati criteri (come essere abbastanza lento e avere un basso rumore), in realtà aumenti di un bit ogni 4 campioni. Quindi, per ogni 4 campioni risultanti, puoi ottenere "join", quindi di nuovo per formare un altro campione ad alta risoluzione, in modo tale che alla fine ottieni log_4 (n) bit per ogni n campioni che leggi sul tuo ADC.

Per quanto riguarda la parte di decimazione, non è davvero una media, specialmente se prendi in considerazione che qui stiamo parlando di numeri interi (campioni ADC). Ad esempio, se si dispone di campioni 1, 1, 3e 2, il vostro media sarebbe:

int result = (1+1+3+2)/4;

Dato che stai calcolando la media con i numeri interi, il tuo "risultato matematico" di 1,75 verrà arrotondato per difetto a 1. Se poi moltiplichi per 2, otterrai 2.

Ora, se lo decimali con:

int result = (1+1+3+2)>>1;

Il tuo risultato sarà 3. Puoi sostenere che questo equivale a dividere per 2, ma sicuramente non puoi sostenere che 3 sia la media di 1, 1, 3 e 2 . Vedi la differenza?

Ora potresti essere tentato di sommare tutto e non scartare l'ultimo bit. Ma ricorda che questo bit è rumore: non puoi davvero usarlo.


Mi sento come se l'ampiezza del rumore aumentasse con sqrt (N) e il segnale coerente aumentasse con N, allora il SNR dovrà aumentare con N / sqrt (N) e non sqrt (N)
Plumpie

@Plumpie Controllare nuovamente la matematica: N/sqrt(N) = sqrt(N).
Ronan Paixão,

1

Sembra che tutti abbiano già trattato la parte teorica della tua domanda, ma dato che stai usando un Arduino potresti voler leggere le mie avventure cercando di aumentare la risoluzione dell'ADC con questa tecnica:

Miglioramento della risoluzione ADC di Arduino con Dithering e Oversampling

Il carattere del rumore è una parte critica della storia e si scopre che puoi generare un dither ragionevolmente buono semplicemente premendo un pin con un resistore su di esso mentre leggi l'ADC in modo asincrono. Non è perfetto e ottieni un piccolo offset di sincronia che varia a seconda di quanti campioni / bit extra stai cercando di ottenere. Accetterei anche le critiche sul fatto che questa tecnica dipenda dalla scarsa stabilizzazione del binario nell'Arduino, quindi si sta davvero progettando per un difetto, piuttosto che seguire le buone pratiche. Ma è molto facile da fare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.