Circuito digital para agregar múltiples frecuencias

El objetivo es implementar una especie de piano digital en un FPGA.

Hasta ahora, logré producir notas individuales usando contadores. Básicamente, genero una onda cuadrada de cierta frecuencia, que corresponde a una nota musical (por supuesto, para hacer eso, confío en la frecuencia del reloj, pero eso no es un problema).

¿Cómo puedo diseñar un circuito que pueda producir la superposición de múltiples notas? Básicamente, quiero poder producir 2 sonidos de diferentes frecuencias al mismo tiempo.

Respuestas (5)

Cuando era adolescente en la década de 1980, tenía una computadora Apple II+, que tenía una salida de altavoz similar a la de una PC IBM. Acceder a una ubicación de puerto de E/S mapeada en la memoria tuvo el efecto de alternar una salida conectada al altavoz.

Escribí un programa en lenguaje de máquina que tocaba tríadas: tres notas simultáneas. Una tabla de búsqueda convirtió valores de nota (indexados por semitonos) en valores de contador. El enfoque era simple: inicializar tres contadores y ciclarlos de forma independiente en un gran bucle. En cualquier iteración, cuando al menos uno de los contadores haya rodado, cambie el altavoz.

Esta rutina, junto con un programa BASIC para controlarla con datos, reprodujo una interpretación con un sonido muy bueno de la progresión de acordes del sintetizador de Jump de Van Halen .

Es un sonido único. Hay distorsión, pero la separación de notas es bastante clara.

Las variaciones en el timbre se pueden producir, por cierto, con la variación del ciclo de trabajo. Me parece recordar que esto se traduce en volumen percibido.

Depende mucho del tipo de hardware que tengas.

Si solo tiene una salida de 1 bit en el FPGA, puede sobremuestrear la señal de audio (1 MHz o más) y usar un modulador PWM o delta-sigma, generando efectivamente una señal de amplitud variable (puede agregar un filtro de paso bajo, un simple circuito RC es suficiente).

Luego puede agregar sus señales sintetizadas (seno, cuadrado, triángulo...) y generar sonidos polifónicos. Por ejemplo, con un sumador de 8 bits (con signo), establezca la amplitud de los dos generadores de onda cuadrada en +50/-50.

La parte fpga es algo irrelevante. No uso la salida de audio real. En cambio, tengo una salida digital normal, a la que conecto un altavoz. Entonces, lo único que tengo es una onda cuadrada, y debo generar esta onda cuadrada de una manera que suene como 2 notas musicales superpuestas. También estoy más interesado en el circuito real que en la implementación real.
"salida digital normal". ¿Qué es eso? 8 bits? 16 bits? ¿Firmado? ¿No firmado?
@Kaz, me parece que tiene una sola señal de salida digital (1 bit) y la está usando para controlar un altavoz.

Una forma simple es tomar cada salida de los contadores, pasarla a través de una resistencia y luego conectar el otro extremo de las resistencias. Ahora las salidas individuales del contador se atenuarían mientras que la salida final sería la suma de las salidas del contador.

Dos formas (en las que puedo pensar):

  1. con un DAC
    • Multiplique las señales individualmente para obtener diferentes amplitudes individuales.
    • Suma las señales que quieras combinar
    • Salida de n bits al DAC de n bits
    • Puede hacer un DAC R2R simple usted mismo usando solo resistencias.
  2. Sin DAC, usando un solo pin y un filtro de paso bajo
    • Suma las dos señales
    • Modular la salida usando modulación delta-sigma
    • Salida a través de un filtro de paso bajo (RC es el más simple).

Si solo está tratando con una sola salida digital y generando ondas cuadradas, la forma más sencilla de hacerlo es tener dos (o n) contadores en cada frecuencia deseada y XOR sus salidas juntas antes de enviarlas al pin. Esto produce un resultado equivalente al enfoque de alternancia de Kaz.