2012-01-09 5 views
5

Я сделал fft в matlab и в 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

Больше, чем немного отличается. Является ли одна библиотека использующей 32-разрядную плавающую точку, а другую 64-битную? –

ответ

7

Есть several different algorithms для выполнения БПФ. В принципе, они все равны, но на практике, в сочетании с floating-point arithmetic, результаты будут несколько отличаться. Даже если базовый алгоритм БПФ одинаковый, детали реализации, такие как порядок суммирования, могут вызывать различия. Многие modern processors do this, даже если вы не делаете ничего особенного, в зависимости от флагов оптимизации.

В ваших результатах разница составляет около 5-й значащей цифры. Это довольно небольшая разница. Вы можете попробовать обратное преобразование результатов (используя как Matlab, так и JTransforms IFT), чтобы увидеть, является ли один или другой из преобразований явно более точным.

1

Различия, по-видимому, больше, чем обычные проблемы с числовой точностью для арифметики с плавающей запятой с двойной точностью. Это больше похоже на то, что один из БПФ использует некоторую короткую арифметику или данные с плавающей запятой и печатает результат как удваивает (что делает все эти лишние цифры бессмысленными).

+0

В этом случае это может быть или не быть так, но, по крайней мере, нет такой вещи, как «нормальная» для точности FPA. В частности, в аккумуляторах/интеграторах (которые неизбежно содержат алгоритмы БПФ) ошибка округления может накапливаться почти бесконечно. –