0

MatlabでFFT変換とその逆変換を正しく適用する方法について私は大いに混乱しています。私は私がする必要があるプログラムを持っています

  1. サイズ4x32の行列にFFT2を適用します(モードに対応しますm=-1:2n=-15:16
  2. いくつかの処理を実行します。これにより、別の関数の係数行列が生成されます。そのフーリエ係数は、単純な代数(コンポーネント単位)の式によって最初のデータセットに関連付けられます。
  3. 2つの関数のいくつかのプロパティを使用して、モードのn番目の係数である2*abs(A_n)*cos(phi+n*theta+alpha_n)フォームの式を合計するだけで必要なものを計算できます。A_nm=1alpha_n = arg(A_n)

FFT2関数を少し実験して、出力がどのように配置されるかを理解しようとしました。私が理解していること(私のコースの文献の情報源から)から、係数は次のスクリプトで示されているように順序付けられます。

>>m = -1:2; n = -7:8;
>>[N,M] = meshgrid(n,m); 
>>MN = M; MN(:,:,2) = N; 
>>asfft = @(X) [X(2:4,8:16,:) X(2:4,1:7,:); X(1,8:16,:) X(1,1:7,:)];
>>asfft(MN)
ans(:,:,1) =
     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
     1     1     1     1     1     1     1     1     1     1     1     1     1     1     1     1
     2     2     2     2     2     2     2     2     2     2     2     2     2     2     2     2
    -1    -1    -1    -1    -1    -1    -1    -1    -1    -1    -1    -1    -1    -1    -1    -1
ans(:,:,2) =
     0     1     2     3     4     5     6     7     8    -7    -6    -5    -4    -3    -2    -1
     0     1     2     3     4     5     6     7     8    -7    -6    -5    -4    -3    -2    -1
     0     1     2     3     4     5     6     7     8    -7    -6    -5    -4    -3    -2    -1
     0     1     2     3     4     5     6     7     8    -7    -6    -5    -4    -3    -2    -1

ここでasfft、私が信じているのと同じ方法でインデックスを並べ替えますfft2が、それ以外は何もしません。つまり、各インデックスは0から最大まで、次に最小から-1までの順序になっています。ドキュメントによると、これを再配置して、を使用して途中で0を取得できるようにする必要がありますが、fftshift期待する出力が得られません。代わりに、私はこれを取得します:

>> fftshift(asfft(MN))
ans(:,:,1) =
     8    -7    -6    -5    -4    -3    -2    -1     0     1     2     3     4     5     6     7
     8    -7    -6    -5    -4    -3    -2    -1     0     1     2     3     4     5     6     7
     8    -7    -6    -5    -4    -3    -2    -1     0     1     2     3     4     5     6     7
     8    -7    -6    -5    -4    -3    -2    -1     0     1     2     3     4     5     6     7
ans(:,:,2) =
     2     2     2     2     2     2     2     2     2     2     2     2     2     2     2     2
    -1    -1    -1    -1    -1    -1    -1    -1    -1    -1    -1    -1    -1    -1    -1    -1
     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
     1     1     1     1     1     1     1     1     1     1     1     1     1     1     1     1

ご覧のとおり、最大値はスペクトルの反対側にあります。との代わりに-7 -6 ... -1 0 1 ... 8-1 0 1 2とが8 -7 6 ...あり2 -1 0 1ます。上記の3で説明した計算を実行できるようにするには、それぞれの係数のインデックスを知る必要があるため、これは私にとって致命的です。(2つのレイヤーも切り替えられますが、後でNd配列ではなく、MxNマトリックスでのみこれを行うので、それは私にとっては重要ではありません。)

どうしてこれなの?私はここで何が間違っているのですか?

4

3 に答える 3

3

最初に単純な1Dの場合を考えると、次のようになりfftます。

[X(0) X(1) X(2) ... X(N/2-1) X(-N/2) X(-N/2+1) ... X(-1)]

ここで、数学的なDFTX(k)の要素を表すために使用しています。

これらfftshiftをで回転させるだけなN/2ので、次のようになります。

[X(-N/2) X(-N/2+1) ... X(-1) X(0) X(1) X(2) ... X(N/2-1)]

つまり、線形順序。1

多次元の場合、fftshiftこの回転をすべての次元に適用するだけです。


1.定義上、X(k) == X(N+k)DFTの場合、回転されていないベクトルも「線形」順序になります。

于 2012-05-23T13:30:08.087 に答える
0

このニュースリードエントリも確認して くださいhttp://www.mathworks.com/matlabcentral/newsreader/view_thread/285244

于 2012-05-23T13:47:00.447 に答える
-1

Oliからキューを取得すると、問題は、途中でそれを解析していないことです。

だからasfft = @(X) [X(2:4,8:16,:) X(2:4,1:7,:); X(1,8:16,:) X(1,1:7,:)];

size(8:16)
ans =
     1     9
size(1:7)
ans =
     1     7

そうする:

asfft = @(X) [X(3:4,9:16,:) X(3:4,1:8,:); X(1:2,9:16,:) X(1:2,1:8,:)];
于 2012-05-23T13:41:41.863 に答える