我正在使用Matlab Voicebox例程中的melcepst
函数从声音文件中获取MFCC。下面是我正在使用的代码,以及一个示例wav文件。我的实际文件是以48000Hz和24位深度采样的1秒wav文件。 melcepst
的源代码可以在http://www.ee.ic.ac.uk/hp/staff/dmb/voicebox/doc/voicebox/melcepst.html找到,我将参考。{3}}。
加载wav文件:
load handel.mat
filename = 'handel.wav'
[y,Fs] = audioread('handel.wav');
audiowrite(filename, y, Fs)
运行melcepst
功能。文件的采样率为8192Hz。我指定一个汉明窗口('M'),12个倒谱系数,30个三角滤波器,245帧长度,81个样本的帧增量,以及默认的最低和最高滤波器。
[c,tc] = melcepst('handel.wav', 8192, 'M', 12, 30, 245, 81, 0, 0.5)
这会返回以下错误:
Error using max
Matrix dimensions must agree.
Error in melcepst (line 111)
y=log(max(m*abs(f(a:b,:)),ath));
深入挖掘melcepst
源代码可揭示问题的根源(第111行):
从第101行开始:
[z,tc]=enframe('handel.wav',0.54-0.46*cos(2*pi*(0:245-1)'/(245-1)),81)
f=rfft(z.');
[m,a,b]=melbankm(30,245,8192,0,0.5,'t');
pw=f(a:b,:).*conj(f(a:b,:));
pth=max(pw(:))*1E-20;
ath=sqrt(pth);
y=log(max(m*abs(f(a:b,:)),ath));
最后一行中使用的矩阵ath
和m*abs(f(a:b,:))
不兼容。 ath
是0 x 1空双向量列,而m*abs(f(a:b,:))
是30 x 0空双向量列。
我理解问题是什么,但我不清楚为什么这个问题首先出现,除非原始源代码中存在错误(这似乎不太可能)。先前在代码中是否存在问题,以后会出现不兼容的矩阵?我用自己的文件尝试了这个,并且他们自己的变量与我为这个例子指定的变量略有不同,我仍然返回相同的错误。任何想法将不胜感激。
答案 0 :(得分:1)
我一直在继续努力,并认为我的问题只是我使用完整的音频信号(原始的wav文件)作为我的输入语音信号,而不仅仅是样本矢量。因此,在上面的示例中,如果我在y
函数中输入handel.wav
而不是melcespt
,则代码运行正常:
[c,tc] = melcepst(y, 8192, 'M', 12, 30, 245, 81, 0, 0.5);
问题解决了。