总-语音信号分析_特征(包络均方根 过零率谱质心子带带宽)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


时域分析(续上包络、均方根)

提示:包络AE和均方根RMS见上篇

包络:
在信号处理中,信号的包络是描述信号振幅变化的曲线。简单来说,包络可以理解为原始信号的上下界,它反映了信号的整体变化趋势,而忽略了信号中的高频细节。低频整体,高频细节可由音频合成示意
均方根
均方根误差是用来衡量两个数据集之间的差异程度的一种常用指标。它计算了预测值与真实值之间的差异,并将这些差异的平方求和后再取平均值,最后取平方根得到均方根误差。RMSE 越小表示预测值与真实值之间的差异越小,模型的拟合效果越好。


统一部署代码任务为:

  1. 预设环境
  2. 加载信号
  3. 定义函数(各种)
  4. 设置参数(帧长、帧移等)
  5. 绘制图像或打印输出

提示:以下是本篇文章正文内容

一 过零率Zero crossing rate

概念

过零率:是一个信号符号变化的比率,即在每帧中语音信号从正变为负或从负变为正的次数。
计算第t帧信号过零点数示意:
在这里插入图片描述
其中Sgn()是符号函数
前一个点与后一个点符号相反,则相减的绝对值为2
前一个点与后一个点符号相同,则相减的绝对值为0。
前面乘以1/2,还需要除帧的长度,即为取均值。

作用

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

实例

  1. 功能函数代码:
#2.定义函数,功能:计算每一帧的过零率,
def Calc_ZCR(waveform , frame_length , hop_length):
	if len(waveform) %hop_length != 0:
		frame_num = int((len(waveform)-frame_length)/hop_length) + 1
		pad_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 = []
	for t in range(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)
	return np.array (waveform_zcr)

  1. 或者利用librosa库函数(误差不大)
#调用librosa.feature库
waveform_zrc_librosa = librosa.feature.zero_crossing_rate()
###############################################################
原函数定义如下
def zero_crossing_rate(y, *, frame_length=2048,hop_length=512,center=True**kwargs):
	已知
		y:数组或类数组的音频时间序列
		frame_length:(选)帧长,默认2048
		hop_length:(选)帧移,默认512
		center: (选),是否要在帧之间对音频信号进行居中,是_True
		kwargs:其他参数
所以传入

结果示意

在这里插入图片描述

频域变换

以下是概念介绍
常见方法:傅里叶变换拉普拉斯变换Z变换的频谱分析、功率谱分析、倒频谱分析、共振解调技术等。
结果:得到不同频率的幅值和相位,幅值表示了原始信号和sin的相似度

一 谱质心 Spectral centroid

概念

谱质心 是频率成分的重心,是频谱中在一定频率范围内通过能量加权平均的频率,其单位是Hz。
在这里插入图片描述

SC=每一帧的幅值*对应点的频率的和/每帧的幅值之和centroid[t] = sum_k S[k t] * freq[k]/ (sum j Si. t)

作用

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

实例

#1.加载信号
jazz_path = r"E:\Codelaudio_dataljazz.wav"jazz,sr = librosa.load(jazz_path, sr=None)
rock_path = r"E:ICodelaudio_data\rock.wav"rock, sr = librosa.load(rock_path , sr=None)
blues_path = r"E:\Code\audio_data\blues.wav"blues , sr = librosa.load(blues_path, sr=None)
orchestra_path = r"E:lCodelaudio_datalorchestra.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]
#制图2*2
fig,aix = plt.subplots(2.25l
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(

结果示意

在这里插入图片描述
总结:可以看到jazz和blues值较高,较为轻快
摇滚较低沉(电吉他等乐器)
Orchestra管弦乐逐渐增大的趋势,也很符合规律

二 子带带宽Bandwidth

概念

在Spectral centroid的频谱范围,计算每一点到谱质心的距离的加权平均值。
然后
BW=每个采样点减去谱质心的绝对值*对应点的权重值/总的权重之和

(sum_k S[k, t] * (freq[k,t] centroid[t])p)(1/p)

在这里插入图片描述

作用

用于音频识别和主观听音感受
如果音频的能量谱密度函数下降快,那么BW也下降,类似于频谱的变化速度。

实例

#3。获得信号的Spectral bandwidth
sw_jazz = librosa.feature.spectral_bandwidth(y=jazz, n_fft=1024).T[:,0] 
sw_rock = librosa.feature.spectral_bandwidth(y=rock,n_fft=1024).T[:,0]
sw_blues = librosa.feature.spectral_bandwidth(y=blues,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(

结果示意

在这里插入图片描述

  • 27
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值