在音频信号处理领域,了解RMS能量和幅值包络的概念对于音乐流派分类和音频特征提取至关重要。本文将通过可视化和分析不同音乐流派(包括古典、蓝调、雷鬼、摇滚和爵士)的RMS能量和幅值包络,探讨这些特征对异常值的鲁棒性。文章的灵感来源于Valerio Valerdo的工作,强烈推荐访问他的YouTube频道,了解他在音频机器学习/深度学习领域的杰出工作。
本文使用的工具包括Python、Librosa库,以及来自GTZAN数据集的音频样本(每个样本长度为30秒)。
音频信号的RMS能量指的是信号的整体幅度,通常等同于信号的响度。信号的能量计算方法如下:
RMS = sqrt(mean(x^2))
其中,RMS是一种计算变量平均值的方法,适用于随时间变化的数据。在音频处理中,信号值(振幅)被平方,然后随时间平均,最后计算结果的平方根。信号的均方根能量(RMSE)的数学定义是:
幅值包络是从原始音频波形中提取的时间域音频特征,指的是声音振幅随时间的变化,影响对音色的听觉印象。这是一个重要的音频特征,因为它使能够快速识别和区分声音。信号的幅值包络,提供了响度的粗略估计,由每个帧中所有样本的最大振幅值组成。这个属性已被广泛用于音乐流派分类和起始检测。然而,由于它比RMS能量音频函数更敏感于异常值,因此通常较少被优先选择。
接下来,将逐步指导如何可视化和比较不同音乐流派曲目的幅值包络和RMS能量。
!pip install librosa
import matplotlib.pyplot as plt
import numpy as np
import librosa
import librosa.display
import IPython.display as ipd
%matplotlib inline
classical_music_file = "/content/drive/MyDrive/trytheseaudios/classical.00000.wav"
blues_music_file = "/content/drive/MyDrive/trytheseaudios/blues.00000.wav"
reggae_music_file = "/content/drive/MyDrive/trytheseaudios/reggae.00000.wav"
rock_music_file = "/content/drive/MyDrive/trytheseaudios/rock.00000.wav"
jazz_music_file = "/content/drive/MyDrive/trytheseaudios/jazz.00000.wav"
# 加载音频文件
classical, sr = librosa.load(classical_music_file)
blues, _ = librosa.load(blues_music_file)
reggae, _ = librosa.load(reggae_music_file)
rock, _ = librosa.load(rock_music_file)
jazz, _ = librosa.load(jazz_music_file)
FRAME_SIZE = 1024
HOP_LENGTH = 512
rms_classical = librosa.feature.rms(classical, frame_length=FRAME_SIZE, hop_length=HOP_LENGTH)[0]
rms_blues = librosa.feature.rms(blues, frame_length=FRAME_SIZE, hop_length=HOP_LENGTH)[0]
rms_reggae = librosa.feature.rms(reggae, frame_length=FRAME_SIZE, hop_length=HOP_LENGTH)[0]
rms_rock = librosa.feature.rms(rock, frame_length=FRAME_SIZE, hop_length=HOP_LENGTH)[0]
rms_jazz = librosa.feature.rms(jazz, frame_length=FRAME_SIZE, hop_length=HOP_LENGTH)[0]
def amplitude_envelope(signal, frame_size, hop_length):
return np.array([max(signal[i:i+frame_size]) for i in range(0, signal.size, hop_length)])
ae_classical = amplitude_envelope(classical, FRAME_SIZE, HOP_LENGTH)
ae_blues = amplitude_envelope(blues, FRAME_SIZE, HOP_LENGTH)
ae_reggae = amplitude_envelope(reggae, FRAME_SIZE, HOP_LENGTH)
ae_rock = amplitude_envelope(rock, FRAME_SIZE, HOP_LENGTH)
ae_jazz = amplitude_envelope(jazz, FRAME_SIZE, HOP_LENGTH)