FFT de tamaño no una potencia de 2


9

Mi pregunta es con respecto al tamaño de entrada de una señal que no es una potencia de 2 y tenemos que aprovecharla. Algunas soluciones dicen que supongamos que si queremos tomar el fft de 1800 debemos ponerlo a cero hasta la longitud de 2048 para que sea potencia de 2 y luego aplicar el algoritmo radix 2. Pero también hay otras soluciones que aplican una combinación de algoritmos diferentes sin relleno de cero y luego calculan la FFT requerida. Mi pregunta es: ¿el relleno de cero es una señal con una longitud de 2048 en caso de que tengamos que tomar fft de 1800 hace alguna diferencia en los resultados, si utilizamos una combinación de algoritmos diferentes para calcular el fft de tamaño 1800? El resultado sería el mismo.


La FFT resultante será diferente: en lugar de calcular la FFT en las frecuencias para , las calculará en para . Sin embargo, no hay degradación de la información. 2πnorte/ /1800norte=0 0...17992πnorte/ /2048norte=0 0...2047
Peter K.

Entonces, ¿significa que ambos enfoques son correctos? ¿Pero cuál recomienda que sea más bueno en términos de practicidad?
DX

Sí, ambos enfoques son correctos. Usaría la "solución de energía mínima" (es decir, la solución más simple, la más perezosa). Esto usualmente usaría la transformación de longitud 2048.
Peter K.

He visto en la literatura y en los libros que la gente recomienda ponerlo en cero para que sea potencia de 2. ¿Por qué nunca insisten en implementar alguna combinación de otros algoritmos para obtener buenos resultados?
DX

2
Suponga que sus datos están adentro x. Forma X = fft(x,123456);(o alguna otra longitud extraña). Encuentra xx = ifft(X);. Mira lo que sum(abs(x-xx(1:length(x))));es.
Peter K.

Respuestas:


6

La FFT resultante será diferente: en lugar de calcular la FFT en las frecuencias 2πnorte/ /1800   para norte=0 0...1799  , los calcularás en 2πnorte/ /2048   para norte=0 0...2047  . Sin embargo, no hay degradación de la información.

Ambos enfoques son correctos: usando 1800 o 2048. Yo usaría la "solución de energía mínima" (es decir, la solución más simple, la más perezosa). Esto usualmente usaría la transformación de longitud 2048.

Las personas tienden a usar transformaciones radix-2 porque no saben nada mejor. Parece que hay mucha información errónea sobre las FFT que TIENEN poder de 2. No hay tal restricción. Además, probablemente no sepan sobre algoritmos decentes que no sean radix-2, como los disponibles en FFTW y otras bibliotecas.

Para ver que la FFT de cualquier longitud preserva la información:

Suponga que sus datos de longitud 1800 están adentro x. Forma X = fft(x,2048);(o alguna otra longitud diferente de 1800).
Encuentra xx = ifft(X);.
Mira lo que sum(abs(x-xx(1:1800)));es.

Vea también esta pregunta y sus respuestas.


Cuando lo hago ... solo me da un número, pero no hay comparación a través de gráficos. Lo siento, pero no soy muy bueno en matlab porque implementé todo en C.
DX

0

Es necesario comprender que, dado que el resultado (y la fuente) son discretos, FFT no es realmente una transformación de Fourier, sino que en realidad es el desarrollo de la Serie Fourier. Esto significa que el resultado de cualquier FFT no es la transformación de un solo bloque de datos, sino la transformación de una señal periódica que consiste en una concatenación infinita del mismo bloque de datos, con o sin una separación que consiste en la longitud del relleno . (Suponiendo que mis datos analizados se vean como «m», la transformación será el desarrollo de «... mmmmm ...» o de «... mmmmm ...», que no son la misma señal).

Como consecuencia, no tener relleno significa que uno agregará o eliminará implícitamente la falla de alta frecuencia en los datos de origen provenientes de la discontinuidad en la unión del final de un bloque y el comienzo del siguiente (que es lo mismo). El ejemplo extremo sería analizar un bloque que contiene el mismo valor. El relleno de no relleno marcará la diferencia entre una señal continua y una rectangular.

La otra consecuencia de esto es que cuanto más largo sea el relleno, más cerca estará el resultado de la transformación de una sola ráfaga de datos, y mayor será la resolución de la transformación. No es del todo exacto decir que, sin importar el paso, no habrá degradación de la información. Habrá (de forma limitada), debido a los errores de redondeo y el uso de un búfer más largo podría ayudar a prevenirlo (nuevamente, de manera muy limitada).

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.