AppleのAccelerateFrameworkFFT関数を利用するアプリを開発していて、 MatlabのFFT関数の機能を模倣しようとしています。現在のコードは、matlabで実行しているのとまったく同じ方法で出力するように設定しています。同じように出力されないのは、データ配列内の要素の数が!= 2を底とする対数(技術的にはFFTに必要)の場合のみです。Matlab関数がこのケースをどのように処理するかを誰かが知っているかどうか疑問に思いました。アップルコードを使用して実行すると、異なる結果が生成されます。
注:私は単にfft(x)を呼び出しているのではありません。また、FFTシフトして絶対値を取り、それを2乗します。また、FFTの影響を直接受けないため、これらをAppleコードにミラーリングします。彼らは事後に呼ばれます。
例1-16要素(対数ベース2): 同様の出力
Matlabコール:
x = 1:16;
Fxx = abs(fftshift(fft(x))).^2;
Fxx =
Columns 1 through 7
64 66.5322 74.9807 92.5736 128 207.3490 437.0193
Columns 8 through 14
1681.5451 18496 1682.5451 437.0193 207.3490 128 92.5736
Columns 15 through 16
74.9807 66.5322
*長さのために省略されたAppleコード
Appleの出力:
Fxx[0] = 64.000000
Fxx[1] = 66.532232
Fxx[2] = 74.980664
Fxx[3] = 92.573612
Fxx[4] = 128.000000
Fxx[5] = 207.349044
Fxx[6] = 437.019336
Fxx[7] = 1681.545112
Fxx[8] = 18496.000000
Fxx[9] = 1681.545112
Fxx[10] = 437.019336
Fxx[11] = 207.349044
Fxx[12] = 128.000000
Fxx[13] = 92.573612
Fxx[14] = 74.980664
Fxx[15] = 66.532232
例2-10要素(対数ベース2ではない):異なる出力
Matlabコール:
x = 1:10;
Fxx = abs(fftshift(fft(x))).^2;
Fxx =
Columns 1 through 7
25 27.6393 38.1966 72.3607 261.8034 3025 261.8034
Columns 8 through 10
72.3607 38.1966 27.6393
*長さのために省略されたAppleコード
Appleの出力:
Fxx[0] = 16.000000
Fxx[1] = 45.250000
Fxx[2] = 18.745166
Fxx[3] = 32.000000
Fxx[4] = 109.254834
Fxx[5] = 1296.000000
Fxx[6] = 109.254834
Fxx[7] = 32.000000
Fxx[8] = 18.745166
Fxx[9] = 45.250000
ご覧のとおり、最初の例と2番目の例では明らかに同じ出力が生成されます。私は正と負の両方の入力でテストしましたが、それらが異なるのはログベース2ではない場合だけです。Matlabがこの問題をどのように処理するか知っている人はいますか?おそらく、2進数の対数になるまで配列を0で埋めてから、特定のポイントの平均を計算しますか?私は多くの検索を行いましたが、この特殊なケースで出力を取得するために彼らが何をしているのか理解できません。