如何使用matlab从单声道wav文件中获取频率和音高?

时间:2014-03-24 20:15:17

标签: matlab audio wav

我获得了音乐数据挖掘课程的作业,我们只有2天的时间。我无法弄清楚如何完成问题4(下面)。其他4个问题非常容易,但这个问题毫无意义。她在课程中没有教过我们任何帮助,也没有互联网资源能够解决问题。我知道如果我有音符的频率,如何得到音高名称,但我不知道如何获得频率。任何帮助将不胜感激。

完整的问题:

编写一个名为hw2q4xxx.m的matlab程序(xxx是你的n个数字的最后3位数字) 识别波形文件中包含的音高。

程序将使用以下命令执行:

hw2q4xxx('input.wav')

输入: •input.wav - 包含单个音高声音的单声道波形文件。

输出: •显示音高名称并在屏幕上注册。例如,显示C4 包含频率约为265 Hz的音高的波形文件。

1 个答案:

答案 0 :(得分: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"它地处。最后一行从索引转换为频率。