[实战] 天线阵列波束成形原理详解与仿真实战(完整代码)

天线阵列波束成形原理详解与仿真实战

1. 引言

在无线通信、雷达和声学系统中,波束成形(Beamforming)是一种通过调整天线阵列中各个阵元的信号相位和幅度,将电磁波能量集中在特定方向的技术。其核心目标是通过空间滤波增强目标方向的信号,同时抑制干扰和噪声。本文将从阵列模型、波束成形原理、数学推导及波束增益计算等方面展开详细分析。


2. 天线阵列模型

2.1 均匀线性阵列(ULA)

假设一个由 N N N个各向同性阵元组成的均匀线性阵列(Uniform Linear Array, ULA),阵元间距为 d d d。以第一个阵元为参考点,第 n n n个阵元的位置为:
x n = ( n − 1 ) d ( n = 1 , 2 , … , N ) x_n = (n-1)d \quad (n=1,2,\dots,N) xn=(n1)d(n=1,2,,N)

2.2 远场假设

当信号源距离阵列足够远时,入射波可视为平面波。假设信号入射方向与阵列法线方向的夹角为 θ \theta θ,则相邻阵元间的相位差为:
Δ ϕ = 2 π d sin ⁡ θ λ \Delta \phi = \frac{2\pi d \sin\theta}{\lambda} Δϕ=λ2πdsinθ
其中 λ \lambda λ为波长。


3. 波束成形的基本原理

3.1 阵列响应向量

对于入射角度 θ \theta θ,阵列的响应向量(导向向量)为:
a ( θ ) = [ 1 , e j Δ ϕ , e j 2 Δ ϕ , … , e j ( N − 1 ) Δ ϕ ] T \mathbf{a}(\theta) = \left[ 1, e^{j\Delta\phi}, e^{j2\Delta\phi}, \dots, e^{j(N-1)\Delta\phi} \right]^T a(θ)=[1,ejΔϕ,ejϕ,,ej(N1)Δϕ]T

3.2 加权合成

通过为每个阵元分配复权重 w n w_n wn,合成输出信号为:
y ( t ) = w H x ( t ) = ∑ n = 1 N w n ∗ x n ( t ) y(t) = \mathbf{w}^H \mathbf{x}(t) = \sum_{n=1}^N w_n^* x_n(t) y(t)=wHx(t)=n=1Nwnxn(t)
其中 w = [ w 1 , w 2 , … , w N ] T \mathbf{w} = [w_1, w_2, \dots, w_N]^T w=[w1,w2,,wN]T为权重向量, x ( t ) \mathbf{x}(t) x(t)为接收信号向量。

3.3 波束方向图

阵列的波束方向图(Array Factor, AF)定义为:
A F ( θ ) = w H a ( θ ) = ∑ n = 1 N w n ∗ e j ( n − 1 ) Δ ϕ AF(\theta) = \mathbf{w}^H \mathbf{a}(\theta) = \sum_{n=1}^N w_n^* e^{j(n-1)\Delta\phi} AF(θ)=wHa(θ)=n=1Nwnej(n1)Δϕ


4. 数学推导:波束成形的实现

4.1 相位补偿法

若需使主瓣对准方向 θ 0 \theta_0 θ0,需补偿相邻阵元间的相位差。权重向量设计为:
w n = e − j ( n − 1 ) 2 π d sin ⁡ θ 0 λ w_n = e^{-j(n-1)\frac{2\pi d \sin\theta_0}{\lambda}} wn=ej(n1)λ2πdsinθ0
此时,方向图在 θ 0 \theta_0 θ0处达到最大值。

4.2 波束方向图分析

代入权重后,方向图简化为:
A F ( θ ) = ∑ n = 0 N − 1 e j n 2 π d λ ( sin ⁡ θ − sin ⁡ θ 0 ) AF(\theta) = \sum_{n=0}^{N-1} e^{j n \frac{2\pi d}{\lambda} (\sin\theta - \sin\theta_0)} AF(θ)=n=0N1ejnλ2πd(sinθsinθ0)
利用等比数列求和公式:
A F ( θ ) = sin ⁡ ( N ⋅ π d λ ( sin ⁡ θ − sin ⁡ θ 0 ) ) sin ⁡ ( π d λ ( sin ⁡ θ − sin ⁡ θ 0 ) ) AF(\theta) = \frac{\sin\left( N \cdot \frac{\pi d}{\lambda} (\sin\theta - \sin\theta_0) \right)}{\sin\left( \frac{\pi d}{\lambda} (\sin\theta - \sin\theta_0) \right)} AF(θ)=sin(λπd(sinθsinθ0))sin(Nλπd(sinθsinθ0))

4.3 主瓣与栅瓣

  • 主瓣宽度:与 N N N成反比, N N N越大波束越窄。
  • 栅瓣条件:当 d / λ > 0.5 d/\lambda > 0.5 d/λ>0.5时,可能出现多个主瓣(栅瓣)。

5. 波束增益计算

5.1 方向性系数

波束增益 G G G定义为最大辐射强度与各向同性辐射器的比值:
G = 4 π ∣ A F ( θ 0 ) ∣ 2 ∫ 0 2 π ∫ 0 π ∣ A F ( θ , ϕ ) ∣ 2 sin ⁡ θ d θ d ϕ G = \frac{4\pi |AF(\theta_0)|^2}{\int_0^{2\pi} \int_0^{\pi} |AF(\theta,\phi)|^2 \sin\theta d\theta d\phi} G=02π0πAF(θ,ϕ)2sinθdθdϕ4πAF(θ0)2
对于均匀加权ULA,最大增益近似为:
G ≈ N ⋅ ( 4 π d λ ) G \approx N \cdot \left( \frac{4\pi d}{\lambda} \right) GN(λ4πd)

5.2 阵元间距影响

  • 最优间距:通常取 d = λ / 2 d = \lambda/2 d=λ/2,以避免栅瓣并最大化增益。
  • 过密阵元:间距过小导致互耦效应,降低效率。

5.3 实际增益公式

考虑效率 η \eta η后,实际增益为:
G r e a l = η ⋅ N ⋅ G e l e m e n t G_{real} = \eta \cdot N \cdot G_{element} Greal=ηNGelement
其中 G e l e m e n t G_{element} Gelement为单个阵元的增益。


6. 影响波束增益的关键因素

  1. 阵元数量(N):增益随 N N N线性增加。
  2. 权重设计:非均匀加权(如切比雪夫加权)可降低旁瓣,但略微减小主瓣增益。
  3. 频率与带宽:宽带信号需考虑色散效应。
  4. 阵元方向性:若阵元非各向同性,总增益需乘以阵元方向图。
  5. 扫描角度:扫描至端射方向( θ = 9 0 ∘ \theta = 90^\circ θ=90)时增益下降。

7. 扩展:平面阵列与二维波束成形

对于 M × N M \times N M×N平面阵列,导向向量为:
a ( θ , ϕ ) = a x ( θ , ϕ ) ⊗ a y ( θ , ϕ ) \mathbf{a}(\theta, \phi) = \mathbf{a}_x(\theta, \phi) \otimes \mathbf{a}_y(\theta, \phi) a(θ,ϕ)=ax(θ,ϕ)ay(θ,ϕ)
其中 ⊗ \otimes 表示Kronecker积。增益提升至 M × N M \times N M×N倍。


8. 仿真

这里直接提供仿真代码和仿真结果:
先说结果,采用32阵元的阵列进行仿真,阵列布局如图如下,阵元间隔0.8 λ \lambda λ
在这里插入图片描述
仿真在俯仰角60度时,方位角指向不同方向的波束情况如下:
在这里插入图片描述
完整代码作为福利,如下:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue Apr  8 22:13:36 2025@author: neol
"""import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3Dplt.close('all')
# 设置全局字体为支持中文的字体
plt.rcParams['font.sans-serif'] = ['WenQuanYi Micro Hei']  # 黑体
# 解决负号显示问题
plt.rcParams['axes.unicode_minus'] = False# 参数设置
c = 299792458  # 光速
freq = 1268.52e6  # 频率
wavelength = c / freq  # 波长
d = wavelength*0.7 # 阵元间距
N = 6  # 网格尺寸(6x6)
theta_res = 1  # 角度分辨率(度)# 生成阵元位置(四角空缺)
positions = []
for i in range(N):for j in range(N):# 排除四个角落(0,0),(0,5),(5,0),(5,5)if (i==0 and j==0) or (i==0 and j==5) or (i==5 and j==0) or (i==5 and j==5):continuepositions.append([i*d - (N-1)*d/2, j*d - (N-1)*d/2, 0])  # 中心对齐positions = np.array(positions)
num_elements = len(positions)
print(f"有效阵元数量: {num_elements}")# 生成12个目标方向(方位角均匀分布)
num_beams = 12
phi_targets = np.linspace(0, 2*np.pi, num_beams, endpoint=False)
# theta_target = np.pi/2  # 固定俯仰角为90度(水平面)
pitch = 60
theta_target = np.radians(pitch)  # 俯仰角设置# 波束方向图计算函数
def calculate_beam_pattern(weights, positions, wavelength):theta = np.linspace(0, np.pi, 181)phi = np.linspace(0, 2*np.pi, 361)THETA, PHI = np.meshgrid(theta, phi)# 转换为直角坐标X = np.sin(THETA) * np.cos(PHI)Y = np.sin(THETA) * np.sin(PHI)Z = np.cos(THETA)pattern = np.zeros_like(THETA, dtype=np.complex128)# 计算每个阵元的贡献for i, pos in enumerate(positions):phase_shift = 2*np.pi/wavelength * (pos[0]*X + pos[1]*Y + pos[2]*Z)pattern += weights[i] * np.exp(1j*phase_shift)return 20*np.log10(np.abs(pattern))# 创建绘图
fig = plt.figure(figsize=(18,12))
fig.suptitle('32-Element Array Beam Patterns (12 Directions)', fontsize=16)# 为每个波束生成权重并绘图
for beam_idx in range(num_beams):# 当前目标方向phi_target = phi_targets[beam_idx]# 计算导向矢量steering_vector = np.zeros(num_elements, dtype=np.complex128)for i, pos in enumerate(positions):phase = 2*np.pi/wavelength * (pos[0]*np.sin(theta_target)*np.cos(phi_target) +pos[1]*np.sin(theta_target)*np.sin(phi_target) +pos[2]*np.cos(theta_target))steering_vector[i] = np.exp(-1j*phase)# 归一化权重weights = steering_vector / np.linalg.norm(steering_vector)# 计算方向图pattern = calculate_beam_pattern(weights, positions, wavelength)# 转换为极坐标并绘图ax = fig.add_subplot(3, 4, beam_idx+1, projection='polar')ax.set_theta_offset(np.pi/2)ax.set_theta_direction(-1)#标志主瓣方向r_max = 15r_min = -40ax.plot([phi_target, phi_target], [r_min, r_max], color='red', linestyle='--', linewidth=1.5, alpha=0.8)phi_plot = np.linspace(0, 2*np.pi, 361)theta_plot = np.linspace(0, np.pi, 181)# 提取水平面方向图horizontal_cut = pattern[:, pitch]  # theta=90度# 绘制极坐标图ax.plot(phi_plot, horizontal_cut, linewidth=1.5)ax.set_title(f'Beam {beam_idx+1}\nAzimuth={np.degrees(phi_target):.1f}°\nPitch={pitch:.1f}°', pad=20)ax.set_rlim(r_min, r_max)ax.grid(True)plt.tight_layout()
plt.show()# 绘制阵列几何布局
plt.figure(figsize=(8,6))
plt.scatter(positions[:,0]/wavelength, positions[:,1]/wavelength, s=50, c='r')
plt.title('Array Geometry (Wavelength Normalized)')
plt.xlabel('X (λ)')
plt.ylabel('Y (λ)')
plt.grid(True)
plt.axis('equal')
plt.show()

9. 结论

天线阵列波束成形通过精确控制各阵元的相位和幅度,实现了信号的空间选择性。其性能直接取决于阵元数量、间距及权重设计。理解其数学本质和增益限制因素,对5G Massive MIMO、雷达等系统设计至关重要。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/75958.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深圳漫云科技户外公园实景儿童剧本杀小程序:开启亲子互动新纪元

在亲子娱乐需求日益增长的当下,深圳漫云科技推出的户外公园实景儿童剧本杀小程序,凭借其创新玩法与丰富功能,为亲子家庭带来全新体验。该小程序融合户外探险、角色扮演与逻辑推理,不仅满足孩子好奇心,更提升其思维能力…

HOW - 如何测试 React 代码

目录 一、使用 React 测试库:testing-library/react二、使用测试演练场:testing-playground.com三、使用 Cypress 或 Playwright 进行端到端测试四、使用 MSW 在测试中模拟网络请求 一、使用 React 测试库:testing-library/react testing-li…

COBOL语言的网络安全

COBOL语言与网络安全:传统语言的新挑战 引言 COBOL(Common Business-Oriented Language)是一种早期编程语言,最初于1959年被开发出来,主要用于商业、金融和行政系统的处理。尽管年代久远,COBOL在大型机系…

通过世界排名第一的免费开源ERP,构建富有弹性的智能供应链

概述 现行供应链模式的结构性弱点凸显了对整个行业进行重塑的必要性。正确策略和支持可以帮助您重塑供应链,降低成本,实现业务转型。开源智造(OSCG)所推出的Odoo免费开源ERP解决方案,将供应链转化为具有快速响应能力的…

Android 开发中compileSdkVersion 和 targetSdkVersion

在 Android 开发中,compileSdkVersion 和 targetSdkVersion 是 build.gradle 文件中的两个关键配置,它们分别控制应用的编译行为和运行时兼容性。以下是它们的详细区别和用途: 1. compileSdkVersion(编译版本) 作用&a…

Qt QComboBox 下拉复选多选

Qt 中,QComboBox 默认只支持单选,但实际使用过程中,我们经常会碰到需要多选的情况,但是通过一些直接或者曲折的方法还是可以实现的。 1、通过 QListWidget 间接实现 这种方式是网上搜索最多的一种方式,也是相对来说比…

Selenium自动化:玩转浏览器,搞定动态页面爬取

嘿,各位爬虫爱好者和自动化达人们!是不是经常遇到这种情况:信心满满地写好爬虫,requests一把梭,结果抓下来的HTML里,想要的数据空空如也?定睛一看,原来数据是靠JavaScript动态加载出…

天梯赛 L2-023 图着色问题

使用vector<vector<int>> g(N)去存储边&#xff0c;然后每次判断每个节点的邻节点是不是相同的颜色&#xff0c;需要注意的是不同的颜色一定需要为K种&#xff0c;不能多也不能少。 #include<bits/stdc.h> using namespace std; int main(){int n,m,k;cin&g…

在ubuntu24上装ubuntu22

实验室上有一台只装了ubuntu24的电脑&#xff0c;但是项目要求在22上进行 搞两个ubuntu系统&#xff01; 步骤一&#xff1a;制作22的启动盘 步骤二&#xff1a;进入bios安装界面 步骤三&#xff1a;选择try or install ubuntu 步骤四&#xff1a;选择try ubuntu 步骤五&…

【PVR Review】《Review of Deep Learning Methods for Palm Vein Recognition》

[1]谭振林,刘子良,黄蔼权,等.掌静脉识别的深度学习方法综述[J].计算机工程与应用,2024,60(06):55-67. 文章目录 1、Background and Motivation2、数据采集3、掌脉图像预处理3.1、ROI提取算法3.2、图像滤波与增强 4、掌脉识别算法4.1、基于深度学习的方法4.2、其他方法 5、融合识…

【CSP】202403-1词频统计

文章目录 算法思路1. 数据结构选择2. 输入处理3. 统计出现的文章数4. 输出结果 代码示例代码优化 样例输入 4 3 5 1 2 3 2 1 1 1 3 2 2 2 2 3 2样例输出 2 3 3 6 2 2算法思路 1. 数据结构选择 vector<int>&#xff1a;用于存储每篇文章的单词列表&#xff08;可能包含…

Docker基础1

本篇文章我将从系统的知识体系讲解docker的由来和在linux中的安装下载 随后的文章会介绍下载镜像、启动新容器、登录新容器 如需转载&#xff0c;标记出处 docker的出现就是为了节省资本和服务器资源 当企业需要一个新的应用程序时&#xff0c;需要为它买台全新的服务器。这样…

Linux系统学习Day04 阻塞特性,文件状态及文件夹查询

知识点4【文件的阻塞特性】 文件描述符 默认为 阻塞 的 比如&#xff1a;我们读取文件数据的时候&#xff0c;如果文件缓冲区没有数据&#xff0c;就需要等待数据的到来&#xff0c;这就是阻塞 当然写入的时候&#xff0c;如果发现缓冲区是满的&#xff0c;也需要等待刷新缓…

vue 3 从零开始到掌握

vue3从零开始一篇文章带你学习 升级vue CLI 使用命令 ## 查看vue/cli版本&#xff0c;确保vue/cli版本在4.5.0以上 vue --version ## 安装或者升级你的vue/cli npm install -g vue/cli ## 创建 vue create vue_test ## 启动 cd vue_test npm run servenvm管理node版本&#…

Mysql专题篇章

一、事务的四大特性&#xff1f; 1、原子性&#xff1a;是指事务包含的所有操作要么全部成功&#xff0c;要么全部失败回滚。 2、一致性&#xff1a;是指一个事务执行之前和执行之后都必须处于一致性状态。比如a与b账户共有100块&#xff0c;两人之间转账之后无论成功还是失败…

CAD插件实现:自动递增编号(前缀、后缀、位数等)——CADc#实现

cad中大量输入一定格式的递增编号时&#xff0c;可用插件实现&#xff0c;效果如下&#xff1a; ①本插件可指定数字位数、起始号码、加前缀、后缀、文字颜色等&#xff08;字体样式和文字所在图层为cad当前图层和当前字体样式&#xff09;。 ②插件采用Jig方式&#xff0c;即…

k8s1.24升级1.28

0、简介 这里只用3台服务器来做一个简单的集群&#xff0c;当前版本是1.24.17目标升级到1.28.17 地址主机名192.168.160.40kuber-master-1192.168.160.41kuber-master-2192.168.160.42kuber-node-1 因为1.24已经更换过了容器运行时&#xff0c;所以之后的升级相对就会简单&am…

4.3-2 jenkins

一.登录jenkins 二.修改密码 三.配置节点 新建节点 编辑节点名称 编辑节点配置 激活节点 将jar下载到指定的路径 再到dos命令下的路径 E:\az\wx 执行 配置节点成功 四. 安全设置中&#xff0c;勾选代理 五.新建项目 编辑项目名称 编辑项目执行的 路径&#xff1a;C:\Users\Ad…

js对象与数组的互转

js对象与数组的互转 文章目录 js对象与数组的互转一、数组转对象1.使用forEach,for in,es6展开运算符,assign2. 使用 Object.fromEntries()3. 将数组转为键值对对象4. 使用 reduce()4. 数组元素为对象时提取属性 二、对象转数组1. 提取键/值/键值对2. 转换为特定结构的数组 三、…

HTTPS在信息传输时使用的混合加密机制,以及共享、公开密钥加密的介绍。

HTTPS在信息传输时使用的混合加密机制&#xff0c;其中包括了共享密钥加密和公开密钥加密&#xff0c;我们先来介绍一下这两种加密方式。 共享密钥加密&#xff08;对称密钥&#xff09; 对称加密是指加密和解密使用的是同一个密钥。就像家里的门锁&#xff0c;钥匙只有一把&…