2016-04-08 72 views
1

我正在嘗試計算一部分聲音文件的功率譜圖。 目前我正在使用librosa計算.wav文件的窗口上的功率譜圖

我正在計算我的windowsize 20 * 1e-3 * samplerate。 我想知道的結果(特別是t的長度)可以在下面的例子中看到:

44.1kHz的採樣率與20ms的時間幀相結合產生了一個882個採樣窗口。

In [2]: D = np.abs(librosa.stft(y[:882]))**2 

In [3]: np.shape(D) 
Out[4]: (1025, 2) 

我得到的是我的結果中的2ms時間幀,這不是我所期望的。有人能幫助我/指出我做錯了什麼嗎?

+0

請嘗試給出[MCVE]。也許添加一個你得到的圖,vs你的預期。從一些你理解的綜合數據開始,通常是一個好主意。看看這個頻譜圖問題,例如:http://stackoverflow.com/questions/35932145/plotting-with-matplotlib-specgram/35933996#35933996 – roadrunner66

+0

你知道「20ms * 1e-3」是20微秒,對? – twalberg

+0

嗯,是的 - 我的代碼正確,但不知何故在我的例子中標記爲錯誤。當然是20秒* 1e-3。 – soultice

回答

2

默認librosa.stft使用的FFT大小爲2048 n_fft和輸出的第一尺寸相匹配真實輸入信號非冗餘頻率分量的數目(這是1+n_fft/2,在這種情況下1025)。

第二個維度由時間片的數量決定,我假設這是您感到有點困惑的地方,期望您的882個樣本有一個時間片。然而librosa.stft計算重疊時間片的輸出。用於每個切片的樣本數量默認設置爲win_length/4,由於您沒有指定win_length,因此設置爲n_fft/4或512.充分利用您的882個樣本(並根據需要填充),這會爲您提供兩片:

  • 一個用於樣本0到2047;
  • 另一個樣本512到881,並添加零填充。

如果你不想有任何重疊,你可以設置hop_length參數匹配n_fft

+0

寫得很好,答案正確。謝謝。 – soultice

+0

再讀一次,我不應該得到兩個片:0至511和512至881 +填充? – soultice

+0

切片的大小基於'n_ffft'參數,默認爲2048.因此,第一個切片使用樣本0至2047.第二個切片與第一個切片重疊,從512開始並以2559結束(但由於您沒有那麼多的數據會使用你的樣本來取樣881,然後零墊到2048的長度)。 – SleuthEye