波束形成 基于对角加载的稳健自适应波束形成

article/2025/8/24 23:21:57

前言

        本人刚刚入门阵列信号处理的波束形成方向,因此仿真过程中可能会出现错误,如果诸位大佬发现仿真过程中有错误,请不吝指出谢谢。

        对角加载(Diagonal Loading, DL)是一种比较常用的提高Capon波束形成器鲁棒性的方法,通过在样本协方差矩阵的对角元素上加上一个适当的量,可以有效地提高样本协方差求逆(SMI)波束形成算法的稳健性,一般来说,通过在原样本协方差矩阵的基础上加上一个对角加载的量来更新矩阵,实现波束形成器的鲁棒性的方法都可以算作是对角加载法。在经典的对角加载法中,经过对角加载更新的矩阵一般可以定义为:

LNR=10\lg \left ( \lambda/\sigma_w^2 \right )

        其中\sigma_w^2为噪声中白噪声分量的功率,\lambda为对角加载量,LNR为加载噪声级,经验表明,LNR一般取10,由此可以通过噪声功率得到一个较为合适的对焦加载量,因此,根据MVDR的最佳权向量解,可以得到一个较为一般的对角加载波束形成器的权向量解:

\hat{w}_{LSMI} = \frac{\left ( \hat {R}^{-1} + \lambda I \right ) \bar{a}_s}{\bar{a}_s^H \left ( \hat {R}^{-1} + \lambda I \right ) \bar{a}_s}

        早期的鲁棒自适应波束形成器大多可以以对角加载的形式表现出来,比如S. A. Vorobyov等人提出的最坏情况性能最优波束形成器(Worst-case Performance Optimization, WCPO),其等价权向量解为:

\hat {w}_{WCPO} = \frac{ \lambda_{L} \left ( \hat {R} + \lambda_{L} \varepsilon ^{2} I \right ) ^{-1} \bar {a}_{s}}{ \lambda_{L} \bar {a}_{s}^{H} \left ( \hat {R} + \lambda_{L} \varepsilon ^{2} I \right ) ^{-1} \bar {a}_{s} -1}

        关于这篇文章可以参考YHCANDOU大佬的最差性能最优波束形成算法。

问题的提出与作者的解决方案

        在这篇文章中,作者分别考虑了样本协方差矩阵满秩(快拍数大于阵元数)与欠秩(快拍数小于阵元数)两种情况。

        对于满秩的情况,作者提出了一个约束来获得导向矢量,该约束可以表示为:

\max_{\sigma^2, a} \sigma^2,s.t. R- \sigma^2aa^{*} \geq 0,\left ( a - \bar {a} \right )C^{-1}\left ( a - \bar {a} \right )\leq 1

        其中\bar a为已知的名义导向矢量,C为一给定的正定阵,然而在一般情况下,C= \epsilon I,因而该约束问题可以化为一个球形约束下的二次优化问题,即:

\min_{a} a^{*} R^{-1} a,s.t. \left \| a-\bar {a} \right \|\leq \epsilon

        对于该优化问题,可以采用CVX求解器进行求解,此处作者采用了拉格朗日乘子法进行解决,构造拉格朗日函数:

f = a^{*}R^{-1}a+\lambda\left ( \left \| a-\bar {a} \right \| ^{2} -\epsilon\right )

        对a求导并令其导数为0,即得:

R^{-1}\hat {a}_0+\lambda \left ( \hat {a}_0 - \bar {a}\right ) = 0

        化简即得(通过Woodbury矩阵反演公式):

\hat {a}_0 = \left ( \frac{R^{-1}}{\lambda} \right )^{-1} \bar {a} = \bar {a} - \left ( I+\lambda R \right )^{-1} \bar {a}

        则

\bar {a}-\hat {a}_0=\left ( I+\lambda R \right )^{-1} \Rightarrow \left \| \bar {a}-\hat {a}_0 \right \|=\left \| \left ( I+\lambda R \right )^{-1} \right \|

        定义

g\left ( \lambda \right ) \triangleq\left \| \left ( I+\lambda R \right )^{-1} \right \|^{2} = \sum_{m=1}^{M} \frac{\left | z_{m} \right | ^{2}}{(1+\lambda \gamma_{m})^{2}}= \epsilon

        则可通过牛顿法对该方程的\lambda进行迭代求解。

        最后的估计得到的导向矢量\hat {a}_{0}即为:

\hat {a}_{0} = \bar {a} - U\left ( I+\lambda \Gamma \right ) ^{-1} U^{*} \bar {a}

        该情况下得到的权向量\hat {w}_{0}为:

\hat {w}_{0} = \frac{\left ( R+\frac{1}{\lambda} \right ) ^{-1} \bar {a}}{\bar {a}^{*}\left ( R+\frac{1}{\lambda} \right ) ^{-1} R \left ( R+\frac{1}{\lambda} \right ) ^{-1} \bar {a}}

        对于欠秩的情况,作者构造了以下的约束来获得导向矢量:

        \max_{\sigma^2, a} \sigma^2,s.t.a=Bu+\bar {a},,\left \| u \right \| \leqslant 1

        其中B是一个M \times L的矩阵,且L< M,该矩阵为列满秩,构成该矩阵的L个列向量分别为其他角度上的名义导向矢量或者其线性组合,而u则为各自列向量分量的系数。

        和上一种情况的优化问题转换方式一样,该优化问题可以转换为:

\min _{u} \left ( Bu+\bar {a} \right ) ^{*} R ^{-1} \left ( Bu+\bar {a} \right ) ,s.t.\left \| u \right \| \leqslant 1

又因为在这种情况下阵列协方差矩阵存在欠秩的情况,所以作者在这里对协方差矩阵进行了降秩的操作以保证变换后的协方差矩阵的满秩性,令:

\check {R} = B^{*}R^{-1}B, \bar {\check {a}} = B^{*}R^{-1}\bar {a}

        该优化问题即为:

\min _{\check {a}} \check {a} ^{*} R ^{-1} \check {a} ,s.t.\left \| \check {a}-\bar {\check {a}} \right \| ^{2}\leqslant 1

        对该优化问题的近似求解过程与上一节方法类似,当然,该优化问题也可以用CVX求解器进行快速求解。

阵列权向量为:

w = \frac{\hat R_{-1} \hat a_0}{\hat a_0^H \hat R^{-1} \hat a_0}

仿真

        部分仿真条件如下所示:

阵元数10
信噪比0
扰噪比20
阵元间距半波长
信源数1
干扰数2
信源到达角
干扰到达角-30°,45°
信源角度估计误差[0°,4°]
不确定系数\epsilon4.5
clc;
clear;
jk = 0;
loop = 50;
SINRO = zeros(1,length(-20:5:40));
snr = 0;
deg_dev_predf = 4;%%预定义的角度最大偏移量
%% 初始化及设定参数
array_num = 10;%%阵元数
snapshot_num = 40;%%快拍数
source_aoa = [5,-30,45];%%信源到达角
tgt_ang = 1;
c = 340;%%波速
f = 1000;%%频率
lambda_wave = c/f;%%波长
d = 0.5*lambda_wave;
inr1 = 20;
inr2 = 20;
source_num = length(source_aoa);%%信源数
sig_nr = [snr,inr1,inr2];%%信号功率dBw
deg_deviate = 2;%%误差角度偏离
source_dev = source_aoa(tgt_ang)+deg_deviate;
epsl = 4.5;
%% 转向矢量
a_bar = exp(-1i*(0:array_num-1)'*pi*sind((source_aoa(tgt_ang)+deg_deviate)));%%实际带有误差的阵列响应矢量
A = exp(-1i*(0:array_num-1)'*2*pi*(d/lambda_wave)*sind(source_aoa));%%阵列响应矩阵
a_real = A(:,1);
tar_sig = wgn(1,snapshot_num,sig_nr(tgt_ang));
inf1 = wgn(1,snapshot_num,sig_nr(2));
inf2 = wgn(1,snapshot_num,sig_nr(3));
n = (randn(array_num,snapshot_num)+randn(array_num,snapshot_num)*1i)/sqrt(2);
rec_sig = A(:,1)*tar_sig+A(:,2)*inf1+n;
R = rec_sig*rec_sig'/snapshot_num;%%接收阵的协方差矩阵
if array_num < snapshot_numR_inv = inv(R);Rs = A(:,1)*tar_sig*(A(:,1)*tar_sig)'/snapshot_num;Ri = (A(:,2)*inf1+A(:,3)*inf2)*(A(:,2)*inf1+A(:,3)*inf2)'/snapshot_num;Rn = n*n'/snapshot_num;[U,Gamma,V] = svd(R);Gamma_vec = diag(Gamma);z = abs(U'*a_bar);lambda = 0;while abs(norm(z./(1+lambda*Gamma_vec))^2-epsl)>1e-5lambda = lambda+(norm(z./(1+lambda*Gamma_vec))^2-epsl)/ ...sum(2*z.^2.*Gamma_vec.*(1+lambda*Gamma_vec)./(1+lambda*Gamma_vec).^4);enda_est = a_bar-U*diag(1./(1+lambda*Gamma_vec))*U'*a_bar;w0 = inv(a_est'*inv(R)*a_est)*inv(R)*a_est;
elseR_inv = inv(R);Rs = A(:,1)*tar_sig*(A(:,1)*tar_sig)'/snapshot_num;Ri = A(:,2)*inf1*(A(:,2)*inf1)'/snapshot_num;Rn = n*n'/snapshot_num;degr(ik,:) = linspace(source_dev(ik)-deg_dev_predf,source_dev(ik)+deg_dev_predf,array_num-1);B = exp(-1i*(0:array_num-1)'*2*pi*(d/lambda)*sind(degr(ik,:)));R1 =  B'*inv(R)*B;a1 = B'*inv(R)*a_bar;[U,Gamma,V] = svd(R);Gamma_vec = diag(Gamma);[Gamma_vec,index_vec] = sort(Gamma_vec,'descend');U = U(:,index_vec);z = abs(U'*a1);if abs(norm(inv(R1)*a1)) <=1lambda = 0;elsewhile abs(norm(z./(1+lambda*Gamma_vec))^2-1)>1e-5lambda=lambda+(norm(z./(1+lambda*Gamma_vec))^2-1)/ ...sum(2*z.^2.*Gamma_vec.*(1+lambda*Gamma_vec)./(1+lambda*Gamma_vec).^4);endu_hat = -1*U*inv(Gamma+eye(length(Gamma)))*U'*a1;a_est =  B*u_hat+a_bar;w0 = inv(a_est'*inv(R)*a_est)*inv(R)*a_est;end
end
beam_plot(w0);function [] = beam_plot(input_weight_vector)
array_num = length(input_weight_vector);
theta = -90:0.01:90;
p = exp(-1j*2*pi*(0:array_num-1)'*sind(theta)/2);
y = input_weight_vector'*p;
outputval = 20*log10(abs(y)/max(abs(y)));
figure()
plot(theta,outputval);
end

仿真运行结果如下图所示: 

部分参考文献

 S. A. Vorobyov, A. B. Gershman and Zhi-Quan Luo. Robust adaptive beamforming using worst-case performance optimization: a solution to the signal mismatch problem. IEEE Transactions on Signal Processing, vol. 51, no. 2, pp. 313-324, Feb. 2003.

J. Li, P. Stoica and Zhisong Wang. On robust Capon beamforming and diagonal loading. IEEE Transactions on Signal Processing, vol. 51, no. 7, pp. 1702-1715, July 2003.


http://chatgpt.dhexx.cn/article/FPBHZLlG.shtml

相关文章

Unity大场景数据加载及优化方案

前段时间&#xff0c;有几个虚拟仿真公司跟我请教关于大地形的加载优化问题&#xff0c;它们使用的引擎都是自己研发的&#xff0c;引擎对于开发者来说&#xff0c;大同小异&#xff0c;它们的基本构造是一样的&#xff0c;关键是在于解决问题的方法&#xff0c;正是基于这个前…

预训练模型

目录 一、BERT1、贡献1.1 MLM任务1.2 NSP任务 2、实验细节 二、ALBERT1、贡献1.1 词向量分解1.2 层参数共享1.3 SOP任务 三、 ERNIE1、贡献2、实验细节2.1 语料2.2 MLM任务2.3 DLM任务 四、DistilBERT1、贡献2、实验细节 五、RoBERTa1、贡献2、实验细节2.1 动态mask2.2 去掉NSP…

改动模型后,加载部分预训练权重文件

加载部分预训练权重文件 最近在做姿态估计相关内容&#xff0c;需要将Hrnet模型修改&#xff0c;Hrnet是基于coco数据集训练的&#xff0c;coco数据集是17个关节点&#xff0c;而我需要的是15个关节点&#xff0c;在将数据集标好训练之后&#xff0c;发现由于数据量比较小&…

Pointer 0x0, not in getPreloadedDrawables android 系统资源预加载

Android系统在启动的时候&#xff0c;会对一些系统资源进行预加载。这样不仅使得应用程序在需要时可以快速地访问这些资源&#xff0c;还使得这些资源能够在不同应用程序之间进行共享。在硬件加速渲染环境中&#xff0c;这些预加载资源还有进一步优化的空间。Android系统提供了…

OpenCV | 基本矩阵操作

起因 在2013年1月份发行的OpenCV 2.4.4中,对Java的支持也正式发布。同时也有支持Python。 环境配置 这里的环境配置十分简单,在这里,操作系统64位,所以选这个,将里面的opencv_java342.dll负责到你本地下载的JDK的bin目录下,和JDK下的JRE目录下的bin目录下。 我使用的…

Android应用程序UI硬件加速渲染的预加载资源地图集服务(Asset Atlas Service)分析

我们知道&#xff0c;Android系统在启动的时候&#xff0c;会对一些系统资源进行预加载。这样不仅使得应用程序在需要时可以快速地访问这些资源&#xff0c;还使得这些资源能够在不同应用程序之间进行共享。在硬件加速渲染环境中&#xff0c;这些预加载资源还有进一步优化的空间…

预训练词嵌入

作者|ARAVIND PAI 编译|VK 来源|Analytics Vidhya 概述 理解预训练词嵌入的重要性 了解两种流行的预训练词嵌入类型:Word2Vec和GloVe 预训练词嵌入与从头学习嵌入的性能比较 介绍 我们如何让机器理解文本数据?我们知道机器非常擅长处理和处理数字数据,但如果我们向它们提供…

【论文整理】风格迁移中格拉姆矩阵(Gram Matrix)的使用

Gram矩阵在风格迁移中的使用 1、格拉姆矩阵的定义2、风格迁移的任务描述3、格拉姆矩阵的使用方法3、实现过程4、总结5、参考文献 1、格拉姆矩阵的定义 1&#xff09; 什么是格拉姆矩阵&#xff1a; 在内积空间中&#xff0c;一组向量[v1, v2, … , vn]的格拉姆矩阵&#xff0…

Tensorflow加载Vgg预训练模型

很多深度神经网络模型需要加载预训练过的Vgg参数&#xff0c;比如说&#xff1a;风格迁移、目标检测、图像标注等计算机视觉中常见的任务。那么到底如何加载Vgg模型呢&#xff1f;Vgg文件的参数到底有何意义呢&#xff1f;加载后的模型该如何使用呢&#xff1f;本文将以Vgg19为…

混淆矩阵、准确率、F1和召回率的具体实现及混淆矩阵的可视化

utils专栏不会细讲概念性的内容&#xff0c;偏向实际使用&#xff0c;如有问题&#xff0c;欢迎留言。如果对你有帮助就点个赞哈&#xff0c;也不搞什么粉丝可见有的没的&#xff0c;有帮助点个赞就ok 1、混淆矩阵、准确率、F1和召回率的计算 混淆矩阵 对于混淆矩阵的计算…

预编码技术

预编码的基本原理 TD-LTE下行传输采用了MIMO-OFDM的物理层构架&#xff0c;通过最多4个发射天线并行传输多个&#xff08;最多4个&#xff09;数据流&#xff0c;能够有效地提高峰值传输速率。LTE的物理层处理过程中&#xff0c;预编码是其核心功能模块&#xff0c;物理下行共…

pytorch 计算混淆矩阵

混淆矩阵是评估模型结果的一种指标 用来判断分类模型的好坏 预测对了 为对角线 还可以通过矩阵的上下角发现哪些容易出错 从这个 矩阵出发 可以得到 acc &#xff01; precision recall 特异度&#xff1f; 目标检测01笔记AP mAP recall precision是什么 查全率是什么 查准率…

Code::Blocks 相关

文库上的使用教程 http://blog.csdn.net/JGood/article/details/5252119 使用手册 http://blog.csdn.net/liquanhai/article/details/6618300 一&#xff0e;Code::blocks Code::blocks集成开发环境是一个支持编译、链接、调试许多种语言的IDE&#xff0c;支持VS6.0到VS200…

mysql8 sql_mode去掉only_full_group_by

1.查询版本与sqlmode: select version(), sql_mode; 2.修改sqlmode,执行下面两句代码&#xff1a; set global sql_modeSTRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION;set session sql_modeSTRICT_TRANS_TABLES,NO_…

- MySQL - 存储过程 Stored Procedure

文章目录 存储过程是什么存储过程的优点存储过程的缺点存储过程分类存储过程的查询语句存储过程的创建和调用语法实例 - IN、OUT、INOUT条件语句循环语句迭代 存储过程是什么 存储过程是一组为了完成特定功能的SQL语句集&#xff0c;存储在数据库中&#xff0c;一次编译多次使…

mysql的delete语句_mysql删除语句

展开全部 mysql删除语句如下&#xff1a; 1、delete删除一行&#xff1a;delete from student where id1。 2、delete删除多行&#xff1a;delete from student where in (1,2,3)3。 3、删62616964757a686964616fe78988e69d8331333433623162除表的所有数据&#xff1a;delete f…

mysql any all some

假设现在有两张表 a &#xff0c; b 如下 SELECT * FROM a WHERE id > ANY(SELECT id FROM b )# any 等价于 some 这里有两个id sql的意思大概是查询a表的所有&#xff0c;在where中a的id > 子表 b的id 这里用到了any(some) 他们的意思是一样的&#xff0c;就是说a表…

mysql 的 sql_mode.only_full_group_by属性解析

文章目录 1. 初始条件2. 现象3. 解决①&#xff1a;关闭sql_mode 的 only_full_group_by模式②&#xff1a;使用 ANY_VALUE() 抑制 ONLY_FULL_GROUP_BY 的影响 mysql8.0官网&#xff1a;处理 group by 1. 初始条件 现在有这样一张表&#xff0c;其中有两条 name 裤子 的数据…

MYSQL 删除语句

删除数据(DELETE) 如果你失忆了&#xff0c;希望你能想起曾经为了追求梦想的你。 数据库存储数据&#xff0c;总会有一些垃圾数据&#xff0c;也会有一些不需要用的数据了&#xff0c;这些情况下&#xff0c;我们就可以删除这些数据&#xff0c;释放出一定的空间&#xff0c;给…

MySql递归RECURSIVE的详解

背景&#xff1a; 在实际开发的过程中&#xff0c;我们会遇到一些数据是层级关系的、要展示数据子父级关系的时候&#xff0c; 第一个解决方案&#xff1a;将数据库中的所有数据都查询出来用Java代码进行处理。 第二个解决方案&#xff1a;可以考虑MySql中的RECURSIVE递归进行…