我对如何在 Matlab 中正确应用 FFT 变换及其逆变换感到非常困惑。我有一个我需要的程序
- 将 FFT2 应用于大小为 4x32 的矩阵(对应于模式
m=-1:2
,n=-15:16
) - 做一些处理,这导致另一个函数的系数矩阵,其傅里叶系数通过一个简单的代数(按分量)公式与第一组数据相关
- 使用这两个函数的一些属性,让我可以通过对形式的表达式求和来计算我需要的内容,
2*abs(A_n)*cos(phi+n*theta+alpha_n)
其中A_n
是m=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 ... 8
and-1 0 1 2
我有8 -7 6 ...
and 2 -1 0 1
。这对我来说是致命的,因为为了能够进行上面 3 中描述的计算,我需要知道各个系数的索引。(这两个层也被切换了,但这对我来说并不重要,因为我只打算在 MxN 矩阵上执行此操作,而不是在 Nd 阵列上,稍后。)
为什么是这样?我在这里做错了什么?