簡體   English   中英

如何使用Matlab從單聲道wav文件中獲取頻率和音調?

[英]How can I get frequency and pitch from a monophonic wav file using matlab?

我的音樂數據挖掘課程只給了我2天的作業。 我不知道如何完成問題4(如下)。 其他4個問題非常容易解決,但這沒有任何意義。 她在本課程中教給我們的所有信息都無濟於事,並且沒有任何互聯網資源能夠說明任何問題。 我知道音符的頻率后如何獲取音高名稱,但是我不確定如何獲取頻率。 任何幫助,將不勝感激。

完整問題:

編寫一個名為hw2q4xxx.m的Matlab程序(xxx是您的n數的最后3位數字),以識別包含在波形文件中的音高。

該程序將使用以下命令執行:

hw2q4xxx('input.wav')

輸入:•input.wav –包含單個音高聲音的單音波文件。

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

當加載到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”內的哪個索引。 最后一行從索引轉換為頻率。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM