资源简介
该方 法基 于 自适
应子带谱熵的方法, 引入正常量 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(
- 上一篇:MATLAB 常微分方程
- 下一篇:MATLAB上实现不同窗口的中值滤波
评论
共有 条评论