关于fftshift----将零频率的分量移到频谱的中心
fftshift
作用:将零频点移到频谱的中间
用法:
Y=fftshift(X)
Y=fftshift(X,dim)
描述:fftshift移动零频点到频谱中间,重新排列fft,fft2和fftn的输出结果。将零频点放到频谱的中间对于观察傅立叶变换是有用的。
fftshift就是对换数据的左右两边比如 x=[1 2 3 4] fftshift(x) ->[3 4 1 2] IFFTSHIFT Inverse FFT shift.(就是fftshift的逆)(IFFTSHIFT undoes the effects of FFTSHIFT.
x=[1 2 3 4 5];
y=fftshift(x)
y =
4 5 1 2 3
ifftshift(y)
ans =
1 2 3 4 5
需要fftshift的原因:
1、在matlab中,经过fft变换后,数据的频率范围是从[0,fs]排列的。
2、而一般,我们在画图或者讨论的时候,是从[-fs/2,fs/2]的范围进行分析。
3、因此,需要将经过fft变换后的图像的[fs/2,fs]部分移动到[-fs/2,0]这个范围内。而fftshift就是完成这个功能。通常,如果想得到所见的中间是0频的图像,经过fft变换后,都要再经过fftshift。
=================================================================================================================================
一.对于实信号:
因为实信号以fs为采样速率的信号在 fs/2处混叠,所以实信号fft的结果中前半部分对应[0, fs/2],后半部分对应[ -fs/2, 0];
1)实信号fft的结果前半部分对应[0, fs/2]是正频率的结果,后半部分对应[ -fs/2, 0]是负频率的结果。大于fs/2的部分的频谱实际上是实信号的负频率加fs的结果。故要得到正确的结果,只需将视在频率减去fs即可得到频谱对应的真实负频率;
2)如果要让实信号fft的结果与[-fs/2, fs/2]对应,则要fft后fftshift一下即可,fftshift的操作是将fft结果以fs/2为中心左右互换;
3)如果实信号fft的绘图频率f从[-fs/2, fs/2],并且没有fftshift,则fft正频谱对应f在[0, fs/2]的结果将混叠到(f - fs/2)的位置;
fft负频谱对应f在[-fs/2, 0]的结果混叠到 f + fs - fs/2 的位置,注意这里f为负值,也就是说此种情况下fft负频谱对应的视在频率减去fs/2即可得到频谱对应的真实负频率。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
结论:
1.如果希望绘制的频谱图的频率范围为:0-fs,则无需进行fftshift,正频率对应0-fs/2;大于fs/2的频谱的频率值为对应[-fs/2 , 0 ]负频率f + fs,注意f是负频率,是个负数。
2.如果期望绘制的幅频图的频率范围为-fs/2~fs/2,则需要运行fftshift变换,如果不变换,图示的响应频点会发生变换。
二.复信号情况
1)复信号没有负频率,以fs为采样速率的信号,fft的频谱结果是从[0,fs]的。
2)在 f> fs/2时,对复信号的fft结果进行fftshift会产生频率混叠(将下面的示例2中的频率从f=15改为f=85可以验证f=85的谱线在fftshift后跑到 f= -15 = 85 - fs = 85 - 100的位置了),所以复信号也一般要求 f <= fs/2
3)在对雷达的慢时间维(复信号)进行fft后,由于要用doppler= ((0:LFFT-1)/LFFT - 0.5)*PRF; 计算多普勒频率,所以对该慢时间信号fft后要fftshift下,以便和正确的频率单元相对应。注意多普勒频率fd < = PRF/2 时才测的准!
%=====================================================================================================================================
补充:

%====================================================================================================================================
%关于fftshift的程序理解
clc;close all;clear all;
fs=100;N=256; %采样频率和数据点数
n=0:N-1;t=n/fs; %时间序列,从0到2.55s
x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t); %信号
y1=fft(x,N); %对信号进行快速Fourier变换,256点DFT
y2=fftshift(y1); %fftshift的操作是将fft结果以fs/2为中心左右互换
mag1=abs(y1); %求得Fourier变换后的振幅
mag2=abs(y2);
f1=n*fs/N; %频率序列
f2=n*fs/N-fs/2; %频率序列向左移fs/2
figure;
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;

%===============================================================================================================================
%复信号的情况:
fs=100;N=256; %采样频率和数据点数
n=0:N-1;t=n/fs; %时间序列
x=0.5*exp(j*2*pi*15*t)+2*exp(j*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;
figure;
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;

%=============================================================================================
更直观的程序:
t=0:0.001:2;
n=2001;
Fs=1000;
Fc=200;
x=cos(2*pi*Fc*t);
y1=fft(x);
y2=fftshift(y1);
f=(0:2000)*Fs/n-Fs/2;
figure;
hold on;
plot(f,abs(y1),'r')
plot(f,abs(y2),'b')

总之用fftshift后频率序列要减去fs/2
参考:
http://www.cnblogs.com/limanjihe/p/10014142.html
fft后为什么要fftshift: https://blog.csdn.net/ssdxiao01/article/details/6687721
https://blog.csdn.net/zhyoulun/article/details/12859339
https://wenku.baidu.com/view/c6a7964476c66137ee06199a.html
关于fftshift----将零频率的分量移到频谱的中心的更多相关文章
- NumPy v1.15手册汉化
NumPy参考 数组创建 零 和 一 empty(shape[, dtype, order]):返回给定形状和类型的新数组,而不初始化条目 empty_like(prototype[, dtype, ...
- MATLAB函数表(转自:http://bbs.06climate.com/forum.php?mod=viewthread&tid=16041&extra=page%3D4)
MATLAB函数表 4.1.1特殊变量与常数 ans 计算结果的变量名 computer 确定运行的计算机 eps 浮点相对精度 Inf 无穷大 I 虚数单位 inputname 输入参数名 NaN ...
- matlab 常用函数汇总
1. 特殊变量与常数 主题词 意义 主题词 意义 ans 计算结果的变量名 computer 确定运行的计算机 eps 浮点相对精度 Inf 无穷大 I 虚数单位 inputname 输入参数名 Na ...
- [引用]MATLAB中的fft后为何要用fftshift
原文地址:MATLAB中的fft后为何要用fftshift fft是一维傅里叶变换,即将时域信号转换为频域. fftshift是针对频域的,将FFT的DC分量移到频谱中心,重新排列fft,fft1和… ...
- Matlab信号处理基础
一. 简介 离散傅立叶.离散余弦和离散小波变换是图像.音频信号常用基础操作,时域信号转换到不同变换域以后,会导致不同程度的能量集中,信息隐藏利用这个原理在变换域选择适当位置系数进行修改,嵌入信息,并确 ...
- MATLAB之图像与音频信号处理
原理简介 离散傅立叶.离散余弦和离散小波变换是图像.音频信号常用基础操作,时域信号转换到不同变换域以后,会导致不同程度的能量集中,信息隐藏利用这个原理在变换域选择适当位置系数进行修改,嵌入信息,并确保 ...
- Python 实现图像快速傅里叶变换和离散余弦变换
图像的正交变换在数字图像的处理与分析中起着很重要的作用,被广泛应用于图像增强.去噪.压缩编码等众多领域.本文手工实现了二维离散傅里叶变换和二维离散余弦变换算法,并在多个图像样本上进行测试,以探究二者的 ...
- 离散傅里叶变换的衍生,负频率、fftshift、实信号、共轭对称
封面是福州的福道,从高处往下看福道上的人在转圈圈.从傅里叶变换后的频域角度来看,我们的生活也是一直在转圈圈,转圈圈也是好事,说明生活有规律,而我们应该思考的是,如何更有效率地转圈圈--哦别误会,我真不 ...
- fftshift
说明:本文为转载http://blog.csdn.net/myathappy/article/details/51344618 Matlab fftshift 详解 一.实信号情况 因为实信号以fs为 ...
随机推荐
- IDEA 运行spring boot出现端口占用的问题
Description: The Tomcat connector configured to listen on port 8080 failed to start. The port may al ...
- 关于new你应当知道的一切
new在C++中是一个我们经常用到的运算符.由它所创建的变量会被分配在堆中,并且在程序结束之前应当将分配的内存delete掉,否则就会导致内存泄漏.但是除此之外,你对new有更深入的了解吗?本篇文章将 ...
- java 中的强制转换
强制转换分两种,一种是基础类型强制转换(Type Conversion),一种是引用类型强制转换(Class Casting):
- C语言数据结构基础学习笔记——静态查找表
查找:在数据集合中寻找满足某种条件的数据元素的过程称为查找. 查找表:用于查找的数据集合称为查找表,一般有以下操作:①查找是否在表中:②查找属性:③进行操作. 查找表又分为: ①静态查找表:只可以进行 ...
- python函数与模块(装饰器,文件处理,迭代器等)
os模块 os.system('命令') 利用python调用系统命令,命令可以是以列表或者元组内的元素形式* res import os res=os.system('ipconfig') prin ...
- Selenium自动化Chrome浏览器 在windows下窗口最大化
本人由于是搞自动化时间不长,所以踩了很多坑.准备把踩得这些坑记录下来. 自动化测试最基础的就是打开浏览器然后让Windows窗口最大化. 一开始百度了好多窗口最大化的方法,最常用的是: WebDriv ...
- 通过nginx日志,统计最近两天的交易笔数
#!/bin/bash yesterday=`date -d last-day +%Y-%m-%d` dayago=`date -d '2 days ago' +%Y-%m-%d` #echo $ye ...
- 通过阿里云ECS服务器公网ip访问tomcat,nginx
一.概述 1.操作系统:centos7 2.安装nginx方法:https://www.cnblogs.com/boonya/p/7907999.html,亲测可用. 3.tomcat版本:apach ...
- gp工具的许可
还是要在代码里许可 static class Program { [STAThread] static void Main() { ESRI.ArcGIS.RuntimeManager.Bind(ES ...
- 关于 /bin/bash: warning: setlocale: LC_ALL: cannot change locale (en.US_UTF-8) 问题
亲测可行 中文 # vim /etc/profile.d/locale.sh export LC_CTYPE=zh_CN.UTF-8 export LC_ALL=zh_CN.UTF-8 # vim / ...