2012-01-09 23 views
5

Lo hice fft en matlab y en java utilizando la biblioteca jtransforms, pero los resultados son ligeramente diferentes.fft en matlab y java

Matlab results: 
-0.0530528652679544 
-0.00775535711930750 + 0.0281791646147104i 
-0.0304104457750988 - 0.209776156064443i 
0.266945753193636 + 0.200338044445226i 

Jtransforms results: 
-0.05305448436232618 
-0.007755593801247046 + 0.028180024600812384 
-0.03041137385657606 -0.20978255812004887 
0.26695389998013486 + 0.20034415846373468 

¿Los resultados son diferentes o Matlab simplemente está redondeando los valores?

+1

Más que ligeramente diferente. ¿Hay una biblioteca que use coma flotante de 32 bits y otra de 64 bits? –

Respuesta

7

Hay several different algorithms para hacer FFT. En principio, todos son iguales, pero en la práctica, combinados con floating-point arithmetic, los resultados serán ligeramente diferentes. Incluso si el algoritmo básico de FFT es el mismo, los detalles de implementación, como el orden de suma, pueden causar diferencias. Muchos modern processors do this incluso si no hace nada especial, dependiendo de los indicadores de optimización.

En sus resultados, las diferencias están en alrededor del quinto dígito significativo. Es una diferencia razonablemente pequeña. Podría intentar transformar los resultados de forma inversa (utilizando IFT de Matlab y JTransforms) para ver si una u otra de las transformaciones es claramente más precisa.

1

Las diferencias parecen ser mayores que los problemas de precisión numérica normales para la aritmética de coma flotante de precisión doble. Parece más bien que una de las FFT usa en su lugar algo de aritmética o datos de flotación corta, e imprime el resultado como dobles (lo que hace que todos esos dígitos extra sean una gran cantidad de tonterías).

+0

En este caso, puede o no ser así, pero al menos no existe la "normal" para la precisión de FPA. Particularmente, en acumuladores/integradores (que los algoritmos de FFT inevitablemente contienen), el error de redondeo puede acumularse casi infinitamente. –