Cómo enviar múltiples señales a un DAC

Entonces, en mi clase de sistemas integrados, estábamos trabajando con DAC y construimos una escalera de resistencia. Luego enviamos datos a la escalera de resistencias usando temporizadores para generar ondas sinusoidales a una frecuencia determinada. Esto produjo el sonido que queríamos escuchar.

Desde entonces, construí una escalera de resistencia DAC de 10 bits con una frecuencia de muestreo de 1024 Hz. Estoy tratando de enviar dos notas a la vez al DAC. Tomo el valor actual de la onda de una nota, lo sumo con el valor de la onda de la otra nota, lo escalo apropiadamente para que no exceda el rango máximo y luego envío este número combinado al DAC.

Desafortunadamente, esto está creando un sonido de distorsión muy grave. Enterrado en el ruido puedo escuchar el acorde que estoy tratando de producir, pero ¿por qué hay tanto ruido en primer lugar? ¿No debería ser tan simple hacer un acorde como sumar las ondas sinusoidales?

¿Estás escalando cada muestra por el mismo factor?
¿Cómo estás escalando la suma?
¿Qué frecuencia de onda sinusoidal está generando y está por debajo de la mitad de la frecuencia de muestreo para evitar el aliasing?
Entonces, básicamente, tengo dos matrices de longitud 1024 con valores 1024 en la "forma" de una onda sinusoidal. Ciclo a través de la onda sinusoidal a una cierta frecuencia para producir un sonido. Uso la misma matriz para múltiples notas pero diferentes índices. Entonces, al DAC escribo (wave[i1]/10 + wave[i2]/40), donde i1 e i2 se incrementan a diferentes velocidades
La longitud de una matriz no tiene nada que ver con la frecuencia de muestreo.
Bueno, hacemos que la longitud de la matriz sea igual a la frecuencia de muestreo, ya que la matriz contiene un período de una forma de onda. No lo dejé claro en mi comentario anterior, mi error...

Respuestas (1)

Una frecuencia de muestreo de 1024 Hz es muy baja. Deberá filtrar la salida de su DAC con un filtro de reconstrucción de paso bajo que tenga muy poca respuesta (al menos 30 dB de atenuación) por encima de 500 Hz para eliminar las frecuencias de "imagen" creadas por el proceso de muestreo.

Suponga que está tratando de generar tonos a 100 Hz y 150 Hz. La salida sin procesar de su DAC también tendrá componentes de frecuencia en

  • 1024 - 150 = 874 Hz
  • 1024 - 100 = 924 Hz
  • 1024 + 100 = 1124 Hz
  • 1024 + 150 = 1174 Hz

además de los componentes de orden superior. Estos componentes adicionales no están armónicamente relacionados con sus tonos originales, por lo que los percibe como "ruido".

Normalmente, un DAC para aplicaciones de audio tendría una frecuencia de muestreo de aproximadamente 10x a 100x la frecuencia que está utilizando, con un filtro de salida correspondiente. Las frecuencias de muestreo comúnmente utilizadas incluyen:

  • 8 kHz (audio hasta 3400 Hz) - llamado "grado de voz" porque se usa para circuitos telefónicos.
  • 16 kHz (audio hasta 7500 Hz) - grado de radio AM
  • 32 kHz (audio hasta 15 kHz) - grado de radio FM
  • 44,1 kHz (audio hasta 20 kHz) - "Calidad de CD"
  • 48 a 192 kHz - frecuencias de audio profesional
En caso de que alguien tenga una idea equivocada: 10x (es decir, 10 KHz) es el extremo inferior absoluto y sonaría bastante mal para la música que no sea chiptunes. 22 KHz es aceptable, pero en la mayoría de los casos querrá 44 KHz o más (48 KHz y 96 KHz también son comunes) para audio con calidad de CD. Puede encontrar una amplia gama de DAC externos con una resolución de muestra de 16 o 24 bits en estas frecuencias.
Oh hombre... eso va a ejercer una gran presión sobre nuestro tablero. En este momento, usamos temporizadores e ISR para desplazarnos por las formas de onda. Acabo de hacer los cálculos y para reproducir una nota C5 a una frecuencia de muestreo de 8000Khz, el ISR debe llamarse cada 19 ciclos (nuestra velocidad de reloj es de 80Mhz). Tendré que desmontar el código ISR para que sea menos de 19 ciclos, eso podría ser difícil.
También puedo estar usando mal el término frecuencia de muestreo... Con eso quiero decir que muestreamos un período de onda sinusoidal de 2pi 1024 veces para obtener una matriz de valores, una tabla de búsqueda esencialmente. Simplemente nos desplazamos a través de esta tabla de ondas sinusoidales más rápido para generar frecuencias más altas. No estoy seguro si eso cambia algo...
No, no debería necesitar una frecuencia de muestreo de 8000 kHz (8 MHz). C5 es 523,25 Hz, y si tiene una tabla de senos de 1024 entradas y una frecuencia de muestreo de 8 kHz, la recorrería a una frecuencia de 1024 s t mi pag s / C y C yo mi 523.25 C y C yo mi s / s mi C 8000 s a metro pag yo mi s / s mi C = 66.976 pasos por muestra. Observe cómo funciona el análisis de la unidad. Puede generar pasos no enteros utilizando técnicas dds .
Ok, pero entonces, ¿qué está causando el feo sonido de distorsión? Estoy recorriendo la misma matriz de onda sinusoidal con 2 índices diferentes (cada uno desplazándose a una frecuencia diferente), tomando el valor de la tabla de búsqueda, agregándolos con la fórmula y luego escribiendo en el DAC A+B-AM/1024. Sin embargo, sigo recibiendo el siguiente ruido: soundcloud.com/rutvik-choudhary/dac-output-test-1
Vea la primera parte de mi respuesta con respecto al filtro de salida. Si utiliza una frecuencia de muestreo más alta, los requisitos del filtro son menos estrictos.
Entonces, ¿un filtro de salida es la única forma de limpiar el sonido? ¿Qué causa exactamente el ruido extraño de todos modos?
¿Está bloqueando los datos que alimenta al DAC? La muestra no debe simplemente "enviarse", debe mantenerse hasta que se produzca una actualización en la siguiente muestra.
Sí, se está escribiendo en el registro de los pines de salida. Es IO asignado a la memoria, por lo que persiste.