关于MATLAB中的fftshift和fft2的困惑

时间:2012-05-23 13:09:52

标签: matlab fft

我对如何在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个系数, alpha_n = arg(A_n)
  4. 我已经对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矩阵上执行此操作,而不是在N-d阵列上执行此操作。)

    这是为什么?我在这里做错了什么?

3 个答案:

答案 0 :(得分:3)

首先考虑简单的1D案例,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)]

即。线性顺序。 1

在多维案例中,fftshift只是在所有维度上应用此轮换。

<小时/> <子> 1。虽然根据定义,对于DFT,X(k) == X(N+k),未旋转的向量也是“线性”顺序!

答案 1 :(得分:0)

答案 2 :(得分:-1)

从Oli排队,问题是你没有在中间解析它:

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