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

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

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

FFT

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

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

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

一个简单的例子

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

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

fo = 4; %frequency of the sine wave

Fs = 100; %sampling rate

Ts = 1/Fs; %sampling time interval

t = 0:Ts:1-Ts; %sampling period

n = length(t); %number of samples

y = 2*sin(2*pi*fo*t); %the sine curve

%plot the cosine curve in the time domain

sinePlot = 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 command

matlabFFT = figure; %create a new figure

YfreqDomain = 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')

grid

axis([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 rate

N=length(x);

%this part of the code generates that frequency axis

if mod(N,2)==0

k=-N/2:N/2-1; % N even

else

k=-(N-1)/2:(N-1)/2; % N odd

end

T=N/Fs;

freq=k/T; %the frequency axis

%takes the fft of the signal, and adjusts the amplitude accordingly

X=fft(x)/N; % normalize the data

X=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')

grid

axis([-6,6,0,1.5])

效果如下:

这张图就满足了我们的需求,我们得到了在+4和-4处的峰值,而且幅值为1.为FFT定义一个函数来获取右边频谱

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

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

function [X,freq]=positiveFFT(x,Fs)

N=length(x); %get the number of points

k=0:N-1; %create a vector from 0 to N-1

T=N/Fs; %get the frequency interval

freq=k/T; %create the frequency range

X=fft(x)/N; % normalize the data

%only want the first half of the FFT, since it is redundant

cutOff = ceil(N/2);

%take only the first half of the spectrum

X = 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')

grid

axis([0,20,0,1.5])

效果如下:

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

大部分内容是根据Matlab的FFT教程翻译的,但是源文档的下载链接找不到了

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

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

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

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

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

  1. matlab 信号插零,【 MATLAB 】MATLAB 实现模拟信号采样后的重建(二)零阶保持(ZOH)...

    这篇博文我们使用零阶保持器(ZOH)来重建信号,采用的案例依然是上篇博文中的案例: 模拟信号: 对该信号使用两种不同的采样频率采样. a. 在 fs = 5000 对信号进行采样 b. 在 fs = ...

  2. matlab 信号生成,如何利用Matlab产生单音信号

    单音信号,既单一频率的信号,在测试IFFT/FFT正确性时,我们常常用到单音信号,一般需要的单音信号时是复数形式: fm = 2e6 ;  %信号频率 fs = 122.88e6; %采样速率 w = ...

  3. matlab+信号+mpf,Python和Matlab中平均频率的差异

    我有这个EMG signal,我想根据这个article绘制平均功率频率.我使用以下代码在Matlab中实现它:clear all; close all; EMG=load('EMG.txt'); N ...

  4. 单位冲激信号 matlab,信号与系统的MATLAB仿真(4.1-4.9)

    函数名 功能(产生***信号) 函数名 功能(产生***信号) sawtooth 锯齿波(三角波) pulstran 冲激串 square 方波 rectpuls 非周期的方波 sinc 抽样(sin ...

  5. matlab 信号的原子产生,MATLAB随机产生原子结构代码

    在计算材料学中极少的情况下,我们可能会需要随机产生一个模拟盒子内的原子结构,一般用于测试. 这样说,其实只要rand一个数组就可以了,但是我们又希望这个结构又能够大致满足一些物理上的限制,而不是纯粹数 ...

  6. matlab 复频域,MATLAB信号与系统分析(四)——离散信号与系统的复频域分析及MATLAB实现...

    一.系统的z变换和反变换 1.利用部分分式展开求解逆Z变换: 2.例子 3.Z变换的MATLAB函数 clear all f=sym('cos(a*k)'); F=ztrans(f) F=sym('z ...

  7. LTI的频域分析matlab,matlab与信号实验连续lti系统的频域分析

    matlab与信号实验连续lti系统的频域分析 上机实验 3 连续 LTI 系统的频域分析一.实验目的 (1).掌握连续时间信号傅立叶变换和傅立叶逆变换的实现方法,以及傅立叶变换的时移特性,傅立叶变换 ...

  8. LTI的频域分析matlab,matlab与信号实验——连续lti系统的频域分析x26lc.doc

    matlab与信号实验--连续lti系统的频域分析x26lc 上机实验3 连续LTI系统的频域分析一.实验目的 (1).掌握连续时间信号傅立叶变换和傅立叶逆变换的实现方法,以及傅立叶变换的时移特性,傅 ...

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

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

  10. matlab 复频谱图,基于MATLAB实现连续信号与系统复频域分析

    题目:基于MATLAB实现连续信号与系统复频域分析 摘要 拉普拉斯变换(Laplace Transform),是工程数学中常用的一种积分变换.它是为简化计算而建立的实变量函数和复变量函数间的一种函数变 ...

最新文章

  1. activemq 异步和同步接收
  2. python constructor_python – 无法成功启动boa-constructor
  3. dubbo-admin安装和简单使用
  4. 2017-2018-1 20155327 《信息安全系统设计基础》第7周学习总结
  5. LNMP--Nginx代理详解
  6. PHP代码重用与函数编写
  7. 网络状态检测的利器 - ss命令
  8. webkit未能加载文件或程序集WebKitBrowser
  9. cents7+tomcat
  10. 数据库 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\test1.mdf' 已存在。请选择其他数据库
  11. 将3D坐标转成2D坐标的方法
  12. 不同风格吉他曲目收录
  13. vue使用upload上传附件
  14. Google Pay 初步集成
  15. shell 实现ping检测存活主机(多进程后台实现)
  16. c++调用动态库失败解决办法
  17. 继承(extends)
  18. 配置rtools 4.0 https://cran.r-project.org/bin/windows/Rtools/
  19. 学会思考--菜鸟程序员晋升大神之路
  20. e的x次方在python中怎么打出来_#e的x次方在excel里面怎么打出来#excel中10的几次方怎么输入...

热门文章

  1. android平台下拼图游戏设计,android 拼图游戏 源码下载
  2. 详解PHP反序列化漏洞
  3. 第一个web项目:东升数学
  4. 佳能600D入门秘籍(五)
  5. 【附源码】Java计算机毕业设计安卓基于Android健康饮食搭配的设计与实现(程序+LW+部署)
  6. MindNode 打印的时候,去除灰色背景色
  7. 组合和继承之间的区别
  8. 基于STM32设计的动态密码锁
  9. CG动画制作项目第九篇:动作捕捉(二)
  10. Word 毕业设计中期报告,论文排版常用操作汇总