FFT de 256 puntos, pero solo necesita 5-6 frecuencias, ¿hay una mejor manera?

Debido a las limitaciones de mi sistema, tengo una FFT de 256 puntos. Sin embargo, solo me importa la energía en 5 o 6 de los 256 contenedores. 256pt FFT sigue siendo más rápido que 5 o 6 DFT específicos, pero parece un desperdicio calcular 256 frecuencias para solo 5 o 6. ¿Hay una mejor manera? ¿Sería la reducción de resolución lo que me gustaría hacer aquí? Si reduzco de 256 a 64 frecuencias, obtendría un factor de mejora de 5x en el no. de operaciones, pero no estoy seguro de entender el concepto completamente (incluso después de leer el libro de procesamiento de señales de tiempo discreto de Oppenheim), es decir, ¿sería esta una aplicación adecuada de este concepto?

Cualquier sugerencia sobre qué buscar o leer más sería muy apreciada, y algunos ejemplos del mundo real me ayudarían a comprender mejor. Gracias.

¿Por qué calcularía todos los contenedores si solo necesita un puñado? Calcular sólo los requeridos. También considere usar tablas para seno y coseno y cuando use una plataforma de 32 bits, los cálculos de enteros pueden ser suficientes.

Respuestas (1)

Si quisiera 1 o 2 frecuencias, el algoritmo de Goertzel sería un claro ganador.

Si quisiera varias docenas, entonces la FFT sería un claro ganador, incluso después de desechar la mayoría de las muestras resultantes, debido a la alta eficiencia que le brinda la factorización del proceso.

Con 5 o 6 frecuencias requeridas, estás en la región de cruce. Dependerá de qué tan bien se implemente cada algoritmo. Obtenga o escriba código para ambos y cronometrarlos.

Si comprende la FFT lo suficientemente bien como para recodificar partes de ella, entonces existe una técnica llamada 'poda', mediante la cual no calcula ninguna de las respuestas que no necesita. Es posible que esto no ahorre muchos ciclos de cálculo ya que a) la factorización significa que todos los resultados deberán calcularse para las primeras rondas de todos modos yb) el cálculo condicional puede ser menos eficiente que simplemente ejecutar los bucles y hacerlos todos. ¿Quiere crear a mano un algoritmo cada vez que cambia las frecuencias que desea generar?