¿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 Arduino ADC pero realmente no puedo entender la teoría detrás de esto. Una nota de solicitud de Atmel a menudo citada ( http://www.atmel.com/Images/doc8003.pdf ) 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 el sobremuestreo, que aumenta la resolución

Entonces, lo que proponen para 'Decimación' es mover el punto decimal. Lo que equivale a reducir a la mitad la lectura binaria para cada lugar donde la mueva, por lo que también podría dividir el valor de la base 10 por 2, 4 u 8 o lo que tenga. ¿Estoy entendiendo mal la decimación?

Plumpie
fuente
"Combinado con sobremuestreo, lo que aumenta la resolución". Creo que dicen que para tener más resolución hay que tomar más muestras. (A diferencia de qué, no lo sé. ¿Tal vez piensan que alguien será lo suficientemente tonto como para promediar la misma muestra una y otra vez?)
user253751
En el área de DSP (Procesamiento de señal digital), el término "diezmado" significa un algoritmo regular de eliminación (caída) de muestras si no cambian mucho (cuando se sobremuestrea muy por encima del límite de Nyquist de la señal, o después de un filtro de suavizado). El término proviene de una práctica en la antigua Roma (?) Para matar a cada tercer soldado en un regimiento que fracasó en un campo de batalla.
Ale..chenski
Y no veo dónde el artículo de Atmel sugiere mover puntos decimales, aunque podría ser parte del algoritmo de promedio.
Ale..chenski

Respuestas:

7

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

Quizás lo que realmente significan es el punto de que si desea obtener más resolución, no puede dividir / cambiar el número a la misma escala que una sola muestra porque (en aritmética de enteros) arrojaría los bits que 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 que pensé de su pregunta fue el hecho de que para realizar un sobremuestreo correcto, debe usar un filtro de paso bajo efectivo, y un promedio móvil directo no es tan bueno para ser un filtro de paso bajo como un FIR diseñado adecuadamente (o IIR) filtro, pero eso no parece ser compatible con el texto de la nota.

Kevin Reid
fuente
Un filtro de paso bajo o un filtro de promedio móvil no filtrará el ruido 1 / f, que es la razón principal por la cual los bits más bajos son ruidosos, si los filtros lo hicieran, estaría sin trabajo
Pico de voltaje
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ía (o debería) 45. Si le pide que la mida nuevamente, responderá 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 muestree la entrada, uno terminará con un valor de 45. El promedio de todas esas lecturas sería, por supuesto, 45 (aunque el tablero tenga 45,2 cm de largo).

Si la persona ajustó el aparato de medición para leer 0,45 cm de largo antes de la primera medición, 0,35 cm de largo antes del segundo, 0,05 cm de largo antes del quinto, 0,05 cm antes del sexto, etc. hasta 0,45 cm poco antes el décimo, luego dos de las mediciones leerían 46 y las otras ocho leerían 45. El promedio de todas ellas sería 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 en algún lugar entre 0.5 cm de largo y 0.5 cm de corto, entonces aproximadamente 1/5 de las mediciones 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 bastante significativa de precisión, pero un promedio de aproximadamente 100 sí lo haría.

No estoy seguro de entender bien la justificación del documento para la distinción entre el promedio y el desplazamiento correcto. Uno debe tener en cuenta que la precisión aparente lograda por el promedio puede exceder el nivel significativo de precisión, pero desde mi experiencia, la cuestión de cuándo y cuánto desplazar a la derecha debe estar impulsada por los límites del rango numérico del procesador. Trabajar con números que se amplíen tanto como sea posible sin causar un desbordamiento generalmente minimizará los efectos de los errores de redondeo, siempre que no se atribuya una importancia excesiva a pequeñas cantidades de ruido.

Por cierto, en el uso original, "diezmar" un ejército era matar a 1/10 de los soldados en él. Diezmar los datos de un ADC es descartar parte de él. El prefijo común con la frase "punto decimal" no implica una asociación.

Super gato
fuente
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 probar una distribución gaussiana se vería así:

ingrese la descripción de la imagen aquí

La línea roja está más cerca de la distribución térmica real (promediada en el tiempo) y el histograma azul representa muchas muestras de ADC. Si tomáramos una muestra continua de esta distribución, obtendríamos mejores estadísticas y podríamos encontrar el valor promedio o la media con mayor precisión (que generalmente es lo que estaba después, sí, me doy cuenta de que las señales se mueven, hay filtrado y señal de ruido dependiendo del contenido de frecuencia, pero consideremos el caso de CC donde la señal no se mueve por ahora).

μ=1norteyo=1norteXyo

El problema es el ruido de parpadeo o el ruido 1 / f, desplaza la media gaussiana y hace que las estadísticas se rompan, porque la distribución ya no es gaussiana.

Este es un modelo pobre, pero podría considerar que verse así, INL también es un problema porque puede introducir algunos bits de error que también desvían la media.

μ=1norteyo=1norteXyo+mirror

Eso es probablemente confuso, veamos el dominio del tiempo como se muestra a continuación

En la imagen superior puede ver una señal con ruido gaussiano, sería fácil "dibujar una línea" en el medio y encontrar la media. Cuanta más muestra tenga de una señal como esta, mejor precisión y conocimiento 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 componentes electrónicos tienen ruido de parpadeo, las resistencias no (suponiendo que no haya influencia de la temperatura ambiente), pero los transistores y los circuitos integrados sí. Hay amplificadores llamados amplificadores de corte que superan estos efectos.

Otra cosa que debe 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 bit ADC valor. Puede emplear sobremuestreo pesado y obtener valores de 32 bits de un núcleo de 14 bits.

Fuente: EDN- 1 / f Ruido: la vela parpadeante ingrese la descripción de la imagen aquí

Pico de voltaje
fuente
Muy interesante, pero no creo que la nota de la aplicación se refiriera al ruido del parpadeo
Plumpie
Todos los buenos puntos; un filtro de promedio simple es un SINC (todos los coeficientes son iguales) pero nunca puede converger por completo (cita más adelante, usando el teléfono en este momento).
Peter Smith
6

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

no exactamente. la parte de diezmado argumenta que, correctamente desde mi punto de vista, que el "promedio" normal de múltiples muestras, pero conservando el ancho de bits, no retiene tanta información. Entonces, si promedia las lecturas de ADC de n bits, el promedio resultante sigue siendo una lectura de ADC de n bits.

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

Pensé que esa era siempre la forma en que el sobremuestreo se hacía profesionalmente. Este simple promedio de personas en la red se entiende ampliamente como el enfoque equivocado.

El otro punto es 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 sobremuestreo no hubiera funcionado.

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

dannyf
fuente
> Este simple promedio de personas en la red se entiende ampliamente como el enfoque equivocado. no si los promedias como carrozas
Plumpie
4

Primero, un ADC es tan bueno como su referencia de voltaje. Si su arduino usa el + 5V como referencia, puede olvidarse de cualquier tipo de precisión, ya que el regulador de + 5V es bastante ruidoso, baja precisión como 1-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.

Entonces, si necesita precisión o precisión, seleccione una referencia de voltaje que coincida con sus requisitos. Si no necesita una precisión absoluta en el voltaje, será más barato, ya que solo necesitará que sea estable, en lugar de precisa y estable.

No he probado el SAR ADC dentro del arduino. Tengo experiencia con el 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 fluctuante si el voltaje está entre valores. No puedo esperar un mejor resultado de un ADC SAR. (Utilicé una referencia de voltaje externo de buena calidad)

Entonces, 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 veces de cada diez y 101 una vez de cada diez. Entonces tendrá un promedio de 100.1, ¿entiendes?

Si proviene de un sensor, generalmente tendrá suficiente ruido de forma gratuita.

Peufeu
fuente
Buenos puntos sobre todas las formas en que estoy perdiendo precisión y precisión con mi método actual. Tengo un tl431 (derivación ajustable de precisión) por ahí e intentaré conectarlo.
Plumpie
Los reguladores de voltaje lineal tienen tiempos de respuesta en el rango de MHz y, por lo tanto, son bastante estables en el rango de frecuencia del ADC.
JimmyB
Entonces es posible que solo desee medir los voltajes en relación con el mismo Vcc (potenciómetro, sensores de tipo divisor de voltaje).
JimmyB
¿LDO con respuesta "En el rango de MHz"? Envíe las hojas de datos hombre, me gustaría conocer a uno! Lo más probable es que el arduino venga con un horrible 1117 o similar, que tiene una respuesta transitoria lenta para perros ... El uso del suministro como referencia no está destinado a la precisión de todos modos.
peufeu
4

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

Estrictamente hablando, "diezmar" es reducir 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 promedia un número de muestras y reduce el número de muestras en el mismo número.

Como ejemplo, si muestreas a 1000Hz y promedia 4 muestras, solo mantienes el promedio. Al final, solo tiene 250 muestras por segundo en lugar de 1000. Ha perdido resolución de tiempo, pero ganó un poco de resolución de voltaje.

Por cada factor de 4, gana 1 bit. Promedie y diezme en 4, y pase de una resolución de 10 bits a una resolución de 11 bits.

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

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

Esto es diezmado, y es cuántos ADC de bit alto obtienen su alta resolución. Muestran a una velocidad alta, promedio (o usan un filtro digital de paso bajo) y diezman.

En el extremo, tiene un ADC de un solo bit (un comparador simple) que sobremuestrea varios millones de veces para obtener una profundidad de bits 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 usa un voltaje de referencia de 5 V, eso sería un ruido de aproximadamente 5 mV pico a pico.

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

Agregue ruido casi al 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 valor verdadero de la señal. El promedio ahora es diferente al de las muestras, y cuantas más muestras use, más se acercará al 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 haciendo.

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

Los experimentos con sobremuestreo mostraron que lo que estaba haciendo podrí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 obtener ese mejor ADC, y obtener esa prueba solo me costó unas pocas líneas de código y un poco de tiempo.

Descubrí que necesitaba al menos 16 bits. Eso habría significado promediar 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 hubiera tomado 2 horas.

No soy tan paciente, y las cosas que estaba midiendo no se mantendrían constantes durante tanto tiempo. Tuve que cambiar a usar 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 cosas, la aniquilación es un compromiso que puede brindarle un mejor rendimiento en una dirección (profundidad de bits) mientras le cuesta el rendimiento en otra dirección (frecuencia de muestreo).

JRE
fuente
3
Como te tomas el tiempo para analizar qué significa la aniquilación : estrictamente significa reducción en 1/10, manteniendo 9/10 de los elementos.
tubería
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 la señal esté dentro del ruido. Entonces el componente de ruido promedio se pondrá a cero, mientras que la señal permanecerá. De esta forma obtendrá una resolución a expensas del ancho de banda.

Si tiene, por ejemplo, un adc de 16 bits y sus últimos cuatro bits son ruidosos, puede filtrarlos y obtener la señal allí. Pero si solo tiene un poco de ruido, no hay mucho para 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.

Gregory Kornblum
fuente
2

¿Por qué no puedes? Puede hacerlo, pero debe considerar 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, σ. El criterio a cumplir es que el ruido gaussiano debe superar el error de cuantificación. La especificación a definir es el error total y hacer que el error de cuantificación o la resolución contribuyan solo con una pequeña cantidad 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 de modo común y / o protegiendo mejor la señal junto con el promedio digital.

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

Para promediar significa σ de ruido se reduce por X 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.

Tenga en cuenta que el término "diezmado" se aplica tanto a valores decimales como a números decimales codificados en binario. Puede visualizar si tiene un contador que lee valores enteros y luego promediando 10 resultados, divide entre 10 para lograr una mejora con un decimal adicional pero el σ de ruido solo se reduce por 1/ /10 0=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,

Fovmirsunametropagslyonortesol=4 4norteFnorteyqtuyost

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

  • Por ejemplo, si el BW es de 10 kHz, entonces Fnorteyqtuyost= 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 en el que no se espera que los últimos dos bits contengan información valiosa.

Demasiado error de cuantificación 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, se debe definir el presupuesto de error total y la resolución disponible (bits), la SNR deseada o el error absoluto para cualquier señal dentro del rango de medición completo. Definir todas las fuentes de error al principio puede parecer difícil, pero necesario, incluso;

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

Luego determine cuántos bits más de resolución necesita para lograr el presupuesto de error de diseño anterior una vez 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 diezmado para ADC en tiempo real.

Esto no corregirá los errores de ganancia o compensación y si hay ruido aleatorio insuficiente, entonces se debe agregar ruido para oscurecer la señal. Idealmente, todas las demás fuentes de ruido y error no superan 1 bit, de modo que la desviación estándar o el dither sea solo +/- 1 valor 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.

Tony Stewart Sunnyskyguy EE75
fuente
1

La teoría detrás de esto se puede tomar, en forma breve, de esta oración en el artículo de Wikipedia sobre sobremuestreo :

Sin embargo, la SNR aumenta en sqrt (N) (...). La suma del ruido no correlacionado aumenta su amplitud en sqrt (N), mientras que la suma de una señal coherente aumenta su promedio en N. Como resultado, la SNR (o señal / ruido) aumenta en sqrt (N). En el ejemplo, eso significa que mientras que con N = 256 hay un aumento en el rango dinámico de 8 bits, y el contenido de "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), en realidad aumenta un bit por cada 4 muestras. Luego, por cada 4 muestras resultantes, puede "unirse" nuevamente para formar otra muestra de mayor resolución, de modo que al final obtenga bits log_4 (n) por cada n muestras que lea en su ADC.

En cuanto a la parte de diezmado, en realidad no es un promedio, especialmente si tienes en cuenta que estamos hablando de enteros aquí (muestras de ADC). Por ejemplo, si usted tiene muestras 1, 1, 3y 2, el promedio sería:

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

Como estás promediando con matemáticas enteras, tu "resultado matemático" de 1.75 se redondeará a 1. Si luego multiplicas por 2, obtendrás 2.

Ahora, si lo diezmas con:

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

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

Ahora puede tener la tentación de sumar todo y no descartar el último bit. Pero recuerda que este bit es ruido: realmente no puedes usarlo.

Ronan Paixão
fuente
Siento que si la amplitud del ruido aumenta con sqrt (N) y la señal coherente aumenta con N, entonces la SNR tendrá que aumentar con N / sqrt (N) y no sqrt (N)
Plumpie
Compruebe su @Plumpie matemáticas de nuevo: N/sqrt(N) = sqrt(N).
Ronan Paixão
1

Parece que todo el mundo ya ha cubierto la parte teórica de su pregunta, pero dado que está utilizando un Arduino, es posible que desee leer mis aventuras tratando de aumentar la resolución del ADC con esta técnica:

Mejora de la resolución ADC de Arduino con tramado y sobremuestreo

El personaje del ruido es una parte crítica de la historia, y resulta que puedes generar un tramado razonablemente bueno simplemente pulsando un pin con una resistencia mientras lees el ADC de forma asincrónica. No es perfecto, y obtienes un pequeño desplazamiento de sincronía que varía dependiendo de cuántas muestras / bits adicionales estés tratando de lograr. También acepto la crítica de que esta técnica depende de la pobre estabilización ferroviaria en el Arduino, por lo que realmente está diseñando para un defecto, en lugar de seguir una buena práctica. Pero es muy fácil de hacer.

Ed Mallon
fuente