我正在 MATLAB 中编码,我需要获得二维数组 x 的正确频谱(就像连续傅立叶变换所做的那样)。
我尝试过以下两种方法。
fftshift(fft2(x));
fftshift(fft2(fftshift(x)));
似乎两者都给出了 x 光谱的正确强度分布,我想知道哪一个给出了正确的 x 光谱。
非常感谢您的帮助!
正如 Christoph Rackwitz 指出的那样,
fftshift
是一种在频域中对序列进行操作的效用函数,通常不与时间/空间域中的信号一起使用。
其原因与
fft
的“包装”方式有关。通常,对于 Matlab 函数,DFT 实现会将第 0
频率 (DC) 放入 bin 1
,即最高可计算频率(sr/2 - sr/n
,其中 sr
是采样率,n
是 DFT 的长度)放入 bin n/2
中,然后将负频率(-(sr/2 - sr/n)
向上通过 -sr/n
放入第 n/2+1
到第 n
个 bin 中。因此,该序列的上半部分(在实数输入的情况下,它是下半部分的镜像)实际上是负频率信息——即使负数出现在数轴上的正数之前,fftshift
占据了向量的上半部分,并且通常,在频域中处理二维图像信息(例如边缘检测)时,这非常方便。时域处理(至少根据我的经验是这样)。
一图胜千言。为了便于可视化,这是一个一维案例:
代码:
t = 0:1/512:1;
x = chirp(t,0,1,10);
figure;
subplot(2,1,1);
plot(x);
hold;
plot(fftshift(x));
legend('x', 'fftshift x');
subplot(2,1,2);
plot(abs(fft(x)));
hold;
plot(fftshift(abs(fft(x))));
legend('abs(fft(x))', 'fftshift(abs(fft(x)))');