fftshift函数详解
reference: https://ww2.mathworks.cn/help/matlab/ref/fftshift.html
一.实信号情况
因为实信号以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)复信号没有负频率,以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
作用:将零频点移到频谱的中间
用法:
Y=fftshift(X)
Y=fftshift(X,dim)
描述:fftshift移动零频点到频谱中间,重新排列fft,fft2和fftn的输出结果。将零频点放到频谱的中间对于观察傅立叶变换是有用的。
示例1 -实信号的情况:
clf;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;
结论:
1)如果期望绘制的幅频图的频率范围为0~fs,则无需运行fftshift变换,正频率对应在[0, fs/2],大于fs/2的频谱的频率值为对应[-fs/2 , 0 ]负频率f + fs,注意f是负频率,是个负数。如图1。
2)如果期望绘制的幅频图的频率范围为-fs/2~fs/2,则需要运行fftshift变换,如图3;如果不变换,图示的响应频点会发生变换,如图2,分析见顶端。
示例2 -复信号的情况:
close all; clear; clf;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;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://www.cnblogs.com/limanjihe/p/10014142.html
fftshift函数详解相关推荐
- C语言网络编程:accept函数详解
文章目录 前言 函数描述 代码实例 如何得到客户端的IP 和 端口号 前言 当使用tcp服务器使用socket创建通信文件描述符,bind绑定了文件描述符,服务器ip和端口号,listen将服务器端的 ...
- 【FFmpeg】函数详解(三)
FFmpeg函数详解 14.av_write_frame 15.av_interleaved_write_frame 16.av_write_trailer 17.avio_close 18.av_i ...
- 【FFmpeg】函数详解(二)
FFmpeg函数详解 9.av_dump_format 10.avio_open 11.avformat_write_header 12.avcodec_send_frame 13.avcodec_r ...
- 【FFmpeg】函数详解(一)
FFmpeg函数详解 一.错误码相关 1.AVERROR 2.av_strerror 3.其他错误码解释 二.编解码 1.获取编解码器 2.申请.释放上下文环境 3.打开编码器avcodec_open ...
- 【ES6】Generator函数详解
[ES6]Generator函数详解 一.Generator函数简介 基本概念 函数写法 yield关键字介绍 二.next方法的参数 三.for...of循环 四.关于普通throw()与Gener ...
- mysql的聚合函数综合案例_MySQL常用聚合函数详解
一.AVG AVG(col) 返回指定列的平均值 二.COUNT COUNT(col) 返回指定列中非NULL值的个数 三.MIN/MAX MIN(col):返回指定列的最小值 MAX(col):返回 ...
- python平方数迭代器_对python中的高效迭代器函数详解
python中内置的库中有个itertools,可以满足我们在编程中绝大多数需要迭代的场合,当然也可以自己造轮子,但是有现成的好用的轮子不妨也学习一下,看哪个用的顺手~ 首先还是要先import一下: ...
- python基础知识~ 函数详解2
python~函数详解2 1 生成器函数 定义 如果函数有yield这个关键字,就是生成器函数.生成器函数() 获取的是生成器,不执行函数 须知 yield和return一样,都可以返回数 ...
- scanf函数详解与缓冲区
1.基本信息 函数原型: int scanf( char *format, args, ...); 函数返回值: 读入并赋给args的数据个数,遇到文件结束返回EOF,出错返回0. 函数功能: sca ...
- pythonpandas函数详解_对pandas中Series的map函数详解
Series的map方法可以接受一个函数或含有映射关系的字典型对象. 使用map是一种实现元素级转换以及其他数据清理工作的便捷方式. (DataFrame中对应的是applymap()函数,当然Dat ...
最新文章
- 不动产登记证书曝光 一个“改变”必须注意(图)
- [IE9] GPU硬件加速到底是实用创新还是噱头
- Leetcode 209.长度最小子序列(滑动窗口)
- java callable 线程池_JAVA 线程池之Callable返回结果
- (键盘)代码 19:由于其配置信息(注册表中的)不完整或已损坏,Windows 无法启动这个硬件设备 解决方法...
- 苹果抛弃英特尔!TCL 怼格力 500 亿不够做芯片;高德地图上线叫车 | CSDN 极客头条...
- 一步一步SharePoint 2007之二十八:实现WebPart的单步调试
- 2019web前端全新面试题库 一
- idea连接presto
- python整型为空的情况_深度剖析凭什么python中整型不会溢出
- c语言考试题库大一下学期基础,c语言考试题(全国c语言二级考试题库)
- c51单片机小车代码解释
- linux一句话精彩问答 (转贴)
- 【牛腩】未能加载文件或程序集“AspNetPager”或它的某一个依赖项
- 看LIVALL智能头盔是如何借助Google广告和YouTube实现海外众筹“冷启动“?
- practice是什么意思_practice是什么意思 还有practice的用法
- mybatis-plus过滤不查询某一字段
- Springboot​ mybatis-plus
- thinkpadE450 进入bios并设置bios为uefi模式U盘启动(也可以是legacy)
- 用Python计算利率,告诉你亏了多少!