Результаты FFTW отличаются от результатов FFT в MATLAB - PullRequest
3 голосов
/ 24 июня 2019

Я сравниваю FFT вперед, используя FFTW и MATLAB fft.Входной сигнал гауссовский.Код:

FFTW с использованием функции C:

float *signal; /*input signal*/
int nt; /*length of the signal*/
fftw_complex *in, *out;
fftw_plan plan1;

in = fftw_malloc(nt*sizeof(fftw_complex)); 
out = fftw_malloc(nt*sizeof(fftw_complex));
for (j=0;j<nt;j++){
        in[j][0]=(double)signal[j];
        in[j][1]=0.0;
}    
plan1 = fftw_plan_dft_1d(nt, in, out, -1, FFTW_ESTIMATE);
fftw_execute(plan1);        
fftw_destroy_plan(plan1);

for (j=0;j<nt;j++){
        real[j]=(float)out[j][0];
        imag[j]=(float)out[j][1];
}

fft в MATLAB:

fft(signal);

Я рисую действительные и мнимые части обоих результатов:

fft vs fftw

Действительная часть имеет почти одинаковое значение, тогда как мнимая часть имеет совершенно разные значения.Как решить эту проблему?

Ответы [ 2 ]

2 голосов
/ 24 июня 2019

Вы должны взглянуть на масштабный коэффициент на графике слева над графиком «Imag».Это говорит 10 ^ -15.Это довольно мало по отношению к реальной величине сигнала (по крайней мере, для больших частей, которые> 10 ^ 1), поэтому результаты довольно схожи.

Алгоритмы с плавающей точкой в ​​целом, как правило, не дают точно такой же результатдо тех пор, пока они не будут реализованы точно так же.(И даже тогда они могут отличаться в зависимости от вариантов округления).

Этот QA может дать некоторое представление: Примеры погрешностей с плавающей запятой

0 голосов
/ 24 июня 2019

Округлено с точностью до 0,001% от полной шкалы (действительное значение), обратите внимание, что все мнимые значения равны нулю.

...