Me gustaría convertir una señal al dominio de frecuencia. El rango de frecuencia deseado es 0.1 Hz
a 1 Hz
y la resolución de frecuencia es 0.01 Hz
.
Con la frecuencia de muestreo de 30 Hz
, FFT proporciona los componentes de frecuencia de hasta 15 Hz. Elevar la frecuencia de muestreo proporciona una mejor resolución de frecuencia. Sin embargo, FFT ofrece un rango de frecuencia más amplio. En mi caso, sólo quiero 0.1 Hz
a 1 Hz
, FFT da hasta 15 Hz
(cálculo extra).
Mi pregunta es, ¿hay alguna forma estándar de calcular el dominio de frecuencia de una señal con un rango de frecuencia específico y alta resolución?
Respuestas:
Creo que la mejor solución a su problema es usar el chirp-DFT. Es como una lupa para un cierto rango de frecuencia. Es más eficiente que la implementación directa de la DFT (sin FFT), ya que un algoritmo de FFT se puede utilizar con algún procesamiento previo y posterior adecuado. Básicamente, necesita modular su señal con una señal de chirp, luego filtrar usando una FFT y luego nuevamente modular su señal para obtener la respuesta de frecuencia deseada. Consulte aquí y aquí para obtener detalles sobre cómo implementar el chirp-DFT.
fuente
También existe la posibilidad de utilizar la deformación de frecuencia (también funciona como una lupa ya que obtiene una resolución mejorada en su rango de frecuencia de interés para el mismo tamaño de FFT a expensas de una resolución más baja a frecuencias más altas). Sin embargo, no guarda ningún MIPS ya que el tamaño de FFT no se reduce y la deformación de frecuencia está lejos de ser barata.
Si solo desea calcular ciertos contenedores en la FFT (y, por lo tanto, guardar MIPS), hay un par de métodos para hacerlo. Por ejemplo el DFT deslizante. Las referencias en este documento dan una muy buena explicación http://www.comm.utoronto.ca/~dimitris/ece431/slidingdft.pdf . También creo que el algo de goertzel hace algo similar, pero no lo sé.
Luego está la opción de reducir la resolución antes de realizar FFT. Eso probablemente también ahorrará algunos MIPS.
Editar: solo para aclarar el comentario sobre el algoritmo de Goertzel que no es útil. Al conectar directamente los valores a la expresión que se encuentra en la parte inferior de esta página wiki http://en.wikipedia.org/wiki/Goertzel_algorithm , el enfoque de Goertzel será más complejo que una FFT cuando el tamaño de la FFT requerida es mayor que 128 (suponiendo que el tamaño de FFT es un factor de 2 y una implementación de radix-2).
Sin embargo, hay otros factores que deben tenerse en cuenta, lo que favorece al Goertzel. Solo para citar la página wiki: "Las implementaciones de FFT y las plataformas de procesamiento tienen un impacto significativo en el rendimiento relativo. Algunas implementaciones de FFT [9] realizan cálculos internos de números complejos para generar coeficientes sobre la marcha, aumentando significativamente su" costo K por unidad de trabajo ". Los algoritmos FFT y DFT pueden usar tablas de valores de coeficientes precalculados para una mejor eficiencia numérica, pero esto requiere más accesos a los valores de coeficientes almacenados en la memoria externa, lo que puede conducir a una mayor contención de caché que contrarresta algunas de las ventajas numéricas ".
"Ambos algoritmos ganan aproximadamente un factor de eficiencia 2 cuando usan datos de entrada de valor real en lugar de valores complejos. Sin embargo, estas ganancias son naturales para el algoritmo de Goertzel pero no se lograrán para el FFT sin usar ciertas variantes de algoritmo especializadas para transformar real -valorados ".
fuente
fuente