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/ ...
随机推荐
- cf 833 A 数论
A. The Meaningless Game time limit per test 1 second memory limit per test 256 megabytes input stand ...
- wordcount程序出现map 100% reduce 0%问题的解决方法
运行wordcount程序一直停在map 100% reduce 0%, input文件夹的内容: 其中: f1.txt中的内容为:hello hadoop f2.txt中的内容为:hello had ...
- NetHogs 实时检测网络流量 转
有很多适用于Linux系统的开源网络监视工具.比如说,你可以用命令iftop来检查带宽使用情况. netstat用来查看接口统计报告,还有top监控系统当前运行进程.但是如果你想要找一个能够按进程实时 ...
- Day11 - Python操作memcache、redis缓存、rabbitMQ队列
本周课前必备: 1. Memcached 2. Python操作Memcached模块: https://pypi.python.org/pypi/python-memcached 3. Redis ...
- Python批量修改图片格式和尺寸
Python批量修改图片格式和尺寸 备注: 1.导入了PIL库,是处理图片用的,很强大; 2.导入了的win32库,是判断隐藏文件用的,我们的项目需要删除隐藏文件,不需要的可以直接找到删除. 3.导入 ...
- Spring源码解析-IOC容器的实现
1.IOC容器是什么? IOC(Inversion of Control)控制反转:本来是由应用程序管理的对象之间的依赖关系,现在交给了容器管理,这就叫控制反转,即交给了IOC容器,Spring的IO ...
- pulltoRefresh类图
- redis的list类型以及其操作
lists类型 给你个图;' lists类型以及操作List是一个链表结构,主要功能是push.pop.获取一个范围的所有值等等,操作中key理解为链表的名字.Redis的list类型其实就是每一个子 ...
- C++11_Type Traits
版权声明:本文为博主原创文章,未经博主允许不得转载. 识别变量的type id,返回true或false,举一个简单使用的例子 template <typename T> void typ ...
- dubbo 之filter使用
1.继承接口com.alibaba.dubbo.rpc.Filter实现public Result invoke(Invoker<?> invoker, Invocation invoca ...