• 大小: 3KB
    文件类型: .m
    金币: 1
    下载: 0 次
    发布日期: 2021-06-15
  • 语言: Matlab
  • 标签: 端点检测  

资源简介

该方 法基 于 自适 应子带谱熵的方法, 引入正常量 K, 计算 负熵, 然而噪 声的负 熵减少要比语音的 负熵 减小 的明显, 同 时, 各种 噪声的 负熵 很接近, 这样就增强了语音与噪声的区分度

资源截图

代码片段和文件信息

clear all;
clc;
close all
%基于自适应子带频谱熵的稳健性语音端点检测
N=256;%FFT变换的点数
Winsiz=256;%帧长
Shift=128;%帧移
[xFs]=wavread(‘d:\new180_speech\1\1_1.wav‘);
% len=length(x1);
% nois=0.003*rand(len1);
% x=x1+nois;
% x=x./max(x);
% 对信号做预加重处理
x=filter([1 -0.9375] 1 x);

nseg=floor((length(x)-Winsiz)/Shift)+1;
A=zeros(Winsiz/2+1nseg);

%下面循环是x信号的加窗处理并求出各点频谱能量
for i=1:nseg
    n1=(i-1)*Shift+1;n2=n1+(Winsiz-1);
    xx=x(n1:n2);xx=xx.*hamming(Winsiz);
    y=fft(xxN);
    y=y(1:Winsiz/2+1);
    y=y.*conj(y);
    A(:i)=y;
end
%计算总能量
Esum=zeros(1nseg);
for i=1:nseg
    for j=1:Winsiz/2
        Esum(i)=Esum(i)+A(ji);
    end
end 
%下面是计算每一帧的谱的能量
for i=1:nseg
    for n=1:Winsiz/2
        E(ni)=A(ni);
    end
end   
%下面是计算每帧中每个样本点的概率分布
for i=1:nseg
    for n=1:Winsiz/2
      P(ni)=E(ni)/Esum(i);  
    end
end

%下面是计算每一帧的谱熵值
H=zeros(1nseg);
for i=1:nseg
    for n=1:Winsiz/2
        H(i)=H(i)+P(ni)*log(P(ni)+eps);
    end
end   
H=-H;
%_________________________________________________

T1=2;
T2=1.8;
maxsilence=2;
minlen=20;
status=0;
count=0;
silence=0;
%开始端点检测
x1 = 0; 
x2 = 0;
xn=1;
for n=1:length(H)             %xn记录连续语音中字的段数(几个字)  
   switch status
   case {01}                   % 0 = 静音 1 = 可能开始
      if H(n) > T1          % 确信进入语音段
         x1(xn) = max(n-count(xn)-11);
         status  = 2;
         %silence(xn) = 0;
         count(xn)   = count(xn) + 1;
      elseif H(

评论

共有 条评论