¿Cuál podría ser la fuente de esta distorsión de onda sinusoidal, visible como líneas igualmente espaciadas en FFT?

Tengo una MCU que controla un DAC de 16 bits a través de SPI (y una salida LDAC adicional, que activa la actualización de la salida DAC). La MCU tiene una onda sinusoidal de 1120 Hz precalculada en un búfer largo de 364 bytes (todos los cálculos en float32, redondeados a uint16 para la salida DAC), muestreada a 29120 Hz. En una interrupción del temporizador, la actualización del DAC se activa a través de LDAC y luego se carga un nuevo valor desde el búfer y se envía a través de SPI. La actualización al último valor se activa al principio para reducir la fluctuación debido a las carreras de acceso a la memoria contra DMA. La interrupción tiene una prioridad lo suficientemente alta como para no retrasarse.

Aunque visualmente el seno se ve bien , la FFT de mi Rigol DS1054Z detrás del DAC (antes del filtro de reconstrucción) muestra una distorsión significativa:Espectro de señal distorsionada detrás de DAC

El pico más alto es el requerido de 1120 Hz, otros están igualmente espaciados por 260 Hz. ¡El pico derecho parece estar solo 5dB por debajo del principal!

El jitter en el pin LDAC es del orden de +/- 0.25us, lo que consideraría aceptable frente a 34.3us de tiempo de muestra. El temporizador en sí se ejecuta desde el cristal de MCU y debería ser lo suficientemente estable.

¿Qué tipo de problema conduciría a tal patrón de distorsión? ¿Cuáles podrían ser las formas de diagnosticarlo y reducirlo?

Por si acaso, el DAC es un AD5686, la referencia de escala completa es de 5 V, la amplitud sinusoidal es de 25 mV, lo que da como resultado que aproximadamente los 10 bits inferiores se "conmuten".

El 1,5 % de fluctuación de pico a pico es bastante.
29120/260 = exactamente 112, ¿es incorrecto uno de sus valores de onda sinusoidal?
Además, si su tabla de senos está en 364 bytes, deberá muestrear esto a 407,680 veces por segundo para dar 1120 Hz a menos que tenga 14 ciclos almacenados en la tabla. Pero, ¿por qué almacenar 14 ciclos sinusoidales?
los subarmónicos gritan que su tasa de muestreo no es constante, o que su búsqueda en la tabla tiene un problema de desbordamiento sistemático. Reemplace su onda sinusoidal con (digamos) 32 ciclos de onda cuadrada y repita como un experimento. O quédese con la LUT de onda sinusoidal y codifique la búsqueda para simplemente incrementarla en una ubicación cada vez. A ver si alguno de ellos te da pistas de lo que está pasando. Alternar solo los 10 bits más bajos del DAC no debería ser un problema en este nivel, pero si tiene bits intercambiados, exacerbará el efecto. Intente cambiar la amplitud a escala completa para obtener más pistas.
@Andyaka El búfer está diseñado para una señal más compleja, la onda sinusoidal es solo un caso. Jugando como sugirió el usuario 44635, informaré si encuentro alguna pista ...
@ user44635 Esperaría que la onda sinusoidal tuviera saltos visibles si solo fuera un problema de indexación/búsqueda. Me pregunto si el cálculo de la LUT basado en float32 y el siguiente redondeo podrían introducir una distorsión tan significativa...
ah Me acabo de dar cuenta de que dices que estás analizando la señal aguas arriba del filtro de reconstrucción. Con solo 26 muestras por ciclo de su señal de 1120 Hz, ¿por qué espera algo diferente? ¿Cómo se ve a la salida del filtro?
@DaveTweed Esperaría ver solo espejos de mi espectro por encima de la frecuencia niquist del DAC (a menos que, por supuesto, la frecuencia de muestreo del alcance sea demasiado pequeña). No se ve muy diferente después del filtro. Sin embargo, vea mi auto-respuesta a continuación para los detalles desafortunados =(
¡Tu imagen de avatar me molesta!

Respuestas (1)

Conecté un generador de señal de laboratorio a la entrada del osciloscopio para compararlo con la señal medida y, sorprendentemente, vi exactamente el mismo espectro en su FFT. Subiendo la frecuencia, los subarmónicos desaparecieron a 1250 Hz. Cambiar la profundidad de la memoria en la configuración "Adquirir" de Auto a 6K eliminó el efecto. Parece que se está produciendo algún tipo de problema de aliasing en la FFT del DS1054Z.

===

EDITAR: si observa detenidamente la imagen, verá una frecuencia de muestreo de 5 kHz en la ventana FFT. Hubiera sido demasiado menos probar la salida DAC antes que el filtro. Es sorprendente que todavía se vea igual si se le proporciona una señal limpia de 1120 Hz, ya que todavía está por debajo de la frecuencia niquist.