MatlabでFFT変換とその逆変換を正しく適用する方法について私は大いに混乱しています。私は私がする必要があるプログラムを持っています
- サイズ4x32の行列にFFT2を適用します(モードに対応します
m=-1:2
、n=-15:16
) - いくつかの処理を実行します。これにより、別の関数の係数行列が生成されます。そのフーリエ係数は、単純な代数(コンポーネント単位)の式によって最初のデータセットに関連付けられます。
- 2つの関数のいくつかのプロパティを使用して、モードのn番目の係数である
2*abs(A_n)*cos(phi+n*theta+alpha_n)
フォームの式を合計するだけで必要なものを計算できます。A_n
m=1
alpha_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マトリックスでのみこれを行うので、それは私にとっては重要ではありません。)
どうしてこれなの?私はここで何が間違っているのですか?