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

音频信号处理笔记(二)

文章目录

      • 1.1.3 过零率
      • 1.1.4 谱质心和子带带宽
      • 1.1.5 短时傅里叶分析法
      • 1.1.6 小波变换

相关课程: 音频信号处理及深度学习教程
傅里叶分析之掐死教程(完整版)更新于2014.06.06 - 知乎 (zhihu.com)

1.1.3 过零率

过零率:是一个信号符号变化的比率,即在每中语音信号从正变为负或从负变为正的次数。(语音识别、音乐信息检索,过零率越大,频率近似越高)

image-20230218172553973

计算第t帧信号过零点数:

代码如下:

# 信号的过零率
# 0. 预设环境
import librosa
import numpy as np
from matplotlib import pyplot as plt
import librosa.display# 1.加载信号
wave_path_absolute = r"E:\VoiceDev\audio_data\speech_this_song.wav"
wave_path = "../audio_data/music_piano.wav"
waveform, sample_rate = librosa.load(wave_path_absolute, sr=None)# 2.定义函数,功能:计算每一帧的过零率
def Calc_ZCR(waveform, frame_length, hop_length):# 如果按照帧长来分割信号,余下部分不能形成一个帧则需要补0if len(waveform) % hop_length != 0:frame_num = int((len(waveform) - frame_length) / hop_length) + 1pad_num = frame_num * hop_length + frame_length - len(waveform)  # 补0个数waveform = np.pad(waveform, pad_width=(0, pad_num), mode="wrap")  # 补0操作frame_num = int((len(waveform) - frame_length) / hop_length) + 1waveform_zcr = []for t in range(frame_num):current_frame = waveform[t * (frame_length - hop_length):t * (frame_length - hop_length) + frame_length]a = np.sign(current_frame[0:frame_length-1, ])b = np.sign(current_frame[1:frame_length, ])current_zcr = np.sum(np.abs(a-b))/2/frame_lengthwaveform_zcr.append(current_zcr)return np.array(waveform_zcr)# 3. 设置参数:每一帧长1024,以50%的重叠率分帧,调用该函数
frame_size = 1024
hop_size = int(frame_size * 0.5)
waveform_ZCR = Calc_ZCR(waveform=waveform, frame_length=frame_size, hop_length=hop_size)# 4.绘制图像
frame_scale = np.arange(0,len(waveform_ZCR),step=1)
time_scale = librosa.frames_to_time(frame_scale,hop_length=hop_size)
plt.figure(figsize=(20, 10))
plt.plot(time_scale, waveform_ZCR, color='red')
plt.title("Zero-Cross-rate")
plt.show()# 5. 利用librosa.feature
waveform_ZCR_librosa = librosa.feature.zero_crossing_rate(y=waveform, frame_length=frame_size, hop_length=hop_size).T[1:,0]
plt.figure(figsize=(20, 10))
plt.plot(time_scale, waveform_ZCR_librosa, color='red')
plt.title("Zero-Cross-rate-librosa")
plt.show()bias = waveform_ZCR_librosa - waveform_ZCR
print(f"the bias is {bias}\n Congratulation!")

运行结果:

使用自己写的函数结果图:

image-20230218172630734

使用librosa库函数:

image-20230218172654104

1.1.4 谱质心和子带带宽

谱质心 Spectral centroid

频率成分的重心,是频谱中在一定频率范围内通过能量加权平均的频率,其单位是Hz。(声音的明亮度,低沉的声音谱质心低,欢快明亮的声音谱质心高,声色)

image-20230219155939025

子带带宽 Bandwidth

在Spectral centroid的频谱范围,计算每一点到谱质心的距离的加权平均值(音频识别)

代码如下:

# 信号的频域特征
import librosa
import numpy as np
from matplotlib import pyplot as plt# 1. 加载信号
jazz_path = r"E:\VoiceDev\audio_data\jazz.wav"
jazz, sr = librosa.load(jazz_path, sr=None)rock_path = r"E:\VoiceDev\audio_data\rock.wav"
rock, sr = librosa.load(rock_path, sr=None)blues_path = r"E:\VoiceDev\audio_data\blues.wav"
blues, sr = librosa.load(blues_path, sr=None)orchestra_path = r"E:\VoiceDev\audio_data\orchestra.wav"
orchestra, sr = librosa.load(orchestra_path, sr=None)# 2. 获取信号的Spectral centroid(谱质心)
sc_jazz = librosa.feature.spectral_centroid(y=jazz, n_fft=1024).T[:, 0]
sc_rock = librosa.feature.spectral_centroid(y=rock, n_fft=1024).T[:, 0]
sc_blues = librosa.feature.spectral_centroid(y=blues, n_fft=1024).T[:, 0]
sc_orchestra = librosa.feature.spectral_centroid(y=orchestra, n_fft=1024).T[:, 0]fig, aix = plt.subplots(2, 2)
aix[0, 0].plot(np.arange(0, len(sc_jazz)), sc_jazz, linewidth=1)
aix[0, 0].set_title("Jazz")
aix[0, 1].plot(np.arange(0, len(sc_rock)), sc_rock, linewidth=1)
aix[0, 1].set_title("Rock")
aix[1, 0].plot(np.arange(0, len(sc_blues)), sc_blues, linewidth=1)
aix[1, 0].set_title("Blues")
aix[1, 1].plot(np.arange(0, len(sc_orchestra)), sc_orchestra, linewidth=1)
aix[1, 1].set_title("Orchestra")
fig.suptitle("Spectral centroid")
plt.show()# 3. 获取信号的Spectral bandwidth
sw_jazz = librosa.feature.spectral_bandwidth(y=jazz, n_fft=1024).T[:, 0]
sw_blues = librosa.feature.spectral_bandwidth(y=blues, n_fft=1024).T[:, 0]
sw_rock = librosa.feature.spectral_bandwidth(y=rock, n_fft=1024).T[:, 0]
sw_orchestra = librosa.feature.spectral_bandwidth(y=orchestra, n_fft=1024).T[:, 0]figure, aix = plt.subplots(2, 2)
aix[0, 0].plot(np.arange(0, len(sw_jazz)), sw_jazz, linewidth=1)
aix[0, 0].set_title("Jazz")
aix[0, 1].plot(np.arange(0, len(sw_rock)), sw_rock, linewidth=1)
aix[0, 1].set_title("Rock")
aix[1, 0].plot(np.arange(0, len(sw_blues)), sw_blues, linewidth=1)
aix[1, 0].set_title("Blues")
aix[1, 1].plot(np.arange(0, len(sw_orchestra)), sw_orchestra, linewidth=1)
aix[1, 1].set_title("Orchestra")
figure.suptitle("Spectral bandwidth")
plt.show()

运行结果:

image-20230219160225944

image-20230219160233802

加窗处理

image-20230211202357594

1.1.5 短时傅里叶分析法

由于声信号往往是随时间变化的,在短时间内可以近似看做平稳(对于语音来说是几十毫秒的量级)所以我们希望把长的声音切短,来观察其随时间的变化情况,由此产生STFT分析方式。

FFT与STFT对比
STFT在时域中对信号进行加窗处理 (分),所以最终结果是有关时域频域的信息,时域的信息是每一帧帧长 (窗函数的长度)

关系:如果窗函数带宽长,则包络中的精细结构较少,疏松,得到窄带语谱图,有较好的频域分辨率,但时域分辨率较差,如果窗函数带宽窄,则包络中的精细结构较多,密集,得到宽带语谱图,有较好的时域分辨率,但频域分辨率较差;

获取不同时刻、不同频率的频谱图(能量分布情况)

代码如下:

import librosa
import numpy as np
from matplotlib import pyplot as plt# 1.加载信号
wave_path = r"E:\VoiceDev\audio_data\music_piano.wav"
waveform, sample_rate = librosa.load(wave_path, sr=None)# 2.信号分帧:补零->分帧->加窗
frame_size, hop_size = 1024, 512
if len(waveform) % hop_size != 0:frame_num = int((len(waveform) - frame_size) / hop_size) + 1pad_num = frame_num * hop_size + frame_size - len(waveform)waveform = np.pad(waveform, pad_width=(0, pad_num), mode="wrap")
frame_num = int((len(waveform) - frame_size) / hop_size) + 1
# 分帧 ?
row = np.tile(np.arange(0, frame_size), (frame_num, 1))
column = np.tile(np.arange(0, frame_num * (frame_size - hop_size), (frame_size - hop_size)), (frame_size, 1)).T
index = row + column
waveform_frame = waveform[index]
# 加窗 ?
waveform_frame = waveform_frame * np.hanning(frame_size)# 3.信号做傅里叶变换np.fft.rfft(waveform_frame,n _fft)
n_fft = 1024
waveform_stft = np.fft.rfft(waveform_frame, n_fft)# 4.功率谱函数
waveform_pow = np.abs(waveform_stft)**2/n_fft
waveform_db = 20 * np.log10(waveform_pow) # 分贝# 5.绘制波形
plt.figure(figsize=(10,10))
plt.imshow(waveform_db)
y_ticks = np.arange(0,int(n_fft/2),100)
plt.yticks(ticks=y_ticks,labels=y_ticks*sample_rate/n_fft)
plt.title("Waveform_STFT")
plt.show()

运行结果如下:

得到语谱图

image-20230220160624944

我们也可以使用librosa库提供的函数获取语谱图,代码如下:

# 语谱图
def plot_spectrogram(spectrogram, title="spectrogram(dB)"):plt.imshow(librosa.amplitude_to_db(spectrogram))plt.title(title)plt.xlabel("Frame/s")plt.ylabel("Frequency/hz")plt.colorbar()plt.show()# 设置参数,调用librosa.stft函数
n_fft = 1024
hop_size = 512
waveform_stft = librosa.stft(y=waveform,n_fft=n_fft,hop_length=hop_size)
plot_spectrogram(np.abs(waveform_stft))

1.1.6 小波变换

相关文章:

音频信号处理笔记(二)

文章目录1.1.3 过零率1.1.4 谱质心和子带带宽1.1.5 短时傅里叶分析法1.1.6 小波变换相关课程: 音频信号处理及深度学习教程傅里叶分析之掐死教程(完整版)更新于2014.06.06 - 知乎 (zhihu.com)1.1.3 过零率 过零率:是一个信号符号…...

钓鱼网站+bypassuac提权

本实验实现1 :要生成一个钓鱼网址链接,诱导用户点击,实验过程是让win7去点击这个钓鱼网站链接,则会自动打开一个文件共享服务器的文件夹,在这个文件夹里面会有两个文件,当用户分别点击执行后,则…...

合并两个有序链表——递归解法

题目描述21. 合并两个有序链表难度简单2922收藏分享切换为英文接收动态反馈将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1:输入:l1 [1,2,4], l2 [1,3,4]输出:[1,1,2,3,4,4]示例…...

ADRC自抗扰控制总结

目录 前言 1.ADRC形式 1.1形一 1.2形二 2.被控对象 3.仿真分析 3.1仿真模型 3.2仿真结果 4.学习问题 前言 前面的3篇文章依次介绍了微分跟踪器TD、状态观测器ESO和非线性状态误差反馈NLSEF三部分内容,至此ADRC的结构已经介绍完毕,现在对分块学习…...

3年工作之后是不是还在“点点点”,3年感悟和你分享....

经常都有人问我软件测试前景怎么样,每年也都帮助很多朋友做职业分析和学习规划,也很欣慰能够通过自己的努力帮到一些人进入到大厂。 2023年软件测试行业的发展现状以及未来的前景趋势 最近很多测试人在找工作的时候,明显的会发现功能测试很…...

【自动化测试】web自动化测试验证码如何测?如何处理验证码问题?解决方案......

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 在对安全性有要求的…...

面试浅谈之 C++ STL 篇

面试浅谈之 C STL 篇 一 🏠 概述 HELLO,各位博友好,我是阿呆 🙈🙈🙈 这里是面试浅谈系列,收录在专栏面试中 😜😜😜 本系列将记录一些阿呆个人整理的面试题…...

【PTA Advanced】1144 The Missing Number(C++)

目录 题目 Input Specification: Output Specification: Sample Input: Sample Output: 思路 代码 题目 Given N integers, you are supposed to find the smallest positive integer that is NOT in the given list. Input Specification: Each input file contains…...

oracle的sqlnet.ora文件配置传输加密算法

sqlnet.ora文件位于ORACLE_HOME/network/admin目录中。sqlnet.ora文件中增加如下:SQLNET.ENCRYPTION_SERVER REQUIRED SQLNET.ENCRYPTION_TYPES_SERVER (RC4_256) SQLNET.CRYPTO_CHECKSUM_SERVER REQUIRED SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER MD5SQLNET.ENCRYP…...

RK3568存储性能测试

USBU盘储存性能参数(USB3.0接口)参数测试条件最小典型最大单位说明写速度写入1GB数据—32.6—MB/sU盘型号:KODAK,32GB USB3.0读速度读取1GB数据—66.7—MB/s 备注HW356X-CORE-4GB-32GBHW356X-GKA,操作系统:LinuxU盘储存性能参数(U…...

Homekit智能家居一智能灯泡

一、什么是智能灯 传统的灯泡是通过手动打开和关闭开关来工作。有时,它们可以通过声控、触控、红外等方式进行控制,或者带有调光开关,让用户调暗或调亮灯光。 智能灯泡内置有芯片和通信模块,可与手机、家庭智能助手、或其他智能…...

轻量级 Java 权限认证框架——Sa-Token

文章目录Sa-Token 介绍SpringBoot 集成 Sa-TokenSa-Token 功能登录认证会话查询Token 查询权限认证权限校验角色校验注解鉴权注册 Sa-Token 拦截器关闭注解校验路由拦截鉴权注册 Sa-Token 路由拦截器[记住我] 模式密码加密Sa-Token 集成 Redis方式1、使用 jdk 默认序列化方式方…...

算法复习(四、五、六)

动态规划 动态规划算法的有效性依赖于问题本身所具有的两个重要性质:最优子结构、重叠子问题 关于动态规划算法和备忘录方法的适用条件: 要求: 用分治法和动态规划法分别解决最大子段和问题(第四步求最优解不需要掌握&#xff…...

SORT与DeepSORT简介

一、MOT( mutil-object tracking)步骤 在《DEEP LEARNING IN VIDEO MUTIL-OBJECT TEACKING: A SURVEY》这篇基于深度学习多目标跟踪综述中,描绘了MOT问题的四个主要步骤 1.跟定视频原始帧 2.使用目标检测器如Faster-rcnn, YOLO, SSD等进行检测,获取目标…...

TCP/IP网络编程——多播与广播

完整版文章请参考: TCP/IP网络编程完整版文章 文章目录第 14 章 多播与广播14.1 多播14.1.1 多播的数据传输方式以及流量方面的优点14.1.2 路由(Routing)和 TTL(Time to Live,生存时间),以及加入组的办法14…...

K8S DNS解析过程和延迟问题

一、Linux DNS查询解析原理(对于调用glibc库函数gethostbyname的程序)我们在浏览器访问www.baidu.com这个域名,dns怎么查询到这台主机呢?  1、在浏览器中输入www.baidu.com域名,操作系统会先查找本地DNS解析器缓存&a…...

【JavaScript】js实现深拷贝的方法

前言 在js中我们想要实现深拷贝,首先要了解深浅拷贝的区别。 浅拷贝:只是拷贝数据的内存地址,而不是在内存中重新创建一个一模一样的对象(数组) 深拷贝:在内存中开辟一个新的存储空间,完完全全…...

RK3288 GPIO记录

1、引脚对应的GPIO 编号第一种 使用/sys/kernel/debug/gpio查询所有gpio引脚的基数第二种 cat /sys/class/gpio/gpiochip248/label对应的label就是GPIO引脚,例如下图GPIO8对应的基数就是2482、计算编号编号 基数 PIN脚如GPIO8的基数是248, GPIO8_A6的编…...

MongoDB介绍及使用教程

文章目录一、MongoDB介绍1. 什么是MongoDB2. 为什么要用MongoDB3. MongoDB的应用场景4. MongoDB基本概念二、MongoDB使用教程1.下载安装(Windows)2.MongoDB Conpass简单使用(选学)3.使用navicat连接MongoDB4.JAVA项目中使用MongoD…...

51单片机开发环境搭建 - VS Code 从编写到烧录

我安装并测试成功的环境: 操作系统:Windows 10 (22H2)单片机:STC89C52RCPython version: 3.7.6 在这之前,给51单片机写程序是用 Keil 5(编写编译)、STC-ISP(烧录),由于…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...

安卓基础(Java 和 Gradle 版本)

1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...