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编码方式再学
一直以来对编码方式对了解不是很深入.建议读下这几篇博文 学点编码知识又不会死:Unicode的流言终结者和编码大揭秘 编码研究笔记 这几篇博文上回答了内心存在的一些问题,这些问题可能也是大家经常遇到的 ...
- ansible入门七(实战)
Ansible实战:部署分布式日志系统 本节内容: 背景 分布式日志系统架构图 创建和使用roles JDK 7 role JDK 8 role Zookeeper role Kafka role ...
- 013——数组(十三) array_push array_rand array_reverse
<?php /* 数组 array_push array_rand array_reverse */ //array_push()在数组的末端,增加一个或多个元素,入栈 /*$array = a ...
- Django中关于事务的代码编写
Django中对于数据库的事务,默认每执行一句数据库操作,便会自动提交. 在Django中可以通过django.db.transaction模块提供的atomic来定义一个事务,atomic提供两种用 ...
- Selenium实现右键保存图片(Java)
1.代码 public class SaveImage extends TestCase { private WebDriver driver; private Actions action; pri ...
- onunload、onbeforeunload事件详解--zhuan
最近项目中做到一个功能:在上传页面用户开始上传文件之后用户点击任意跳转都需要弹出提示层进行二次确定才允许他进行跳转,这样做的目的是为了防止用户的错误操作导致这珍贵的UGC 流失(通常用户在一次上传不成 ...
- 手机通过笔记本开的WIFI访问TOMCAT服务器站点示例
我一直想用手机连上笔记本上的服务器TOMCAT,尝试了好久没连上,实验室一个妹子会这个技术,我也想学,自己摸索着学了几次,没成功,今晚想个办法试了一下,可以连接了,以后可以做手机网站开发了,这也是移动 ...
- 编写configure.ac
configure.ac由一些宏组成(如果已经有源代码,你可以运行autoscan来产生一个configure.scan文件,在此基础修改成configure.ac将更加方便) 最基本的组成可以是下面 ...
- iOS开发:UITableView的优化技巧-异步绘制Cell
最近在微博上看到一个很好的开源项目VVeboTableViewDemo,是关于如何优化UITableView的.加上正好最近也在优化项目中的类似朋友圈功能这块,思考了很多关于UITableView的优 ...
- PHP循环嵌套例子
循环嵌套1.实现如下效果:第一行第二行第三行第四行第五行1 2 3 4 51 2 3 4 51 2 3 4 51 2 3 4 52.实现如下效果图:第一行第二行第三行第四行第五行1 2 3 4 56 ...