计算语音信号功率谱熵matlab程序,基于自适应子带功率谱熵的语音端点检测算法...

谁能帮我看看  这段代码  我qq526874591   谢了

%csig混合前

%noise噪声

%nsig混合后

clear all;

Fs=20000;

csig=wavread('nsh.wav');

%sound(csig);

csig=csig(1:Fs);

noise=wavread('m109.wav');%read noise signal

%sound(noise);

nsig=saddn(csig,noise,0);%信比snr=15

%sound(nsig);

%时域相加,不会影响频域的~

%基于自适应子带频谱熵的稳健性语音端点检测

N=256;%

Winsiz=256;%帧长

Shift=128;%帧移

%q帧数

x=nsig;

x=x(:,1);%我这里假设你的声音是双声道,我只取单声道作分析,如果你想分析另外一个声道,请改成y=y(:,2)

t=(0:length(x)-1)/Fs;

subplot(311)

plot(t,x);xlabel('t/s'); ylabel('幅度');

x=double(x);

%对信号做预加重处理

x=filter([1 -0.9375], 1, x);%????????

q=floor((length(x)-Winsiz)/Shift)+1;%向负无穷取整  然后加一    帧数

A=zeros(Winsiz/2+1,q);%m行n列零矩阵

%下面循环是x信号的加窗处理并求出各点频谱能量

for i=1:q

n1=(i-1)*Shift+1;n2=n1+(Winsiz-1);

xx=x(n1:n2);xx=xx.*hamming(Winsiz);%.*表示元素对应相乘

y=fft(xx,N);%n点fft对xx进行快速傅里叶变换

y=y(1:Winsiz/2+1);

y=y.*conj(y);%求复数的共轭

A(:,i)=y;

end

%计算总能量

Esum=zeros(1,q);

for i=1:q

for j=1:Winsiz/2

Esum(i)=Esum(i)+A(j,i);

end

end

%下面是计算每一帧的谱的能量  公式(2)

for i=1:q

for n=1:Winsiz/2

E(n,i)=A(n,i);

end

end

%下面是计算每帧中每个样本点的概率分布 公式(3)

for i=1:q

for n=1:Winsiz/2

P(n,i)=E(n,i)/Esum(i);

end

end

%下面是计算每一帧的谱熵值  公式(4)

H=zeros(1,q);

for i=1:q

for n=1:Winsiz/2

H(i)=H(i)+P(n,i)*log(P(n,i)+eps);

end

end

%画出wav文件的波形和对应的信息熵

subplot(312)

plot(H);

title('对应信息熵')

%为了消除单个点受噪声的影响,现在把4点放在一起,变成一子带,4*32=128

Eb=zeros(32,q);Ebsum=zeros(1,q);

for i=1:q

for m=1:32

for k=(4*m-3):4*m

Eb(m,i)=Eb(m,i)+E(k,i);

end

Ebsum(i)=Ebsum(i)+Eb(m,i);

end

end

%实现文中公式(8)

for i=1:q

for k=1:32

Pb(k,i)=Eb(k,i)/Ebsum(i);

end

end

%实现文中公式(9)

Hb=zeros(1,q);

for i=1:q       %i相当m

for k=1:32     %Vb=m

Hb(i)=Hb(i)-Pb(k,i)*log(P(k,i)+eps);

end

end

%画出wav文件的波形和对应的信息熵

subplot(313)

plot(Hb);

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值