fftshift(fft2(fftshift(x))) 和 fftshift(fft2(x)) 有什么区别?

问题描述 投票:0回答:1

我正在 MATLAB 中编码,我需要获得二维数组 x 的正确频谱(就像连续傅立叶变换所做的那样)。

我尝试过以下两种方法。

fftshift(fft2(x));
fftshift(fft2(fftshift(x)));

似乎两者都给出了 x 光谱的正确强度分布,我想知道哪一个给出了正确的 x 光谱。

非常感谢您的帮助!

matlab signal-processing fft
1个回答
0
投票

正如 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
占据了向量的上半部分,并且通常,在频域中处理二维图像信息(例如边缘检测)时,这非常方便。时域处理(至少根据我的经验是这样)。

一图胜千言。为了便于可视化,这是一个一维案例:

enter image description here

代码:

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)))');
© www.soinside.com 2019 - 2024. All rights reserved.