Matlab 之 FFT的理解和应用
网上看了一些大牛的关于FFT的见解,加上自己的一点儿理解,针对以下这几个问题来加深对FFT的理解。
不知道大家有没有类似以下几点的困惑:
问题的提出
- 对于1秒钟输出的连续信号,使用采样率Fs不同,就会得到不同的采样序列。在计算N点FFT之后得到N点的复数,幅频图中横坐标如何与我实际的频率相对应?
- FFT之后的幅频响应图,对应的幅值到底有什么含义,我们可以通过这个对应频率点的幅值推出原始信号的相关特性吗?
问题的解释
傅里叶是法国数学家和物理学家的名字,英语原名是Jean Baptiste Joseph Fourier(1768-1830)。他在1807年在他论文里面运用正弦曲线来描述温度分布,论文里有个在当时具有争议性的决断:任何连续周期信号都可以由一组适当的正弦曲线组合而成。
分解信号的方法是无穷多个的,为什么我们要用正弦曲线来代替原来的曲线呢?分解信号的目的是为了更加简单地处理原来的信号。用正余弦来表示原信号会更加简单,因为正余弦拥有原信号所不具有的性质:)对线性系统而言,输入正弦信号,输出为同频率的正弦信号,只有附加相移和幅度变化。2)根据傅立叶变换性质,几乎全部实际信号都可以表示成傅里叶级数形式,包括正弦信号本身。可见,正弦信号是不可分的基本信号,而方波或三角波不是,所以不用方波或三角波。)且只有正余弦曲线才拥有这样的性质,正因如此我们才不用方波或三角波来表示。
1三角函数形式的傅里叶级数
我们来看这个式子:
它就是傅里叶级数,周期函数f(t)的角频率为w1,可由三角函数的线性组合来表示,式中n为正整数,
a为直流分量
余弦分量的幅度
正弦分量的幅度
2指数形式的傅里叶级数
根据欧拉公式,将f(t)表示为:
令
那么
f(t)指数形式的傅里叶级数为:
注意:这就将0到正无穷的范围扩展到了负无穷到正无穷,就是为什么做傅里叶变化之后会出现负的频率。指数形式表示的信号频谱图中,每个分量nw1的幅度一分为2,在正负频率上相对应的位置上个为一半,所以,只有把正、负频率上对应的这两条谱线矢量相加起来才代表一个分量的幅度。复数频谱中出现的负频率是由于将sin(nw1t),cos(nw1t)写成指数形式的时,从数学观点自然分成了exp(-jnw1t)和exp(jnw1t)两项,负频率的出现完全是数学运算的结果只有把相应的正、负频率成对的合并起来,才是实际的频谱函数,。
三角形式的傅立叶级数频率为非负的,对应的频谱一般称为单边谱,
指数形式的傅立叶级数频率为整个实轴,所以称为双边谱。
最后回过头来想想:f(t)的指数形式也可以说明F(nw1)是代表各个频率点上的复数信息,说明了傅里叶变化的结果就是将时域变换到的频域去分析信号。
3DFT
接着来看一下离散傅里叶变化
DFT合成等式
其中
和N/2时,实数部分的计算要用下面的等式:
假设原始信号的峰值为A,那么FFT的结果的每个点(除了第一个点直流分量之外)的模值就是的A的N/2倍。而第一个点就是直流分量,他的模值就是直流分量的N倍。
首先,FFT(快速傅里叶变换)是一种实现DFT(离散傅里叶变换)的快速算法,是利用复数形式的离散傅里叶变换来计算实数形式的离散傅里叶变换)。
5Matlab程序举例
%%时域信号的表示,
Fs = 1000; % Sampling frequency
T = 1/Fs; % Sample time
L = 1000; % Length of signal
t = (0:L-1)*T; % Time vector
% Sum of a 50 Hz sinusoid and a 120 Hz sinusoid
x = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t);
y = x + 2*randn(size(t)); % Sinusoids plus noise
plot(Fs*t(1:50),y(1:50))
title('Signal Corrupted with Zero-Mean Random Noise')
xlabel('time (milliseconds)');
%%这样子横坐标代表实际时间。。
NFFT = 2^nextpow2(L); % Next power of 2 from length of y
f = Fs/2*linspace(0,1,NFFT/2+1);
%%%频域也有NFFT个点,频域中每两个点之间的间隔为Fs/NFFT;
%%%因此f的坐标设置为FS*(0:NFFT-1)/NFFT;
% Plot single-sided amplitude spectrum.
plot(f,2*abs(Y(1:NFFT/2+1)))
title('Single-Sided Amplitude Spectrum of y(t)')
xlabel('Frequency (Hz)')
ylabel('|Y(f)|')
Matlab 之 FFT的理解和应用的更多相关文章
- MATLAB中FFT的使用方法
MATLAB中FFT的使用方法 说明:以下资源来源于<数字信号处理的MATLAB实现>万永革主编 一.调用方法X=FFT(x):X=FFT(x,N):x=IFFT(X);x=IFFT(X, ...
- [转载]Matlab中fft与fftshift命令的小结与分析
http://blog.sina.com.cn/s/blog_68f3a4510100qvp1.html 注:转载请注明出处——by author. 我们知道Fourier分析是信号处理里很重要的技术 ...
- matlab中fft快速傅里叶变换
视频来源:https://www.bilibili.com/video/av51932171?t=628. 博文来源:https://ww2.mathworks.cn/help/matlab/ref/ ...
- MATLAB中fft函数的正确使用方法
问题来源:在阅读莱昂斯的<数字信号处理>第三章离散傅里叶变换时,试图验证实数偶对称信号的傅里叶变换实部为偶对称的且虚部为零.验证失败.验证信号为矩形信号,结果显示虚部是不为零且最大幅值等于 ...
- [转载]MATLAB中FFT的使用方法
http://blog.163.com/fei_lai_feng/blog/static/9289962200971751114547/ 说明:以下资源来源于<数字信号处理的MATLAB实现&g ...
- MatLab实现FFT与功率谱
FFT和功率谱估计 用Fourier变换求取信号的功率谱---周期图法 clf; Fs=1000; N=256;Nfft=256;%数据的长度和FFT所用的数据长度 n=0:N-1;t=n/Fs;%采 ...
- 一个蒟蒻对FFT的理解(蒟蒻也能看懂的FFT)
建议同学们先自学一下"复数(虚数)"的性质.运算等知识,不然看这篇文章有很大概率看不懂. 前言 作为一个典型的蒟蒻,别人的博客都看不懂,只好自己写一篇了. 膜拜机房大佬 HY 一. ...
- matlab 中fft的用法
一.调用方法X=FFT(x):X=FFT(x,N):x=IFFT(X);x=IFFT(X,N) 用MATLAB进行谱分析时注意: (1)函数FFT返回值的数据结构具有对称性. 例:N=8;n=0:N- ...
- 【转】MATLAB conv2函数的理解
另附:http://blog.csdn.net/anan1205/article/details/12313593 原文:http://blog.csdn.net/andrewseu/article/ ...
随机推荐
- Java对象的初始化顺序
new一个对象时,该对象的初始化顺序如下 : 父类中的静态成员变量 父类中的静态代码块 子类中的静态成员变量 子类中的静态代码块 父类中的非静态变量 父类中的非静态代码块 父类构造函数 子类中的非静态 ...
- 我的 VSCode 常用扩展
Beautify (option+shift+F) Bookmarks (option+option+k,l,j) Debugger for Chrome Docker EditorConfig fo ...
- asp.net服务器上无法发送邮件的问题
前几天为开发的网站做了个发送邮件的功能,但是部署到服务器上无法发送邮件,提示由于目标机器积极拒绝,无法连接.在网上找到了一个解决办法 如果安装了McAfee杀毒软件(按照“手工安装方法”安装),首先需 ...
- Python写入CSV文件的问题
这篇文章主要是前几天我处理数据时遇到的三个问题: Python写入的csv的问题 Python2与Python3处理写入写入空行不同的处理方式 Python与Python3的编码问题 其实上面第3个问 ...
- Java进阶3. 内存回收机制
Java进阶3. 内存回收机制 20131029 前言: 学过C++的都知道,C++中内存需要程序员自己维护.说道这里,很多开发的同学就感觉很痛苦,当他转向Java的时候,就会说你看Java多好啊,程 ...
- 抽奖小程序,js,canvas
js写的网页抽奖小程序,先上截图 源码地址:https://github.com/xiachaoxulu/raffle
- Node.js 全栈开发(一)——Web 开发技术演化
这些年一直不断接触学习 Node 技术栈,个人的技术开发学习兴趣也越来越倾向 node 流.也许是由于英语的关系,也许是因为墙增加了学习国外一手资料的难度,加上现在流行的 web 开发技术并不太容易上 ...
- JQuery iframe
子页面获取父页面的元素 function colisetapTJ() { var tapid = $('div:contains("添加档案报送"):last', window.p ...
- SQL2008R2 收缩数据库问题 - 日志文件不变小
数据库的日志文件(*.ldf)越来越大,怎么办? 收缩吧.收缩日志文件的操作真不简单哟,还跟数据库的恢复模式有关啊. 一.“简单恢复模式”时的日志收缩 1. 截断日志 当数据库的恢复模式为“简单”的时 ...
- ES获取磁盘使用率情况
private void diskUage() { ClusterStateResponse stateResponse = client.admin().cluster().prepareState ...