我必须从1秒长的.wav文件中提取基本频率。
我已经查看了几种选择,例如找到峰值或进行复杂的倒频谱,但到目前为止还没有运气。在过去的几周中,我已经阅读了很多有关它的内容,但仍然找不到可行且最佳的方法。我是Matlab和Signal Processing的新手。
filedir = dir('*.wav');
[y, Fs] = audioread(filedir.name);
x = y(y ~= 0) % removing the zeroes from the array
psdest = psd(spectrum.periodogram,x,'Fs',Fs,'NFFT',length(x));
[~,I] = max(psdest.Data);
fprintf('Maximum occurs at %d Hz.\n',psdest.Frequencies(I));
例如,输出为:最大值出现在5.758645e + 02 Hz
我可能实际上需要将该数字转换为Hz。
对于复杂倒频谱:
load mtlb
dt = 1/Fs;
I0 = round(0.1/dt);
Iend = round(1/dt);
x = mtlb(I0:Iend);
c = cceps(x);
t = 0:dt:length(x)*dt-dt;
trng = t(t>=2e-3 & t<=10e-3);
crng = c(t>=2e-3 & t<=10e-3);
[~,I] = max(crng);
fprintf('Complex cepstrum F0 estimate is %3.2f Hz.\n',1/trng(I))
clearvars
我加载的所有文件的输出值都相同,因此很明显出了问题。
我已经挣扎了一段时间,我真的需要弄清楚这一点。提取该基本频率。我使用Matlab 2016b。
非常感谢!