空间谱专题02:波束形成(Beamforming)

article/2025/8/22 3:24:28

作者:桂。

时间:2017-08-22  10:56:45

链接:http://www.cnblogs.com/xingshansi/p/7410846.html 


前言

本文主要记录常见的波束形成问题,可以说空间谱估计是波束形成基础上发展而来,在系统论述空间谱之前,有必要分析一些Beamforming的基本特性。

一、波束形成模型

以均匀线阵为例:

按窄带模型分析:

可以写成矩阵形式:

其中方向矢量或导向矢量(Steering Vector),波束形成主要是针对各个接收信号X进行权重相加。

 

二、波束形成基本理论

  A-波束形成

权重相加:

不同的波束形成,就是不同的权重W。

  B-瑞利限

以均匀直角窗为例:

得出方向图:

主瓣宽度正比于孔径宽度的倒数:

因为孔径的限制,造成波束宽度存在限制(不会无限制小),近而落在主瓣波束内部的两个信号便会混在一起而分不清,这就存在瑞利限的问题。

直角窗主瓣宽度为:

其中λ为入射波长,theta1为入射角,Md为阵列孔径。

  C-常见窗函数

 对于空间不同的阵列信号,类似采样分析(空域采样),自然可以加窗进行处理,不加窗可以认为是直角窗,另外也可以选择汉明窗、hanning窗等等。

加窗可以改变波束宽度以及主瓣、副瓣等特性,可以借助MATLAB 的wvtool观察不同窗函数特性。

N = 192;
w = window(@blackmanharris,N);
wvtool(w)

  D-DFT实现

 阵列的采样间隔是相位信息:

这就类似于频域变换,只不过这里的相位信息:对应的不是频率,而是不同位置,可以看作空域的变换。

分别对阵列信号进行直接加权、加窗、DFT实现:

function x = StatSigGenerate(M,N,DOA,SNR,SignalMode,lambda,d)ld = length(DOA);
if strcmp(SignalMode,'Independent')st = randn(ld,N)+1j*randn(ld,N);
elseif strcmp(SignalMode,'Coherent')st = [];st1 = randn(1,N)+1j*randn(1,N);for k = 1:ldst = [st;st1];end
end
st = st/sqrt(trace(st*st'/N)/ld);
nt = randn(M,N)+1j*randn(M,N);
nt = nt/sqrt(trace(nt*nt'/N)/M);SNR = ones(1,ld)*SNR;
Amp = diag(10.^(SNR/20));
A = exp(1j*2*pi*[0:M-1]'*sind(DOA)*d/lambda);
x = A*Amp*st+nt;
end

  主程序:

clc;clear all;close all
M = 32;
DOA = [-30 30];
SNR = 10;
theta = -90:.1:90;
len = length(theta);
SignalMode = 'Independent';
fc = 1e9;
c = 3e8;
lambda = c/fc;
d = lambda/2;
N = 100;%snap points
x = StatSigGenerate(M,N,DOA,SNR,SignalMode,lambda,d);
R_hat = 1/N*x*x';
output = zeros(3,len);
for i = 1:lena = exp(1j*2*pi*[0:M-1]'*sind(theta(i))*d/lambda);W = (inv(R_hat)*a)*(1./(a'*inv(R_hat)*a));output(1,i) = mean(abs(W'*x),2);output(2,i) = 1./(a'*inv(R_hat)*a);output(3,i) = a'*x*ones(N,1);
end
output = abs(output);
output = output - repmat(mean(output.')',1,size(output,2));
output = output./repmat(max(output.')',1,size(output,2));
%plot
plot(theta,output(1,:),'k',theta,output(2,:),'r--',theta,output(3,:),'b');
legend('MVDR 波束','MVDR 谱','固定权重 波束');

  对应结果图:

  E-自适应波束形成

 直接相加也好、加窗也好,都是固定的权重系数,没有考虑到信号本身的特性,所以如果结合信号本身去考虑就形成了一系列算法:自适应波束形成。

这类步骤通常是:

1)给定准则函数;

2)对准则函数进行求解。

准则常用的有:信噪比(snr)最大准则、均方误差最小准则(MSE)、线性约束最小方差准则(LCMV)、最大似然准则(ML)等等;

求解的思路大体分两类:1)直接求解,例如MVDR中的求解;2)也可以利用梯度下降的思想,如随机梯度下降、批量梯度下降、Newton-raphson等方法,不再详细说明。

以MVDR举例:

这里采用直接求解的思路:

将求解的W带入

 即可得到波束形成。

  F-栅瓣现象

 栅瓣是一类现象,对应干涉仪就是相位模糊(相位超过2*pi),对应到Beamforming就是栅瓣问题,具体不再论述,给出现象(同样的波束,在不同的位置分别出现):

  G-波束形成与空间谱

 之前分析过MVDR的方法,得到的输出(含有约束的最小均方误差准则)为:

有时候也称这个输出为空间谱,其实就是|y2(t)|,但这个与MUSIC等算法的谱还不是一回事,只是有时候也被称作空间谱,所以这里多啰嗦几句,分析这个说法的来源。

已知N个采样点的信号,对其进行傅里叶变换:

进一步得到功率谱密度:

根据上文的分析:y(t)其实对应的就是空域变换(可借助DFT实现),类比于时频处理中的频域变换。而这里又可以看到频域变换的平方/长度,对应就是功率谱,这是频域的分析。

对应到空域,自然就是|y2(t)|/长度,对应空间谱,长度只影响比例关系,所以MVDR的最小方差输出被称作:空间谱也是合适的。

 给出一个测试(这里如果),对比MVDR的y(t)、MVDR功率谱以及普通Beamforming的结果:

clc;clear all;close all
M = 32;
DOA = [-30 30];
SNR = 10;
theta = -90:.1:90;
len = length(theta);
SignalMode = 'Independent';
fc = 1e9;
c = 3e8;
lambda = c/fc;
d = lambda/2;
N = 100;%snap points
x = StatSigGenerate(M,N,DOA,SNR,SignalMode,lambda,d);
R_hat = 1/N*x*x';
output = zeros(3,len);
for i = 1:lena = exp(1j*2*pi*[0:M-1]'*sind(theta(i))*d/lambda);W = (inv(R_hat)*a)*(1./(a'*inv(R_hat)*a));output(1,i) = mean(abs(W'*x),2);output(2,i) = 1./(a'*inv(R_hat)*a);output(3,i) = a'*x*ones(N,1);
end
output = abs(output);
output = output - repmat(mean(output.')',1,size(output,2));
output = output./repmat(max(output.')',1,size(output,2));
%plot
plot(theta,output(1,:),'k',theta,output(2,:),'r--',theta,output(3,:),'b');
legend('MVDR 波束','MVDR 谱','固定权重 波束');

  对应结果:

如果将d = lambda/2;改为d = lambda/0.5;,自然就有了栅瓣:

 


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

相关文章

UE4 插件 简单全景播放器

UE4 插件 1分钟完成全景展示项目(Simple panorama player and video player) 全景图、全景视频播放器,附带列表和热点模板。另附带一个视频播放器。全景播放器可以使用本地资源或Web URL。 完全由蓝图实现,易于扩展和修改。 具有…

Android VR Player(全景视频播放器) [10]: VR全景视频渲染播放的实现(exoplayer,glsurfaceview,opengl es)

前言 此博客的大部分内容来自我的毕业设计论文,因此语言上会偏正式一点,如果您有任何问题或建议,欢迎留言。在此感谢实验室的聂师兄,全景视频render部分的代码设计主要参考了他所编写的代码来完成,他对视频渲染过程的…

VR+全景播放器+头控讲解-07

VR全景播放器头控讲解-01-知识储备VR全景播放器头控讲解-02-创建球体VR全景播放器头控讲解-03-渲染视频VR全景播放器头控讲解-04-滑动手势VR全景播放器头控讲解-05-伸缩画面VR全景播放器头控讲解-06-头控实现VR全景播放器头控讲解-07-分屏技术 学习目标 如何实现分屏 实现思路 …

[OpenGL]从零开始写一个Android平台下的全景视频播放器——目录

Github项目地址 为了方便没有准备好梯子的同学,我把项目在CSDN上打包下载,不过不会继续更新(保留在初始版本) 先放一张效果图: Youtube 优酷 前言 Android平台下的全景视频(360,Panoram…

VR+全景播放器+头控讲解-06

VR全景播放器头控讲解-01-知识储备VR全景播放器头控讲解-02-创建球体VR全景播放器头控讲解-03-渲染视频VR全景播放器头控讲解-04-滑动手势VR全景播放器头控讲解-05-伸缩画面VR全景播放器头控讲解-06-头控实现VR全景播放器头控讲解-07-分屏技术 学习目标 掌握头控部分布局 如何检…

mxreality.js 免费开源的全景图/全景视频/VR 直播播放器介绍

[2018-10-20 重要更新]支持VR直播功能支持全景视频poster支持全景图和视频和场景之间随意切换全景模式切换回默认主视角播放列表 优点: 1、全景图支持全景模式和VR模式 2、支持网页端全景图补天功能,有效去除顶部和底部拼接留下的痕迹、做出真正完美的…

Unity3D制作极简版VR全景视频播放器

自从Unity5.6.4还是2017的版本开始,官方提供了兼容移动端和Windows端的视频播放器控件——Video Player,下面介绍如何使用这个控件,制作VR播放器。 1、新建空白场景,新建球体Sphere,Camera放置球心位置; …

基于threejs,完成一个简单的全景图播放器

直接上代码 CameraControls.js相机控制器 import * as THREE from three;function CameraControls(object, domElement, cb, update) {this.object object;this.domElement domElement ! undefined ? domElement : document;this.enabled true;this.lookSpeed 0.1;this.…

使用SceneKit编写VR全景播放器

最近用SceneKit做了全景看房的功能,现总结下如何实现的。 先看下最终的效果: gif1.gif VR图片全景播放器有以下功能: 360度手势滑动,缩放陀螺仪分屏(VR眼镜)热点hotpot头控/eyepick 手势滑动,缩放&#…

AVProVideo☀️五、播放全景视频

🎊 商务合作:https://skode.cn/file/businesscard/wechat.jpg 🎥 本文由 星河造梦坊公司官方 原创! 🏅 如果你有技术问题或项目开发,都可以加上方的联系方式,和我聊一聊你的故事🧡 文章目录 🟥 360球形全景视频🟧 360立方体全景视频🟨 360天空盒全景视频🟩…

[OpenGL]从零开始写一个Android平台下的全景视频播放器——3.1 全景视频是如何实现的

Github项目地址 为了方便没有准备好梯子的同学,我把项目在CSDN上打包下载,不过更新会慢一些 回到目录 恭喜Martin同学获得由CSDN颁发的“更新慢慢慢”荣誉称号 全景视频有很多种类,例如Sphere全景,Skybox(Cubemap&…

VR全景播放器 AvPro Video

最近项目需要,使用Unity开发VR全景播放器,包括PC端和VR一体机端(Android)。Unity5.6开始支持VideoPlayer,使用自带的VideoPlayer,很顺利把播放器完成了,使用了很长时间,一直没什么性…

FFmpeg 开发(07):FFmpeg + OpenGLES 实现 3D 全景播放器

该文章首发于微信公众号:字节流动 FFmpeg 开发系列连载: FFmpeg 开发(01):FFmpeg 编译和集成 FFmpeg 开发(02):FFmpeg + ANativeWindow 实现视频解码播放 FFmpeg 开发(03):FFmpeg + OpenSLES 实现音频解码播放 FFmpeg 开发(04):FFmpeg + OpenGLES 实现音频可视化播放 FFm…

html全景直播播放器,Insta360 Player(全景视频播放器) V2.3.6 官方版

Insta360 Player是一款性能强劲且专业的全景视频播放器,它支持播放Insta360全景相机拍摄的全景视频和图片,并且支持本地视频的播放,操作非常的简单,有需要的用户可以下载来使用,此软件支持播放 Insta360全景相机产生的…

全景播放器,免安装支持全景视频

全景图片播放器,同时支持全景视频,可直接拖入页面查看。免安装全景播放器,文件不要大于20M Hpano 3D全景播放器是一款免安装可以720度互动浏览的全景图片查看器,通过拖球形全景图片或视频文件进行预览,720度的全方位图片查看器让你…

android 简单的exoplayer全景播放器

全景播放器网上一搜也是一堆一堆的,还有google推出的vrsdk,所以也没啥好说的,就简单记录一下 实现全景主要用到的还是opengles,只要用的开源播放器有setSurface(Surface surface)这个函数,就可以不改播放器源码实现 …

全景播放器

在github上发现的,绿色免安装,完全免费,只有一个界面三个按键,超级简单。里面带来几个全景视频和图片的demo,想体验全景的可以直接打开看看。想换片的时候按键盘的空格键既可以返回主界面。视角查看用鼠标左键点击拖动…

OpenGL ES_手把手教你打造VR全景播放器

OpenGL ES _ 入门_01OpenGL ES _ 入门_02OpenGL ES _ 入门_03OpenGL ES _ 入门_04OpenGL ES _ 入门_05OpenGL ES _ 入门练习_01OpenGL ES _ 入门练习_02OpenGL ES _ 入门练习_03OpenGL ES _ 入门练习_04OpenGL ES _ 入门练习_05OpenGL ES _ 入门练习_06OpenGL ES _ 着色器 _ 介…

播放全景视频【一】:用unity Video Player视频播放器来播放360全景视频

先上图为敬 本文测试环境: Win10 Unity 2020.3.40 Pico G2 4k VR一体机 一、使用Video Player心理负担比较小 使用Unity自带的【视频播放器(Video Player)】来播放360全景视频的【好处】: 1、控制逻辑与2D视频相同&#xff0c…

利用FFmpeg和OpenGL ES 实现 3D 全景播放器

前言 我们已经利用 FFmpeg OpenGLES OpenSLES 实现了一个多媒体播放器,本文将基于此播放器实现一个酷炫的 3D 全景播放器。 全景播放器原理 全景视频是由多台摄像机在一个位置同时向四面八方拍摄,最后经过后期拼接处理生成的。 用普通的多媒体播放器播…