过零率
过零率(zero crossing rate)是一个信号符号变化的比率,即,在每帧中,语音信号从正变为负或从负变为正的次数。
一般情况下,过零率越大,频率近似越高。
选取一个音频数据进行观察,先画出数据的波形图。由于数据的波形长度过长,为了方便观察,就在其中截取一段进行放大输出。
代码:
x, sr = librosa.load('./train_sample/aloe/24EJ22XBZ5.wav')
#绘制声波信号
plt.figure(figsize=(14, 5))
librosa.display.waveplot(x, sr=sr)
# 放大
n0 = 9000
n1 = 9100
plt.figure(figsize=(14, 5))
plt.plot(x[n0:n1])
plt.grid()
其中librosa.display.waveplot()这个函数是librosa中常用的函数之一,用来画出音频数据的波形图,其中x是音频时间序列,sr是采样率。它还有两个参数,一个是x_axis,默认是‘time’,是在x轴上给定时间刻度线;还有一个是offset,水平偏移开始波形图,假如设定为3,就是第0秒的音频信号在图上的x轴横坐标显示就是第3秒。这个感觉应该不经常用到。
结果:
观察过零点(就是图中经过纵坐标0值的点的个数),数了一下有15个,用代码输出验证:
zero_crossings = librosa.zero_crossings(x[n0:n1], pad=False)
print(sum(zero_crossings))
15
频谱质心
谱质心(Spectral Centroid)是描述音色属性的重要物理参数之一,是频率成分的重心,是在一定频率范围内通过能量加权平均的频率,其单位是Hz。它是声音信号的频率分布和能量分布的重要信息。在主观感知领域,谱质心描述了声音的明亮度,具有阴暗、低沉品质的声音倾向有较多低频内容,谱质心相对较低,具有明亮、欢快品质的多数集中在高频,谱质心相对较高。该参数常用于对乐器声色的分析研究。
(我的理解:哪个地方频率高,频谱之心就在哪里。)
绘制频谱质心代码:
spectral_centroids = librosa.feature.spectral_centroid(x, sr=sr)[0]
print(spectral_centroids.shape)
# (2647,)
# 计算时间变量
frames = range(len(spectral_centroids))
t = librosa.frames_to_time(frames)
# 归一化频谱质心
def normalize(x, axis=0):
return sklearn.preprocessing.minmax_scale(x, axis=axis)
#沿波形绘制频谱质心
librosa.display.waveplot(x, sr=sr, alpha=0.4)
plt.plot(t, normalize(spectral_centroids), color='r')
注:librosa.frames_to_time():根据音频帧的下标转化为时间数组。
结果:
声谱衰减
声谱衰减是对声音信号形状(波形图)的一种衡量,表示低于总频谱能量的指定百分比的频率。
spectral_rolloff = librosa.feature.spectral_rolloff(x+0.01, sr=sr)[0]
librosa.display.waveplot(x, sr=sr, alpha=0.4)
plt.plot(t, normalize(spectral_rolloff), color='b')
注:librosa.feature.spectral_rolloff ():计算信号中每帧的滚降系数。
结果:
色度频率
色度频率是音乐音频有趣且强大的表示,其中整个频谱被投影到12个区间,代表音乐八度音的12个不同的半音(或色度)。
hop_length = 512
chromagram = librosa.feature.chroma_stft(x, sr=sr, hop_length=hop_length)
plt.figure(figsize=(15, 5))
librosa.display.specshow(chromagram, x_axis='time', y_axis='chroma', hop_length=hop_length, cmap='coolwarm')
短时傅里叶变换
关于librosa.stft()这个函数里面的参数:
参数 | 功能 |
---|---|
y | 音频时间序列 |
n_fft | FFT窗口大小,n_fft=hop_length+overlapping |
hop_length | 帧移,如果未指定,则默认win_length / 4 |
win_length | 每一帧音频都由window()加窗。窗长win_length,然后用零填充以匹配n_fft,默认win_length=n_fft。 |
window | 字符串,元组,数字,函数 shape =(n_fft, )窗口(字符串,元组或数字);窗函数,例如scipy.signal.hanning;长度为n_fft的向量或数组 |
center | 如果为True,则填充信号y,以使帧 D [:, t]以y [t * hop_length]为中心;如果为False,则D [:, t]从y [t * hop_length]开始 |
dtype | D的复数值类型。默认值为64-bit complex复数 |
pad_mode | 如果center = True,则在信号的边缘使用填充模式。默认情况下,STFT使用reflection padding |
关于梅尔滤波器
自己了解之后对这部分的知识还是一知半解,感觉整个过程有点点抽象。特别是mfcc的特征缩放那里,不是很懂。明天去看看直播回放,希望能加深理解!