Может ли результирующая матрица извлечения признаков MFCC иметь отрицательное значение?

Я использую MFCC для извлечения функции для реализации распознавателя речи. Я застрял в реализации HMM. Я использую Kevin Murphy Toolbox для HMM. Моя результирующая матрица MFCC содержит отрицательные значения, может быть, это тот случай, когда я получаю, может ли мой код MFCC быть неправильным. Ниже приведена ошибка, которую я получаю:

Attempted to access obsmat(:,-39.5403); index must be a positive integer or logical.

Error in multinomial_prob (line 19)
  B(:,t) = obsmat(:, data(t));

Error in dhmm_em>compute_ess_dhmm (line 103)
 obslik = multinomial_prob(obs, obsmat);

Error in dhmm_em (line 47)
 [loglik, exp_num_trans, exp_num_visits1, exp_num_emit] = ...

Error in speechreco (line 77)
[LL, prior2, transmat2, obsmat2] = dhmm_em(dtr{1}, prior, A, B, 'max_iter', 5);

Также, если кто-нибудь знает ссылку на какой-либо исходный код Matlab для HMM, пожалуйста, предоставьте мне мой окончательный проект. Я пытаюсь внедрить распознаватель речи и не знаю, что делать после извлечения вектора признаков.

Это весь код MatLab (я использую kevin murphy HMM Toolkit, ошибка в функции dhmm_em):

    function []=speechreco()

vtr = {8}; fstr = {8}; nbtr = {8};
ctr = {8};

for i = 1:8

    % Read audio data from train folder for performing operations
    st=strcat('train\s',num2str(i),'.wav');
    [s1 , fs1 , nb1]=wavread(st);  %st is filename; s1 is sample data, fs1 is frame rate in hertz, nb1 is number of bits per sample 
    vtr{i} = s1; fstr{i} = fs1; nbtr{i} = nb1;

    ctr{i} = mfcc(vtr{i},fstr{i});

end


display(ctr{1}); %MFCC matrix 20*129

W1 = transpose(ctr{1});

ch1=menu('Mel Space:','Signal 1','Signal 2','Signal 3',...
                        'Signal 4','Signal 5','Signal 6','Signal 7','Signal 8','Exit');
                    if ch1~=9
                        plot(linspace(0, (fstr{ch1}/2), 129), (melfb(20, 256, fstr{ch1})));
                        title('Mel-Spaced-Filterbank');
                        xlabel('Frequency[Hz]');
                    end


%error is here
[LL, prior2, transmat2, obsmat2] = dhmm_em(ctr{1}, prior, A, B, 'max_iter', 5);
plot(LL());

end

%%mfcc
%old one MFCC now
function r = mfcc(s, fs)
m = 100;
n = 256;
frame=blockFrames(s, fs, m, n); %power spectra obtained 
m = melfb(20, n, fs);
n2 = 1 + floor(n / 2);
z = m * abs(frame(1:n2, :)).^2; %apply traingular window
r = dct(log(z));  %take log and then the dct conversion 
end



%% blockFrames Function
% blockFrames: Puts the signal into frames
%
% Inputs: s contains the signal to analize
% fs is the sampling rate of the signal
% m is the distance between the beginnings of two frames
% n is the number of samples per frame
%
% Output: M3 is a matrix containing all the frames

function M3 = blockFrames(s, fs, m, n)
l = length(s);
nbFrame = floor((l - n) / m) + 1;
for i = 1:n
    for j = 1:nbFrame
        M(i, j) = s(((j - 1) * m) + i); %#ok<AGROW>
    end
end
h = hamming(n);
M2 = diag(h) * M;
for i = 1:nbFrame
    M3(:, i) = fft(M2(:, i)); %#ok<AGROW>
end
end
%--------------------------------------------------------------------------

function m = melfb(p, n, fs)  %used for graph plot of power spectra
% MELFB Determine matrix for a mel-spaced filterbank 
% 
% Inputs: p number of filters in filterbank 
% n length of fft 
% fs sample rate in Hz 
% 
% Outputs: x a (sparse) matrix containing the filterbank amplitudes 
% size(x) = [p, 1+floor(n/2)] 
% 
% Usage: For example, to compute the mel-scale spectrum of a 
% colum-vector signal s, with length n and sample rate fs: 
% 
% f = fft(s); 
% m = melfb(p, n, fs); 
% n2 = 1 + floor(n/2); 
% z = m * abs(f(1:n2)).^2; 
% 
% z would contain p samples of the desired mel-scale spectrum 
%%%%%%%%%%%%%%%%%% 
%
f0 = 700 / fs; 
fn2 = floor(n/2); 
lr = log(1 + 0.5/f0) / (p+1); 
% convert to fft bin numbers with 0 for DC term 
bl = n * (f0 * (exp([0 1 p p+1] * lr) - 1)); 
b1 = floor(bl(1)) + 1; 
b2 = ceil(bl(2)); 
b3 = floor(bl(3)); 
b4 = min(fn2, ceil(bl(4))) - 1; 
pf = log(1 + (b1:b4)/n/f0) / lr; 
fp = floor(pf); 
pm = pf - fp; 
r = [fp(b2:b4) 1+fp(1:b3)]; 
c = [b2:b4 1:b3] + 1; 
v = 2 * [1-pm(b2:b4) pm(1:b3)]; 
m = sparse(r, c, v, p, 1+fn2); 
end
%----------------------------------------------------------------------

person user3489201    schedule 02.04.2014    source источник


Ответы (1)


Ошибка не связана с отрицательным значением в MFCC, значения могут быть отрицательными. Ошибка говорит о том, что index является значением с плавающей запятой в obsmat, что означает, что вы неправильно строите obsmat, он имеет неправильный тип и у вас там значения и индексы не в том месте. Вам нужно поделиться всем кодом, который вы написали, чтобы выявить ошибку, а не только строками, в которых вы вызываете обучение.

Глядя на ваш код, я вижу, что вам, вероятно, нужно вызывать dhmm_em с помощью ctr, а не ctr{1}.

person Nikolay Shmyrev    schedule 03.04.2014
comment
Теперь я добавил весь код. Также дайте мне знать, если у вас есть код MatLab и вы можете поделиться им с HMM для распознавания изолированных слов, чтобы я мог использовать его в качестве справочного материала и в дальнейшем разрабатывать код для непрерывной модели из этой дискретной изолированной модели. - person user3489201; 04.04.2014