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

如何使用matlab从单声道wav文件中获取频率和音高?,matlab,audio,wav,Matlab,Audio,Wav,我的音乐数据挖掘课程给了我一个作业,我们只有2天的时间。我不知道如何完成问题4(如下)。其他4个问题非常容易回答,但这个问题毫无意义。她在课程中教给我们的任何东西都没有帮助,也没有任何网络资源能够提供任何信息。一旦我知道音符的频率,我就知道如何获得音高名称,但我不确定如何获得频率。任何帮助都将不胜感激 完整问题: 编写一个名为hw2q4xxx.m的Matlab程序(xxx是n数字的最后3位) 识别波形文件中包含的音高 程序将使用以下命令执行: hw2q4xxx('input.wav') 输入:

我的音乐数据挖掘课程给了我一个作业,我们只有2天的时间。我不知道如何完成问题4(如下)。其他4个问题非常容易回答,但这个问题毫无意义。她在课程中教给我们的任何东西都没有帮助,也没有任何网络资源能够提供任何信息。一旦我知道音符的频率,我就知道如何获得音高名称,但我不确定如何获得频率。任何帮助都将不胜感激

完整问题:

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

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

hw2q4xxx('input.wav')

输入: •input.wav–包含单个音调声音的单声道波形文件

输出: •在屏幕上显示音高名称和寄存器。例如,显示
包含频率约为265 Hz的音调的波文件

加载到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”中。然后,它将找到所有本地maxima“PK”及其位置“LOC”。然后,您可以使用find命令找到最大局部峰值,并确定它位于向量“out”中的哪个索引。最后一行从索引转换为频率

加载到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”中。然后,它将找到所有本地maxima“PK”及其位置“LOC”。然后,您可以使用find命令找到最大局部峰值,并确定它位于向量“out”中的哪个索引。最后一行从索引转换为频率

加载到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”中。然后,它将找到所有本地maxima“PK”及其位置“LOC”。然后,您可以使用find命令找到最大局部峰值,并确定它位于向量“out”中的哪个索引。最后一行从索引转换为频率

加载到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”中。然后,它将找到所有本地maxima“PK”及其位置“LOC”。然后,您可以使用fin找到最大局部峰值