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 -实信号的情况

  1. clf;
  2.  
  3. fs=100;N=256; %采样频率和数据点数
  4. n=0:N-1;t=n/fs; %时间序列
  5. x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t); %信号
  6.  
  7. y1=fft(x,N); %对信号进行快速Fourier变换
  8. y2=fftshift(y1);
  9.  
  10. mag1=abs(y1); %求得Fourier变换后的振幅
  11. mag2=abs(y2);
  12.  
  13. f1=n*fs/N; %频率序列
  14. f2=n*fs/N-fs/2;
  15.  
  16. subplot(3,1,1),plot(f1,mag1,'r'); %绘出随频率变化的振幅
  17. xlabel('频率/Hz');
  18. ylabel('振幅');title('图1:usual FFT','color','r');grid on;
  19.  
  20. subplot(3,1,2),plot(f2,mag1,'b'); %绘出随频率变化的振幅
  21. xlabel('频率/Hz');
  22. ylabel('振幅');title('图2:FFT without fftshift','color','b');grid on;
  23.  
  24. subplot(3,1,3),plot(f2, mag2,'c'); %绘出随频率变化的振幅
  25. xlabel('频率/Hz');
  26. 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 -复信号的情况

  1. close all; clear; clf;
  2.  
  3. fs=100;N=256; %采样频率和数据点数
  4. n=0:N-1;t=n/fs; %时间序列
  5. x=0.5*exp(j*2*pi*15*t)+2*exp(j*2*pi*40*t); %信号
  6.  
  7. y1=fft(x,N); %对信号进行快速Fourier变换
  8. y2=fftshift(y1);
  9.  
  10. mag1=abs(y1); %求得Fourier变换后的振幅
  11. mag2=abs(y2);
  12.  
  13. f1=n*fs/N; %频率序列
  14. f2=n*fs/N-fs/2;
  15.  
  16. subplot(3,1,1),plot(f1,mag1,'r'); %绘出随频率变化的振幅
  17. xlabel('频率/Hz');
  18. ylabel('振幅');title('图1:usual FFT','color','r');grid on;
  19.  
  20. subplot(3,1,2),plot(f2,mag1,'b'); %绘出随频率变化的振幅
  21. xlabel('频率/Hz');
  22. ylabel('振幅');title('图2:FFT without fftshift','color','b');grid on;
  23.  
  24. subplot(3,1,3),plot(f2,mag2,'c'); %绘出随频率变化的振幅
  25. xlabel('频率/Hz');
  26. ylabel('振幅');title('图3:FFT after fftshift','color','c');grid on;

  

fftshift函数详解的更多相关文章

  1. malloc 与 free函数详解<转载>

    malloc和free函数详解   本文介绍malloc和free函数的内容. 在C中,对内存的管理是相当重要.下面开始介绍这两个函数: 一.malloc()和free()的基本概念以及基本用法: 1 ...

  2. NSSearchPathForDirectoriesInDomains函数详解

    NSSearchPathForDirectoriesInDomains函数详解     #import "NSString+FilePath.h" @implementation ...

  3. JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解

    二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...

  4. Linux C popen()函数详解

    表头文件 #include<stdio.h> 定义函数 FILE * popen( const char * command,const char * type); 函数说明 popen( ...

  5. kzalloc 函数详解(转载)

    用kzalloc申请内存的时候, 效果等同于先是用 kmalloc() 申请空间 , 然后用 memset() 来初始化 ,所有申请的元素都被初始化为 0. view plain /** * kzal ...

  6. Netsuite Formula > Oracle函数列表速查(PL/SQL单行函数和组函数详解).txt

    PL/SQL单行函数和组函数详解 函数是一种有零个或多个参数并且有一个返回值的程序.在SQL中Oracle内建了一系列函数,这些函数都可被称为SQL或PL/SQL语句,函数主要分为两大类: 单行函数 ...

  7. jQuery.attr() 函数详解

    一,jQuery.attr()  函数详解: http://www.365mini.com/page/jquery-attr.htm 二,jQuery函数attr()和prop()的区别: http: ...

  8. memset函数详解

    语言中memset函数详解(2011-11-16 21:11:02)转载▼标签: 杂谈 分类: 工具相关  功 能: 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大 ...

  9. CreateFile函数详解

    CreateFile函数详解 CreateFile The CreateFile function creates or opens the following objects and returns ...

随机推荐

  1. 雷林鹏分享:jQuery EasyUI 树形菜单 - 使用标记创建树形菜单

    jQuery EasyUI 树形菜单 - 使用标记创建树形菜单 一个树形菜单(Tree)可以从标记创建.easyui 树形菜单(Tree)也可以定义在 元素中.无序列表的 元素提供一个基础的树(Tre ...

  2. 雷林鹏分享:C# 基本语法

    C# 基本语法 C# 是一种面向对象的编程语言.在面向对象的程序设计方法中,程序由各种相互交互的对象组成.相同种类的对象通常具有相同的类型,或者说,是在相同的 class 中. 例如,以 Rectan ...

  3. 单分子荧光原位杂交(smFISH)

    single-molecule RNA fluorescence in situ hybridization (RNA smFISH) 单分子荧光原位杂交(smFISH)是一种新的基因表达分析方法,能 ...

  4. every day a practice —— morning(2)

    Two years at sea have fostered a close relationship between the two fellow sailors as they cross the ...

  5. 自定义广播(BroadcastReceiver)事件 --Android开发

    本例演示自定义广播事件.我们需要做的是,在主活动中写发送广播的代码,然后在接收广播的类中写接收广播的代码. 1.主活动中点击按钮后发送广播 MainActivity.java: public clas ...

  6. linux进程管理之进程查看

    查看进程 process ====================================================================================了解如 ...

  7. 宽度优先搜索BFS(Breadth-First-Search)

    Breadth-First-Search 1. 与DFS的异同 相同点:搜索所有可能的状态. 不同点:搜索顺序. 2. BFS总是先搜索距离初始状态近的状态,它是按照:开始状态->只需一次转移就 ...

  8. bzoj4516: [Sdoi2016]生成魔咒 sam

    题意:每次插入一个数字,查询本质不同的子串有多少个 题解:sam,数字很大,ch数组用map来存,每次ins之后查询一下新建点表示多少个本质不同的子串(l[np]-l[fa[np]]) /****** ...

  9. Oracle11g温习-第十九章:审计(audit)

    2013年4月27日 星期六 10:52 1.审计的功能:监控用户在database 的 action (操作) 2.审计分类 1) session :在同一个session,相同的语句只产生一个审计 ...

  10. git commit -am "remark" 提交

    一.前言 假如你昨晚把本地文件a.html提交到远程库,今早发现还有补充的内容,于是添加了新的内容到a.html,并且还在本地还多添加了“几个文件”,那么怎么使用git来把这些文件一并提交到远程库呢? ...