Mejora de PWM mediante el uso de comparación con LFSR en lugar de contador

PWM es una técnica muy poderosa para simular una salida analógica de un microcontrolador, lógica programable o cualquier otro entorno digital. Esto se puede utilizar para controlar LED, motores y altavoces, etc... sin necesidad de un componente DAC externo (en algunos casos es necesario un filtro de paso bajo).

Un PWM generalmente se hace usando un contador y un comparador. El contador cuenta y avanza constantemente, y cuando está por encima de un valor de umbral (el % deseado de voltaje de salida), entonces se envía una lógica '1', cuando está por debajo de una lógica '0'.

El principal problema de PWM es que existe una compensación entre precisión y frecuencia: si se necesita un bit más para la precisión, significa que el contador tardará el doble antes de volver a rodar y, como tal, las frecuencias parásitas que tendrán que ser filtrados son más bajos en el espectro, por lo tanto, más cerca de la señal y más difíciles de filtrar.

Por estas razones, PWM no es aplicable para señales que deberían

  1. Tener altas frecuencias analógicas
  2. Necesita demasiados bits en el DAC

Mi idea es simple, en lugar de usar un contador de N bits, uso un generador de números aleatorios, hecho tomando los N bits altos (¿o bajos?) de un LFSR de M bits (por ejemplo, use los 8 bits más bajos de un LFSR de 16 bits). LFSR). De esa manera, en lugar de generar una onda cuadrada con un ancho de pulso variable, generamos un vapor de pulsos aleatorios.

La probabilidad de que un pulso sea '1' es igual a la relación entre el voltaje de salida deseado y el voltaje de salida máximo. Como tal, el resultado es exactamente el mismo que PWM, excepto que las frecuencias parásitas ahora son aleatorias y son mucho más fáciles de filtrar. Ahora es posible agregar tantos bits como sea necesario para el ADC, y esto no causará ningún problema.

Por ejemplo, es posible y realmente muy simple tener una salida de audio de 16 bits con un reloj de 1 MHz. Con PWM tradicional, esto nunca hubiera sido posible: solo una señal de audio de 5 bits habría sido posible sin una pelusa de audio audible.

esto funcionara? Dado que esta idea es tan simple y mejora tanto la técnica PWM, ¿por qué no se menciona en ninguna parte?

Las "frecuencias aleatorias" no serán más fáciles de filtrar. Serán más difíciles. Con PWM, conoce la frecuencia de antemano y puede construir su filtro de paso bajo de manera adecuada. Con su modulación aleatoria, parte de la aleatoriedad caerá en el rango de frecuencias que está tratando de generar; no podrá eliminarlas.
El punto es que habrá algo de ruido blanco en todas las frecuencias, en lugar de ser parásitos fuertes en algunas frecuencias. Al menos en el caso del audio, probablemente sonará "mejor".
Sin embargo, estaría interesado en los resultados si intentara simularlo. Tal vez tenga algún uso en casos especiales, y tal vez haya algo que haya supervisado que lo haga útil en el caso general. Sin embargo, probablemente no sea útil en general, de lo contrario, alguien más ya lo habría hecho. Hay mucha gente inteligente por ahí, y seguramente alguien estaría haciendo esto si presentara alguna ventaja.
¿Realmente quieres ruido blanco en tu audio? Eso es como estática en una radio FM.
@JRE Idealmente no, por supuesto. Pero supongo que el ruido blanco silencioso suena mejor que el ruido que obtenemos cuando soltamos los bits menos significativos.
En una estimación rápida, calculo que el uso de modulación aleatoria de 1MHz para generar una señal de audio de 44100Hz de ancho de banda terminaría con un ruido blanco de alrededor de -14dB. Esa sería una relación señal a ruido muy triste.
Me interesa cómo hiciste esa estimación rápida. También es un ancho de banda típico de 22050 Hz, 44100 Hz es la tasa de muestreo típica.
Suponiendo un verdadero ruido blanco, la modulación aleatoria incluirá frecuencias distribuidas uniformemente desde casi cero hasta su frecuencia de muestreo. 44100Hz/1MHz es 4.41 por ciento o alrededor de -14dB. Cambiar a 22050 mejora eso en 3dB a -17dB.
¿Has estudiado modulación delta-sigma? Superará a PWM en una frecuencia dada, y es muy simple de implementar.
@ uint128_t ¿Muy simple? Me he perdido sistemáticamente en cada intento de tratar de entender el concepto. Pero aparentemente hay un bucle de regulación con retroalimentación, que siempre es un concepto avanzado/problemático y una fuente de errores/inestabilidad. También parece que se necesita un comparador analógico para implementar la versión DAC de sigma-delta, y esto generalmente no está disponible en placas de microcontroladores sin hardware externo adicional.
Bueno, comprender el comportamiento de un DAC DS de orden superior es complicado, pero implementar un DAC DS de primer orden es muy fácil con un FPGA y no mucho más difícil con un MCU. Solo necesita un comparador analógico para ADC, todo lo que se necesita para un DAC es un filtro, que puede ser un RC LPF pasivo. Ver aquí _
Solo por el gusto de hacerlo, generé una señal de ruido blanco a -4.5dB (lo mejor que podía manejar el software) con una frecuencia de muestreo de 1MHz, luego la filtré y la convertí a una frecuencia de muestreo de 44100Hz. El nivel bajó a -18.5dB, que es un cambio de -14 dB. Entonces, más o menos lo que obtuve de una estimación rápida.

Respuestas (5)

Pensé en resumir mis comentarios en una respuesta, tal vez sea de alguna utilidad para alguien.

  1. El uso de ruido blanco hará que sea más difícil eliminar la señal de modulación que más fácil. En el caso de una señal PWM normal, necesita un paso bajo y listo. Cuando utilice ruido blanco para hacer la modulación, provocará ruido en el mismo rango de frecuencia que la señal que está tratando de crear. Esto no se puede quitar fácilmente.
  2. El ruido que quede en la señal generada estará unos 14 dB por debajo del nivel del ruido blanco que usó como señal moduladora. Suponiendo un ruido blanco verdadero de hasta 1MHz como en su ejemplo, entonces la cantidad de ruido que queda es una proporción simple. 44100Hz/1MHz da 4.41 por ciento o alrededor de -14dB.
  3. Verifiqué mi estimación anterior generando una señal de ruido blanco con una frecuencia de muestreo de 1 MHz, luego filtré y remuestreé hasta 44100 Hz. La señal resultante fue de hecho 14dB por debajo de la señal de ruido blanco original.
  4. Curiosamente, 14 dB también se trata del rango dinámico del muestreo de 5 bits a 1 MHz mencionado en la pregunta. Entonces, realmente no ganas nada en el departamento de señal a ruido. Intercambia audio cuantificado de 5 bits que es al menos silencioso cuando no hay señal para obtener una señal que está cuantificada a una profundidad de bits mucho más alta pero tiene un ruido blanco constante a -14dB, incluso cuando no hay señal real presente.

Entonces, la idea funciona y no funciona.

Como esperaba, puede usar la modulación de ruido para obtener una mejor profundidad de bits y tener menos errores de cuantificación al distribuir la señal de modulación en todo el ancho de banda.

Eso tiene el costo de no poder eliminar el ruido de modulación de la señal de salida generada para que termine con la misma relación señal/ruido.

Todo lo que ha hecho es cambiar la causa de la mala relación señal/ruido.

Todavía creo que la relación debería ser de unos -17 dB, ya que se filtraría después de los 20 000 Hz, pero en cualquier caso sigue siendo demasiado ruido para ser aceptable.

Una mejora sin duda. Pero no lo mejora hasta el punto de que no hay señales a una frecuencia de f_clock/resolución, siguen presentes, reducidas en el primer orden de la relación de frecuencias. Si la pequeña mejora es adecuada para su aplicación, hágalo. Para una aplicación de audio típica, la mejora no sería suficiente, ni lo sería para generar señales de calibración de CC, por ejemplo.

Puede lograr una mejor supresión de las frecuencias f_clock/resolution mediante una de dos técnicas.

N fraccionario sigma delta en forma de ruido . Hay mucho material publicado sobre este tema, mucho de él bastante opaco. No voy a hacer una revisión de la literatura aquí. En este método todavía hay señales en fclk/resolución, pero son suprimidas por el orden n de la relación para un modulador de orden n.

Síntesis del teorema del resto chino. Esto utiliza dos (o más) PWM convencionales en paralelo, cada uno con un acumulador más corto. Los dos contadores tienen la forma MN y MP, donde M, N y P son primos entre sí, y M es un poco más que el número de PWM, digamos 5 para dos PWM. Si N=63 y P=64, entonces la tasa de repetición más baja es 1/320 de fclock (1/5x64), pero la resolución que se puede lograr es 1/16128 (el 63 y el 64 trabajan juntos para crear 1/4032, y hay una adición de 1/4 de 1/(M-1)). En este método, realmente no hay señales en fclk/resolución. El método está limitado por la monotonicidad por el grado de balance analógico que se puede obtener, pero esta igualdad debería ser más fácil de lograr que la relación entre un PWM más significativo y menos significativo, si intenta combinar dos de esa manera. ¿Por qué se llama Síntesis del Teorema del Resto Chino? Eso'

El problema es que aún tendrá bajas frecuencias en la salida. Peor aún, no existe un límite inferior en el contenido de frecuencia incluso si la señal prevista es estable. Al menos con PWM sabes que todo el ruido estará en la frecuencia PWM y sus armónicos.

Básicamente, está intercambiando ruido en frecuencias conocidas con ruido de amplio espectro. En algunos casos, eso podría ser una compensación deseable. En otros casos, esto es peor porque ahora ya no se puede separar el ruido de la señal por frecuencia.

Otra idea común en esta línea es usar un motor DIV o algo así como un algoritmo de Bresenham. Realiza un seguimiento del error acumulado y hace que la salida sea alta cuando el error es negativo y baja cuando el error es positivo.

Luego puede jugar con diferentes estrategias de cómo se acumula cada porción de salida con el tiempo en el error. Si solo se agrega sin decaer, entonces tiene un motor DIV puro o un algoritmo de Bresenham. Esto puede producir frecuencias infinitamente bajas, pero el promedio a largo plazo está dentro de ± un segmento alto o bajo. Con diferentes decaimientos, puede hacer que emita menos frecuencias más bajas a expensas de la precisión a largo plazo.

Sin embargo, en ningún caso estos métodos tienen un límite garantizado más alto en la frecuencia de ruido que el que tiene PWM a la misma frecuencia de corte y precisión final resultante.

En realidad, el límite inferior de la frecuencia se genera por el hecho de que el generador de ruido LFSR finalmente se repetirá. (Después de 2 ^ N ciclos) Pero sí, aparte de eso, tienes toda la razón.
@Breg: Sí, eso es cierto para la técnica digital que describiste. Estaba generalizando a verdaderos números aleatorios.

Esta usado.

Creo que ha descrito el generador PWM de "secuencia pseudoaleatoria" (PRS).

Se describe en la nota de aplicación de Cypress Semiconductor "AN2246: PSoC® 1 – PWM Source – High Frequency, High Resolution" en el documento "AN2246_001-33721_0C_V" que puede descargar de Cypress Semi en el documento:
AN2246_001-33721_0C_V.pdf

Esa nota de aplicación también describe varias alternativas.

Eso usa números pseudoaleatorios para mejorar la precisión, pero lo hace en combinación con un esquema PWM. La combinación evita generar pulsos por debajo de una frecuencia mínima, por lo que el filtrado sigue siendo bastante sencillo.

Un modulador Delta-Sigma de orden simple o doble (también conocido como MOD1 y MOD2) hacen un trabajo aún mejor al aprovechar el ancho de banda, el ruido y la resolución, y son incluso más simples de implementar. Y se utilizan mucho en varios dominios.

Cuando desee obtener más información sobre los convertidores Delta-Sigma, le recomiendo: "Understanding Delta-Sigma Data Converters" de Schreier y Temes (ISBN 0-471-46585-2).