![](/img/trans.png)
[英]I need help in computing the frequecines of fourier coeffients using MATLAB after applying the fft2 and fftshift on map data
[英]Confusion about fftshift and fft2 in MATLAB
我對如何在Matlab中正確應用FFT變換及其逆變得非常困惑。 我有一個我需要的程序
m=-1:2
, n=-15:16
) 2*abs(A_n)*cos(phi+n*theta+alpha_n)
上求和表達式來計算我需要的東西,其中A_n
是m=1
的第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到最大,然后從min到-1。 根據文檔,我應該可以重新排列這個,所以我通過使用fftshift
在中間得到0,但它沒有給我我期望的輸出。 相反,我明白了:
>> 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中描述的計算,我需要知道各個系數的指數。 (這兩個層也被切換,但這對我來說無關緊要,因為我只會在MxN矩陣上執行此操作,而不是在Nd陣列上執行此操作,稍后。)
為什么是這樣? 我在這做錯了什么?
首先考慮簡單的1D案例, fft
為您提供:
[X(0) X(1) X(2) ... X(N/2-1) X(-N/2) X(-N/2+1) ... X(-1)]
我在哪里使用X(k)
來表示數學DFT的元素。
所有fftshift
都會將它們旋轉N/2
,所以你最終得到:
[X(-N/2) X(-N/2+1) ... X(-1) X(0) X(1) X(2) ... X(N/2-1)]
即線性順序。 1
在多維情況下, fftshift
只是在所有維度上應用此旋轉。
X(k) == X(N+k)
,未旋轉的矢量也是“線性”順序!
從Oli排隊,問題是你沒有在中間解析它:
所以對於asfft = @(X) [X(2:4,8:16,:) X(2:4,1:7,:); X(1,8:16,:) X(1,1:7,:)];
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,:)];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.