python音频信号分析

本文探讨了声音的表示形式,包括音频信号的参数和不同格式,如mp3和wav。重点介绍了声音的三个要素——音调、音强和音色,以及声波的频率、幅度和相位。文章通过Python的Librosa库展示了如何处理音频,包括计算过零率、提取MFCC特征和色度频率,这些都是语音识别和音乐分析的关键技术。此外,还提供了时域波形和频域谱图的示例,展示特征提取在音频理解中的应用。
摘要由CSDN通过智能技术生成

一、声音以具有诸如频率、带宽、分贝等参数的音频信号的形式表示,典型的音频信号可以表示为幅度和时间的函数。这些声音有多种格式,使计算机可以读取和分析它们,例如:mp3格式、WMA(Windows Media Audio)格式、wav(波形音频文件)格式。根据声波的特征,可把音频信息分类为规则音频和不规则声音。其中规则音频又可以分为语音,音乐和音效。规则音频是一种连续变化的模拟信号,可用一条连续的曲线来表示,称为声波。

声音的三个要素是音调,音强和音色,声波或正弦波有三个重要参数:频率、幅度和相位,这也就决定了音频信号的特征,语音识别等应用离不开音频特征的提取,Python有一些很棒的音频处理库,比如Librosa和PyAudio。

二、过零率:N为一帧的长度,n为对应的帧数,按帧处理。过零率体现的是信号过零点的次数,体现的是频率特性。因为需要过零点,所以信号处理之前需要中心化处理。

三、MFCC梅尔频率倒谱系数:声音信号是连续变化的,为了将连续变化信号简化,我们假设在一个短时间尺度内音频信号不发生改变。因此将信号以多个采样点集合成一个单位,称为"讯框"。一个讯框多为20-40毫秒,如果讯框长度更短,那每个讯框内的采样点将不足以做出可靠的频谱计算,但若长度太长,则每个讯框信号会变化太大。预强化的目的就是为了消除发声过程中,声带和嘴唇造成的效应,来补偿语音信号受到发音系统所压抑的高频部分。并且能突显高频的共振峰。由于信号在时域上的变化通常很难看出信号的特性,所以通常透过傅里叶变换将它变换成频域上的能量分布来观察,不同的能量分布,就能代表不同语音的特性。由于能量频谱中还存在大量的无用信息,尤其人耳无法分辨高频的频率变化,因此让频谱通过梅尔滤波器。梅尔滤波器,也就是一组20个非线性分布的三角带通滤波器(Triangular Bandpass Filters),能求得每一个滤波器输出的对数能量。信号的Mel频率倒谱系数(MFCC)是一小组特征(通常约10-20),其简明地描述了频谱包络的整体形状,它模拟了人声的特征。

四、色度频率:是音乐音频有趣且强大的表示,其中整个频谱被投影到12个区间,代表音乐八度音的12个不同的半音(或色度)。

五、代码

import librosa
x, sr = librosa.load(r'E:\pythonProject\3 yinping\1.wav')
#print(type(x), type(sr))  #将音频时间序列作为numpy数组返回,默认采样率(sr)为22KHZ
#print(x.shape, sr)

import numpy as np
import matplotlib.pyplot as plt
import matplotlib
#时域波形
#plt.figure() # 将显示的所有图分辨率调高
matplotlib.rc("font",family='SimHei') # 显示中文
matplotlib.rcParams['axes.unicode_minus']=False # 显示符号
time = np.arange(0, len(x)) * (1.0 / sr)
plt.plot(time/60, x)
plt.title("语音信号时域波形")
plt.xlabel("时长(分)")
plt.ylabel("振幅")
plt.show()

# #谱图:通过视觉表示频谱的频率、声音或其他信号,因为它们随时间变化。
import librosa.display
plt.figure(1)
X = librosa.stft(x)   #短时傅里叶变换
Xdb = librosa.amplitude_to_db(abs(X))
librosa.display.specshow(Xdb, sr=sr, x_axis='time', y_axis='hz')
plt.colorbar()
plt.show()

plt.figure(2)
librosa.display.specshow(Xdb, sr=sr, x_axis='time', y_axis='log') #所有动作都发生在频谱的底部,我们可以将频率轴转换为对数轴。
plt.colorbar()
plt.show()


# 每个音频信号都包含许多特征。
# 但是,我们必须提取与我们试图解决的问题相关的特征。
# 提取要使用它们进行分析的特征的过程称为特征提取

#1、过零率(Zero Crossing Rate,ZCR)是指在每帧中,语音信号通过零点(从正变为负或从负变为正)的次数。
n0 = 9000
n1 = 9100
plt.plot(x[n0:n1])
plt.grid()
plt.show()
zero_crossings = librosa.zero_crossings(x[n0:n1], pad=False)
print(sum(zero_crossings))

# #MFCC:信号的Mel频率倒谱系数(MFCC)是一小组特征(通常约10-20),其简明地描述了频谱包络的整体形状
mfccs = librosa.feature.mfcc(y=x, sr=sr,n_mfcc=20)
print(mfccs.shape)  #计算了12846帧的20个MFCC
librosa.display.specshow(mfccs, sr=sr, x_axis='time')
plt.show()

#色度频率:音乐音频有趣且强大的表示,其中整个频谱被投影到12个区间,代表音乐八度音的12个不同的半音(或色度)
hop_length = 512
chromagram = librosa.feature.chroma_stft(x[10000:50000], sr=sr, hop_length=hop_length)
librosa.display. specshow(chromagram, x_axis='time', y_axis='chroma', hop_length=hop_length, cmap='coolwarm')
plt.show()

chromagram = librosa.feature.chroma_stft(x[300000:700000], sr=sr, hop_length=hop_length1)
librosa.display. specshow(chromagram, x_axis='time', y_axis='chroma', hop_length=hop_length, cmap='coolwarm')
plt.show()
#短时能量体现的是信号在不同时刻的强弱程度。
#傅里叶变换是为了把时域信号变换到频域,在频域对信号进行处理(如滤波)。
# 从频域也可以方便的看到此信号的一些信息,如不同频率的相位、幅度、能量。
#通过变换能够充分突出问题某些方面的特征,能对时间(空间)频率的局部化分析,
# 通过伸缩平移运算对信号(函数)逐步进行多尺度细化,最终达到高频处时间细分,低频处频率细分,
# 能自动适应时频信号分析的要求,从而可聚焦到信号的任意细节

六、实验结果

1.时域图

2、频域图

 

 3、过零率

 4.MFCC图

5、整个音频文件色度频率图

 

特定音频片段色度频率图

 

 

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值