Matlab可以说是一个非常有用且功能齐全的工具,在通信、自控、金融等方面有广泛的应用。

本文讨论使用Matlab对信号进行频域分析的方法。

说到频域,不可避免的会提到傅里叶变换,傅里叶变换提供了一个将信号从时域转变到频域的方法。之所以要有信号的频域分析,是因为很多信号在时域不明显的特征可以在频域下得到很好的展现,可以更加容易的进行分析和处理。

FFT

Matlab提供的傅里叶变换的函数是FFT,中文名叫做快速傅里叶变换。快速傅里叶变换的提出是伟大的,使得处理器处理数字信号的能力大大提升,也使我们生活向数字化迈了一大步。

接下来就谈谈如何使用这个函数。

fft使用很简单,但是一般信号都有x和y两个向量,而fft只会处理y向量,所以想让频域分析变得有意义,那么就需要用户自己处理x向量

一个简单的例子

从一个简单正弦信号开始吧,正弦信号定义为:

我们现在通过以下代码在Matlab中画出这个正弦曲线

fo = 4; %frequency of the sine waveFs = 100; %sampling rateTs = 1/Fs; %sampling time intervalt = 0:Ts:1-Ts; %sampling periodn = length(t); %number of samplesy = 2*sin(2*pi*fo*t); %the sine curve%plot the cosine curve in the time domainsinePlot = figure;plot(t,y)xlabel('time (seconds)')ylabel('y(t)')title('Sample Sine Wave')grid

这就是我们得到的:

当我们对这条曲线fft时,我们希望在频域得到以下频谱(基于傅里叶变换理论,我们希望看见一个幅值为1的峰值在-4Hz处,另一个在+4Hz处)

使用FFT命令

我们知道目标是什么了,那么现在使用Matlab的内建的FFT函数来重新生成频谱


%plot the frequency spectrum using the MATLAB fft commandmatlabFFT = figure; %create a new figureYfreqDomain = fft(y); %take the fft of our sin wave, y(t)stem(abs(YfreqDomain)); %use abs command to get the magnitude%similary, we would use angle command to get the phase plot!%we'll discuss phase in another post though!xlabel('Sample Number')ylabel('Amplitude')title('Using the Matlab fft command')gridaxis([0,100,0,120])

效果如下:

但是注意一下,这并不是我们真正想要的,有一些信息是缺失的

  • x轴本来应该给我们提供频率信息,但是你能读出频率吗?

  • 幅度都是100

  • 没有让频谱中心为

为FFT定义一个函数来获取双边频谱

以下代码可以简化获取双边频谱的过程,复制并保存到你的.m文件中

function [X,freq]=centeredFFT(x,Fs)%this is a custom function that helps in plotting the two-sided spectrum%x is the signal that is to be transformed%Fs is the sampling rateN=length(x);%this part of the code generates that frequency axisif mod(N,2)==0k=-N/2:N/2-1; % N evenelsek=-(N-1)/2:(N-1)/2; % N oddendT=N/Fs;freq=k/T; %the frequency axis%takes the fft of the signal, and adjusts the amplitude accordinglyX=fft(x)/N; % normalize the dataX=fftshift(X); %shifts the fft data so that it is centered

这个函数输出正确的频域范围和变换后的信号,它需要输入需要变换的信号和采样率。

接下来使用前文的正弦信号做一个简单的示例,注意你的示例.m文件要和centeredFFT.m文件在一个目录下

[YfreqDomain,frequencyRange] = centeredFFT(y,Fs);centeredFFT = figure;%remember to take the abs of YfreqDomain to get the magnitude!stem(frequencyRange,abs(YfreqDomain));xlabel('Freq (Hz)')ylabel('Amplitude')title('Using the centeredFFT function')gridaxis([-6,6,0,1.5])

效果如下:

这张图就满足了我们的需求,我们得到了在+4和-4处的峰值,而且幅值为1.

为FFT定义一个函数来获取右边频谱

从上图可以看出,FFT变换得到的频谱是左右对称的,因此,我们只需要其中一边就能获得信号的所有信息,我们一般保留正频率一侧。

以下的函数对上面的自定义函数做了一些修改,让它可以帮助我们只画出信号的正频率一侧

function [X,freq]=positiveFFT(x,Fs)N=length(x); %get the number of pointsk=0:N-1; %create a vector from 0 to N-1T=N/Fs; %get the frequency intervalfreq=k/T; %create the frequency rangeX=fft(x)/N; % normalize the data%only want the first half of the FFT, since it is redundantcutOff = ceil(N/2);%take only the first half of the spectrumX = X(1:cutOff);freq = freq(1:cutOff);

和前面一样,使用正弦信号做一个示例,下面是示例代码

[YfreqDomain,frequencyRange] = positiveFFT(y,Fs);positiveFFT = figure;stem(frequencyRange,abs(YfreqDomain));set(positiveFFT,'Position',[500,500,500,300])xlabel('Freq (Hz)')ylabel('Amplitude')title('Using the positiveFFT function')gridaxis([0,20,0,1.5])

效果如下:

--------------------------------------------

本文内容主要翻译自Matlab官方FFT教程,但是我找不到原链接了,就把我电脑上的文件上传到了百度云盘,公众号后台回复

下载|FFT_tutorial

获取下载链接

------------------------------------------------

本文代码以上传github,可自行下载测试,链接:

https://github.com/greedyhao/DSP/tree/master/matlab_tutorial

-------------------------------------------------

如何使用matlab进行频域分析相关推荐

  1. 物联网控制原理与技术--基于Matlab/利用MATLAB进行频域分析(伯德图)的应用(超详细/设计/实验/作业/练习)

    目录 课程名:物联网控制原理与技术 内容/作用:设计/实验/作业/练习 学习:利用MATLAB进行频域分析(伯德图) 一.前言 二.环境与设备 三.原理 四.内容 五.结果与分析 课程名:物联网控制原 ...

  2. matlab做频域,如何使用matlab进行频域分析

    Matlab可以说是一个非常有用且功能齐全的工具,在通信.自控.金融等方面有广泛的应用. 本文讨论使用Matlab对信号进行频域分析的方法. 说到频域,不可避免的会提到傅里叶变换,傅里叶变换提供了一个 ...

  3. matlab 信号频域分析,如何使用matlab进行频域分析

    Matlab可以说是一个非常有用且功能齐全的工具,在通信.自控.金融等方面有广泛的应用. 本文讨论使用Matlab对信号进行频域分析的方法. 说到频域,不可避免的会提到傅里叶变换,傅里叶变换提供了一个 ...

  4. 单自由度系统的振动的幅频特性曲线及相频特性曲线及matlab分析,实验四 线性系统的频域分析...

    实验四 线性系统的频域分析 一.实验目的 1.掌握用MA TLAB 语句绘制各种频域曲线. 2.掌握控制系统的频域分析方法. 二.基础知识及MATLAB 函数 频域分析法是应用频域特性研究控制系统的一 ...

  5. matlab求两方程交点坐标,matlab求交点坐标

    b xi ? 0(i ? 1, 2, , n) 三.线性规划问题的求解方法二元线性规划问题的图解法 线性规划问题的理论解法 线性规划问题的MATLAB软件解法 线性规划问题的图解...... MATL ...

  6. matlab 倍频,matlab倍频程分析

    关于倍频程的概念 声音信号的频率范围为 20Hz 到 20KHz,在声音信号频谱分析一般不需要对每个频率成分进行 具体分析.为了方便起见,人们把 20Hz 到 20KHz 的声频...... 第四章 ...

  7. P7 频域分析法-《Matlab/Simulink与控制系统仿真》程序指令总结

    上一篇 回到目录 下一篇 <Matlab/Simulink与控制系统仿真>程序指令总结 Matlab_Simulink_BookExample 7. 频域分析法 7.1 Matlab 函数 ...

  8. matlab多变量频域设计工具箱,10.4.3用MATLAB实现连续系统的频域分析.ppt

    10.4.3用MATLAB实现连续系统的频域分析.ppt 第10章 MATLAB在信号与系统分析中的应用 10.0 引 言 一般来说,MATLAB系统包括下面五个主要部分. (1)编程语言:是一种以矩 ...

  9. matlab计算频域动态性能指标,基于MATLAB自动控制系统时域频域分析与仿真.doc

    word文档 可编辑复制 word文档 可编辑复制 基于MATLAB的自动控制系统时域频域分析与仿真 摘 要 自动控制系统就是在无人直接操作或干预的条件下,通过控制装置使控制对象自动的按照给定的规律运 ...

最新文章

  1. xnawindowsph日本 Phone x Phone iphone 4 座机 复古电话手机座 听筒 防辐射
  2. 关于ASP.NET 中站点地图sitemap 的使用
  3. centos 7 minimal connect: Network is unreachable和ifconfig command not found
  4. C#与C++的几个不同之处知识点
  5. Linux Ubuntu 修改Grub,添加删除启动项,初步辨析Grub文件。
  6. moosefs mysql_moosefs搭建与应用
  7. Unity3D热更新之LuaFramework篇[06]--Lua中是怎么实现脚本生命周期的
  8. 【转载】计算机操作系统出现死锁的原因
  9. JavaScript学习笔记:创建自定义对象
  10. 使用ASP.NET Core、JavaScript和Angular防止CSRF攻击
  11. 分布式锁实现的几种方式(DB,Redis,Zookeeper)
  12. python+appium 自动化2--元素定位uiautomatorviewer
  13. linux每日命令(1):which
  14. java怎么递归_什么是递归?用Java写一个简单的递归程序
  15. adb工具下载及安装
  16. 目标优化之帕累托最优
  17. Wireshark 导出特定分组
  18. mysql:Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (111)解决方法
  19. JAVA数组首位末位互换_堆和堆傻傻分不清?一文告诉你 Java 集合中「堆」的最佳打开方式...
  20. 计算机怎么打开隐藏的项目,展示win10系统怎么打开隐藏文件夹

热门文章

  1. 论文阅读:Pointwise Convolutional Neural Networks
  2. C++ multimap的简单使用
  3. 应用导航通用术语珍藏版
  4. MySQL执行查询语句时出现停滞状态,出现Waiting for table metadata lock的问题
  5. html 淡出淡入轮播图,用CSS3 transition属性实现淡入淡出轮播图
  6. 1053: 正弦函数
  7. html中搜索栏怎么写,html搜索框怎么做
  8. KnockoutJs 进阶学习
  9. 最大公约数 / 最小公倍数
  10. div overflow属性