news 2026/4/30 20:03:24

音频信号分析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
音频信号分析

目录

  • 信号分析简介
    • 什么是信号分析
    • 为什么要分析信号
    • 信号分析的方式
  • 信号的时频域分析
    • 信号的时域分析
      • 时域分析——幅值包络AE
      • 时域分析——均方根值RMS
      • 时域分析——过零率ZCR
    • 信号的频域分析
      • 谱质心
      • 子带带宽
    • 信号的时频分析——STFT
  • 傅里叶级数
    • 周期信号的傅里叶级数分析
      • 三角函数形式的傅里叶级数
      • 指数形式的傅里叶级数
      • 周期信号的功率特性
      • 函数的对称性与傅里叶系数的关系
      • 傅里叶有限级数与最小方均误差
    • 典型周期信号的傅里叶级数
      • 周期矩形脉冲信号
      • 周期锯齿脉冲信号
      • 周期三角脉冲信号
  • 傅里叶变换
    • 典型非周期信号的傅里叶变换
      • 单边指数信号
      • 双边指数信号
      • 矩形脉冲信号
      • 钟形脉冲信号
    • 傅里叶变换的基本性质
    • 卷积原理
    • 傅里叶变换(FT)的Python实现
      • FFT
      • 利用FFT和IFFT实现去噪
      • STFT
  • 语音信号处理
    • 频谱、时频图概念
    • 时域、频域概念

信号分析简介

什么是信号分析

  • 将一个复杂信号分解成若干简单信号分量之和,或者用有限的一组参量去表示一个复杂波形的信号,从这些简单的分量组成情况去考察复杂信号的特性;
  • 特征提取的过程,从一段复杂的波形中提取出我们需要的信息

为什么要分析信号

  • 信号分析是获取信号特征信息的重要手段,通过对信号分析,得到复杂信号的基本特征。
  • 信号分析是获取信号源特征信息的重要手段,人们往往可以通过对信号特征的详细了解,得到信号源特性、运行状况等信息。
  • 深度学习的第一步都是要收集数据集的特征(f e a t u r e featurefeature。所以需要信号分析,提取出信号数据集的特征集。

信号分析的方式

根据信号的类型:

  • 平稳信号:信号不随时间变化,可在时域和频域直接分析
  • 非平稳信号:信号随时间变化,需将信号拆解分析
    • 时间维度拆解:利用平均瞬时功率信号等,可以知道信号传播的规律
    • 频域维度拆解:按照不同频带的滤波器进行滤波处理,平均瞬时功率谱信号
    • 时频域维度拆解:同时包含信号随时间和频率变化的规律

信号的频域拆解: 一个复杂信号分解成若干简单信号分量之和。不同个频率信号的叠加,由于和差化积,会形成包络结构与精细结构。
其中低频信号决定了信号的包络形状,高频信号决定其精细结构。在语音识别中,主要通过信号的包络结构来区分不同音频信号,因此在识别领域更关注低频作用。

信号的时频域分析

信号的时域分析

时域分析——幅值包络AE

幅值包络:依次寻找每一帧中的幅值最大值,将每一帧中幅值最大值连起来就是幅值包络

A E t = m a x k = t K ( t + 1 ) K − 1 s ( k ) AE_t = \mathop{max}\limits^{(t+1)K-1}_{k=tK}s(k)AEt=k=tKmax(t+1)K1s(k)

现提取第t tt帧的AE值,其中k kk是采样点数,t tt是帧序列数,K KK是每一帧的帧长,采样点k kk点在t ∗ K , ( t + 1 ) ∗ ( K − 1 ) {t*K, (t+1)*(K-1)}tK,(t+1)(K1)

  • 应用:振幅包络可以给出响度(soundness)的大致信息,对突变信号特别敏感

  • 功能:音频检测、音频分类

分帧:将信号按照时间长度分割,每一段的长度就是帧长frame _size,分出n nn段,则说明帧的个数为frame_num。如果不考虑重叠分帧,该信号总的采样点数为frame_size * frame_num

分帧重叠:为了让分帧后的信号更加平滑,需要重叠分帧,也就是下一帧中包含上一帧的采样点,包含的点数就是重叠长度hop_size

补零:因为帧的个数frame_num是整数,为了不舍弃最后一帧不能凑成一个完整帧长的点,需要对信号补零

分帧不补零:帧的个数frame_num = N/hop_size(N为总样本数)
分帧补零:帧的个数frame_num = ((N - frame_size)/hop_size) + 1

""" 提取信号的幅值包络 # 0. 预设环境 下载语音库librosa 数组处理库nunpy # 1. 加载信号 librosa.load() # 2. 定义一个AE的函数,功能为取信号每一帧中幅值最值为该帧的包络 # 最值的获取方式:max(waveform[t*(frame_size-hop_size):t*frame_size]) # 3. 设置参数:每一帧长1024,以50%的重叠率分帧,调用该函数 # 4. 绘制信号的幅值包络信息 """# 0.预设环境 下载语音库librosa 数组处理库nunpyimportlibrosaimportnumpyasnp#重命名numpy为npfrommatplotlibimportpyplotasplt# 绘图库importlibrosa.display# 1. 加载信号 librosa.load()# 绝对路径(相比于相对路径,需要加“r”)wave_path=r"D:\PycharmProjects\Audio-based-DL\audio_data\music_piano.wav"wave_path_relative="audio_data/music_piano.wav"# 相对路径# 使用librosa.load()加载信号,默认采样率16000waveform,sample_rate=librosa.load(wave_path,sr=None)# 2. 定义一个AE的函数,功能为取信号每一帧中幅值最值为该帧的包络defCalc_Amplitude_Envelope(waveform,frame_length,hop_length):iflen(waveform)%hop_length!=0:#判断分帧是否需要补零# 帧的个数 = (总样本数-帧长/ 重叠数(分帧补零) + 1frame_num=int((len(waveform)-frame_length)/hop_length)+1# 补零个数=帧的个数*重叠数+帧长-总样本数pad_num=frame_num*hop_length+frame_length-len(waveform)# 补零后的信号波形(补零格式wrap)waveform=np.pad(waveform,pad_width=(0,pad_num),mode="wrap")frame_num=int((len(waveform)-frame_length)/hop_length)+1waveform_ae=[]# 定义为列表形式fortinrange(frame_num):# 遍历每一帧current_frame=waveform[t*(frame_length-hop_length):t*(frame_length-hop_length)+frame_length]# 当前帧的位置(参考帧图理解)current_ae=max(current_frame)# 当前帧的最大值即为AE值waveform_ae.append(current_ae)returnnp.array(waveform_ae)#将列表转换为数组形式# 3. 设置参数:每一帧长1024,以50%的重叠率分帧,调用该函数frame_size=1024hop_size=int(frame_size*0.5)# 重叠长度waveform_AE=Calc_Amplitude_Envelope(waveform=waveform,frame_length=frame_size,hop_length=hop_size)# 调用函数得到信号的幅值包络值# 4. 绘制信号的幅值包络信息frame_scale=np.arange(0,len(waveform_AE))# 帧的尺度# 帧的尺度转换为时间尺度time_scale=librosa.frames_to_time(frame_scale,hop_length=hop_size)plt.figure(figsize=(20,10))# 画布尺寸:长20,宽10librosa.display.waveshow(waveform)# 展示原图plt.plot(time_scale,waveform_AE,color="r")plt.title("Amplitude_Envelope")plt.show()

蓝色的是用librosa.display绘制出的信号波形,红色的是用函数Calc_Amplitude_Envelope计算出的幅值包络值

时域分析——均方根值RMS

RMSE计算:依次寻找每一帧中的RMSE,其值为第t帧中每点幅值平方再取均值后开根号
R M S t = 1 K ∑ k = t K ( t + 1 ) K − 1 s ( k ) 2 RMS_t = \sqrt{\frac 1 K {\sum ^{(t+1)K-1}_{k=tK}}s(k)^2 }RMSt=K1k=tK(t+1)K1s(k)2

RMSE和AE对比:RMSE体现了每一帧的包络变化,适用于不平稳的信号,尤其是突变信号,RMSE得到的值较平稳,因为它利用每一帧的所有点幅值的平均值,而不像AE利用每一帧中的最大幅值。

应用:RMSE与响度有关,用于音频分段、分类。

"""信号的均方根值RootMeanSquareEnergy # 0.预设环境 # 1.加载信号 # 2.定义函数RMS,功能:计算每一帧的均方根能量 # 3.设置参数:每一帧长1024,以50%的重叠率分帧,调用该函数 # 4.绘制图像 # 5.利用librosa.feature.rms绘制信号的RMS # 6.比较两者差异 """# 0.预设环境importlibrosaimportnumpyasnpfrommatplotlibimportpyplotaspltimportlibrosa.display# 1.加载信号wave_path=r"D:\PycharmProjects\Audio-based-DL\audio_data\music_piano.wav"waveform,sample_rate=librosa.load(wave_path,sr=None)# 2.定义函数RMS,功能:计算每一帧的均方根能量defCalc_RMS(waveform,frame_length,hop_length):# 传参:信号,每帧长度,重叠长度iflen(waveform)%hop_length!=0:# 判断是否需要补零frame_num=int((len(waveform)-frame_length)/hop_length)+1# 帧的个数pad_num=frame_num*hop_length+frame_length-len(waveform)# 补零个数# 从第一维即0开始补零,补零个数pad_numwaveform=np.pad(waveform,pad_width=(0,pad_num),mode="wrap")# 新的信号分帧的个数frame_num=int((len(waveform)-frame_length)/hop_length)+1waveform_rms=[]# 定义为空列表fortinrange(frame_num):# 遍历每一帧current_frame=waveform[t*(frame_length-hop_length):t*(frame_length-hop_length)+frame_length]# 当前帧# 当前帧均方根值(均方根公式)current_rms=np.sqrt(np.sum(current_frame**2)/frame_length)# 信号的RMS值(将current_rms放在waveform_rms之后)waveform_rms.append(current_rms)returnnp.array(waveform_rms)# 列表转换为数组# 3.设置参数:每一帧长1024,以50%的重叠率分帧,调用该函数frame_size=1024hop_size=int(frame_size*0.5)waveform_RMS=Calc_RMS(waveform,frame_size,hop_size)# 自己定义的绘制均方根值的函数# 4.绘制图像frame_scale=np.arange(0,len(waveform_RMS),step=1)# 通过分帧尺度frame_scale得到时间尺度time_scaletime_scale=librosa.frames_to_time(frame_scale)plt.figure(figsize=(20,10))librosa.display.waveshow(waveform)# 初始波形# 横轴为time_scale,纵轴为waveform_RMS,颜色为红色plt.plot(time_scale,waveform_RMS,color="r")plt.title("Root-Mean-Square-Energy")plt.show()# 5.利用librosa.feature.rms绘制信号的RMSwaveform_RMS_librosa=librosa.feature.rms(y=waveform,frame_length=frame_size,hop_length=hop_size).T[1:,0]# 使用librosa构造的均方根值需要转置plt.figure(figsize=(20,10))librosa.display.waveshow(waveform)plt.plot(time_scale,waveform_RMS_librosa,color="r")plt.title("Root-Mean-Square-Energy_librosa")plt.show()# 计算两者间的偏差值# 偏差值=使用librosa构造的均方根值-自己定义的计算均方根的函数bias=waveform_RMS_librosa-waveform_RMSprint(f"the bias is{bias}\n")

时域分析——过零率ZCR

过零率:是一个信号符号变化的比率,即在每帧中语音信号从正变为负或从负变为正的次数。

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

Z C R t = 1 2 ∑ k = t K ( t + 1 ) K − 1 ∣ s g n ( s ( k ) ) − s g n ( s ( k + 1 ) ) ∣ ZCR_t = \frac 1 2 {\sum ^{(t+1)K-1}_{k=tK}\mid sgn(s(k))-sgn(s(k+1)) \mid}ZCRt=21k=tK(t+1)K1sgn(s(k))sgn(s(k+1))

其中s g n sgnsgn是符号函数,前一个点与后一个点符号相反,则相减的绝对值为2;前一个点与后一个点符号相同,则相减的绝对值为0。前面乘以1 / 2 1/21/2,还需要除帧的长度,也就是取均值。

功能:用于语音识别和音乐信息检索。通常对类似金属、摇滚等高冲击性的声音具有更高的价值。一般情况下,过零率越大,频率近似越高。

"""信号的过零率ZCR # 0.预设环境 # 1.加载信号 # 2.定义函数,功能:计算每一帧的过零率,公式=该帧信号的平方和,开根号后, 取帧长的平均值 np.sum(np.abs(np.sign(a)-np.sign(b)))/2/frame_length # 3.设置参数:每一帧长1024,以50%的重叠率分帧,调用该函数 # 4.绘制图像 # 5.利用librosa.feature. # 6.比较两者差异 """# 0.预设环境importlibrosaimportnumpyasnpfrommatplotlibimportpyplotaspltimportlibrosa.display# 1.加载信号wave_path=r"D:\PycharmProjects\Audio-based-DL\audio_data\music_piano.wav"waveform,sample_rate=librosa.load(wave_path,sr=None)# 2.定义函数,功能:计算每一帧的过零率defCalc_ZCR(waveform,frame_length,hop_length):# 传参iflen(waveform)%hop_length!=0:# 判断是否需要补零frame_num=int((len(waveform)-frame_length)/hop_length)+1pad_num=frame_num*hop_length+frame_length-len(waveform)# 补零个数waveform=np.pad(waveform,pad_width=(0,pad_num),mode="wrap")frame_num=int((len(waveform)-frame_length)/hop_length)+1# 新的波形补零个数waveform_zcr=[]fortinrange(frame_num):current_frame=waveform[(frame_length-hop_length)*t:(frame_length-hop_length)*t+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_length# 过零率公式waveform_zcr.append(current_zcr)returnnp.array(waveform_zcr)# 3.设置参数:每一帧长1024,以50%的重叠率分帧,调用该函数frame_size=1024hop_size=int(frame_size/2)waveform_ZCR=Calc_ZCR(waveform,frame_size,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="r")plt.title("Zero-Cross-rate")plt.show()# 5.利用librosa.feature.#为了使librosa绘制的图像和自己定义的函数绘制的图象一致,需要转置一下waveform_zrc_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_zrc_librosa,color="r")plt.title("Zero-Cross-rate-librosa")plt.show()# 计算偏差bias=waveform_zrc_librosa-waveform_ZCRprint(f"the bias is{bias}\n")

信号的频域分析

谱质心

谱质心是频率成分的重心,是在一定频率范围内通过能量加权平均的频率,单位是H z HzHz

S C = ∑ n = 1 N f ( n ) E ( n ) ∑ 1 N E ( n ) = ∑ n = 1 N f ( n ) P ( E ( n ) ) SC = \frac {\sum ^N _{n=1} f(n)E(n)}{\sum ^N _1 E(n)} = \sum ^N _{n=1} f(n)P(E(n))SC=1NE(n)n=1Nf(n)E(n)=n=1Nf(n)P(E(n))

SC = (每一帧的幅值 * 对应点的频率的和)/每帧的幅值之和

应用:谱质心描述了声音的明亮度,具有阴暗、低沉品质的声音倾向有较多低频内容,谱质心相对较低;具有明亮、欢快品质的多数集中在高频,谱质心相对较高。该参数常用于对乐器声色的分析研究。

子带带宽

计算:在谱质心的频谱范围,计算距离每一帧中心点的平均值。
BW = (每个采样点减去谱质心的绝对值 * 对应点的权重值) / 总的权重之和

B W t = ∑ n = 1 N ∣ n − S C t ∣ m t ( n ) ∑ n = 1 N m t ( n ) BW_t = \frac {\sum ^N_{n=1}\mid {n-SC_t\mid m_t(n)}}{\sum ^N _{n=1}m_t(n)}BWt=n=1Nmt(n)n=1NnSCtmt(n)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/30 20:00:25

灾难恢复专家稀缺报告

一、灾难恢复专家稀缺现状:数字时代的隐形危机在2026年的科技版图中,软件测试行业正经历着前所未有的变革,而灾难恢复领域的人才荒,正成为悬在企业头顶的达摩克利斯之剑。数据显示,当前全球范围内灾难恢复专家的缺口已…

作者头像 李华
网站建设 2026/4/30 19:55:21

开发者在多模型项目中如何利用 Taotoken 简化 API 调用与管理

开发者在多模型项目中如何利用 Taotoken 简化 API 调用与管理 1. 多模型项目的常见挑战 在需要同时调用多个大模型 API 的复杂项目中,开发者通常面临几个核心问题。首先是密钥管理的复杂性,每个模型供应商都有独立的 API Key 和认证机制,导…

作者头像 李华
网站建设 2026/4/30 19:53:25

5个能让你从总监办公室笑着走出来的救命命令

每个开发者都经历过这种想死的崩溃瞬间。这时候,那些官方教程从未教过、资深工程师捂得死死的冷门命令,就是你唯一的救命稻草。本文精选5个真正能救命的Git冷命令,覆盖误删、错提交、远程失联、灾难性回滚四大崩溃场景,每一个都配…

作者头像 李华
网站建设 2026/4/30 19:52:01

如何高效使用n8n-nodes-mcp:从安装到实战的完整指南

如何高效使用n8n-nodes-mcp:从安装到实战的完整指南 【免费下载链接】n8n-nodes-mcp n8n custom node for MCP 项目地址: https://gitcode.com/gh_mirrors/n8/n8n-nodes-mcp n8n-nodes-mcp是一款强大的n8n社区节点,它让你能够在工作流中与Model C…

作者头像 李华
网站建设 2026/4/30 19:51:48

如何快速搭建个人数字图书馆:番茄小说下载器终极指南

如何快速搭建个人数字图书馆:番茄小说下载器终极指南 【免费下载链接】Tomato-Novel-Downloader 番茄小说下载器不精简版 项目地址: https://gitcode.com/gh_mirrors/to/Tomato-Novel-Downloader 还在为无法离线阅读心仪小说而烦恼吗?&#x1f91…

作者头像 李华