私は数学のバックグラウンドがあまりありませんが、私が取り組んでいるプロジェクトの一部では、単一ベクトルの FFT が必要です。matlab 関数 fft(x) は必要なものに対して正確に機能しますが、Accelerate Framework fft 関数をセットアップしようとすると、完全に不正確な結果が得られます。誰かが Accelerate Framework fft の専門知識/経験を持っている場合、私が間違っていることを理解しようとする助けを実際に利用できます。Google で見つけた例に基づいて fft のセットアップを行いましたが、チュートリアルや異なる結果をもたらすものはありませんでした。
EDIT1:これまでの回答に基づいて、いくつかのものを変更しました。計算を行っているようですが、matlab に近い方法でそれらを出力しません
これは、matlab の fft のドキュメントです: 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 アクセラレート フレームワーク: 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 出力:
ffx には以下が含まれるようになりました。
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