¿Cómo funciona un acumulador de fase DSP / FPGA?
-
03-07-2019 - |
Pregunta
Estoy viendo el código de un acumulador de fase, y debo ser un simple porque no lo entiendo. El código es bastante simple:
Every Clock Tick do: accum = accum + NCO_param; return accum;
acumulación es un registro de 32 bits. Obviamente, en algún momento se reiniciará.
Mi pregunta realmente es: ¿Cómo se relaciona esto con la fase?
Solución
Este artículo puede ayudar.
En el paso de ejecución, el contador (correctamente llamado acumulador de fase) recibe instrucciones para avanzar un cierto incremento en cada pulso desde la referencia de frecuencia. La salida del acumulador de fase (la fase) se utiliza para seleccionar cada elemento en la tabla de datos por turno. Finalmente, el DAC convierte esta secuencia de datos a una forma de onda analógica.
En el paso de ejecución, el contador (adecuadamente llamada la fase acumulador) es instruido para avanzar por un cierto incremento en cada pulso a partir de la referencia de frecuencia. los salida del acumulador de fase (el fase) se utiliza para seleccionar cada elemento en la tabla de datos a su vez. Finalmente, el DAC convierte esta secuencia de datos a Una forma de onda analógica. Para generar una forma de onda periódica, la El circuito está configurado para que una pasada. a través de la mesa lleva un tiempo igual al período de la forma de onda. por ejemplo, si la frecuencia de referencia es 1 MHz, y la tabla contiene 1000 entradas, luego un pase completo La tabla con un incremento de fase de 1. tomará 1000/1 MHz = 1 ms, por lo que el frecuencia de la forma de onda de salida ser 1 / (1 ms) = 1 kHz.
Este sistema puede generar una mayor frecuencia de salida simplemente aumentando el incremento de fase para que el El contador pasa por la mesa más. con rapidez. En el ejemplo anterior, el incremento de fase es igual a 1, por lo que La siguiente frecuencia posible es obtenida por establecer el incremento a 2, lo que resulta En una duplicación de la frecuencia de salida. A obtener un mejor control de frecuencia que esto, la fase estándar el incremento se puede establecer en, digamos, 10. Este entonces permite un poco más alto o más bajo Frecuencias de salida. Por ejemplo, aumentando el incremento a 11 sería aumentar la frecuencia de salida en un 10%, y reducirlo a 9 disminuiría La frecuencia de salida por la misma proporción. La mayor precisión requerido sobre la frecuencia, más los bits son necesarios en el contador.
Otros consejos
Respondiendo a mi propia pregunta, encontré otro artículo interesante en línea que describe una Acumulador de fase para síntesis de frecuencia.
Aquí está mi comprensión de cómo funciona el acumulador de fase:
El registro del acumulador en realidad representa 360 grados. Por lo tanto, un valor de 0 representa 0 grados, un valor de 2 ^ 32 representa 360 grados.
El acumulador de fase agrega un valor (M) a cada tic de reloj. Esto representa el ángulo que se mueve alrededor del círculo por (M / 2 ^ 32) grados. Cuando el registro se desborda, simplemente realizamos un ciclo completo de 360 ??grados y comenzamos de nuevo.
La fórmula es esta:
Ejemplo utilizando oscilos que tienen un período de forma de onda (x) = x (0-1) en lugar de x (0-2Pi)
Una variable por flujo de audio llamada acc / acumulación,
Cada muestra, acumúlala por accadd:
var accadd = 1.0/( sampleRate / p2freq( note ) ) ;
acc+= accadd;
acc = acc%1.0;// not sure to do this as accurately using if statement. can reset acc every noteOn
Si estás usando el pecado clásico con un período de 2pi, usa 2pi en lugar de 1.0
Al igual que la forma de onda se ejecutará de 0 a 1 en periodos de p2freq (nota) por segundo.