CAPON波束形成_Matlab程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
CAPON 波束形成器仿真
1.实验原理
波束形成就是从传感器阵列重构源信号。(1)、通过增加期望信源的贡献来实现;(2)、通过抑制掉干扰源来实现。经典的波束形成需要观测方向(期望信源的方向)的知识。盲波束形成试图在没有期望信源方向信息的情况下进行信源的恢复。
波束形成技术的基本思想是:通过将各阵元输出进行加权求和,在一时间内将天线阵列波束“导向”到一个方向上,对期望信号得到最大输出功率的导向位置即给出DOA 估计。 虽然阵列天线的方向图是全方向的,但阵列的输出经过加权求和后,却可以被调整到阵列接收的方向增益聚集在一个方向上,相当于形成了一个”波束”。这就是波束形成的物理意义所在。
在智能天线中,波束形成是关键技术之一,是提高信噪比、增加用户容量的保证,能够成倍地提高通信系统的容量,有效地抑制各种干扰,并改善通信质量。
波束形成器的最佳权向量w 取决于阵列方向向量)(a k θ ,而在移动通信里用户的方向向量一般未知,需要估计(称之为DOA 估计)。因此,在计算波束形成的最佳权向量之前,必须在已知阵列几何结构的前提下先估计期望信号的波达方向。
Capon 波束形成器求解的优化问题可表述为
w arg min P(w)θ=
其约束条件为 1)(a w H =θ
Capon 波束形成器在使噪声和干扰所贡献的功率为最小的同时,保持了期
望信号的功率不变。因此,它可以看作是一个尖锐的空间带通滤波器。最优加 权向量w 可以利用Lagrange 乘子法求解,其结果为 )(a R ˆ)(a )(a R ˆw 1H 1CAP θθθ--=
当μ不取常数,而取作)(a R ˆ)(a 11H θθμ-=时,最佳权向量就转变成Capon 波束形成器的权向量。空间谱为
)(a R
ˆ)(a 1)(P 1-H CAP θθθ=
2.变量定义
M :均匀线阵列数目
P :信号源个数
nn :快拍数
angle1、angle2、angle3:信号来波角度
u :复高斯噪声
Ps :信号能量
refp :信噪比(实值)
X :接收信号
Rxx :接收信号的相关矩阵
doa :波达方向估计
3.仿真结果
采用上述算法进行仿真,结果如图所示。
在本仿真程序中,我们采用16个均匀线阵列,3个信号源,来波角度分别为5︒、45︒、20-︒,信噪比均为10dB ,噪声为复高斯白噪声,快拍数1000。 由仿真结果看出,capon 波束形成器较好的给出了信号的doa 估计,但是在仿真的过程中,我们发现,capon 算法具有很大的局限性,其对扰和噪声是比较敏感的。
4.程序
clear all
i=sqrt(-1);
j=i;
M=16; %均匀线阵列数目
P=3; %信号源数目
f0=10;f1=50;f2=100;%信号频率
nn=1000; %快拍数
angle1=45;angle2=5;angle3=-20;%the signal angle th=[angle1;angle2;angle3]';
SN1=10;SN2=10;SN3=10;%信噪比
sn=[SN1;SN2;SN3];
degrad=pi/180;
tt=0:.001:(1-.001);
x0=exp(-j*2*pi*f0*tt); %3个信号x0、x1、x2
x1=exp(-j*2*pi*f1*tt); %
x2=exp(-j*2*pi*f2*tt); %
t=1:nn;
S=[x0(t);x1(t);x2(t)];
nr=randn(M,nn);
ni=randn(M,nn);
u=nr+j*ni; %复高斯白噪声
Ps=S*S'./nn; %信号能量
ps=diag(Ps);
refp=2*10.^(sn/10);
tmp=sqrt(refp./ps);
S2=diag(tmp)*S; %加入噪声
tmp=-j*pi*sin(th*degrad);
tmp2=[0:M-1]';
a2=tmp2*tmp;
A=exp(a2);
X=A*S2+.1*u; %接收到的信号
Rxx=X*X'./nn; %相关矩阵
invRxx=inv(Rxx);
%搜寻信号
th2=[-90:90]';
tmp=-j*pi*sin(th2'*degrad);
tmp2=[0:M-1]';
a2=tmp2*tmp;
A2=exp(a2);
den=A2'*invRxx*A2;
doa=1./den;
semilogy(th2,doa,'r');
title('spectrum');
xlabel('angle');
ylabel('spectrum');
axis([-90 90 1e1 1e5]);
grid;