簡體   English   中英

為什么我的 8kHz wav 文件的 mel 特征在 sr = 16kHz 和 44.1kHz 中的提取方式不同

[英]why my 8kHz wav file's mel feature extracted differently in sr = 16kHz and 44.1kHz

我目前正在從我的嬰兒哭聲數據集中提取 mel 特征,wav 文件的采樣率為 8kHz、16 位、單聲道和大約 7 秒。

sr = 16000 時的梅爾譜圖 sr = 44100 時的梅爾譜圖

但是正如您所看到的,每當我以不同的采樣率sr提取特征時,mel-spectrogram 的值都會發生變化。 我認為由於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 軸的值都必須相同,但我不明白為什么會這樣。

當您要求 librosa 創建 mel 譜圖時,您要求它執行兩個步驟:

基於傅里葉變換的頻譜

首先,您要求它在可能的范圍內創建基於 FFT 的頻譜圖。 要了解可能的范圍是多少,您必須了解Nyquist-Shannon 定理,該定理(粗略地)指出,當您以 sr Hz 采樣信號時,您無法表示超過 sr/2 Hz(sr = 采樣率)的頻率。 因此,以 44.1kHz 采樣的信號的可能頻率范圍是 0 到 22.05 kHz。

librosa 生成一個規則的線性間隔頻譜圖作為中間結果。 頻率范圍為 0 至 sr/2 Hz。

梅爾譜圖

與常規的基於 FT 的頻譜圖相反,梅爾頻譜圖沒有線性頻率標度,而是(幾乎)對數標度。 要將基於 FT 的頻譜圖映射到對數刻度,所有可用數據都被映射到特定數量的對數間隔 bin。 使用的 bin 數量指定為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 mel 頻段的頻率范圍始終相同,而不管采樣率如何,則必須指定關鍵字參數fminfmax (請參閱此處)。

例如:

fmin = 0.
fmax = 4000.  # since your original signal is sampled at 8 kHz
mel = librosa.feature.melspectrogram(j, n_mels=128,
                                     n_fft=input_nfft,
                                     hop_length=input_stride,
                                     sr=sr,
                                     fmin=fmin,
                                     fmax=fmax)            

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM