1

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で埋めてから、特定のポイントの平均を計算しますか?私は多くの検索を行いましたが、この特殊なケースで出力を取得するために彼らが何をしているのか理解できません。

4

2 に答える 2

3

公式のMATLABドキュメントから:

FFT関数(fft、fft2、fftn、ifft、ifft2、ifftn)は、 FFTWと呼ばれるライブラリに基づいています。

Nが合成の場合(つまり、N = N 1 N 2の場合)にNポイントDFTを計算するために、FFTWライブラリはCooley-Tukeyアルゴリズムを使用して問題を分解します。このアルゴリズムは、最初にサイズN2のN1変換を計算ます。サイズN1のN2変換を計算します。

Nが素数の場合、FFTWライブラリは最初にレーダーのアルゴリズムを使用してN点の問題を3つの(N – 1)点の問題に分解します。次に、上記のCooley-Tukey分解を使用して、(N – 1)ポイントのDFTを計算します。

AppleのAccelerateFrameworkがそのようなFFTをどのように計算するかはわかりませんが、正しい結果を生成するためにここではMATLABを使用しています。

于 2012-08-27T06:47:06.343 に答える
0

これはあなたの質問に対処しませんが、私はそのコンピューティングに注意します。結果を2乗する場合、絶対値は無駄な操作です。速度が問題になる場合は、それを取り除いてください。また、x ^ 2を計算する代わりに、x*xを計算します。同じ結果がより速く得られます。効率の違いが目立つかどうかはわかりませんが、安価なものが同じように単純であるか単純である場合、計算コストが高くなることは意味がありません。

于 2012-11-10T14:25:40.723 に答える