Oscilador controlado numéricamente (NCO) Cantidad de muestra

He estado investigando un poco sobre los suboficiales y cierta información inicial (o la falta de información) me está molestando. He leído algunos artículos sobre este tema:

NCO basado en FPGA

Blog sobre suboficiales

Pero todavía no entiendo cómo un oscilador de este tipo puede variar la frecuencia sin reducir la cantidad de muestras entre diferentes frecuencias.

Todos los artículos sobre este tema mencionan el siguiente arreglo:

Palabra de incremento ---> Acumulador de fase (controlado por el reloj principal) ----> Tabla de búsqueda de onda sinusoidal ---> DAC, etc.

ingrese la descripción de la imagen aquí

El arreglo anterior (hasta donde puedo entender) varía la cantidad en la que itera a través de la tabla, variando así el tiempo que lleva recorrerla y producir una onda sinusoidal completa. Sin embargo, digamos que mi tabla de búsqueda consta de 2 ^ 8 entradas y aumento a través de la tabla en 1 cada vez, revisaré las 2 ^ 8 muestras y obtendré una frecuencia de Clock/256

Ahora, si tuviera que incrementar en 4 cada vez, solo pasaría por 256/4 muestras y, por lo tanto, obtendría una frecuencia 4 veces mayor que el ejemplo anterior.

Entonces, aunque la frecuencia varía, ¿no es también diferente el número de muestras presentes en las diferentes frecuencias?

¿Cómo se puede variar la frecuencia sin afectar el número de muestras presentes en la onda?

Respuestas (3)

Esta técnica se denomina generalmente síntesis digital directa (DDS) .

¿Cómo se puede variar la frecuencia sin afectar el número de muestras presentes en la onda?

no lo hace; La frecuencia de muestreo es fija. Es decir, el sintetizador/oscilador emite una cierta cantidad de muestras por segundo, esto no varía, el valor de la muestra varía.

Digamos que usó una frecuencia de muestreo de 8 kHz, si observa el segundo de salida, tendrá 8000 muestras. La frecuencia más alta que podría emitirse a esta velocidad es de 4 khz, que es la frecuencia de Nyquist . Para estos 4khz, el valor de la muestra alternaría 0,255,0,255... el índice de su tabla sería 0,128,0,128 o (127,255... o lo que sea). El índice aumentaría en 128 cada muestra. Una señal de 2 khz vería un aumento del índice de 64 en cada muestra. Ambas señales tendrían 8000 muestras durante todo el segundo, la señal de 2khz tendría la mitad de ciclos que la señal de 4khz al mismo tiempo, ¡porque es la mitad de la frecuencia!

Ahora, si quiere decir ciclo en lugar de onda, entonces la respuesta sería que no puede tener el mismo número de muestras/ciclo para otra frecuencia con la misma frecuencia de muestreo. Si necesita más fidelidad (es decir, más muestras), tendrá que aumentar la frecuencia de muestreo.

¡Eso responde perfectamente a mi pregunta!

Un DDS/NCO es básicamente un convertidor de frecuencia de muestreo que tiene una frecuencia de muestreo de salida fija y una frecuencia de muestreo de entrada variable. En su ejemplo, establecer la palabra de control de frecuencia de entrada en 4 en lugar de 1 aumenta la frecuencia de la forma de onda de salida aumentando la frecuencia de muestreo de la forma de onda de entrada (almacenada en la tabla) por un factor de 4 mientras que simultáneamente la diezma por 4 (solo conservando 1 de cada 4 muestras). Piénselo de esta manera: si reproduce la tabla a 4 veces Fclk, obtendrá 4 veces la frecuencia de salida. Sin embargo, solo puede generar muestras de salida en Fclk, por lo que debe eliminar 3 muestras cada 4 (diezmar por 4). Esto se implementa omitiendo tres entradas de la tabla en cada ciclo de reloj.

El poder real de un DDS está en que puede tener un acumulador de fase muy grande con más bits que su tabla de búsqueda para que pueda generar frecuencias con una resolución extremadamente fina, específicamente, la frecuencia de muestra dividida por el rango del acumulador. Para un reloj de 250 MHz y un acumulador de 32 bits, la resolución de frecuencia es de 0,058 Hz. La compensación es que las muestras no serán absolutamente perfectas debido al truncamiento de la fase, pero esto generalmente es un problema menor que la cantidad de bits de salida que proporciona la tabla de búsqueda.

Almacenar una tabla de búsqueda muy grande es un problema un poco difícil. Para una salida de 16 bits, generalmente desea una tabla con 2^18 entradas. Esto no cabe en un bloque de RAM FPGA. Existen técnicas para almacenar una versión comprimida de una tabla de búsqueda en varias tablas de búsqueda y luego realizar algún tipo de interpolación u otra reconstrucción para obtener el valor correcto. Un ejemplo es https://github.com/alexforencich/verilog-dsp/blob/master/rtl/sine_dds_lut.v . Este módulo es una LUT de 16 bits para la función seno con una entrada de 18 bits. Normalmente requiere 2^18*16 = 4M bits para almacenamiento, pero este solo usa 16*512*2+8*256 = 18k, un ahorro de 227x.

La frecuencia de muestreo variable es diferente a omitir muestras, estaba pensando de la misma manera que esas respuestas y tratando de averiguar lo mismo que el iniciador del tema.

enlace como prueba de que es diferente: http://www.electricdruid.net/index.php?page=info.wavetableoscs

¡Este enlace me ha puesto en paz! ¡Gracias!