提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
信号的时域分析-均方根能量
概念
均方根能量Root mean square energy RMSE
操作:依次寻找每一帧中的RMSE,其值为第t帧中每点幅值平方再取均值后开根号
对比:与时域幅值包络相比,RMSE体现了每一帧的包络变化
,适用于不平稳的信号。尤其是对于突变信号(outliereffect) , RMSE得到的值较平稳,因为它利用每一帧的所有点幅值的平均值
,而不像AE利用每一帧中的最大幅值。
应用
RMSE与响度有关,用于音频分段、分类audio segmentation, music genre classification。
任务
预设环境
import librosa
import numpy as np
from matplotlib import pyplot as plt
import librosa.display
加载信号
wave_path = r"E:\Code\audio_date\music_piano.wav"#r是为了转移,不然\\
waveform,sample_rate=librosa.load(wave_path,sr=None)
定义函数:实现计算每一帧的均方根能量
def Calc_RMS(waveform,frame_length,hop_length):
if len(waveform) % hop_length !=0:
frame_num = int((len(waveform)-frame_length)/hop_length )+1
pad_num = fram_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_rms=[]#空列表波形均方根值
for t in range(frame_num):
current_frame=waveform[t*(frame_length-hop_length ):t*(frame_length-hop_length )+frame_length]
current_rms=np.sqart(np.sum(current_frame**2)/frame_length)
waveform_rms.append(current_rms)
return np.array(waveform_rms)
设置参数
帧长1024,50%重叠分帧
frame_size= 1024
hop_size=int(frame_size*0.5)
#调用上面的函数
waveform_RMS = Calc_RMS(waveform , frame_size , hop_size)
##绘制信息图
#定义尺度
frame_scale = np.arange(0, len(waveform_RMS),step=1)
time_scale = librosa.frames_to_time(frame_scale, hop_length=hop_size)
plt.figure(figsize=(20,10))#画布大小
librosa.display.waveshow(waveform)#先画出原来的波形
plt.plot(time_scale, waveform_RMS,color="r")
plt.title("Root-Mean-Square-Energy_均方根")
plt.show()
另一种方式:标准库调用
waveform_RMS_librosa=librosa.feature.rms()
首先查看如何使用
代码如下,如注释
def rms (
*,
y=None,#原始波形,可传入
S=None,#同上,但是采样的离散的,传一个即可
frame_length=2048,#帧长,应改
hop_length=512, #帧移步长应改
center=True,
pad_mode="constant" ,
):
如下调用
waveform_RMS_librosa=librosa.feature.rms(y=waveform,frame_length=frame_size,hop_length=hop_size)
如果对比记得改变量名,误差很小所以可以代替