¿Por qué no puede simplemente promediar muestras de ADC para obtener más resolución de un ADC?

8

Estoy tratando de obtener más de 10 bits de precisión de mi ADC Arduino pero realmente no puedo entender la teoría detrás de esto. Una nota de la aplicación Atmel citada con frecuencia ( enlace ) dice que

  

Es importante recordar que el promedio normal no aumenta la resolución de   la conversión. La decimación, o interpolación, es el método de promedio, que   combinado con sobremuestreo, lo que aumenta la resolución

Entonces lo que proponen para 'Disminución' es mover el punto decimal. Lo que equivale a reducir a la mitad la lectura binaria para cada lugar donde lo muevas, así que también puedes dividir el valor de base 10 por 2 o 4 u 8 o lo que sea. ¿Entiendo mal la decimación?

    
pregunta Plumpie

10 respuestas

7

Eché un vistazo a la nota y esa es una afirmación extraña (o una manera confusa de decir lo que realmente significa).

Quizás lo que realmente significan es el punto de que si desea obtener más resolución, no puede dividir / desplazar el número a la misma escala que una sola muestra porque (en aritmética de enteros) eso arrojaría los bits usted ganó.

Si sus muestras de ADC son ruidosas , entonces, por supuesto, puede dividirlas para obtener un valor menos ruidoso en la escala original.

La otra cosa en la que pensé solo por tu pregunta fue el punto de que para hacer un sobremuestreo correctamente, debes usar un filtro de paso bajo efectivo, y un promedio móvil simple no es tan bueno como un filtro de paso bajo como un filtro FIR (o IIR) adecuadamente diseñado, pero el texto de la nota no parece admitirlo.

    
respondido por el Kevin Reid
16

Si le pide a alguien que mida una tabla de 45,2 cm con una precisión del centímetro más cercano, responderá (o debería) a 45. Si pregunta luego para medirla nuevamente, responderá a 45 nuevamente. Repita el ejercicio 8 veces más y el promedio de todas las mediciones debe ser exactamente 45. No importa cuántas veces se muestren las entradas, uno terminará con un valor de 45. El promedio de todas esas lecturas sería, por supuesto, 45 (aunque el tablero mide 45.2cm de largo).

Si hizo que la persona ajustara el aparato de medición para que leyera 0,45 cm antes de la primera medición, 0,35 cm antes de la segunda, 0,05 cm antes de la quinta, 0,05 cm antes de la sexta, etc. hasta 0,45 cm corto antes del décimo, entonces dos de las mediciones serían de 46 y las otras ocho de 45. El promedio de todas ellas sería de 45.2.

En la práctica, lograr sesgar las cosas con tanta precisión es difícil. Si uno ajusta al azar el aparato de medición antes de cada medición para leer entre 0.5 cm de largo y 0.5 cm de corto, entonces aproximadamente 1/5 de las mediciones se leerían 46 y el resto 45, pero debido a que los ajustes son aleatorios, la fracción real podría ser mayor o bajo. Tomar diez mediciones no agregaría una cifra significativa de precisión, pero un promedio de alrededor de 100 lo haría.

No estoy seguro de entender el razonamiento del periódico para la distinción entre promediar y cambiar a la derecha. Hay que tener en cuenta que la precisión aparente alcanzada al promediar puede exceder el nivel significativo de precisión, pero desde mi experiencia, la cuestión de cuándo y cuánto al desplazamiento hacia la derecha debe ser impulsada por los límites del rango numérico del procesador. Trabajar con números que se escalan tanto como pueden sin causar un desbordamiento generalmente minimizará los efectos de los errores de redondeo, siempre que uno no otorgue una importancia indebida a pequeñas cantidades de ruido.

Incidentalmente, en el uso original, para "diezmar" un ejército mató a 1/10 de los soldados. Decimar los datos de un ADC es descartar parte de ellos. El prefijo común con la frase "punto decimal" no implica una asociación.

    
respondido por el supercat
14

La respuesta corta es el ruido, y no es necesariamente el ruido lo que importa, sino el tipo de ruido . El otro problema son los efectos no lineales, como INL, que arrojan el valor promedio

Primero en ruido:

Si tuviéramos que muestrear una distribución gaussiana, se vería así:

Lalínearojaestámáscercadeladistribucióntérmicareal(promediadaeneltiempo)yelhistogramaazulrepresentamuchasmuestrasdeADC.Situviéramosquemuestrearcontinuamenteestadistribución,obtendríamosmejoresestadísticasypodríamosencontrarelvalorpromedioolamediaconmayorprecisión(quesueleserloquebuscábamos,sí,medoycuentadequelasseñalessemueven,hayfiltradoyseñalaruido).Dependiendodelcontenidodelafrecuencia,soloconsideremoselcasodeDCdondelaseñalnoseestámoviendoporahora).

$$\mu=\frac{1}{n}\sum_{i=1}^{n}{x_i}$$

Elproblemaeselruidodeparpadeooelruidode1/f,cambialamediagaussianayhacequelasestadísticassedescomponganporqueladistribuciónyanoesgaussiana.

Esteesunmodelopobre,peropodríasconsiderarloconunaspectocomoesteINLtambiénesunproblemaporquepuedeintroduciralgunosbitsdeerrorquetambiénquitanlamedia.

$$\mu=\frac{1}{n}\sum_{i=1}^{n}{x_i}+error$$

Probablementeseaconfuso,veamoseldominiodetiempocomosemuestraacontinuación

Enlaimagensuperiorpuedeverunaseñalconruidogaussianoqueseríafácil"dibujar una línea" a través del medio y encontrar la media. Cuanta más muestra tenga de una señal como esta, mejor será la precisión y el conocimiento que tendrá de la media.

En la imagen inferior puede ver cómo se ve el ruido de parpadeo, el promedio no va a ayudar aquí.

El problema es que la mayoría de los dispositivos electrónicos tienen ruido de parpadeo, los resistores no (asumiendo que no hay influencia de la temperatura de la habitación) sino los transistores y los circuitos integrados. Hay amplificadores llamados amplificadores de corte que superan estos efectos.

Otra cosa que hay que saber es que hay ADC (lineal tiene un nuevo núcleo SAR) donde los ingenieros han trabajado para eliminar los efectos del ruido 1 / f (y otros efectos no lineales de ADC como INL) a un nivel mucho más bajo que el el valor del bit ADCs. Puede emplear un gran sobremuestreo y obtener valores de 32 bits de un núcleo de 14 bits.

Fuente: EDN- 1 / f Noise —La vela parpadeante

    
respondido por el laptop2d
6
  

Entonces lo que proponen para 'Disminución' es mover el punto decimal.

no exactamente. La parte de la reducción de la misma está argumentando que, correctamente en mi opinión, el "promedio" normal de múltiples muestras, pero que conserva el ancho de bits, no retiene tanta información. Entonces, si promedia las lecturas de ADC de n n bits, el promedio resultante sigue siendo una lectura de adc de n bits.

el enfoque propuesto es, por decirlo suavemente, promediar las lecturas de ADC de n bits para que el promedio resultante tenga un ancho de bits mayor. Por ejemplo, sumar 4 lecturas de anuncios de 10 bits y dividir la suma entre 2 produce una lectura de anuncios de 11 bits.

Pensé que siempre ha sido la forma en que se ha realizado el sobremuestreo profesionalmente. Este simple promedio de gente en la red se entiende como el enfoque equivocado.

el otro punto que para reducir el ruido, el sobremuestreo solo es efectivo si hay ruido es el correcto. Si tuviera un ADC de 10 bits diseñado por Dios (es decir, cada lectura es la lectura verdadera absoluta, sin variación), el muestreo excesivo no hubiera funcionado.

el circuito particular hacia el final del artículo sobre el uso de un pwm para agregar ruido es incorrecto: el pin que agrega ruido debe tener un capacitor de bloqueo de CC. y un punto menos importante es que no tiene que ser un pin PWM. Un pin GPIO normal funcionaría.

    
respondido por el dannyf
4

Primero, un ADC es tan bueno como su referencia de voltaje. Si su arduino utiliza el + 5V como referencia, puede olvidarse de cualquier tipo de precisión, ya que el regulador de + 5V es bastante ruidoso, con una precisión baja del 1 al 5%, y su voltaje de salida dependerá de la cantidad de corriente extraída de tanto en el momento de la medición como en los últimos milisegundos.

Por lo tanto, si necesita precisión o exactitud, seleccione una referencia de voltaje que coincida con sus requisitos. Si no necesita una precisión absoluta en el voltaje, será más económico, ya que solo necesitará que sea estable, en lugar de preciso y estable.

No he probado el ADC SAR dentro del arduino. Tengo experiencia con la de AT90PWM3B que es un pariente cercano. Es bastante bueno Con un voltaje de entrada constante, obtiene la misma lectura de ADC, una y otra vez, con 1 LSB fluctuando si el voltaje está entre los valores. No puedo esperar un mejor resultado de un ADC SAR. (Usé una referencia de voltaje externo de buena calidad)

Por lo tanto, el ruido no es un problema aquí ...

De hecho, el ruido es tu amigo ...

Supongamos que el voltaje que desea medir cae en el valor ADC 100.1

Hace 10 mediciones, pero como el ADC es bueno, ¡obtiene 100 cada vez!

Por lo tanto, necesita un poco de ruido en su señal, como un LSB de ruido, para asegurarse de que si mide 100.1, obtendrá 100 nueve de cada diez, y 101 una vez de cada diez. Entonces, ¿promediará a 100.1, captar la idea?

Si proviene de un sensor, generalmente tendrás suficiente ruido gratis.

    
respondido por el peufeu
4

Lo que te falta es el significado de "diezmado".

Estrictamente hablando, "diezmado" es reducción a 1/10. Es decir, de 10 reducir a 1.

"Decimación" como se usa en el muestreo pierde el significado estricto. En lugar de 1/10, significa "reducir en número".

Lo que esto significa es que promedias un cierto número de muestras y que reduzcas el número de muestras en el mismo número.

Como ejemplo, si muestrea a 1000Hz y promedia 4 muestras, solo mantiene el promedio. Al final, solo tienes 250 muestras por segundo en lugar de 1000. Has perdido la resolución de tiempo, pero obtuviste un bit de resolución de voltaje.

Por cada factor de 4, ganas 1 bit. Promedio y diezmar por 4, y pasar de resolución de 10 bits a 11 bits de resolución.

Otro factor de 4 (4 * 4 = 16 en total) le permite pasar de 10 a 12 bits. Otro factor de 4 te lleva a 13 bits de resolución.

Pero, tenga en cuenta que ahora está excediendo el muestreo por un factor de 64. Su tasa de muestreo efectiva disminuye por el mismo factor. Utilizando el ejemplo de la frecuencia de muestreo de 1000Hz, se reduce a aproximadamente 15 muestras efectivas por segundo.

Esto es diezmo, y es la cantidad de ADC de bits altos que obtienen su alta resolución. Muestrean a alta velocidad, promedian (o usan un filtro de paso bajo digital) y diezman.

En el extremo, tiene un ADC de un solo bit (un simple comparador) que sobreexplota varios millones de veces para obtener una profundidad de bit efectiva de 16 bits.

Una cosa que debe tener en cuenta para que esto funcione es que necesita ruido en su señal aproximadamente igual al valor más pequeño que puede medir su ADC. Para un ADC de 10 bits que utiliza un voltaje de referencia de 5 V, sería un ruido de aproximadamente 5 mV pico a pico.

Aumentar el ruido es de donde provienen las ganancias de bit. Imagine que tiene una señal (DC) que se encuentra exactamente entre el valor de 512 conteos de ADC y 513 conteos de ADC. Sin ruido, el valor medido siempre será el mismo: el promedio le dará el mismo valor que las muestras.

Agregue ruido en casi el valor medible más pequeño, y se ve muy diferente. Aunque la señal en sí no cambia, los valores medidos se "moverán" alrededor del verdadero valor de la señal. El promedio ahora es diferente al de las muestras, y cuantas más muestras utilice, más cerca estará del valor real de la señal

He usado esta técnica con un Arduino (que usa un procesador Atmel con un ADC de 10 bits) para obtener una mejor resolución para algunas mediciones que estaba realizando.

Lo conseguí hasta 13 bits, pero descubrí que necesitaba más. Podría haber optado por otro factor de 4, pero eso me habría llevado mucho tiempo para cada muestra y solo me habría conseguido un bit más.

Los experimentos con sobremuestreo mostraron que lo que estaba haciendo podía funcionar (obtuve resultados reconocibles pero ruidosos) sin tener que gastar tiempo y dinero para obtener un mejor ADC. Con la prueba de concepto, podría seguir adelante y mejorar ese ADC, y obtener esa prueba solo me costó unas pocas líneas de código y un poco de tiempo.

Encontré que necesitaba al menos 16 bits. Eso habría significado un promedio de 4096 muestras.
Eso es aproximadamente medio segundo usando el muestreo más rápido posible con el software Arduino.

Como necesitaba 14400 mediciones, la ejecución completa habría durado 2 horas.

No soy tan paciente, y las cosas que estaba midiendo no se mantendrían constantes por tanto tiempo. Tuve que cambiar a un ADC que usa una tasa de sobremuestreo mucho más alta internamente y que ofrece muestras de mayor resolución a una tasa más baja.

Al igual que con muchas otras cosas, la reducción es un compromiso que puede lograr un mejor rendimiento en una dirección (profundidad de bits) mientras que le cuesta el rendimiento en otra dirección (tasa de muestreo).     

respondido por el JRE
2

Así que puedes estudiar la teoría, pero puedo decirte que en la práctica solo importa un modelo simple. Puede promediar, siempre que su señal esté dentro de ruido. Entonces el promedio de componente de ruido se pondrá a cero, mientras que la señal permanecerá. De esta manera obtendrás resolución en gasto de ancho de banda.

Si, por ejemplo, tiene un adc de 16 bits y los últimos cuatro bits son ruidosos, puede filtrarlos y obtener la señal allí. Pero si solo tiene un poco de ruido, no hay mucho que promediar, por lo que no obtendrá mucha información nueva.

Si necesita una resolución realmente alta (y un ancho de banda bajo), vea cómo funciona el ADC sigma-delta. Tienen una señal de alta velocidad de 1 bit que luego se filtra a un ancho de banda con una resolución más alta, a veces de 20 bits y más.

    
respondido por el Gregory Kornblum
2
  

¿Por qué no puedes?     Puede , pero debe tener en cuenta todas las fuentes de error y ruido para asegurarse de que su plan funcione.

El promedio funciona para mejorar la resolución al reducir el error de desviación estándar, \ $ \ sigma \ $. El criterio a cumplir es que el ruido gaussiano solo debe exceder el error de cuantificación. La especificación que se definirá es el error total y hacer que el error o la resolución de cuantificación contribuyan solo a una cantidad menor del presupuesto de error total.

por ejemplo Si desea mejorar la resolución en 2 bits, pero su ruido ya era de 3 bits, debe considerar cómo reducir el ruido en 2 + 3 = 5 bits mientras aumenta la resolución al mismo tiempo en 2 bits.

  • Esta podría ser una solución digital con un promedio de > 25 muestras con el costo de latencia o una solución analógica mediante el filtrado de rechazo de ruido, equilibrando las señales para rechazar el ruido en modo común y / o protegiendo mejor la señal junto con el promedio digital. li>

Donde n es el (los) bit (s) extra de resolución deseado (s), a la derecha desplazando un número binario (o decimando) x1 es igual a / 2.

Para promediar significa que el \ $ \ sigma \ $ de ruido se reduce en \ $ \ sqrt x \ $ para x muestras, pero también que la latencia aumenta en x muestras de tiempo, por lo tanto, se necesita un exceso de muestreo para reducir la latencia.

  

Tenga en cuenta que el término "decimación" se aplica tanto a los valores decimales como a los números decimales codificados en binario. Puede visualizar si tiene un contador que lee valores enteros y luego, al promediar 10 resultados, divide por 10 para lograr una mejora con un lugar decimal adicional, pero el \ $ \ sigma \ $ de ruido solo se reduce en \ $ 1 / \ sqrt 10 = 1 / 3.3 \ $ para x muestras, pero también que la latencia aumenta en x muestras de tiempo, por lo tanto, se necesita un sobremuestreo para reducir la latencia,

\ $ f_ {oversampling} = 4 ^ nf_ {Nyquist} \ $

Sin embargo, el ruido a esa frecuencia de muestreo, \ $ f_s \ $ debe ser suficiente para interrumpir +/- 1 bit sobre algunas de las x muestras, para obtener la mejor mejora en la resolución.

  • Por ejemplo, si el BW es 10kHz, entonces \ $ f_ {Nyquist} = ~ \ $ 20kHz
  • y si desea convertir una resolución de 10 bits a 12 bits, entonces n = 2 El aumento de la resolución de 10 bits a 12 bits requiere la suma de 16 valores de 10 bits. Una suma de 16 valores de 10 bits genera un resultado de 14 bits donde no se espera que los dos últimos bits contengan información valiosa.

Un error de cuantificación demasiado elevado o demasiado ruido aleatorio requerirán más promedios para reducir el error y más promedios aumentan la latencia del resultado.

Para optimizar un ADC para velocidad y error, uno debe definir el presupuesto total de error y la resolución disponible (bits), SNR deseada o error absoluto para cualquier señal dada dentro del rango de medición completo. La definición de todas las fuentes de error al principio puede parecer difícil, pero necesaria, incluyendo:

por ejemplo error de ganancia, error de compensación, error de cuantificación, error de ruido de CM, error de ruido de DM, ruido de Vref o error de compensación, ruido ambiental, etc., error de latencia (de promediado)

Luego, determine cuántos bits más de resolución necesita para alcanzar el presupuesto de error de diseño anterior después de que se hayan minimizado todas las demás fuentes de error.

Lo mismo se aplica al promedio (para señales lentas) y al sobremuestreo del ancho de banda de la señal y al diezmar para ADC en tiempo real.

Esto no corregirá los errores de ganancia o compensación y, si no hay suficiente ruido aleatorio, se debe agregar ruido para interrumpir la señal. Idealmente, todas las demás fuentes de ruido y error no exceden de 1 bit, de modo que la desviación estándar o la interpolación es solo un valor de +/- 1 sobre el número de muestras. Sin embargo, debe haber suficiente ruido para que no se obtenga la misma lectura mediante muestras sucesivas en ambos métodos.

    
respondido por el Tony EE rocketscientist
1

La teoría subyacente se puede tomar, en forma breve, de esta oración en el artículo de Wikipedia sobre el muestreo excesivo :

  

Sin embargo, la SNR aumenta en sqrt (N) (...). Resumiendo sin correlación   el ruido aumenta su amplitud en sqrt (N), mientras que resume un coherente   la señal aumenta su promedio en N. Como resultado, la SNR (o   señal / ruido) aumenta por sqrt (N). En el ejemplo, eso significa que mientras   con N = 256 hay un aumento en el rango dinámico en 8 bits, y el   el contenido de la "señal coherente" aumenta en N, pero el ruido cambia en   un factor de sqrt (N) = sqrt (256) = 16 en el ejemplo (no debe confundirse   con un aumento de 16 bits), por lo que la SNR cambia en un factor de 16.

Por lo tanto, siempre que su señal coincida con ciertos criterios (como ser lo suficientemente lento y tener poco ruido), realmente aumenta un bit por cada 4 muestras. Luego, por cada 4 muestras resultantes, puede obtener "unirse" y luego formar otra muestra de mayor resolución, de manera que al final obtenga log_4 (n) bits por cada n muestras que lea en su ADC.

En cuanto a la parte de la reducción, no es realmente un promedio, especialmente si se tiene en cuenta que estamos hablando de enteros aquí (ejemplos de ADC). Por ejemplo, si tiene muestras 1 , 1 , 3 y 2 , su promedio sería:

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

Ya que estás promediando con números enteros, tu "resultado matemático" de 1.75 se redondeará a 1. Si luego multiplicas por 2, obtendrás 2 .

Ahora, si lo diezman con:

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

Tu resultado será 3 . Puede argumentar que esto es lo mismo que dividir por 2, pero seguramente no puede argumentar que 3 es el promedio de 1, 1, 3 y 2 . ¿Ves la diferencia?

Ahora puedes estar tentado a sumar todo y no descartar el último bit. Pero recuerda que este bit es ruido: realmente no puedes usarlo.

    
respondido por el Ronan Paixão
1

Parece que todos ya cubrieron la parte teórica de tu pregunta, pero como estás usando un Arduino, es posible que desees leer mis aventuras que intentan aumentar la resolución del ADC con esta técnica:

Mejorando la resolución de Arduino ADC con Dithering & Sobremuestreo

El carácter del ruido es una parte crítica de la historia, y resulta que puede generar una interpolación razonablemente buena simplemente pulsando un pin con una resistencia mientras lee el ADC de forma asíncrona. No es perfecto, y obtiene un pequeño desplazamiento de sincronía que varía según la cantidad de muestras / bits adicionales que esté intentando obtener. También aceptaría la crítica de que esta técnica depende de la mala estabilización del riel en el Arduino, por lo que realmente está diseñando una falla, en lugar de seguir una buena práctica. Pero es muy fácil de hacer.

    
respondido por el Ed Mallon

Lea otras preguntas en las etiquetas

Comentarios Recientes

Otra propiedad opcional es la resolución máxima, el tamaño máximo de archivo para una foto que se toma en una tarjeta SD. Antes de importar y cargar, active Tamaño máximo. Agregue esto a su anotación para que sus fotos utilicen tanto espacio de almacenamiento como desee. No coloque más de unas pocas fotos en un solo lote en Photoshop, ya que la carga de mjpg no se recomienda para la mayoría de los AD. Paso 2: cambie el tamaño de la imagen de diferentes maneras Lo que es realmente difícil es editar sus muestras... Lees verder