資源簡介
該方 法基 于 自適
應子帶譜熵的方法, 引入正常量 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上實現不同窗口的中值濾波
評論
共有 條評論