Matlab中用fft作频谱后为什么要用fftshift

fft是一维傅里叶变换,即将时域信号转换为频域信号
fftshift是针对频域的,将FFT的DC分量移到频谱中心.即对频域的图像,(假设用一条水平线和一条垂直线将频谱图分成四块)对这四块进行对角线的交换与反对角线的交换。
Matlab中用fft作频谱后为什么要用fftshift_第1张图片Matlab中用fft作频谱后为什么要用fftshift_第2张图片Matlab中用fft作频谱后为什么要用fftshift_第3张图片
其中,(a)为一幅简单的图像,(b)为傅里叶频谱,©为经过fftshift变换后居中的频谱。

FFTSHIFT:将零频率分量移至频谱中心。对于向量,FFTSHIFT(X)交换X的左右半部分。对于矩阵,FFTSHIFT(X)交换第一和第三象限,第二和第四象限。对于N维数组,FFTSHIFT(X)在每个维度上交换X的“半空间”。

FFTSHIFT(X,DIM) :在DIM维度上应用FFTSHIFT操作。
FFTSHIFT对于将频谱中间的零频率分量的傅里叶变换可视化是很有用的。

fftshift就是对换数据的左右两边比如
x=[1 2 3 4]
fftshift(x) ->[3 4 1 2]
IFFTSHIFT Inverse FFT shift.(就是fftshift的逆)

x=[1     2     3     4     5]

y=fftshift(x)

y =
     4     5     1     2     3

ifftshift(y)

ans =

     1     2     3     4     5

    IFFTSHIFT undoes the effects of FFTSHIFT.

fft及fftshift示例:

fs=100;N=256;   %采样频率和数据点数
n=0:N-1;t=n/fs;   %时间序列
x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t); %信号
y1=fft(x,N);    %对信号进行快速Fourier变换
y2=fftshift(y1);
mag1=abs(y1);     %求得Fourier变换后的振幅
mag2=abs(y2);    
f1=n*fs/N;    %频率序列
f2=n*fs/N-fs/2;%这个未必正确
subplot(3,1,1),plot(f1,mag1,'r');   %绘出随频率变化的振幅
xlabel('频率/Hz');
ylabel('振幅');title('图1:usual FFT','color','r');grid on;
subplot(3,1,2),plot(f2,mag1,'b');   %绘出随频率变化的振幅
xlabel('频率/Hz');
ylabel('振幅');title('图2:FFT without fftshift','color','b');grid on;
subplot(3,1,3),plot(f2,mag2,'c');   %绘出随频率变化的振幅
xlabel('频率/Hz');
ylabel('振幅');title('图3:FFT after fftshift','color','c');grid on;

补充:https://blog.csdn.net/wordwarwordwar/article/details/52695473

Matlab中用fft作频谱后为什么要用fftshift_第4张图片

你可能感兴趣的:(Matlab图像处理)