自適應波束形成(五)——Frost波束形成2

        上篇是對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波束形成器能明顯增強期望方向上的語音信號,衰減干擾方向的語音信號,但由於不同人聲頻率的差異,增強效果有所差別。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章