【MATLAB基础】频谱分析

2024-04-13 01:28
文章标签 分析 基础 matlab 频谱

本文主要是介绍【MATLAB基础】频谱分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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));%对应连续小波变换中的离散取值endend
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: md(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:4for k = m_sample+1:mmk = k-m_sample;for j = 1:4d1(:,:) = 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;endendif(i == mk_i)m_right (i)= m_right(i) + 1;endend    
end

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

结果输出

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

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

这篇关于【MATLAB基础】频谱分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/898775

相关文章

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

C#基础之委托详解(Delegate)

《C#基础之委托详解(Delegate)》:本文主要介绍C#基础之委托(Delegate),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 委托定义2. 委托实例化3. 多播委托(Multicast Delegates)4. 委托的用途事件处理回调函数LINQ

找不到Anaconda prompt终端的原因分析及解决方案

《找不到Anacondaprompt终端的原因分析及解决方案》因为anaconda还没有初始化,在安装anaconda的过程中,有一行是否要添加anaconda到菜单目录中,由于没有勾选,导致没有菜... 目录问题原因问http://www.chinasem.cn题解决安装了 Anaconda 却找不到 An

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

C++ 各种map特点对比分析

《C++各种map特点对比分析》文章比较了C++中不同类型的map(如std::map,std::unordered_map,std::multimap,std::unordered_multima... 目录特点比较C++ 示例代码 ​​​​​​代码解释特点比较1. std::map底层实现:基于红黑

Spring、Spring Boot、Spring Cloud 的区别与联系分析

《Spring、SpringBoot、SpringCloud的区别与联系分析》Spring、SpringBoot和SpringCloud是Java开发中常用的框架,分别针对企业级应用开发、快速开... 目录1. Spring 框架2. Spring Boot3. Spring Cloud总结1. Sprin

Spring 中 BeanFactoryPostProcessor 的作用和示例源码分析

《Spring中BeanFactoryPostProcessor的作用和示例源码分析》Spring的BeanFactoryPostProcessor是容器初始化的扩展接口,允许在Bean实例化前... 目录一、概览1. 核心定位2. 核心功能详解3. 关键特性二、Spring 内置的 BeanFactory

MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析

《MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析》本文将详细讲解MyBatis-Plus中的lambdaUpdate用法,并提供丰富的案例来帮助读者更好地理解和应... 目录深入探索MyBATis-Plus中Service接口的lambdaUpdate用法及示例案例背景

MyBatis-Plus中静态工具Db的多种用法及实例分析

《MyBatis-Plus中静态工具Db的多种用法及实例分析》本文将详细讲解MyBatis-Plus中静态工具Db的各种用法,并结合具体案例进行演示和说明,具有很好的参考价值,希望对大家有所帮助,如有... 目录MyBATis-Plus中静态工具Db的多种用法及实例案例背景使用静态工具Db进行数据库操作插入

Go使用pprof进行CPU,内存和阻塞情况分析

《Go使用pprof进行CPU,内存和阻塞情况分析》Go语言提供了强大的pprof工具,用于分析CPU、内存、Goroutine阻塞等性能问题,帮助开发者优化程序,提高运行效率,下面我们就来深入了解下... 目录1. pprof 介绍2. 快速上手:启用 pprof3. CPU Profiling:分析 C