Matlab Voicebox 代码中不兼容矩阵的来源



我正在使用 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));

最后一行中使用的矩阵athm*abs(f(a:b,:))不兼容。ath是 0 x 1 空的双向量列,而m*abs(f(a:b,:))是 30 x 0 的空双向量列。

我明白问题是什么,但我不清楚为什么首先会出现这个问题,除非原始源代码中存在错误(这似乎不太可能(。代码前面是否存在问题,稍后会给出不兼容的矩阵?我已经用我自己的文件和它们自己的变量尝试过这个,这些变量与我为此示例指定的变量略有不同,但我仍然返回相同的错误。任何想法将不胜感激。

我一直在研究这个问题,并认为我的问题只是我使用完整的音频信号(原始 wav 文件(作为我的输入语音信号,而不仅仅是样本的向量。因此,在上面的例子中,如果我输入y而不是handel.wavmelcespt函数,代码运行良好:[c,tc] = melcepst(y, 8192, 'M', 12, 30, 245, 81, 0, 0.5);

问题解决了。

相关内容

  • 没有找到相关文章

最新更新