频谱分析是一种非常重要的信号处理方法,在机械设备故障诊断、振动系统分析、电力系统、无线电通信、信息图像处理和自动控制等学科中都有重要应用。频谱分析的核心是1965年Cooely-Tukey发表的快速傅里叶变换算法(简称FFT),它是离散傅里叶变换(DFT)的快速算法。FFT算法的各种语言实现包已经相当成熟,不需要自己来重新写源代码,本文使用matlab自带的fft函数来实现频谱分析。实际信号可能是连续无限长时间的,但是计算机在处理的时候只能是有限长度的离散信号,所以需要对信号进行采样。FFT用的时候是对有限长度的信号进行计算的。一段采集的实际信号给你的时候,往往只知道数据和采样频率,根据数据和采样频率就可以进行频谱分析了。当然,如果你有一段10000个点的数据,你也可以只截取其中感兴趣的N个点进行频谱分析,这里就等效为采集了N个点进行分析。

基本名词解释: 为信号的采样频率,为采样点数,也是频谱分析和FFT计算的点数, 为采样时间间隔, 为时域截断窗长, 为频率分辨率,也就是频谱中相邻两条谱线间的频率间隔。这些变量有如下关系:

,         

理论部分请看这篇博客:频谱分析和FFT算法总结—理论基础

FFT的实现过程,这里不做介绍,直接看matlab中的计算结果。

1.首先来看一下常规的FFT计算

指定信号的参数,采样频率为 1 kHz,信号持续时间为 1.5 秒。

matlab代码如下:

clear;close all
Fs = 1000;            % 采样频率
T = 1/Fs;             % 采样周期
L = 1500;             % 截取的信号长度
t = (0:L-1)*T;        % 时间矢量
%构造一个信号,其中包含幅值为 0.7 的 50 Hz 正弦量和幅值为 1 的 120 Hz 正弦量
X = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t);
% X = S + 2*randn(size(t));%用均值为零、方差为 4 的白噪声扰乱该信号。
%在时域中绘制原始信号
subplot(2,1,1),plot(1000*t(1:100),X(1:100))
title('部分原始信号X(t)')
xlabel('t (milliseconds)')
ylabel('X(t)')
%计算信号的傅里叶变换
Y = fft(X);
%计算双侧频谱 P2。然后基于 P2 和偶数信号长度 L 计算单侧频谱 P1。
P2 = abs(Y/L);
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1);
%定义频域 f 并绘制单侧幅值频谱 P1。与预期相符,频率和幅值与理论相同
f = Fs*(0:(L/2))/L;
subplot(2,1,2),plot(f,P1)
title('X(t)的单边幅值谱')
xlabel('f (Hz)')
ylabel('|P1(f)|')

计算结果如图1所示:

图1

从图1可以看出,计算的频谱(幅值和频率)与理论相同,没有误差。有时候我们也会遇到对数据进行补零以达到数据点数为2的n次幂的情况。

2.如果原始数据插值(重采样)或者补零到2的n次方个再进行频谱分析,结果会如何?

我们知道FFT分析的时候一般要求数据点数为2的n次幂,所以matlab中提供了Y=fft(x,N)这个函数,如果数据x的长度小于N,则为x补上尾零以达到长度N;如果x的长度大于N,则对x进行截断以达到长度N。或者通过插值使原始信号达到2的n次幂个数据。分别来看这两种情况。

1)补零的matlab程序如下:

clear;close all
Fs = 1000;            % 采样频率
T = 1/Fs;             % 采样周期
L = 1500;             % 截取的信号长度
t = (0:L-1)*T;        % 时间矢量
%构造一个信号,其中包含幅值为 0.7 的 50 Hz 正弦量和幅值为 1 的 120 Hz 正弦量
X = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t);
% X = S + 2*randn(size(t));%用均值为零、方差为 4 的白噪声扰乱该信号。
%在时域中绘制原始信号
subplot(2,1,1),plot(1000*t(1:100),X(1:100))
title('部分原始信号X(t)')
xlabel('t (milliseconds)')
ylabel('X(t)')
%计算信号的傅里叶变换
n = length(X);      %获取数据点数
N = 2^nextpow2(n);  %nextpow2(n)获得大于等于n的最大整数次幂
Y = fft(X,N);
%计算双侧频谱 P2。然后基于 P2 和偶数信号长度 N 计算单侧频谱 P1。
P2 = abs(Y/N);
P1 = P2(1:N/2+1);
P1(2:end-1) = 2*P1(2:end-1);
%定义频域 f 并绘制单侧幅值频谱 P1。
f = Fs*(0:(N/2))/N;
subplot(2,1,2),plot(f,P1)
title('X(t)的单边幅值谱')
xlabel('f (Hz)')
ylabel('|P1(f)|')

计算结果如图2所示:

图2

从图2可以看出,本来是1500个数据,补零以达到2048个数据点之后,计算的频谱在频率和幅值方面都产生了误差,出现频谱泄露,原因是补零之后,数据相对原始信号发生了改变,已不是初始信号了。

2)插值的matlab程序如下:

clear;close all
Fs = 1000;            % 采样频率
T = 1/Fs;             % 采样周期
L = 1500;             % 截取的信号长度
t = (0:L-1)*T;        % 时间矢量
%构造一个信号,其中包含幅值为 0.7 的 50 Hz 正弦量和幅值为 1 的 120 Hz 正弦量
X = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t);
% X = S + 2*randn(size(t));%用均值为零、方差为 4 的白噪声扰乱该信号。
%在时域中绘制原始信号
subplot(2,1,1),plot(1000*t(1:100),X(1:100))
title('部分原始信号X(t)')
xlabel('t (milliseconds)')
ylabel('X(t)')
%计算信号的傅里叶变换
n = length(X);      %获取数据点数
N = 2^nextpow2(n);  %nextpow2(n)获得大于等于n的最大整数次幂
X1 = resample(X,N,n);%升采样到2048个数据
Y = fft(X1);
%计算双侧频谱 P2。然后基于 P2 和偶数信号长度 N 计算单侧频谱 P1。
P2 = abs(Y/N);
P1 = P2(1:N/2+1);
P1(2:end-1) = 2*P1(2:end-1);
%定义频域 f 并绘制单侧幅值频谱 P1。
f = Fs*2048/1500*(0:(N/2))/N;
subplot(2,1,2),plot(f,P1)
title('X(t)的单边幅值谱')
xlabel('f (Hz)')
ylabel('|P1(f)|')

插值前后的信号波形对比如图3所示:

图3

从图3可以看出,插值后信号波形变得光滑了。重采样函数resample用法见matlab文档说明。

计算结果如图4所示:

图4

从图4来看,插值计算的结果频率是正确的,幅值有一点点误差,但要比补零好很多。

综上,在用matlab进行频谱分析的时候,一般情况下不需要进行补零和插值操作,但需要进行对数据进行去趋势项操作。

3.趋势项对频谱分析的影响

这里考虑最简单的情况,在原始信号上加上直流分量,结果对比如图5所示:

图5

可以看出,如果不去直流分量,频谱分析中会在0Hz出产生很大的一个值,影响结果。

4.噪声对频谱分析的影响

在原始信号中加入均值为零、方差为 4 的白噪声来扰乱该信号

matlab代码如下:

clear;close all
Fs = 1000;            % 采样频率
T = 1/Fs;             % 采样周期
L = 1500;             % 截取的信号长度
t = (0:L-1)*T;        % 时间矢量
%构造一个信号,其中包含幅值为 0.7 的 50 Hz 正弦量和幅值为 1 的 120 Hz 正弦量
S = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t);
X = S + 2*randn(size(t));%用均值为零、方差为 4 的白噪声扰乱该信号。
%在时域中绘制原始信号
subplot(2,1,1),plot(1000*t(1:100),X(1:100))
title('部分原始信号X(t)')
xlabel('t (milliseconds)')
ylabel('X(t)')
%计算信号的傅里叶变换
Y = fft(X);
%计算双侧频谱 P2。然后基于 P2 和偶数信号长度 L 计算单侧频谱 P1。
P2 = abs(Y/L);
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1);
%定义频域 f 并绘制单侧幅值频谱 P1。与预期相符,频率和幅值与理论相同
f = Fs*(0:(L/2))/L;
subplot(2,1,2),plot(f,P1)
title('X(t)的单边幅值谱(去均值)')
xlabel('f (Hz)')
ylabel('|P1(f)|')

结果如图6所示:

图6

从图6中可以看出,加入噪声之后,会对频谱分析的幅值有一定影响,对频率成分基本没有影响。

后面会继续写一写频谱分析误差校正等方面的知识,欢迎大家留言交流!

参考文献:

matlab官方关于fft函数的教程:https://ww2.mathworks.cn/help/matlab/ref/fft.html

[Matlab科学计算] 频谱分析和FFT算法总结相关推荐

  1. matlab科学计算的应用,精通MATLAB科学计算与数据统计应用 高清版pdf[12MB]

    在各行各业的工程实践中,有大量的科学计算工作需要完成.传统的计算方式一般需要较长的周期,相比之下开发效率极高的MATLAB是一个更好的选择.在MATLAB中,编程细节被简化,繁琐的实现过程也被略去,用 ...

  2. matlab科学计算软件,数据分析软件 Matlab 科学计算软件 科软网——专业正版软件供应商...

    创建二维图形并自定义线条 向图形添加标题.坐标轴标签和图例 合并多个绘图 指定坐标轴范围 创建包含双 y 轴的图. 以交互方式添加文本到图形 二维图和三维图绘制连续.离散.曲面以及三维体数据图 格式和 ...

  3. MATLAB科学计算机lnx代码,[2018年最新整理]Matlab科学计算.ppt

    [2018年最新整理]Matlab科学计算 Matlab与科学计算 计算机学院 刘咏梅 Email:liuyongmei@hrbeu.edu.cn 第二章 MATLAB数值计算基础 Introduct ...

  4. matlab gausspdf,《精通MATLAB科学计算》(王正林 编著).pdf

    <精通MATLAB科学计算>(王正林编著).pdf<精通MATLAB科学计算>(王正林编著).pdf [General Information] 书名=精通MATLAB科学计算 ...

  5. matlab 计算图像质量因数,matlab科学计算-中国大学mooc-试题题目及答案

    matlab科学计算-中国大学mooc-试题题目及答案 更多相关问题 换算因数表示被测物质的摩尔质量与称量形式的摩尔质量的比值,且物质的被测元素在分子,分母中原子 滴定管读数最后一位不一致是系统误差. ...

  6. matlab科学计算及分析,matlab科学计算

    spContent=当前,科学计算已经成为科学研究.技术创新的重要方法与手段,而作为实现工具的科学计算软件无疑具有至关重要的作用.MATLAB为众多领域的计算问题提供了全面的解决方案,代表了当今国际科 ...

  7. matlab科学计算 书,MATLAB与科学计算(第3版)

    <MATLAB与科学计算(第3版)> 第1章 安装及使用前的准备1 1.1 MATLAB简介1 1.1.1 21世纪的科学计算语言1 1.1.2 MATLAB的发展历史3 1.1.3 MA ...

  8. 史上最全MatLAB科学计算工作站硬件配置方案

    (一)MATLAB及工具箱计算特点汇总 MATLAB是美国MathWorks公司出品的商业数学软件,用于算法开发.数据可视化.数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和 ...

  9. [Matlab科学计算] Matlab工具箱介绍和常用工具箱命令

    首先介绍一下常用工具箱的调用命令,这部分持续更新,遇到再补充,也欢迎大家在评论区补充. 1.优化工具箱:optimtool 2.系统辨识工具箱 :ident 3.数字信号处理工具箱:sptool 4. ...

最新文章

  1. “拟态防御”: 让黑客找不到破门之机
  2. dedecms代码研究三
  3. 正则化、归一化含义解析(一)
  4. toB产品经理的KPI
  5. 20-100-010-安装-Flink集群安装 flink-1.4.0-bin-hadoop27-scala_2.11
  6. centos6+ 将程序 注册到 service进行启动 停止 重启等:以nginx为例,添加nginx脚本
  7. C++笔记(2018/2/7)
  8. 想了解能源互联网?看这篇就够了
  9. 第三单元JML地铁系统博客 By Wazaki
  10. vs2010专业板产品密钥
  11. 计算机对舞蹈影响,计算机技术在舞蹈教学中的应用
  12. tempo jsnode扩展 3d图形支持。
  13. 从汇编的角度理解什么是引用
  14. win10使用VMware Workstations安装CentOS
  15. MQTT:QoS服务质量 0,1,2(Quality of Service 0, 1 2)
  16. MarkDown的第一次接触
  17. CString - 详解
  18. C语言中Const指针变量(常指针)
  19. 23种设计模式:(二)结构型模式
  20. uniGui删除服务器文件,彻底取消unigui /server页面

热门文章

  1. 【Python】基于Python获取链家小区房价信息及其POI数据
  2. 神策数据付力力:新一代的营销数据平台
  3. 【机器学习】异常检测
  4. JavaScript中与Array有关的操作
  5. 知识图谱从入门到应用——知识图谱的技术结构
  6. Unity模糊远处物体,近处清晰,景深效果
  7. php实现24点游戏,24点游戏的开发和实现(VC++)
  8. 接口显示返回值正常,但是拿到的值却是undefined?
  9. OTT广告价值「锋芒毕露」,谁能蚕食更大市场?
  10. js学习笔记(1)什么是JavaScript