La FFT es simplemente un método eficiente para calcular la DFT (Discrete Fourrier Transform), que es una convolución entre una forma de onda de entrada de muestra N \ $ x_n \ $, y cada una de las N funciones de base compleja de la forma \ $ u_n = exp (i2 \ pi fn) \ $, donde f es la frecuencia y varía de 0 a N-1.
La forma niave, directa y de fuerza bruta de realizar la DFT requiere \ $ O (2N ^ 2) \ $ multiplicados y agregados. La FFT utiliza una factorización inteligente para reducir radicalmente el número de adiciones y multiplicaciones requeridas para \ $ O (2N \ log_2 (N)) \ $, vale la pena hacer si N es más que unas pocas docenas, y necesita todas las frecuencias.
Si solo necesita la convolución a una sola frecuencia, o un pequeño puñado de frecuencias, hacerlo de manera directa, haciendo solo una frecuencia de la DFT, es más rápido que usar una FFT, que es un cálculo de 'todo o nada' .
Por ejemplo, para calcular la ganancia compleja v / i en una sola frecuencia, comenzaría generando efectivamente una señal compleja a esa frecuencia y emitiendo la componente real de la misma al dispositivo bajo prueba. "Efectivamente" significa que en realidad no es necesario generar explícitamente la señal completa de coseno + seno. Si el período es un múltiplo de 4 muestras, eso significa que puede generar solo la forma de onda del coseno y cambiarlo 90 grados, o simplemente indexarlo, para obtener el seno de forma gratuita.
Una vez que haya recibido la forma de onda \ $ v_n \ $, convolucione con la referencia compleja \ $ u_n \ $. Esto tiene la parte real \ $ cos (2 \ pi f n) \ $ y la parte imaginaria \ $ i.sin (2 \ pi f n) \ $. La convolución se realiza como $$ realpart = \ sum_ {n = 0} ^ {N-1} v_n.cos (2 \ pi fn) $$ Esta es la parte de v que es en fase con La señal de estímulo. Obtiene la parte imaginaria, cuadratura, haciendo la misma suma que tiene sustituido con () por cos () como $$ imagpart = \ sum_ {n = 0} ^ {N-1} v_n.sin (2 \ pi fn) $ $ Por supuesto, no es necesario calcular el cos (2pifn) al hacer las sumas, ¡se reduce a indexar a través de su forma de onda una muestra a la vez!
En C, el algoritmo es
float* v_ptr = v_buffer;
float* real_ptr = &cos_table[0];
float* imag_ptr = &cos_table[OFFSET_FOR_SINE_START];
float real_sum=0, imag_sum=0;
for (i=0; i<N; i++){
real_sum += *real_ptr++ * *v_ptr;
imag_sum += *imag_ptr++ * *v_ptr++;
}
Como detalle, lo anterior asume que cos_table es lo suficientemente largo como para que el seno pueda indexarlo hasta el final después de comenzar un ciclo de 1/4. Tendría que hacer algo complicado si solo fuera N largo.
Como este cálculo es exactamente el mismo, a esa frecuencia, que la FFT hace en todas las frecuencias, está sujeto a las mismas limitaciones de periodicidad. Eso significa que si su forma de onda no es periódica en la longitud N del vector de análisis que eligió, los resultados de la convolución serán inexactos. En la FFT esto se manifiesta como 'fuga espectral'.
Al igual que en la FFT, hay dos soluciones para esto. El primero es asegurarse de que su forma de onda de muestra N siempre contiene un número entero de ciclos. ¡Esto es fácil cuando estás generando tu propia forma de onda! Cuando la señal no está bajo su control, el uso de ventanas generalmente se usa antes de la FFT para reducir las fugas espectrales.