2014-03-26 31 views
1

我有PSD和音頻信號,這是我用Matlab讀取的分辨率,並使用pwelch得到它的PSD,這裏IST的代碼,我使用如何提高利用Matlab

[x,Fs] = audioread('audioFile.wav'); 
x= x(:,1) % mono 
[xPSD,f] = pwelch(x,hamming(512),16,1024,Fs); 
plot(f,xPSD); 

FS=96000和我只在頻率低於5khz感興趣,我想計算只有該區域的PSD,並且還能夠調整PSD的分辨率!任何想法都可以做到!

回答

5

使用pwelch計算PSD時,頻譜分辨率,平均次數和所需數據量之間總是有一個折衷。我使用它的首選方法是:

[psd_x, freq] = pwelch(x, hann(nfft), nfft/2, nfft, fsample); 

與您的代碼有幾個不同點:

  1. 我更喜歡使用hann窗戶,因爲我與海明窗不好的經驗,他們是不是很好如果你的信號包含例如一個大的直流分量。見this comparison,這表明hann的下降要好得多,只需要稍高的第一旁瓣。

  2. 我使用重疊50%的窗口(通過使用noverlap = nfft/2),這樣您就可以充分利用數據。在你的情況下,窗口之間只有16/512 = 3%的重疊,並且由於窗口函數在其邊緣處接近零,所以邊緣處的數據點不會像窗口中間的點那麼多。在半重疊的窗口中,這種效果要小得多。使重疊大於50%是無用的,你會得到更多的平均值,但由於你多次使用相同的點,所以這不會增加任何額外的信息。只要堅持到50%。

  3. 我通常將fft的長度(pwelch的第四個參數)與窗口長度相同。你想要有不同的唯一情況是當你使用zero-padding時,它的使用有限。

有幾個簡單的公式,你應該pwelch和類似函數時記住:

  • 光譜分辨率僅由窗口長度給出:df = 1/t_window

  • 單個窗口的長度爲t_window = nfft/f_sample

  • 用半重疊的窗口,所需要的數據總量爲t_total = t_window * (n_average + 1)/2

  • 對於片面光譜,PSD的頻譜容量的數量是nfft/2

  • Nyquistf_max = f_sample/2

爲了得到一個合理的平穩譜,我通常使用的20周均線的順序。結合上面的公式並填寫所需的光譜分辨率,然後爲您提供所需數據的總長度。或者相反,如果只有有限的可用數據量,則可以計算出您可以獲得的頻率分辨率。

+0

感謝您的回答,但零填充的問題是什麼? – Engine

+0

看到鏈接的問題,它只會給你'假'的決議。它會給你更多的分數,但是這些形式或多或少地形成了你沒有零填充的點之間的平滑插值。你不會奇蹟般地獲得額外的光譜分辨率。把它看作是信息的保存,如果你使用1000點的數據,增加9000個零不會給你帶有10000個獨立箱的頻譜。我所知道的唯一用於零填充的用例是,如果您想準確確定頻譜中單個尖銳線條的頻率。 –

+0

即使運行零paddibnng我仍然得到相同的長度的PSD – Engine