我对如何在Matlab中正确应用FFT变换及其逆变得非常困惑。我有一个我需要的程序
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
其中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阵列上执行此操作。)
这是为什么?我在这里做错了什么?
答案 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,:)];