[英]Funnction to normalize input audio file of 44.1khZ sampling rate and 16 bit resolution
[英]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 頻段的頻率范圍始終相同,而不管采樣率如何,則必須指定關鍵字參數fmin
和fmax
(請參閱此處)。
例如:
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.