我正在使用 Matlab Voicebox 例程中的melcepst
函数从声音文件中获取 MFCC。下面是我正在使用的代码,带有示例 wav 文件。我的实际文件是以 1 位和 48000Hz 和 24 位深度采样的 24 秒 wav 文件。melcepst
的源代码可以在 http://www.ee.ic.ac.uk/hp/staff/dmb/voicebox/doc/voicebox/melcepst.html 这里找到,我将参考。
加载 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 的空双向量列。
我明白问题是什么,但我不清楚为什么首先会出现这个问题,除非原始源代码中存在错误(这似乎不太可能(。代码前面是否存在问题,稍后会给出不兼容的矩阵?我已经用我自己的文件和它们自己的变量尝试过这个,这些变量与我为此示例指定的变量略有不同,但我仍然返回相同的错误。任何想法将不胜感激。
我一直在研究这个问题,并认为我的问题只是我使用完整的音频信号(原始 wav 文件(作为我的输入语音信号,而不仅仅是样本的向量。因此,在上面的例子中,如果我输入y
而不是handel.wav
melcespt
函数,代码运行良好:[c,tc] = melcepst(y, 8192, 'M', 12, 30, 245, 81, 0, 0.5);
问题解决了。