为什么我的8kHz wav文件的mel功能在sr = 16kHz和44.1kHz时提取的不同

时间:2019-07-16 09:00:24

标签: python audio-processing librosa

我目前正在从婴儿哭声数据集中提取mel特征,而wav文件的采样率为8kHz,16bit,单声道和大约7秒。

当sr = 16000时的凝胶光谱图 sr = 44100时的凝胶光谱图

但是正如您所看到的,每当我以不同的采样率sr提取特征时,梅尔频谱图的值都会改变。 我以为,由于wav文件的采样率为8kHz,因此,如果将采样率设置为超过16kHz,则赫兹值必须相同。

我将wav文件的采样率从8kHz转换为44.1kHz,然后再次将其提取,但是没有任何变化。

这是我的代码:

import librosa.display  
import matplotlib.pyplot as plt  
import numpy as np  

sr = 44100 # or 16000 
frame_length = 0.1  
frame_stride = 0.01  
path = '...'
train = []  

j, sr = librosa.load(path + '001.wav', sr, duration = 5.0)   
input_nfft = int(round(sr*frame_length))   
input_stride = int(round(sr*frame_stride))   
mel = librosa.feature.melspectrogram(j, n_mels = 128, n_fft = input_nfft, hop_length=input_stride, sr = sr)            
train.append(mel)

plt.figure(figsize=(10,4))  
librosa.display.specshow(librosa.power_to_db(train[0], ref=np.max), y_axis='mel', sr=sr, hop_length=input_stride, x_axis='time')  
plt.colorbar(format='%+2.0f dB')  
plt.title('Mel-Spectrogram')  
plt.tight_layout()  
plt.show()  

无论sr = 44100还是16000,y轴的值都必须相同 但我不明白为什么会这样。

1 个答案:

答案 0 :(得分:1)

当您要求librosa创建梅尔频谱图时,您要求它执行两个步骤:

基于傅立叶变换的频谱

首先,您要求它在可能的范围内创建基于FFT的频谱图 。要了解可能的范围,您必须了解Nyquist-Shannon theoremhere(大致)指出,当您以sr Hz采样信号时,您无法表示sr / 2 Hz以上的频率(sr =采样率)。因此,以44.1kHz采样的信号的可能频率范围是0到22.05 kHz。

librosa产生规则的线性间隔频谱图作为中间结果。频率范围是0到sr / 2 Hz。

梅尔光谱图

与基于FT的常规频谱图(梅尔频谱图)相反,它不具有线性频率标度,而具有(几乎)对数标度。为了将基于FT的频谱图映射到对数刻度,所有可用数据都映射到特定数量的对数分隔的条带。所使用的箱数指定为n_mels,即梅尔乐队的数量。

放在一起

对于n_mels = 128,如果您有一个以44.1kHz采样的信号,则可以表示0到22.05 Hz的范围。此范围映射到128个对数分隔的波段。如果以16 kHz采样信号,则可以表示0到8 Hz的范围。该范围被映射到128个对数间隔的频带上,即0-8 kHz的范围被分成128个部分,而不是0-22.05 kHz的范围。这必然导致不同的结果。

解决方案

如果要确保映射到n_mels梅尔频段的频率范围始终相同,无论采样率如何,都必须指定关键字参数fmin和{{1} }(请参阅How to use sed/grep to extract text between two words?)。

例如:

fmax