【MATLAB基础】频谱分析

news2024/11/23 13:14:30

01.引言

频率是单位时间内某事件重复发生的次数,用ω表示,单位是赫兹(Hz)。设m时间内某事件重复发生n次,则此事件发生的频率ω为一。又因为周期定义为重复事件发生的最小时间间隔,故频率也可以表示为周期的倒数:ω=n/m,T表示周期。频率是一个很重要的概念,在工程数学中常用于分析信号特征。其最早在地震波的应用中显示优势。从最早的Fourier分析,到改变其整体性而出现的Gabor变换,再到连续小波变换,本章将沿着这条主线,介绍小波分析出现的全过程。

02.主要内容

1.基于Fourier分析的频谱图

fun = @(x)0.*(x<0 |x>5)+x.*(x>=0 & x<1)+1.*(x>=1 & x<4) +(5-x).*(x>=4 & x<5);%分段函数
x=-5:0.2:10;%x自变量
y=fun(x);%得到输入的平稳信号y
Dfy = fft(y);%离散Fourier变换
Dfy_shift = fftshift(Dfy); %对称变换得到对称的Fourier频谱
figure
plot(y); axis([0,80,-0.05,1.05]),xlabel('n'),ylabel('y');%原始平稳信号
figure
plot(abs(Dfy)),xlabel('n'),ylabel('|Dfy|');%|Dft|为离散频谱幅值信息
figure
plot(abs(Dfy_shift)),xlabel('n'),ylabel('|Dfy|');%对称变换后的频谱

2.基于Gabor变换的平面频谱图

%主函数:Gabor变换频谱
x=-5:0.2:10;%x自变量
a = 1; %Gauss窗口函数的窗口大小参数
b = -5:0.2:10; %平移参数,一般为原始信号长度。
Dfy = zeros(length(b),length(b));
for i = 1:length(b)
    	GDfy(i,:) = fft(Gb_fun(a,b(i),x));%针对不同的b的离散Fourier变换
    	GDfy_shift(i,:) = fftshift(GDfy(i,:));%平移频率中心
end
%绘制频谱立体图和图像
figure
mesh(abs(GDfy)); xlabel('b'),ylabel('w'),zlabel('|Gabor(a,w)|');
figure
imshow(abs(GDfy));
imwrite(abs(GDfy),'Fig2-4(b)ImGabor.jpg','jpg')
%绘制对称变换后的频谱立体图和图像
figure
mesh(abs(GDfy_shift)); xlabel('b'),ylabel('w'),zlabel('|Gabor(a,w)|');
figure
imshow(abs(GDfy_shift));
imwrite(abs(GDfy_shift),'Fig2-5(b)ImGaborShift.jpg','jpg')

3.基于连续小变换的频谱

%针对同一个分段函数,我们采用“Haar“小波分解,得到小波的频谱
fun = @(x)0.*(x<0 |x>5)+x.*(x>=0 & x<1)+1.*(x>=1 & x<4) +(5-x).*(x>=4 & x<5);%分段函数
x=-5:0.2:10;%x自变量
y = fun(x);
figure
Cab = cwt(y,1:2:32,'haar','3Dplot');%连续小波变换,并进行频谱幅值的三维显示
figure
Cab = cwt(y,1:2:32,'haar','plot');%连续小波变换,并进行频谱幅值的图像显示
%这段程序也可以按照Gabor变换的方式显示,即
a = 1:2:32;
b = 1:length(y);
Cab = cwt(y,1:2:32,'haar');%连续小波变换,并进行频谱幅值的三维显示
figure
mesh(b,a,abs(Cab)),xlabel('b'),ylabel('a'),zlabel('|Cab|');
figure
imshow(abs(Cab));
imwrite(abs(Cab),'Fig2-6(d)Cwt.jpg','jpg')

4.基于离散小波变换频谱

fun = @(x)0.*(x<0 |x>5)+x.*(x>=0 & x<1)+1.*(x>=1 & x<4) +(5-x).*(x>=4 & x<5);%分段函数
%为离散小波实现做准备,此处采样值加细为2^-5。
x=-5:2^(-5):10;%x自变量
y = fun(x);
%二进小波实现,离散a,不离散b
k = -5:5;
a = 2.^k;
figure
djb = cwt(y,a,'haar','3Dplot');%连续小波变换在2进制点处取值,并进行频谱幅值的三维显示
figure
djb = cwt(y,a,'haar','plot');% 连续小波变换在2进制点处取值,并进行频谱幅值的图像显示
%离散小波实现,直接取djb的平移的整数点值。
n = -5:10;%平移整数点值
b_k = ones(length(n),length(a));%平移整数点在对应的自变量x中的位置序号
for i = 1:length(a)
    for j  = 1:length(n)
        an = a(i)*n(j);%整平移,对应的连续小波变换中的实际平移,即b =  a*n,
        if(an>=-5 & an <=10 )
            b_k(i,j) = find(an == x);%找到对应实际平移的位置序号
            djk(i,j) = djb(i, b_k(i,j));%对应连续小波变换中的离散取值
        end
    end
end
figure
imshow(djk),colormap(pink);

03.实例:音频信号的频谱特征提取

1. 加载数据

load data1 c1
load data2 c2
load data3 c3
load data4 c4

这些代码加载了四个不同类别的音频数据,分别存储在 c1c2c3c4 中。

2. 连续小波变换(CWT)

for i = 1: m
    d(1,i,:,:) = cwt(c1(i,:),a,'haar');
    d(2,i,:,:) = cwt(c2(i,:),a,'haar');
    d(3,i,:,:) = cwt(c3(i,:),a,'haar');
    d(4,i,:,:) = cwt(c4(i,:),a,'haar');
end

这个循环对每个音频数据 c1c2c3c4 做连续小波变换,并将结果存储在 d 数组中。a 是尺度因子数组,表示不同的尺度。这里使用 ‘haar’ 小波作为变换基函数。

3. 提取特征

d_value(:,:,:) = sum(d(:,1:m_sample,:,:),2)./m_sample;

这一步计算每个类别在前 m_sample 个样本上的连续小波特征的平均值,用于后续的分类。

4. 显示连续小波特征图像

subplot(2,2,1);
imshow(dd1,[]);title('data1');
subplot(2,2,2);
imshow(dd2,[]); title('data2');
subplot(2,2,3);
imshow(dd3,[]); title('data3');
subplot(2,2,4);
imshow(dd4,[]); title('data4');

这部分将四类音乐的平均连续小波特征图像显示在一个 2x2 的子图中,并存储为图片文件。

5. 分类识别

for i = 1:4
    for k = m_sample+1:m
        mk = k-m_sample;
        for j = 1:4
            d1(:,:) = d(i,k,:,:);
            d2(:,:) = d_value(j,:,:);
            r = norm(d1-d2,2);
            if(r < m_min(mk,i))
                m_min(mk,i)= r;
                mk_i = j;
            end
        end
        if(i == mk_i)
            m_right (i)= m_right(i) + 1;
        end
    end    
end

这部分代码用于识别测试集中的样本。对于每个测试样本,计算其与每个类别的平均连续小波特征的欧氏距离,并选择距离最小的类别作为预测类别。最后统计每个类别的识别正确数量。

结果输出

m_score = m_right./m_test
score  = sum(m_score)./4

计算并输出每个类别的识别率(正确识别数除以总测试样本数),以及所有类别的平均识别率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1589230.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

43.基于SpringBoot + Vue实现的前后端分离-疫苗发布和接种预约系统(项目 + 论文)

项目介绍 本次使用Java技术开发的疫苗发布和接种预约系统&#xff0c;就是运用计算机来管理疫苗接种预约信息&#xff0c;该系统是可以实现论坛管理&#xff0c;公告信息管理&#xff0c;疫苗信息管理&#xff0c;医生管理&#xff0c;医院信息管理&#xff0c;用户管理&#x…

2022年蓝桥杯省赛——星期计算

目录 题目链接&#xff1a;1.星期计算 - 蓝桥云课 (lanqiao.cn) 题目描述 思路 代码实现 BigInteger常用方法 BigDecimal常用方法 总结 题目链接&#xff1a;1.星期计算 - 蓝桥云课 (lanqiao.cn) 题目描述 一直今天是星期六&#xff0c;请问 天后是星期几。 注意用数字…

第四百五十六回

文章目录 1. 概念介绍2. 思路与方法2.1 实现思路2.2 使用方法 3. 内容总结 我们在上一章回中介绍了"overlay_tooltip用法"相关的内容&#xff0c;本章回中将介绍onBoarding包.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章回中介绍的onBo…

AI大模型创新交汇点:当AI遇见艺术

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

HarmonyOS实战开发-图片编辑、使用 TextArea 实现多文本输入

介绍 本示例使用 TextArea 实现多文本输入&#xff0c;使用 ohos.app.ability.common 依赖系统的图库引用&#xff0c;实现在相册中获取图片&#xff0c;使用 ohos.multimedia.image 生成pixelMap&#xff0c;使用pixelMap的scale()&#xff0c;crop()&#xff0c;rotate()接口…

LinkedHashMap 是如何保证返回的顺序性的?

LinkedHashMap 源码阅读 public class LinkedHashMap<K,V>extends HashMap<K,V>implements Map<K,V>先来看一下 LinkedHashMap 的继承关系&#xff0c;它继承了 HashMap&#xff0c;并且实现了 Map 接口。 LinkedHashMap 底层是 数组 链表 的形式&#xf…

HarmonyOS实战案例:【分布式账本】

简介 Demo基于Open Harmony系统使用ETS语言进行编写&#xff0c;本Demo主要通过设备认证、分布式拉起、分布式数据管理等功能来实现。 应用效果 设备认证,获取同一个局域网内的设备ID&#xff0c;并拉起应用 添加数据并在另一台设备显示该数据 开发步骤 开发文档&#xff…

记账本|基于SSM的家庭记账本小程序设计与实现(源码+数据库+文档)

家庭记账本小程序目录 基于SSM的家庭记账本小程序设计与实现 一、前言 二、系统设计 三、系统功能设计 1、小程序端&#xff1a; 2、后台 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大…

继承【C/C++复习版】

目录 一、什么是继承&#xff1f;怎么定义继承&#xff1f; 二、继承关系和访问限定符&#xff1f; 三、基类和派生类对象可以赋值转换吗&#xff1f; 四、什么是隐藏&#xff1f;隐藏vs重载&#xff1f; 五、派生类的默认成员函数&#xff1f; 1&#xff09;派生类构造函…

JVM基础:类的生命周期详解

JDK版本&#xff1a;jdk8 IDEA版本&#xff1a;IntelliJ IDEA 2022.1.3 文章目录 一. 生命周期概述二. 加载阶段(Loading)2.1 加载步骤2.2 查看内存中的对象 三. 连接阶段(Linking)3.1 连接之验证3.2 连接之准备3.3 连接阶段之解析 四. 初始化阶段(Initialization)4.1 单个类的…

vivado 使用基本触发器模式

使用基本触发器模式 基本触发器模式用于描述触发条件 &#xff0c; 即由参与其中的调试探针比较器组成的全局布尔公式。当“触发器模式 (Trigger Mode) ”设置为 BASIC_ONLY 或 BASIC_OR_TRIG_IN 时 &#xff0c; 即启用基本触发器模式。使用“基本触发器设置 (Basic Trig…

软件测试级别和对应要求

软件测试级别指的是将软件测试活动按照不同的开发阶段和测试目的进行分类&#xff0c;形成不同层次的测试过程。 分级依据&#xff0c;根据V模型 单元测试&#xff1a;这是软件生命周期中的第一个测试级别&#xff0c;主要针对软件的最小单元模块进行&#xff0c;例如类、函数…

二叉树学习

树 树是n个结点的有限集合&#xff0c;当n0时为空树&#xff0c;在任意一颗非空的树中&#xff0c;有且只有一个特定的称为根的结点&#xff0c;当n>1时&#xff0c;其余结点又可以分为m个不相交的有限集&#xff0c;其中每一个集合又是一棵树&#xff0c;并且称为根的子树…

opencv 多线程读取和显示摄像头【python源码】

在Python中&#xff0c;使用OpenCV库实现多线程读取和显示摄像头通常涉及创建多个线程&#xff0c;每个线程负责从摄像头捕获视频帧并显示它们。但是&#xff0c;请注意&#xff0c;OpenCV本身并不直接支持多线程显示&#xff0c;因为cv2.imshow通常是在主线程中运行的。然而&a…

imu6xl点灯(C语言)

参考正点原子开发指南 根据原理图可以看出&#xff0c;我们需要设置低电平导通电路。 在原理图上找到LED0&#xff0c;对应IO为GPIO3 IO复用配置 IMX6UL每个引脚都可以复用 在用户手册第30章可以找到IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03这个寄存器&#xff0c;地址为0x020E0068&…

JavaScript函数式编程

函数式编程 课程介绍 为什么要学习函数编程以及什么是函数式编程函数式编程的特性(纯函数、柯里化、函数组合等)函数式编程的应用场景函数式编程库Lodash 为什么要学习函数式编程 函数式编程是非常古老的一个概念&#xff0c;早于第一台计算机的诞生&#xff0c; 函数式编程…

gpt系列概述——从gpt1到chatgpt

GPT建模实战&#xff1a;GPT建模与预测实战-CSDN博客 OpenAI的GPT&#xff08;Generative Pre-trained Transformer&#xff09;系列模型是自然语言处理领域的重要里程碑。从2018年至2020年&#xff0c;该公司相继推出了GPT-1、GPT-2和GPT-3&#xff0c;这些模型在文本生…

是时候将 DevOps 可见性扩展到网络边缘了

尽管部署前运行了大量测试&#xff0c;但在部署应用程序后&#xff0c;性能问题经常让 DevOps 团队感到困惑。经过进一步调查&#xff0c;最常被忽视的问题是应用程序本身的分布式特性。从多个位置访问应用程序的最终用户永远不会拥有相同水平的互联网服务&#xff0c;因此在纽…

python使用ffmpeg分割视频为Hls分片文件/使用OpenSSL加密m3u8和TS文件

FFmpeg和OpenSSL是一个开源免费的软件&#xff0c;在官网上就能下载&#xff0c; FFmpage网址&#xff08;建议选择文件名full结尾的文件&#xff09;&#xff1a;Builds - CODEX FFMPEG gyan.dev OpenSSL网址&#xff08;建议选择win64的MSI文件&#xff09;&#xff1a;Win3…

OpenAI现已普遍提供带有视觉应用程序接口的GPT-4 Turbo

OpenAI宣布&#xff0c;其功能强大的GPT-4 Turbo with Vision模型现已通过公司的API全面推出&#xff0c;为企业和开发人员将高级语言和视觉功能集成到其应用程序中开辟了新的机会。 PS&#xff1a;使用Wildcard享受不受网络限制的API调用&#xff0c;详情查看教程 继去年 9 月…