2012-05-23 82 views
0

我很困惑如何在Matlab中正確應用FFT變換及其反變換。我有一個程序,其中我需要關於fftshift和fft2的混淆MATLAB

  1. 申請FFT2尺寸4x32的矩陣(對應於模式m=-1:2n=-15:16
  2. 做一些處理,這導致係數矩陣爲另一個函數,它的傅立葉係數通過一個簡單的代數(成分方式)公式與第一組數據相關
  3. 使用兩個函數的一些屬性,它們讓我通過總結表格上的表達式來計算我需要的東西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陣列上,稍後會這樣做。)

這是爲什麼?我在這裏做錯了什麼?

回答

3

首先考慮簡單的一維的情況下,fft爲您提供:

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

在那裏我使用X(k)來表示mathematical DFT的元素。

所有fftshift確實是N/2旋轉這些,所以你最終:

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

即線性順序。

在多維情況下,fftshift只是在所有維度上應用此旋轉。


1.雖然自定義,X(k) == X(N+k)一個DFT,未旋轉的矢量也是「線性」命令!

+0

Sure - 這與我從Matlab文檔中獲得的信息大致相同。但是,爲什麼我會在帖子中顯示的順序而不是顯示的內容呢? –

+2

@TomasLycken:你得到的順序與我所說的相同,你只是將數據編號爲-7 - > +8,而不是更傳統的-8 - > +7。 –

-1

採取從奧利隊列,問題是,你沒有在中間對它進行分析:

所以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,:)]; 
+0

這是否對應於FFT2如何排序我的係數?作爲oli指出的 –

+0

,你也需要做'm = -2:1; n = -8:7;'你應該在那裏 – Rasman

+0

這不是一個選項,考慮到我正在使用數據的物理實驗。我已更新我的帖子以澄清此問題。 –