fftshift有什么用?MATLAB做FFT后为什么还要fftshift?
文章仅为个人理解,不足之处敬请指正
在用MATLAB做FFT分析信号的时候,为什么有时候需要fftshift,有时候又不需要,今天仔细理了理,做个总结记录。
首先,fftshift的用法:
Y = fftshift(X)
Y = fftshift(X,dim)
作用:交换行向量的左右两半部分。
在FFT里的作用:通过将零频分量移动到数组中心。
为什么要在FFT之后用到fftshift呢?
我觉得这个问题可以从采样定律的角度来说。以基带实信号为例,我们都知道时域的以fsf_sfs采样就是频域以fsf_sfs平移延拓,因为采样之后的信号的频谱会在fs/2f_s/2fs/2产生混叠,所以实信号采样率fs/2f_s/2fs/2要大于等于带宽,即fs≥2Bf_s≥2Bfs≥2B,如下图。
MATLAB在对序列做FFT的时候,相当于是取了频谱上[0,fs][0,f_s][0,fs]的部分,由于频谱是按fsf_sfs周期延拓,所以[fs/2,fs][f_s/2,f_s][fs/2,fs]部分的频谱与[−fs/2,0][-f_s/2,0][−fs/2,0]部分的一样,如果你想看[−fs,fs][-f_s,f_s][−fs,fs]部分(上图红框部分),就需要做fftshift,将零频分量移到序列中间,下面看一个例子。
close all; clear; clc;
fs = 300; %采样率大于200
t = 0:1/fs:1; %定义采样点
s = sin(2*pi*100*t)+cos(2*pi*40*t); %采样后的信号序列%---------看[0,fs]的频谱---------
F1 = fft(s); %fft
f1 = linspace(0,fs,length(t)); %频谱横轴
subplot(211);plot(f1,abs(F1));xlabel('f');ylabel('幅度');title('看[0,fs]');%---------看[-fs/2,fs/2]的频谱---------
F2 = fftshift(fft(s)); %fft
f2 = linspace(0,fs,length(t))-fs/2; %频谱横轴
subplot(212);plot(f2,abs(F2));xlabel('f');ylabel('幅度');title('看[-fs/2,fs/2]');
结果如下:
所以,fftshift是为了看[−fs/2,fs/2][-f_s/2,f_s/2][−fs/2,fs/2]部分频谱而需要的操作,如果只是看[0,fs][0,f_s][0,fs]的频谱,就不需要了。
上面只是实序列的情况,然而我们仿真实验更经常用到的是复序列,下面谈谈复序列的情况。
复序列没有负频率,采样率只要大于带宽即可,根据上面的讲解很容易理解这点,
上图可以看出来,只要fs≥Bf_s≥Bfs≥B,频谱就不会混叠。所以就不会去看[−fs/2,fs/2][-f_s/2,f_s/2][−fs/2,fs/2]的频谱,也就不会用到fftshift了。
close all; clear; clc;
fs = 300; %采样率大于100
t = 0:1/fs:1; %定义采样点
s = exp(1j*2*pi*100*t)+exp(1j*2*pi*40*t); %采样后的信号序列%---------看[0,fs]的频谱---------
F1 = fft(s); %fft
f1 = linspace(0,fs,length(t)); %频谱横轴
plot(f1,abs(F1));xlabel('f');ylabel('幅度');title('看[0,fs]');%---------看[-fs/2,fs/2]的频谱---------
%原本就没有负频率,这儿也就没意义了
% F2 = fftshift(fft(s)); %fft
% f2 = linspace(0,fs,length(t))-fs/2; %频谱横轴
% subplot(212);plot(f2,abs(F2));xlabel('f');ylabel('幅度');title('看[-fs/2,fs/2]');
fftshift有什么用?MATLAB做FFT后为什么还要fftshift?相关推荐
- 【数字信号处理】Matlab做fft时点数N怎么选取
一.FFT点数N(也就是离散时间信号的记录长度):要根据所要求的的频率分辨率F来决定. 频率分辨率F:能够用FFT算法分析得到的最靠近的两个信号频率之间的间隔. N和F的关系:N>=Fs/F, ...
- matlab函数fftshift,matlab中fft算法_matlab中fftshift函数_matlab中fft函数的用法(2)
plot([0 : PointNum/2 - 1], x1(1:PointNum/2)); grid on subplot(3,1,2); % [REX IMX] am = sqrt(abs(REX. ...
- MATLAB中的fft后为何要用fftshift?
fft是一维傅里叶变换,即将时域信号转换为频域信号 fftshift 是针对频域的,将FFT的DC分量移到频谱中心 即对频域的图像,(假设用一条水平线和一条垂直线将频谱图分成四块)对这四块进行对角线的 ...
- Matlab中用fft作频谱后为什么要用fftshift
fft是一维傅里叶变换,即将时域信号转换为频域信号 fftshift是针对频域的,将FFT的DC分量移到频谱中心.即对频域的图像,(假设用一条水平线和一条垂直线将频谱图分成四块)对这四块进行对角线的交 ...
- matlab adc仿真,[转载]关于ADC仿真做FFT的设置和结果分析
这些都是比较基础和实用的东西,故做分享~ 以前在实验室跑ADC动态性能仿真,会跑不少点,浪费了不少时间.主要是由于当时没有用相干采样的频率,而是直接选一个和采样频率比较互质的输入频率,然后再进行加窗处 ...
- 在matlab中为什么在使用fft后作图时要加绝对值
因为fft后的结果是复数,复数没法作图,所以一般会用模(复数的绝对值),实部或幅角这些实数作图.
- Matlab中fft作频谱横纵坐标
关于这个问题,在很早之前就分享过,也通过了解实现了算法,当时看的明白,想的明白,突然要用的时候,又开始疑问,不免有些纠结,与其每次使用的时候都查,浪费时间,还不如,一次搞定. 真心没把哪门没学好的课程 ...
- 用matlab做巴特沃斯低通滤波器
用matlab做巴特沃斯低通滤波器 趁着暑假,做一个心电图的matlab实验,遇到了滤波器问题,网上代码比较杂乱,做了一个汇总整理. 主要做了一个简单的低通滤波器并以三角函数为例子进行低通滤波. 基本 ...
- matlab做频域,如何使用matlab进行频域分析
Matlab可以说是一个非常有用且功能齐全的工具,在通信.自控.金融等方面有广泛的应用. 本文讨论使用Matlab对信号进行频域分析的方法. 说到频域,不可避免的会提到傅里叶变换,傅里叶变换提供了一个 ...
- 声音反卷积matlab,用MATLAB做反卷积
关键词:反卷积 MATLAB fft 频移 分母中频谱零点 卷积核 %========================================================== ...
最新文章
- 首发 | 13篇京东CVPR 2019论文!你值得一读~ 技术头条
- 校园表白墙APP使用体验
- 使用function module CRM_BUPA_FRG0010_GET_VALIDLIST 获得某个account assign的sales area
- Go 实现 soundex 算法
- “A class named TcxRect already exists”错误
- 实现ios常见菜单效果的思路
- 使用adb命令从Android手机中取出已安装的app包,导出apk
- 解决谷歌浏览器Chrome 代理设置不能上网的问题
- CSS的border属性绘制简单三角形、边框三角形
- 利用Python进行股票交易分析(一):量化交易策略——买点与卖点的量化
- excel公式不执行。原因是设置问题:公式->计算选项->手动
- 《CRAFT:Character Region Awareness for Text Detection》论文笔记
- 关于学期结束的一些题目的记录
- 宜信微服务架构落地及其演进
- 泰克MDO3104示波器_六合一示波器_无限多功能
- 高通平台 pmic—gpio修改(2)
- 一键新机IGRIMACE手机在线源安装方式
- 微软杀毒软件Microsoft Security Essentials 今起可下载
- 贝尔宾团队角色理论:附Belbin Team Roles测试 CW CO SH PL RI ME TW FI
- 常用HTTP抓包工具Fiddler使用的12个小技巧,值得收藏!