2016-08-23 4 views
2

Я пытаюсь fftw с C++. Я хочу проверить, что он работает правильно. Я внедрил простойfftw/C++ вычисляет fft неправильно, по сравнению с matlab

ifft(fft(shift(data)) - data == 0 

тест, который полностью не работает.

Testdata - это функция прямой, с амплитудой и фазой 1. Кодировка Matlab для сравнения отлично работает с тем же тестом.

Основной вопрос: что я делаю неправильно?

Здесь код matlab (который также использует fftw ...) FFTW dll/.h является последним.

data = zeros(1, 64); 
halfsize = numel(data)/2; 
data(halfsize-10:halfsize+10) = 1; 

phase = ones(size(data)); 
data = data.*exp(phase*sqrt(-1)); 

Ft = fft(fftshift(data)); 

original data fourier transform

В C++ код (не полный)

std::vector<complex<double>,fftalloc<complex<double> > > data(N); 
std::vector<complex<double>,fftalloc<complex<double> > > dataFourier(N); 
... create data 
int nfft = data.size(); 
fftw_plan plan = fftw_plan_dft_1d(nfft,fftw_cast(&data[0]),fftw_cast(&dataFourier[0]), FFTW_FORWARD, FFTW_ESTIMATE|FFTW_PRESERVE_INPUT); 
fftw_execute(plan); 
//fftw_execute_dft(plan, fftw_cast(&data[0]),fftw_cast(&dataFourier[0])); 
cout << dataFourier[0] << dataFourier.back() << endl; 

Выходной сигнал полностью отличается C++ plots

Первое комплексное значение полностью отличается от последняя

(59.8627,7.57324)(-4.00561,7.33222) 

Принимая во внимание, что в matlab они похожи. Кроме того, фаза полностью отличается:

11.3463 +17.6709i 10.8411 +13.7128i 

Для получения более N эти значения одинаковы (здесь N = 64)

+2

Почему вы используете fftshift во временной области? Он должен использоваться в частотной области. Я знаю, что это обычная ошибка, но это не делает все правильно. http://de.mathworks.com/help/matlab/ref/fftshift.html Btw. Matlab внутренне использует FFTW для вычисления ДПФ. – ypnos

+0

Я также предполагаю, что вы, вероятно, центрируете свою прямоугольную функцию (halfsize-9: halfsize + 10), и я хотел бы добавить, что прямоугольная функция из-за ее разрывов не является надлежащей функцией для преобразования через DFT. – ypnos

+0

@Ynpos: Я использую сдвиг, потому что иначе фаза в f. домен неверен. –

ответ

1

FFTW и Matlab не вычислять одно и то же. От the FFTW tutorial:

FFTW вычисляет ненормализованный ДПФ. Таким образом, вычисление вперед, следующего за обратным преобразованием (или наоборот) приводит к исходному массиву , масштабированному на n. Для определения DFT см. What FFTW Really Computes.

+0

Я знаю, но это не имеет ничего общего с моей проблемой, размещенной здесь. Масштабирование не является моей проблемой. Fft ошибочно, поэтому ifft тоже ошибается. –