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