Matlab中fft作频谱横纵坐标
关于这个问题,在很早之前就分享过,也通过了解实现了算法,当时看的明白,想的明白,突然要用的时候,又开始疑问,不免有些纠结,与其每次使用的时候都查,浪费时间,还不如,一次搞定。
真心没把哪门没学好的课程,归结到老师,但fft这事,还真得跟大学老师讨个说法,哈哈。
matlab FFT 横坐标问题:前人关于FFT横坐标的详细阐述
我们知道Fourier分析是信号处理里很重要的技术,matlab提供了强大的信号处理能力,但是有一些细节部分需要我们注意。
记信号f(t)的起始时间为t_start, 终止时间为t_end, 采样周期为t_s, 可以计算信号的持续时间Duration为 t_end – t_start, 信号离散化造成的采样点数 N = Duration/t_s + 1;
根据Fourier分析的相关结论,我们知道时域的采样将会造成频域的周期化,该周期为采样频率f_s(著名的香农采样定理基于此).
于是, 经过matlab的fft函数处理后,得到数据的横坐标为0:f_s/(N-1):f_s。相关代码如下所示:
%matlab fft 测试代码
t_s = 0.01;
t_start = 0.5; t_end = 5;
t = t_start:t_s:t_end;
y = 0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t);
y_f = fft(y);
subplot(3,1,1);
plot(t,y); title('original signal');
Duration = t_end - t_start;
Sampling_points = Duration/t_s + 1;
f_s = 1/t_s;
f_x = 0:f_s/(Sampling_points-1):f_s;
subplot(3,1,2);
plot(f_x,abs(y_f)); title('fft transform');
subplot(3,1,3);
plot(f_x-f_s/2,abs(fftshift(y_f))); title('shift fft transform');
也就是说,如果我们不使用fftshift,其变换后的横坐标为0:f_s/(N-1):f_s,如果使用fftshift命令,0频率分量将会移到坐标中心,这也正是matlab中帮助中心给出的意思:对fft的坐标进行了处理。实际上由于频谱的周期性,我们这样做是合理的,可以接受的。
请读者特别要注意横坐标的差别。另外,根据函数的特性,频谱应当只有在15Hz,40Hz出现峰值,但是fft变换后在60Hz,及85Hz处同样出现了峰值,应当可以从fft的计算过程中得到相应的解释。
事实上,如果我们用15Hz,60Hz来测试fft变换,也即是 y = 0.5*sin(2*pi*15*t)+2*sin(2*pi*60*t);图像如下所示,没有任何变化。
这种现象提醒我们,频率在f_s以内,即 0<f<f_s,f 以及 f_s – f 都有可能是测试信号的频率谱,这就给我们带来了歧义。并且从第三个子图也可以看出,这时候的fftshift会给我们带来错误的引导,也就是说,如果我们试图采样fft或者fftshift来分析信号的频率谱显得不那么靠谱了,matlab的fft谱线与信号的实际频率并不是一一对应的映射关系。这当然不是我们所期望看到的结果,所以实际分析信号时,有关这个问题需要额外的注意。
实际上,这也就间接地证明了Nyquist采样定理的合理性:采样频率要高于截止频率的两倍,上面的处理中我们所使用的采样频率为100Hz,于是当截止频率超过50Hz时,就会出现混叠效应,特殊情况就如上图所示:完全一样。于是,这也就告诉我们若要正确的显示频谱,需要仔细地考量采样频率与截止频率的关系,若太小,则有可能出现混叠,若太大,则计算代价过高。
上面内容说明了fft横坐标与采样定理的问题,如果你没有这个耐心看完,想着这事啥呀,乱七八糟的。下面我总结了坐标问题如下:
1)如果你用fft(NFFT)计算振幅谱,且fft变换后的点数为NFFT的话,只用fft,而不用fftshift,那么:
你只需要显示fft变换结果的前NFFT/2个点,横坐标为fx=index*Fs/(nfft-1),index=0:nfft/2-1 ;
2)如果你用fft(NFFT)计算振幅谱,且fft变换后的点数为NFFT的话,用了fft,还用了fftshift,那么:
你需要显示fft变换结果的数据点,横坐标为 fx = 0:Fs/(nfft-1):Fs;fx=fx-Fs/2;
原因:对实信号fft,产生了负频率,由于FFT变化是对称的,所以负频率对应到了Fs/2~Fs上,对实信号而言,该段频率没有任何意义,所以只显示到Fs/2。
matlab FFT 纵坐标问题:前人关于FFT纵坐标的详细阐述
一.调用方法
X=FFT(x);
X=FFT(x,N);
x=IFFT(X);
x=IFFT(X,N)
用MATLAB进行谱分析时注意:
(1)函数FFT返回值的数据结构具有对称性。
例:
N=8;
n=0:N-1;
xn=[4 3 2 6 7 8 9 0];
Xk=fft(xn)
→
Xk =
39.0000 -10.7782 + 6.2929i 0 - 5.0000i 4.7782 - 7.7071i 5.0000 4.7782 + 7.7071i 0 + 5.0000i -10.7782 - 6.2929i
Xk与xn的维数相同,共有8个元素。Xk的第一个数对应于直流分量,即频率值为0。
(2)做FFT分析时,幅值大小与FFT选择的点数有关,但不影响分析结果。在IFFT时已经做了处理。要得到真实的振幅值的大小,只要将得到的变换后结果乘以2除以N即可。
二.FFT应用举例
例1:x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t)。采样频率fs=100Hz,分别绘制N=128、1024点幅频图。
clf;
fs=100;N=128; %采样频率和数据点数
n=0:N-1;t=n/fs; %时间序列
x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t); %信号
y=fft(x,N); %对信号进行快速Fourier变换
mag=abs(y); %求得Fourier变换后的振幅
f=n*fs/N; %频率序列
subplot(2,2,1),plot(f,mag); %绘出随频率变化的振幅
xlabel('频率/Hz');
ylabel('振幅');title('N=128');grid on;
subplot(2,2,2),plot(f(1:N/2),mag(1:N/2)); %绘出Nyquist频率之前随频率变化的振幅
xlabel('频率/Hz');
ylabel('振幅');title('N=128');grid on;
%对信号采样数据为1024点的处理
fs=100;N=1024;n=0:N-1;t=n/fs;
x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t); %信号
y=fft(x,N); %对信号进行快速Fourier变换
mag=abs(y); %求取Fourier变换的振幅
f=n*fs/N;
subplot(2,2,3),plot(f,mag); %绘出随频率变化的振幅
xlabel('频率/Hz');
ylabel('振幅');title('N=1024');grid on;
subplot(2,2,4)
plot(f(1:N/2),mag(1:N/2)); %绘出Nyquist频率之前随频率变化的振幅
xlabel('频率/Hz');
ylabel('振幅');title('N=1024');grid on;
运行结果:
例3:x=cos(2*pi*0.24*n)+cos(2*pi*0.26*n)
======================评论======================================
1)FFT的算法与奈奎斯特频率没有关系,奈奎斯特频率只是用来避免频率的混叠。
3)"频谱图是以Nyquist频率为对称轴的"这句话不对。对称轴是N/2
上面内容说明了fft纵坐标的问题,如果你没有这个耐心看完,想着这事啥呀,乱七八糟的。下面我总结了坐标问题如下:
1)如果你用fft(NFFT)计算振幅谱,且fft变换后的点数为NFFT的话,那么将得到的振幅谱abs(fft(x))的结果乘以2然后除以N。
Matlab中fft作频谱横纵坐标相关推荐
- Matlab中用fft作频谱后为什么要用fftshift
fft是一维傅里叶变换,即将时域信号转换为频域信号 fftshift是针对频域的,将FFT的DC分量移到频谱中心.即对频域的图像,(假设用一条水平线和一条垂直线将频谱图分成四块)对这四块进行对角线的交 ...
- MATLAB中FFT的使用方法(频谱分析)
原文地址:MATLAB中FFT的使用方法(频谱分析)作者:飞鸿 说明:以下资源来源于<数字信号处理的MATLAB实现>万永革主编 一.调用方法 X=FFT(x): X=FFT(x,N): ...
- 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画频谱图,matlab 用 fft画频谱
matlab 用 fft画频谱 关注:193 答案:2 手机版 解决时间 2021-01-19 14:14 提问者挥映在沉默里的渲染 2021-01-18 18:27 在这样一段程序中 clear ...
- matlab函数乘阶跃,MATLAB中FFT函数和点乘、乘、单位阶跃函数
注意问题:1, 对于单位阶跃函数u(t-b)和Dirac函数delta(t-a),可以借用Maple函数库中的定义,他们分别是Heaviside(t-b),Dirca(t-a). 2,点乘和点除代表矩 ...
- matlab交换横纵坐标,Excel中表格如何交换横纵坐标数据-怎样把EXCEL表中的数据横纵互换...
excel表格如何横纵轴互换 excel表格横纵轴互换,可通过数据选项互换图表横纵坐标. 1.打开需要操作的EXCEL表格,点击图标使之处于编辑状态,在图表工具中点击"选择数据", ...
- Matlab中fft函数的使用与原理
快速傅里叶变换(Fast Fourier transform,FFT) 利用离散傅里叶变换(DTF)算法进行运算时,复数乘法运行次,复数加法运行次,计算量其实可以通过fft减小.1965年,首先由Co ...
- fft2MATLAB内存不足,matlab中fft快速傅里叶变换
博文来源:https://ww2.mathworks.cn/help/matlab/ref/fft.html?searchHighlight=fft&s_tid=doc_srchtitle 视 ...
- python+matlab 3通道图像加横纵坐标和0-255色标
目的:对输入的3通道图像进行可视化操作实现加横纵坐标和色标操作,其中色标范围是0-255,但是不对输入图像做灰度化处理. 步骤: 1.用python中的convert方法将3通道转成1通道 pytho ...
最新文章
- 梯度优化算法Adam
- 探究netty的观察者设计模式
- 不装.net Framework 也能运行WinForm程序,用飞信(转)
- yii2 gradview 输出当前时间和图片
- SAP CX Upscale Commerce : SAP全新推出的电商云平台
- Python 调度算法 死锁 静动态链接 分页分段
- IIS7 MVC网站生成、发布
- CentOS7 2.新项目上线脚本
- Android异步加载全解析之引入二级缓存
- 服务器系统无法共享打印机驱动程序,windows-server-2003 – windows服务器共享打印机,为什么本地机器需要驱动程序?...
- win7 桌面背景保存位置,告诉你源文件删除后如何找回
- 如何批量Ping 1000个IP地址,一个小技巧节约N小时?
- 计算机三级信息安全技术试题与答案,计算机三级《信息安全技术》练习题与答案...
- 跨境电商收款之派安盈Payoneer个人账号收款教程
- Xposed插件开发
- macOS--苹果本安装Win(看完可省200块)
- BAT 字符串大小写转换
- VQLS:变分量子算法解线性方程组
- 二叉排序树的查找、插入、创建和删除
- Linux系统中vi命令失效
热门文章
- 清华校庆正当时,智能小车决赛日
- 无线节能信标调试说明-2021-3-3
- 负离子发生器模块 ANION GENERATOR
- html 嵌入vb脚本,从嵌入在HTML中的VBScript访问VB6收藏品
- android 炫酷背景,炫酷-背景图垂直循环滚动登录页,Android RecyclerView实现
- java 矩阵_(JAVA)计算机图形学与矩阵
- python与或非运算规则_Python逻辑运算符及其用法
- lapack安装_VASP环境安装-BoltzTraP-1.2.5安装
- 更换ip软件安卓_2019十大手机读书软件排行榜
- FPGA之道(82)功能仿真之仿真原理