【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

相关文章

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

python中Hash使用场景分析

《python中Hash使用场景分析》Python的hash()函数用于获取对象哈希值,常用于字典和集合,不可变类型可哈希,可变类型不可,常见算法包括除法、乘法、平方取中和随机数哈希,各有优缺点,需根... 目录python中的 Hash除法哈希算法乘法哈希算法平方取中法随机数哈希算法小结在Python中,

Java Stream的distinct去重原理分析

《JavaStream的distinct去重原理分析》Javastream中的distinct方法用于去除流中的重复元素,它返回一个包含过滤后唯一元素的新流,该方法会根据元素的hashcode和eq... 目录一、distinct 的基础用法与核心特性二、distinct 的底层实现原理1. 顺序流中的去重

关于MyISAM和InnoDB对比分析

《关于MyISAM和InnoDB对比分析》:本文主要介绍关于MyISAM和InnoDB对比分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录开篇:从交通规则看存储引擎选择理解存储引擎的基本概念技术原理对比1. 事务支持:ACID的守护者2. 锁机制:并发控制的艺

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis

从基础到进阶详解Pandas时间数据处理指南

《从基础到进阶详解Pandas时间数据处理指南》Pandas构建了完整的时间数据处理生态,核心由四个基础类构成,Timestamp,DatetimeIndex,Period和Timedelta,下面我... 目录1. 时间数据类型与基础操作1.1 核心时间对象体系1.2 时间数据生成技巧2. 时间索引与数据

Python主动抛出异常的各种用法和场景分析

《Python主动抛出异常的各种用法和场景分析》在Python中,我们不仅可以捕获和处理异常,还可以主动抛出异常,也就是以类的方式自定义错误的类型和提示信息,这在编程中非常有用,下面我将详细解释主动抛... 目录一、为什么要主动抛出异常?二、基本语法:raise关键字基本示例三、raise的多种用法1. 抛