Confusión con la resolución ADC FFT y herramientas de programación

Tengo un ADC de 16 bits firmado, lo que significa que asigna un rango de -10V a +10V a 16 bits. Entonces el voltaje máximo +10V es 2^15-1 = 32767; cero es 0; y -10V es -2^15 = -32768.

Mi confusión es que cuando realizo la adquisición de datos con dicho hardware de 16 bits y hago la FFT con la herramienta MATLAB o Python, no sé cómo el programa sabe la resolución de los datos (como 16 bits). Y si creo mi propia matriz en MATLAB codificando cuál sería la resolución de bits cuando hace la FFT.

No sé si podría articular dónde estoy atascado. Básicamente, como he escrito antes, imagine que tiene un ADC de 16 bits firmado, lo que significa que asigna un rango de -10V a +10V a 16 bits. Entonces el voltaje máximo +10V es 2^15-1 = 32767; cero es 0; y -10V es -2^15 = -32768. E imagine que tiene un archivo binario lleno de muestras de 16 bits grabadas por este hardware ADC. Ahora, si realiza FFT en MATLAB o Python, estas herramientas leerán un archivo de 16 bits y convertirán estos bits sin firmar en voltaje y realizarán FFT.

Pero imagina que quieres hacer/imitar lo mismo con la codificación sin usar FFT. ¿Cómo haría tal matriz en MATLAB o Python?

Aquí hay un ejemplo: digamos que quiero crear/trazar una sinusoide en MATLAB o Python donde puedo imitar exactamente ese ADC de 16 bits que muestrea una entrada sinusoidal de 1V 100Hz durante 1 segundo que se muestrea con una frecuencia de muestreo de 512Hz. Al final, quiero obtener el mismo gráfico de FFT que obtendría después de un muestreo real de ADC. ¿Cómo se puede obtener ese tipo de matriz? ¿Cómo sabe la función FFT la resolución del ADC cuando calcula la FFT?

Los buenos resultados de FFT requieren 10 log (muestras por longitud de onda) y una alta SNR [dB] de resolución. Solo tiene 10 log (512/100) y 10 log (1 V/10 V * 32767), por lo que su resultado de FFT tendrá ruido y una respuesta de frecuencia Q baja (<10), pero los picos pueden dar alguna indicación pero >-70 dB de ruido por debajo picos
Parece que su pregunta es sobre cómo Mathlab/Phyton convierte una matriz de enteros de 16 bits con signo en una matriz de punto flotante. Cuál es el problema aquí? ¿O se trata de cómo generar datos firmados de 16 bits a partir de una subrutina SIN(t) de coma flotante? No está muy claro qué estás preguntando.

Respuestas (2)

Aquí hay un ejemplo: digamos que quiero crear/trazar una sinusoide en MATLAB o Python donde puedo imitar exactamente ese ADC de 16 bits que muestrea una entrada sinusoidal de 1V 100Hz durante 1 segundo que se muestrea con una frecuencia de muestreo de 512Hz. Al final, quiero obtener el mismo gráfico de FFT que obtendría después de un muestreo real de ADC. ¿Cómo se puede obtener ese tipo de matriz?

Parece que su objetivo general es observar el efecto de cuantificar su señal en el dominio de la frecuencia. Aquí hay un código de ejemplo para Python que podría trasladarse fácilmente a MATLAB

for n in range(num_samples):
    # Input signal (1/10th of FSR)
    Input_Signal[n] = 0.1*math.sin(2*math.pi*100*n/num_samples)
    
    # Ideal Quantized ADC Output
    ADC_Output[n] = np.round(Max_Code*Input_Signal[n])
    
    # ADC Output scaled to represent voltage
    Scaled_Output[n] = ADC_Output[n]/Max_Code

# FFT of input and output signals
Input_Signal_FFT = np.fft.fft(Input_Signal,axis=0)
Scaled_Output_FFT = np.fft.fft(Scaled_Output,axis=0)
Input_Mag = abs(Input_Signal_FFT[:,0])
Quantized_Mag = abs(Scaled_Output_FFT[:,0])

Aquí está la FFT de la señal de entrada

ingrese la descripción de la imagen aquí

Aquí está la FFT de la señal cuantificada

ingrese la descripción de la imagen aquí

No hay una diferencia notable entre los dos. Este es un ejercicio útil para aprender las consideraciones de ruido del diseño de un sistema ADC. El ruido en un ADC de 16 bits podría muy bien estar dominado por factores distintos al ruido de cuantificación. Esto no sería cierto para un ADC de 4 bits (FFT que se muestra a continuación)

ingrese la descripción de la imagen aquí

Digamos que quiero crear/trazar una sinusoide en MATLAB o Python donde puedo imitar exactamente ese ADC de 16 bits que muestrea una entrada sinusoide de 1V 100Hz durante 1 segundo que se muestrea con una frecuencia de muestreo de 512Hz.

Primero, necesitas escribir algo de código para incrementar la fase de un ángulo. Quiere crear 512 puntos. Si la frecuencia fuera de 1 Hz, recorrería 2 pi radianes en el transcurso de 512 muestras, pero su frecuencia es de 100 Hz, por lo que debería incrementar 100 veces más rápido.

Entonces necesitas la amplitud correcta. Usted dice 1v (supongamos que quiere decir pico, si no es correcto en consecuencia). La escala completa en su ADC es de 10v, por lo que desea una décima parte de eso. La salida de escala completa de su ADC es 32767, por lo que desea una décima parte de eso. El valor máximo de la función seno es uno. Básicamente, multiplique la salida de su función seno (evaluada en los ángulos calculados anteriormente) por 32767/10 y luego redondee.

Por supuesto, esta señal falsa será irrealmente limpia: para un modelo más realista, podría agregar algo de ruido, etc.