Corregir la frecuencia de las notas para sintetizadores MIDI basados en STM32

1

He estado jugando con el EasyMXPro para STM32 dev. Tablero de Microelektronica. Estoy intentando crear un sintetizador de tabla de ondas monofónico simple usando el DAC, jugable vía. un teclado MIDI, sin embargo, tengo los siguientes problemas:

Tengo un bucle que recorre los valores de la tabla de ondas (a la velocidad del reloj de la MCU). La velocidad a la que el programa recorre la matriz obviamente me da una frecuencia incorrecta a la frecuencia fundamental de la onda sinusoidal en la tabla de ondas. ¿Cuál es la mejor manera de retrasar / acelerar la ejecución del programa para cada muestra en la matriz, dado que necesito recorrer la matriz a diferentes velocidades para diferentes notas en el teclado? He intentado usar un retraso simple, sin embargo, para cada cambio en la frecuencia de la nota, la cantidad del retraso tiene que cambiar específicamente. ¿Hay alguna forma más fácil de hacerlo en la que no haya pensado (tal vez usando temporizadores)?

¡Gracias de antemano por cualquier respuesta útil!

    
pregunta Stuart Thomas

1 respuesta

4
La mayoría de los sintetizadores basados en la tabla práctica utilizan una frecuencia de muestreo de reproducción fija y un registro de acumuladores y un incremento de fase fraccional .

Esencialmente, calcule el incremento de fase por período de muestra para su frecuencia de salida deseada, y multiplíquelo previamente por una gran potencia de dos, digamos 1024 o incluso más, con un ARM MCU también podría multiplicarlo por 2 ^ 16 .

Cada ciclo agrega este incremento de fase a un registro de acumulador.

El acumulador será más ancho (tendrá más precisión) que la entrada de la dirección en la tabla de búsqueda de ondas, así que simplemente ignore los bits inferiores y use solo los bits superiores, ya que la tabla de búsqueda tiene bits de dirección. Por lo tanto, es posible que esté calculando el tiempo con una precisión de 32 bits, pero solo utilice los 16 bits superiores para buscar muestras en una tabla de elementos 65536.

El resultado es que, si bien el tiempo de índice de una muestra dada es aproximado , el tiempo acumulativo tiene muchos bits de precisión. Esto le permite obtener fácilmente una resolución de sub-Hz, sin la necesidad de alterar un temporizador o un reloj DAC. Y eso es importante, porque normalmente los circuitos de limpieza en un DAC y siguiendo su salida están diseñados para solo un pequeño número de frecuencias de muestreo.

Tenga en cuenta que si su tabla de búsqueda contiene un seno u otra forma de onda con simetría, probablemente pueda reducir su tamaño; para un seno, solo necesita almacenar un cuarto de ola, ya que puede obtener los otros tres cuadrantes invirtiendo fase o amplitud.

Aunque la pregunta establece específicamente la salida monofónica, esta técnica es extensible a las salidas polifónicas. Un procesador moderno tendrá pocos problemas para realizar un buen número de tales búsquedas y sumarlas para alimentar al DAC a las frecuencias de muestreo de audio típicas.

    
respondido por el Chris Stratton

Lea otras preguntas en las etiquetas