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

📄 beamform.m

📁 基于麦克风阵波束形成的谱相减方法在语音增强中的应用
💻 M
字号:

close all;
a1=0;a2=0;a3=0;a4=0;a5=0;
nn1=zeros(5,1:26000);
N=32;w=zeros(1,32);DD=zeros(1,32);var=0.99997;x=zeros(1,32);
e=zeros(4,1:26000);Usf=0.0008;                
[n1,n2,n3,n4,n5]=dataread5('C:\MATLAB6p5\work\beamform\5ch8k40cm01.dat',80000); % 5ch8k1m4fu3cmcircle.dat',80000);21760);5ch8k1m4fu3cmcircle.dat'定义五个通道含噪声
sp=wavread('C:\MATLAB6p5\work\beamform\speech_dft.wav');%纯语音
for i=1:26000 
speech(i)=sp(i*3);
end                                             %===初始化
%=================================================
nn1(1,1:26000)=n1(1:26000)/50;nn1(2,1:26000)=n2(1:26000)/50;         %自适应
nn1(3,1:26000)=n3(1:26000)/50;nn1(4,1:26000)=n4(1:26000)/50;
nn1(5,1:26000)=n5(1:26000)/50;
xx(1:26000)=nn1(5,1:26000)+speech;   
for aa=1:4
    dd(1:26000)=nn1(aa,1:26000);
  for k=1:26000
    if k<=32 
     x(1:k)=dd(k:-1:1);
      else
       x(1:32)=dd(k:-1:k-32+1);
     end
  y=w*x';
  e(aa,k)=xx(k)-y;    %e(aa,k)自适应输出
   var=0.01*xx(k)^2+0.99*var;
   if k<=32
    w(1:k)=w(1:k)+Usf*e(aa,k)*dd(k:-1:1)/var;
   else
    w(1:32)=w(1:32)+Usf*e(aa,k)*dd(k:-1:k-32+1)/var;
   end
  end
 end
 %spectral subtraction
hanning=zeros(1,256);soutput=zeros(4,26000);szeros=zeros(1,26000);
szeros=zeros(1,26000);Sout0=zeros(1,256);
j=sqrt(-1);a=3,b=0.01;
Snoise=zeros(1,256);
phase=zeros(1,256);
for n=1:256
   hanning(n)=(1/2)*(1-cos((2*pi)*(n-1)/255));
end
for i=1:8   %=======================================
  noise1=e(1,i*256-255:i*256).*hanning;
  Noise1=abs(fft(noise1));
  Noise(i,1:256)=Noise1; 
  if i>1
  Noise(i,1:256)=Noise(i,1:256)-Noise(1,1:256);    
  end
end
S0=zeros(4,1:26000); 
as=4;
for k=1:4 
 as
 for i=1:200
   snoise=e(k,(i-1)*128+1:(i-1)*128+256).*hanning;  %重叠目的:抵消窗效应       
   phase=angle(fft(snoise));
   Snoise=abs(fft(snoise));   
  for m=1:8
   for n=1:256 
      if(Snoise(n)^2-Noise(m,n)^2)<0
      Sout0(n)=0;
      else
      Sout0(n)=(Snoise(n)^2-Noise(m,n)^2)^0.5;
      end
      S0(k,n)=Sout0(n)*(cos(phase(n))+j*sin(phase(n)));
    end
    Snoise=Sout0;
   end
   sout0=ifft(S0(k,1:256));
   szeros(((i-1)*128+1):((i-1)*128+256))=real(sout0);
   soutput(k,1:26000)=soutput(k,1:26000)+szeros;
   szeros=zeros(1,26000);
  end
end
 output=zeros(1,26000);
 for i=1:4 
 output=soutput(i,1:26000)+output;
end
subplot(4,1,1)
plot(xx)
subplot(4,1,2)
plot(e(1,1:26000))
subplot(4,1,3)
plot(soutput(1,1:26000))
subplot(4,1,4)
plot(output (1:26000))
      end
    end
  end
end

⌨️ 快捷键说明

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