我很困惑如何在Matlab中正確應用FFT變換及其反變換。我有一個程序,其中我需要關於fftshift和fft2的混淆MATLAB
- 申請FFT2尺寸4x32的矩陣(對應於模式
m=-1:2
,n=-15:16
) - 做一些處理,這導致係數矩陣爲另一個函數,它的傅立葉係數通過一個簡單的代數(成分方式)公式與第一組數據相關
- 使用兩個函數的一些屬性,它們讓我通過總結表格上的表達式來計算我需要的東西
2*abs(A_n)*cos(phi+n*theta+alpha_n)
其中A_n
是第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。根據文檔,我應該能夠重新排列這個,所以我通過使用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矩陣上做這件事,而不是在N-d陣列上,稍後會這樣做。)
這是爲什麼?我在這裏做錯了什麼?
Sure - 這與我從Matlab文檔中獲得的信息大致相同。但是,爲什麼我會在帖子中顯示的順序而不是顯示的內容呢? –
@TomasLycken:你得到的順序與我所說的相同,你只是將數據編號爲-7 - > +8,而不是更傳統的-8 - > +7。 –