这段时间由于学习和工作原因开始学习阵列信号处理的相关知识,本系列仅用于个人学习记录,本人也是刚刚开始学习,若在文章中有错误或者问题,非常欢迎各位大佬批评指正!
波束形成对于阵列信号处理是一个十分重要的组成部分,最常规的波束形成方法,是一种相控阵天线法,该方法选取了一个权向量来补偿阵列中各阵元的传播延时,从而使得阵元输出在某一期望方向上可以同向叠加,在该方向上产生一个主瓣波束,在其他方向上产生较小的响应。
本文现在将用MVDR算法并以常规波束形成角度来构造等距线阵MATLAB代码
参量初始化
要实现波束形成,我们首先要知道一些基本的参量,如阵元数,快拍数,信号源个数,信号入射角度,干扰源个数及其入射角度等等。
这里着重强调一下快拍数,在阵列信号处理和波束形成的理论中,快拍数十分重要,他指的是在信号采样过程中的总采样点的个数,也可以理解是采样次数,即采样时间点的数量(样本数量),如:对于M个阵元的阵列,其在第t个快拍时接收到的信号为(这里无视干扰以及噪声,仅为举例理解)
X(t)=[X1(t),X2(t), ... ,XM(t)]
快拍数主要是用于协方差矩阵估计,协方差矩阵对于波束形成算法是非常重要的部分。
快拍数越多,协方差矩阵估计越准确,波束形成效果越好,但不能无限多,会使计算更复杂,对存储要求也较高。
参量初始化代码如下:
%%参量初始化
M=18;%天线数
L=100;%快拍数
thetas=10;%信号入射角度
thetai=[-30 30];%干扰入射角度
n=[0:M-1]';
方向矢量构造
对于方向矢量的构造,我们可以参考均匀线阵的阵列响应矢量
本文里的均匀线阵以半波长布阵,即
所以信号和噪声的方向矢量构造如下:
%%方向矢量
vs=exp(-j*pi*n*sin(thetas/180*pi));%信号方向矢量
vi=exp(-j*pi*n*sin(thetai/180*pi));%干扰方向矢量
所需信号构造
对于该信号,我们需要构造他的有用部分,噪声部分和干扰部分,我们假设这里的信噪比和干燥比都是10,代码如下:
%%信号生成
f=16000;%载波频率
t=[0:1:L-1]/200;
snr=10;
inr=10;
xs=sqrt(10^(snr/10))*vs*exp(j*2*pi*f*t);%构造有用信号
xi=sqrt(10^(inr/10)/2)*vi*[randn(length(thetai),L)+j*randn(length(thetai),L)];
%构造干扰信号
noise=[randn(M,L)+j*randn(M,L)]/sqrt(2);%噪声,归一化处理(根号2)
X=xi+noise;
对于期望信号,其是一个正弦型信号,形式为:
代码中的 即为公式里的相角
,而幅值
的构造则是与信噪比有关。
信噪比为
所以可推导出
构造完成。
这里的干扰信号 假设为随机复高斯信号,且其幅值与期望信号构造方法一样,利用了干噪比
。
对于噪声,假设其也是复高斯信号,唯一需要说明的是,在 MATLAB编程语言中,生成标准正态分布的随机数时,通常会得到均值为 0、方差为 1 的高斯噪声。为了将其实部和虚部的方差调整为1,需要对噪声进行归一化处理,所以最后除以了根号2,是为了确保噪声的总功率为1。
在学习过程中,也有一个比较重要的问题值得思考,在代码中对于信号 没有包含期望信号
,经查阅资料分析思考,可能的原因如下:
在 LCMV 波束形成算法中,通常假设期望信号是已知的方向矢量,而协方差矩阵仅由干扰和噪声构成。况且波束形成器的目标是对准期望信号方向,同时抑制干扰和噪声。如果期望信号被加入到接收信号中,可能会引入不必要的偏差,影响波束形成的效果。
权向量计算与波束图绘制(针对MVDR/LCMV波束形成器)
对于LCMV波束形成器,其准则为:在某种约束条件下使阵列输出的方差最小。
约束函数为:
约束条件为:
然而,当线性约束条件 时,该算法就变成了最小方法无畸变响应,MVDR波束形成器,其权向量计算公式为:
当 时,即为Capon波束形成。
%%协方差矩阵
R=X*X'/L;%构造协方差矩阵
%%权向量计算
wop1=inv(R)*vs/(vs'*inv(R)*vs);%波束形成
波束图绘制
%%波束图绘制
sita=45*[-1:0.001:1];%扫描方向范围
v=exp(-j*pi*n*sin(sita/180*pi));%扫描方向矢量
B=abs(wop1'*v);
plot(sita,20*log10(B/max(B)),'k');
title('波束图');
xlabel('角度/degree');
ylabel('波束图/dB');
grid on
axis([-45 45 -50 0]);
hold off
最后需要计算最后总的波束响应,公式这里不再赘述。
以上就是最常规的波束形成器的构造思路,本人仅为新手,欢迎各位大佬批评指正,完整MATLAB代码如下:
%%参量初始化
M=18;%天线数
L=100;%快拍数
thetas=10;%信号入射角度
thetai=[-30 30];%干扰入射角度
n=[0:M-1]';
%%方向矢量
vs=exp(-j*pi*n*sin(thetas/180*pi));%信号方向矢量
vi=exp(-j*pi*n*sin(thetai/180*pi));%干扰方向矢量
%%信号生成
f=16000;%载波频率
t=[0:1:L-1]/200;
snr=10;
inr=10;
xs=sqrt(10^(snr/10))*vs*exp(j*2*pi*f*t);%构造有用信号
xi=sqrt(10^(inr/10)/2)*vi*[randn(length(thetai),L)+j*randn(length(thetai),L)];
%构造干扰信号
noise=[randn(M,L)+j*randn(M,L)]/sqrt(2);%噪声,归一化处理(根号2)
X=xi+noise;
%%协方差矩阵
R=X*X'/L;%构造协方差矩阵
%%权向量计算
wop1=inv(R)*vs/(vs'*inv(R)*vs);%波束形成
%%波束图绘制
sita=45*[-1:0.001:1];%扫描方向范围
v=exp(-j*pi*n*sin(sita/180*pi));%扫描方向矢量
B=abs(wop1'*v);
plot(sita,20*log10(B/max(B)),'k');
title('波束图');
xlabel('角度/degree');
ylabel('波束图/dB');
grid on
axis([-45 45 -50 0]);
hold off
代码输出为
文献参考:张小飞 《阵列信号处理及MATLAB实现》 电子工业出版社