上篇是对matlab模拟产生的阵列接收语音进行增强,这篇主要是利用Frost波束形成器对真实信号进行增强。
1 测试环境
采集环境为6*3.7*3.4m3的测试室,用恒通DAR2000多路音频采集卡(如图1左),通过D型音频接线口与由烽火PK-080VH微型数字针孔拾音器(如图1右)组成的麦克风阵列相连,采集8路真实语音信号进行语音增强测试。
图1 DAR2000多路音频采集卡和 PK-080VH微型数字针孔拾音器
2 C++源码
这里仅仅是测试算法,所以没有加入读取音频及写音频部分的代码,通过将音频数据存放于txt中简单存取。
#define BOUNDS_CHECK
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "engine.h"
using namespace std;
using namespace splab;
typedef double Type;
const int M=8,N=38454,fs=8000,J=20; //麦克风数
const double theta=-PI*30.0/180.0,mu=0.00002; //指向角-30
const Type c=Type(340.0);
const Type d=Type(0.064);
const Type Ts=1.0/fs;
//计算时延
Type delay(int m)
{
Type T=(M-1)*d/c;
//cout<=0.5)
{
return Dd+1;
}
else
{
return Dd-1;
}*/
return D;
}
int delay1(int m)
{
Type T=M*d/c;
//cout<=0.5)
{
return Dd+1;
}
else
{
return Dd-1;
}
}
//分数时延滤波器
Vector h(int m)
{
Vector H(10);
for(int n=0; n<10; n++)
{
H[n]=1;
for(int k=0; k<=10; k++)
{
Type nk=n-k;
if(k!=n)
H[n]*=((delay(m)-k)/nk);
//cout< Cons()
{
Matrix C(M*J,J);
for(int i=0; i c(M*J);
for(int j=0; j fcon()
{
Vector f(J);
f[0]=1;
return f;
}
//计算C(C^TC)^-1
Matrix Cc()
{
Matrix C=Cons();
Matrix CTC(J,J);
for(int i=0; i CTCinv=inv(CTC);
Matrix CC(M*J,J);
for(int i=0; i Fcon()
{
Matrix CCI=Cc();
Vector f=fcon();
Vector F(M*J);
for(int i=0; i Pcon()
{
Matrix CCI=Cc();
Matrix C=Cons();
Matrix CCIC(M*J,M*J);
for(int i=0; i I(M*J,M*J);
for( int i=0; i P=I-CCIC;
return P;
}
Matrix DELAY(Matrix &x)
{
int Len=x.cols();
Matrix yd(M,Len);
for(int n=0; n xd(M,10);
for(int row=0; row y(M);
for(int row=0; row H=h(row);
y[row]=dotProd(H,xd.getRow(row));
}
yd.setColumn(y,n);
}
return yd;
}
//时域lcmv
Vector lcmvtime(Matrix &x,const int M)
{
int Len=x.cols(); //数据长度
//Vector hw=hamming(WL,A); //汉明窗
Vector w=Fcon();
//cout< y(Len);
Matrix P=Pcon();
Vector F=Fcon();
for(int n=0; n xx(M,J);
for(int row=0; row x_in(M*J);
for(int i=0; i w1=w-mu*y[n]*x_in;
//cout< Pw(M*J);
for(int i=0; i ReadData(int a)
{
const char*filename[8]={"0.txt","1.txt","2.txt","3.txt","4.txt","5.txt","6.txt","7.txt"};
Vector In(N);
ifstream fin(filename[a]);
for(int i=0;i>In[i];
}
fin.close();
fin.clear();
return In;
}
int main()
{
//各麦克风输出信号
/*Vector In_0=ReadData(0);
Vector In_1=ReadData(1);
Vector In_2=ReadData(2);
Vector In_3=ReadData(3);
Vector In_4=ReadData(4);
Vector In_5=ReadData(5);
Vector In_6=ReadData(6);
Vector In_7=ReadData(7);*/
//cout< x_In(M,N);
for(int i=0; i x_In_delay=DELAY(x_In);
//cout< x0=x_In.getRow(0);
Vector x1=x_In.getRow(1);
//cout< > X0(N);
X0=fftr2c(x0);
Vector X0_abs=abs(X0);
Vector y_out=lcmvtime(x_In,M);
//cout<<"After proceed:"<
其中时延用的是整数时延,最后是用vs调用matlab画图。
3 增强效果
在60o方向有一女声说“我在60o”,-30o方向有一男声“我在-30o”,首先两人分别单独说,然后两人同时说,采样频率为8kHz,8个拾音器线性排列,间距6.4cm。先对-30o方向的男声进行增强,结果如图2所示。
图2 增强-30o男声信号
上图的上半部分是第一个麦克风采集的混合语音,下半部分是对-30o男声进行增强后的语音。由于前面两段波形是两人单独说话时的波形,对这两段波形分析可发现,60o语音信号波形明显衰减,-30o语音信号波形基本不变。将-30o语音作为期望信号,60o语音作为噪声,增强前信噪比约为3.6364dB,增强后信噪比约为8.0330dB,信噪比增益4.3966dB。
然后对60o方向的女声语音进行增强,结果如图3所示。
图3 增强60o女声信号
上图的上半部分是第一个麦克风采集的混合语音,下半部分是对60o女声进行增强后的语音。对前面两段两人单独说话时的波形分析可发现,60o语音信号波形基本不变,-30o语音信号波形明显衰减。将60o语音作为期望信号,-30o语音作为噪声,增强前信噪比约为-3.6364dB,增强后信噪比约为8.2396dB,信噪比增益11.8760dB。
由以上实验可知,Frost波束形成器能明显增强期望方向上的语音信号,衰减干扰方向的语音信号,但由于不同人声频率的差异,增强效果有所差别。