機器學習中的音頻特徵:理解Mel頻譜圖

如果你像我一樣,試着理解mel的光譜圖並不是一件容易的事。你讀了一篇文章,卻被引出了另一篇,又一篇,又一篇,沒完沒了。我希望這篇簡短的文章能澄清一些困惑,並從頭解釋mel的光譜圖。

信號

信號是一定量隨時間的變化。 對於音頻,變化的量是氣壓。 我們如何以數字方式捕獲此信息? 我們可以隨時間採集氣壓樣本。 我們採樣數據的速率可以變化,但是最常見的是44.1kHz,即每秒44,100個採樣。 我們捕獲的是信號的波形,可以使用計算機軟件對其進行解釋,修改和分析。

import librosa
import librosa.display
import matplotlib.pyplot as plty, sr = librosa.load('./example_data/blues.00000.wav')plt.plot(y);
plt.title('Signal');
plt.xlabel('Time (samples)');
plt.ylabel('Amplitude');




 

 

 

我們可以使用音頻信號的數字表示形式。 歡迎來到信號處理領域! 您可能想知道,我們如何從中提取有用的信息? 看起來像是一團混亂。 這就引出我們的朋友傅里葉,這裏是它最熟悉的領域。

傅立葉變換

音頻信號由幾個單頻聲波組成。 在一段時間內對信號進行採樣時,我們僅捕獲得到的幅度。 傅立葉變換是一個數學公式,它使我們可以將信號分解爲單個頻率和頻率幅度。 換句話說,它將信號從時域轉換到頻域。 結果稱爲頻譜。

這是可能的,因爲每個信號都可以分解爲一組正弦波和餘弦波,它們加起來等於原始信號。 這是一個著名的定理,稱爲傅立葉定理。

快速傅立葉變換(FFT)是一種可以有效計算傅立葉變換的算法。 它廣泛用於信號處理。 我將在示例音頻的窗口片段中使用此算法。

import numpy as npn_fft = 2048
ft = np.abs(librosa.stft(y[:n_fft], hop_length = n_fft+1))plt.plot(ft);
plt.title('Spectrum');
plt.xlabel('Frequency Bin');
plt.ylabel('Amplitude');



 

 

 

頻譜圖

快速傅立葉變換是一種功能強大的工具,可讓我們分析信號的頻率成分,但是如果信號的頻率成分隨時間變化,該怎麼辦? 大多數音頻信號(例如音樂和語音)就是這種情況。 這些信號稱爲非週期性信號。 我們需要一種表示這些信號隨時間變化的頻譜的方法。 您可能會想,“嘿,我們不能通過對信號的多個窗口部分執行FFT來計算多個頻譜嗎?” 是! 這正是完成的工作,稱爲短時傅立葉變換。 FFT是在信號的重疊窗口部分上計算的,我們得到了所謂的頻譜圖。 哇! 需要接受很多東西。這裏有很多事情要做。 良好的視覺效果是必須的。

 

 

 

您可以將頻譜圖視爲一堆相互堆疊的FFT。 當信號在不同頻率下隨時間變化時,這是一種直觀地表示信號響度或幅度的方法。 計算頻譜圖時,還有一些其他細節。 y軸轉換爲對數刻度,顏色尺寸轉換爲分貝(您可以將其視爲振幅的對數刻度)。 這是因爲人類只能感知到非常小的集中頻率和幅度範圍。

spec = np.abs(librosa.stft(y, hop_length=512))
spec = librosa.amplitude_to_db(spec, ref=np.max)librosa.display.specshow(spec, sr=sr, x_axis='time', y_axis='log');
plt.colorbar(format='%+2.0f dB');
plt.title('Spectrogram');


 

 

 

僅用幾行代碼,我們就創建了一個頻譜圖。 好。 我們對“頻譜圖”部分有紮實的瞭解,但對“MEL”則如何。 他是誰?

梅爾(Mel)量表

研究表明,人類不會感知線性範圍的頻率。 我們在檢測低頻差異方面要勝於高頻。 例如,我們可以輕鬆分辨出500 Hz和1000 Hz之間的差異,但是即使之間的距離相同,我們也很難分辨出10,000 Hz和10,500 Hz之間的差異。

1937年,Stevens,Volkmann和Newmann提出了一個音高單位,以使相等的音高距離聽起來與聽衆相等。 這稱爲梅爾音階。 我們對頻率執行數學運算,以將其轉換爲mel標度。

 

 

 

Mel譜圖

mel譜圖是頻率轉換爲mel標度的譜圖。使用python的librosa音頻處理庫它只需要幾行代碼就可以實現。

mel_spect = librosa.feature.melspectrogram(y=y, sr=sr, n_fft=2048, hop_length=1024)
mel_spect = librosa.power_to_db(spect, ref=np.max)librosa.display.specshow(mel_spect, y_axis='mel', fmax=8000, x_axis='time');
plt.title('Mel Spectrogram');
plt.colorbar(format='%+2.0f dB');


 

 

 

總而言之

如果你像我一樣是信號處理新手的話,這裏有很多概念需要了解。然而,如果你繼續回顧這篇文章中提出的概念(花足夠的時間盯着牆角思考它們),它就會開始有意義了!讓我們簡要回顧一下我們所做的工作。

我們隨時間採集了氣壓樣本,以數字方式表示音頻信號

  1. 我們使用快速傅里葉變換將音頻信號從時域映射到頻域,並在音頻信號的重疊窗口部分執行此操作。
  2. 我們將y軸(頻率)轉換爲對數刻度,將顏色尺寸(幅度)轉換爲分貝,以形成頻譜圖。
  3. 我們將y軸(頻率)映射到mel刻度上以形成mel頻譜圖。

聽起來很簡單,對吧? 好吧,雖然不盡然,但是我希望這篇文章能使你瞭解音頻特徵的處理和梅爾頻譜圖的原理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章