音频&深度学习Lesson2_均方根能量

该代码示例展示了如何使用librosa库加载音频文件,并计算每一帧的均方根能量(RMS)。首先自定义了一个计算RMS的函数,然后与librosa自带的RMS功能进行了比较。最后,通过绘制图表展示两者之间的差异,并输出平均偏差。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# 0.预设环境
# import librosa
import numpy as np
from matplotlib import pyplot as plt
import librosa.feature
from matplotlib import font_manager

# 1.加载信号
wave_path = r"C:\Users\LENOVO\PycharmProjects\pythonProject3\Audio_Data\piano_1.wav"
waveform,sample_rate = librosa.load(wave_path,sr=None)

# 2.定义函数RMS,功能:计算每一帧的均方根能量
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 = 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=[] # 这是list型

    for t in range(frame_num):
        current_frame = waveform[t*hop_length : t*hop_length+frame_length]
        current_rms = np.sqrt(np.sum(current_frame**2)/frame_length)  #  注意得除以帧的长度
        waveform_rms.append(current_rms)
    return np.array(waveform_rms)

# 3.设置参数,每一帧长1024,以50%的重叠率重叠,调用该函数
frame_size = 1024
hop_size = int(frame_size*0.5)
waveform_RMS = Calc_RMS(waveform=waveform,frame_length=frame_size,hop_length=hop_size)

# 4.绘制图像

my_font=font_manager.FontProperties(fname=r"C:\Windows\Fonts\simsun.ttc")

frame_scale = np.arange(0,len(waveform_RMS))
time_scale = librosa.frames_to_time(frame_scale,hop_length=hop_size)

plt.figure(figsize=(20, 10))
plt.plot(time_scale, waveform_RMS, color="k",linewidth=3,label="套公式的RMS")
plt.legend(prop=my_font)
# 5.利用librosa.feature.rms绘制音频的rms
waveform_RMS_Librosa = librosa.feature.rms(y=waveform,frame_length=frame_size,hop_length=hop_size).T[1:,0]
plt.plot(time_scale,waveform_RMS_Librosa,color="r",linewidth=1,label="librosa自带的RMS")
plt.legend(prop=my_font)

librosa.display.waveshow(waveform)

plt.title("Root_Mean_Square_Energy")
plt.show()

# 6.比较librosa自带的RMS和套公式的RMS的差异
bias=[]
bias.append(abs(waveform_RMS - waveform_RMS_Librosa))
print(f"average_bias:"+str(np.average([bias]))+f"\n bias:{bias}") # 这里要关闭图标才能显示
# []是array,用list{}打出会显示这是个array,{}符号在加上f后可以在引号里直接使用
#   print can only concentrate str to str(print里面str后面只能拼接str)
print("Congratulation!")

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值