2014-03-24 76 views
0

我被授予了我的音樂數據挖掘課程的作業,我們只有2天的時間。我無法弄清楚如何完成問題4(如下)。其他4個問題非常容易做到,但這個問題沒有意義。在課程中她沒有教給我們什麼幫助,也沒有任何互聯網資源能夠說明問題。我知道如何獲得音符名稱,只要我有音符的頻率,但我不知道如何獲取頻率。任何幫助,將不勝感激。如何使用matlab從單聲道wav文件中獲取頻率和音高?

全部問題:

寫Matlab程序名爲hw2q4xxx.m(xxx是你正號碼的最後3位數字) 識別包含在波形文件的音調。

程序將使用該命令來執行:

hw2q4xxx(「input.wav」)

輸入: •input.wav - 包含單個音調的聲音單聲道波文件。

輸出: •顯示音調名稱並在屏幕上註冊。例如,顯示包含頻率爲265Hz左右音高的波形文件的C4。

回答

3

當加載到Matlab中時,.wav文件通常包含一個數據向量和一個採樣頻率。您需要執行頻譜估計或FFT以確定頻率內容。我會推薦使用像pwelch這樣的東西,它會爲您的數據執行功率譜估計。加載後,你可以嘗試的東西沿着這些路線:

pwelch(data,[],[],1024,fs) 

這將繪製譜估計,並應包含感興趣的頻率的強音。

您還可以通過使用某些窗口技術來獲得更好的光譜,例如,使用海明窗會減少您在光譜圖中看到的很多波紋。這將使用這樣的事情來完成:

NFFT = 1024; 
pwelch(data,hamming(NFFT),[],NFFT,fs) 

增加NFFT的大小將提供更好的頻率分辨率。你也可以玩這個(例如你可以試試NFFT = 1024 * 10)。

要提取頻率信息,您可以使用findpeaks函數。試試這段代碼:

NFFT = 1024*10; 

out = pwelch(data,hamming(NFFT),[],NFFT,fs); 
[pks locs] = findpeaks(out); 
indx = find(pks == max(pks)); 
indx_max = locs(indx); 

f = indx_max/length(out) * (fs/2); 

這會將pwelch數據保存到「out」向量中。然後它會查找所有當地最大值「pks」及其位置「locs」。然後,您可以使用find命令找到最大局部峯值,並確定它所在向量「out」中的哪個索引。最後一行從索引轉換爲頻率。

+0

嘿,謝謝,這真棒!這正是我需要的。感謝您的解釋。我已將代碼轉換爲便籤,所以我非常感謝您幫助我理解這一點。 再次感謝! – TyP

相關問題