⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gmm.m

📁 使用GMM模式建立的语音识别系统
💻 M
字号:
function    value=GMM(centroid,cov,k_all,v)
mindist=0.01;%设置最小的矢量距离
L=30.001;%30times iterate ,with average variation of 0.001 for each iteration.
em_count=0;
[dimen,frame_all]=size(v);
cov_exp=zeros(dimen,16,20);
centroid_exp=zeros(dimen,16,20);
%   mix(v,16,5);
th=(L-floor(L))*frame_all;%0.001*frame_all
finalpro=0;
for ii=1:L%em过程L=30次
    %     divide设置初始点时候只需要根据每个类别聚类就可以了,而下面将进行的高斯模型em过程将会在每个中心 点都与每个点关联 取得p和b的值
    em_count=em_count+1;
    p=zeros(16,frame_all);
    b=zeros(16,frame_all);
    k_all=k_all/frame_all;%i类模型出现的概率
    for i=1:16
        for j=1:frame_all
            if sum(abs(centroid(:,i)))~=0
            b(i,j)=(abs(prod(cov(:,i))^(-1/2)))*exp(sum((v(:,j)-centroid(:,i)).^2./cov(:,i))*(-1/2));
            else
                b(i,j)=0;
            end
        end
    end
    for i=1:frame_all
        b_sum=0;
        for j=1:16
            b_sum=b_sum+b(j,i)*k_all(j);
        end
        for j=1:16
            if b_sum~=0%防止没有数据的出现
                p(j,i)=k_all(j)*b(j,i)/b_sum;
            else
                p(j,i)=0;
            end
        end
    end
    centroid=zeros(dimen,16);
    cov=zeros(dimen,16);
    p_sum=zeros(16,1);
    k_all=zeros(16,1);
    %知道了p和b的值,修正centroid, cov 的值和k_all就是p(i)的值
    for i=1:16%problem
        for j=1:frame_all
            centroid(:,i)=centroid(:,i)+p(i,j)*v(:,j);
            p_sum(i)=p_sum(i)+p(i,j);
            k_all(i)=k_all(i)+p(i,j);
        end
        k_all(i)=k_all(i)/frame_all;
        if p_sum(i)~=0%改过
            centroid(:,i)=centroid(:,i)/p_sum(i);
        else
            centroid(:,i)=0;
        end
        for j=1:frame_all
            if p_sum(i)~=0%改过
                cov(:,i)=cov(:,i)+(v(:,j).^2-centroid(:,i).^2)*p(i,j)/p_sum(i);
            else
                cov(:,i)=0;
            end
        end

    end
    for j=1:16
        for jj=1:dimen
            if cov(jj,j)<mindist
                cov(jj,j)=mindist;
            end
        end
    end
    cov_exp(:,:,em_count)=cov(:,:);
    centroid_exp(:,:,em_count)=centroid(:,:);

    finalpro_pre=finalpro;
    finalpro=0;
    for i=1:frame_all
        finalpro=finalpro+sum(b(:,i).*k_all);
    end

    if finalpro-finalpro_pre<th&&ii>2
        break;
    end
    % zza2
end
value={centroid,cov,k_all};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -