簡體   English   中英

關於MATLAB中的fftshift和fft2的困惑

[英]Confusion about fftshift and fft2 in MATLAB

我對如何在Matlab中正確應用FFT變換及其逆變得非常困惑。 我有一個我需要的程序

  1. 將FFT2應用於大小為4x32的矩陣(對應於模式m=-1:2n=-15:16
  2. 進行一些處理,導致另一個函數的系數矩陣,其傅立葉系數通過簡單的代數(分量)公式與第一組數據相關
  3. 使用兩個函數的一些屬性,讓我通過在表格2*abs(A_n)*cos(phi+n*theta+alpha_n)上求和表達式來計算我需要的東西,其中A_nm=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只是在所有維度上應用此旋轉。


雖然根據定義,對於DFT, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM