У меня не так много математического образования, но часть проекта, над которым я работаю, требует БПФ одного вектора. Функция 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