当前位置: 首页 > news >正文

MATLAB学习:频谱图的绘制

1.概述

时域信号经FFT变换后得到了频谱,在作图时还必须设置正确的频率刻度,这样才能从图中得到正确的结果。

2.案例分析

下面透过一个简单的例子来分析频谱图中频率刻度(横坐标)的设置的重要性。一余弦信号,信号频率为30Hz,采样频率100Hz,信号长128,在FFT后做谱图,代码如下:

clear; clc; close all;
fs=128;                         % 采样频率
N=128;                          % 信号长度
t=(0:N-1)/fs;                   % 时间序列
y=cos(2*pi*30*t);               % 余弦信号
Y=fft(y,N);                     % FFT
f=linspace(0,64,64);
plot(f,abs(Y(1:64)),'k');
% xlim([25 35]);
xlabel('频率(Hz)'); ylabel('幅值');

谱分析后,最大值谱线应该在30Hz处。从图中看到得到的最大值谱线在30Hz与31Hz之间为30.47Hz,这表明信号不是30Hz的正弦信号,其频率在30Hz与31Hz之间,这明显不符合初始设置。发生这种错误的原因是频率刻度的设置错误。

3.解决方法

当N为偶数和N为奇数时频率刻度的设置方法稍有不同。这里讨论N为偶数和奇数的情况。

clear all; clc; close all;
fs=128;                         % 采样频率
N=128;                          % 信号长度
t=(0:N-1)/fs;                   % 时间序列
y=cos(2*pi*30*t);               % 余弦信号
y=fft(y,N);                     % FFT
freq=(0:N/2)*fs/N;              % 按式(2-2-6c)设置正频率刻度 
% 作图
plot(freq,abs(y(1:N/2+1)),'k')
xlabel('频率(Hz)'); ylabel('幅值');
title('频谱图')
set(gcf,'color','w');

运行程序后,图中频率刻度符合式(2-2-6),只用了正频率来表示。本例中用的信号与案例分析中用的信号是相同的,但从图2-2-3中可看到,最大值的谱线在30Hz处,与信号设置频率一致。但是此时的频率对了但是其幅值无法体现信号的真实幅值因此需要进一步的处理。

关键部分代码如下:

function Hutu_FFT(data, fs)
N=length(data);
fft_data=fft(data);
if mod(N, 2) == 1
freq=(0:N/2)*fs/N;
magY=abs(fft_data(1:N/2+1))*2/N;
plot(freq,magY,'k');else
freq=(0:(N-1)/2)*fs/N;
magY=abs(fft_data(1:(N-1)/2+1))*2/N;
plot(freq,magY,'k');
end
set(gca,'FontWeight','normal','LineWidth',0.8, ...'XMinorTick','off','XGrid','on','YGrid','on','YMinorTick','off','GridLineStyle', '--',...'FontSize',10,'FontAngle','normal' ,'FontSmoothing','on') 
title('\fontname{宋体}频谱图')                                                  %标题
xlabel('\fontname{宋体}频率/\fontname{Times new roman}\it{Hz}');                 %x轴标签
ylabel('\fontname{宋体}幅值/\fontname{Times new roman}\it{mm}');                %y轴标签
end

本人编写画频谱图函数的使用说明

clear; clc; close all;
fs=128;                         % 采样频率
N=128;                          % 信号长度
t=(0:N-1)/fs;                   % 时间序列
y=cos(2*pi*30*t);               % 余弦信号
Y=fft(y,N);                     % FFT
f=linspace(0,64,64);
figure;Hutu_FFT(y, fs)

使用本人编写的频谱图函数的效果图,可看出可以较好得到信号所在的频率和幅值相关信息

获取代码请关注MATLAB科研小白的个人公众号(即文章下方二维码),并回复频谱图的绘制本公众号致力于解决找代码难,写代码怵。各位有什么急需的代码,欢迎后台留言~不定时更新科研技巧类推文,可以一起探讨科研,写作,文献,代码等诸多学术问题,我们一起进步。

相关文章:

  • Rviz 复选框插件
  • 小猪APP分发:让你的应用轻松上架,免费分发
  • eNSP学习——OSPF被动接口配置
  • 同一份工程代码上传到多个不同的git地址的配置方法
  • Vulnhub靶机 whowantsobeking :1 打靶 渗透详细过程(萌新)
  • 常见文本分类小模型
  • 滚珠花键在工业自动化领域中有什么优势?
  • 在Bash中解析命令行参数的两种样例脚本
  • layui table在不发送请求时更新templet操作列
  • 小程序唯品会Authorization sign
  • 使用html2canvas和jspdf导出pdf包含跨页以及页脚
  • 回答网友问题:在C# 中调用非托管DLL
  • 基于Spring 框架中的@Async 注解实现异步任务
  • Spring Aware接口:揭秘Bean生命周期中的“先知”角色与源码剖析
  • 第十三届蓝桥杯国赛大学B组填空题(c++)
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • conda常用的命令
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • JavaScript标准库系列——Math对象和Date对象(二)
  • MySQL数据库运维之数据恢复
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • React-flux杂记
  • Zsh 开发指南(第十四篇 文件读写)
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 成为一名优秀的Developer的书单
  • 关于extract.autodesk.io的一些说明
  • 开源地图数据可视化库——mapnik
  • 区块链将重新定义世界
  • 使用Gradle第一次构建Java程序
  • 我从编程教室毕业
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • Linux权限管理(week1_day5)--技术流ken
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • 通过调用文摘列表API获取文摘
  • #QT(一种朴素的计算器实现方法)
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (2022 CVPR) Unbiased Teacher v2
  • (6)添加vue-cookie
  • (CVPRW,2024)可学习的提示:遥感领域小样本语义分割
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (原)本想说脏话,奈何已放下
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转)关于pipe()的详细解析
  • (转载)PyTorch代码规范最佳实践和样式指南
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本