2012-01-09 9 views
5

私はmatlabでfftを行い、javaでjtransformsライブラリを使用しましたが、結果は若干異なります。fft matlabと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 

結果が異なるか、Matlabは値を丸めていますか?

+1

多少異なる。 1つのライブラリは32ビットの浮動小数点を使用し、もう1つのライブラリは64ビットを使用していますか? –

答えて

7

FFTを行うためのseveral different algorithmsがあります。原理的にはすべて同じですが、実際にはfloating-point arithmeticと組み合わせると、結果は若干異なります。たとえ基本的なFFTアルゴリズムが同じであっても、加算の順序などの実装の詳細によって差異が生じる可能性があります。最適化フラグによっては、特別な操作を行わなくても多くの場合modern processors do thisになります。

結果には、差は約5桁目です。それは合理的に小さな違いです。 MatlabとJTransformsの両方のIFTを使用して結果を逆変換して、どちらか一方の変換がはるかに正確かどうかを調べることができます。

1

倍精度浮動小数点演算での違いは、通常の数値精度の問題よりも大きいようです。 FFTの1つが、短い浮動小数点演算やデータを代わりに使用しているように見え、結果を倍精度として出力します(余分な数字はすべてナンセンスになります)。

+0

この場合、それはそうかもしれないし、そうでないかもしれないが、少なくともFPA精度のための「正常」というものはない。特に、アキュムレータ/インテグレータ(FFTアルゴリズムに必然的に含まれる)では、丸め誤差がほぼ無限に蓄積する可能性があります。 –