0

我对如何在 Matlab 中正确应用 FFT 变换及其逆变换感到非常困惑。我有一个我需要的程序

  1. 将 FFT2 应用于大小为 4x32 的矩阵(对应于模式m=-1:2, n=-15:16
  2. 做一些处理,这导致另一个函数的系数矩阵,其傅里叶系数通过一个简单的代数(按分量)公式与第一组数据相关
  3. 使用这两个函数的一些属性,让我可以通过对形式的表达式求和来计算我需要的内容,2*abs(A_n)*cos(phi+n*theta+alpha_n)其中A_nm=1模式的第 n 个系数 和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

whereasfft以我认为的相同方式重新排序索引fft2,但没有其他任何作用。换句话说,每个索引从 0 到最大值排序,然后从最小值到 -1。根据文档,我应该能够重新排列它,所以我在中间使用 0 得到 0 fftshift,但这并没有给我我期望的输出。相反,我得到了这个:

>> 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 ... 8and-1 0 1 2我有8 -7 6 ...and 2 -1 0 1。这对我来说是致命的,因为为了能够进行上面 3 中描述的计算,我需要知道各个系数的索引。(这两个层也被切换了,但这对我来说并不重要,因为我只打算在 MxN 矩阵上执行此操作,而不是在 Nd 阵列上,稍后。)

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

4

3 回答 3

3

首先考虑简单的一维案例,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只需在所有维度上应用此旋转即可。


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

于 2012-05-23T13:30:08.087 回答
0

检查这个新闻阅读条目 http://www.mathworks.com/matlabcentral/newsreader/view_thread/285244

于 2012-05-23T13:47:00.447 回答
-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,:)];
于 2012-05-23T13:41:41.863 回答