iPhone Accelerate Framework FFT против Matlab FFT

У меня не так много математического образования, но часть проекта, над которым я работаю, требует БПФ одного вектора. Функция Matlab fft (x) работает точно для того, что мне нужно, но после попытки настроить функции fft Accelerate Framework я получаю совершенно неточные результаты. Если у кого-то есть больше знаний/опыта работы с Accelerate Framework fft, мне действительно может понадобиться помощь, чтобы понять, что я делаю неправильно.Я основывал свою настройку fft на примере, который нашел в Google, но не было руководств или чего-то еще, что дало бы другие результаты.

EDIT1: Некоторые вещи изменены на основе ответов. Кажется, что он выполняет вычисления, но он не выводит их никоим образом, как в Matlab

. Это документация по fft для Matlab: http://www.mathworks.com/help/techdoc/ref/ fft.html

** ПРИМЕЧАНИЕ. Например, массив x будет иметь вид {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16} в обоих примерах

Код Matlab:

x = fft(x)

Вывод Matlab:

x =

   1.0e+02 *

  Columns 1 through 4

   1.3600            -0.0800 + 0.4022i  -0.0800 + 0.1931i  -0.0800 + 0.1197i

  Columns 5 through 8

  -0.0800 + 0.0800i  -0.0800 + 0.0535i  -0.0800 + 0.0331i  -0.0800 + 0.0159i

  Columns 9 through 12

  -0.0800            -0.0800 - 0.0159i  -0.0800 - 0.0331i  -0.0800 - 0.0535i

  Columns 13 through 16

  -0.0800 - 0.0800i  -0.0800 - 0.1197i  -0.0800 - 0.1931i  -0.0800 - 0.4022i

Apple Accelerate Framework: http://developer.apple.com/library/mac/#documentation/Accelerate/Reference/vDSPRef/ Reference/reference.html#//apple_ref/doc/uid/TP40009464

Код цели C:

int log2n = log2f(16);

FFTSetupD fftSetup = vDSP_create_fftsetupD (log2n, kFFTRadix2);     

DSPDoubleSplitComplex fft_data;
fft_data.realp = (double *)malloc(8 * sizeof(double));
fft_data.imagp = (double *)malloc(8 * sizeof(double));

vDSP_ctoz((COMPLEX *) ffx, 2, &fft_data, 1, nOver2); //split data (1- 16) into odds and evens

vDSP_fft_zrip (fftSetup, &fft_data, 1, log2n, kFFTDirection_Forward); //fft forward

vDSP_fft_zrip (fftSetup, &fft_data, 1, log2n, kFFTDirection_Inverse); //fft inverse

vDSP_ztoc(&fft_data, 2, (COMPLEX *) ffx, 1, nOver2); //combine complex back into real numbers

Вывод цели C:

fx теперь содержит:

272.000000
-16.000000
-16.000000
-16.000000
0.000000
0.000000
0.000000
0.000000
0.000000
10.000000
11.000000
12.000000
13.000000
14.000000
15.000000
16.000000

8
задан MrHappyAsthma 31 May 2012 в 17:26
поделиться