简介:本资源是一套面向电子工程专业学生与天线设计初学者的MATLAB阵列天线仿真实践资料,聚焦线性、平面及圆形三类典型天线阵列的方向图建模与性能分析。资源以精简实用为特点,共3个文件:2个MATLAB脚本(polar_dB.m用于极坐标方向图绘制,ARRAYS.m实现多种阵列因子计算与可视化)、1份中文说明文档(READ ME.doc),总大小仅19KB,便于快速下载与本地运行。已有298人学习下载,适合课程设计、毕业设计或自学巩固天线理论知识的用户。通过该包,读者可直接运行代码观察阵元间距、相位激励与阵列构型对波束指向、旁瓣电平及主瓣宽度的影响,并借助文档理解关键参数设置逻辑与结果解读方法,有效打通理论公式与MATLAB实操之间的关键环节。
1. 用 MATLAB 快速建模线性阵列与圆形阵列天线:从方向图仿真到波束扫描实战
你手头有一份名为Chapter06.rar的压缩包,解压后发现是 MATLAB 天线阵列仿真实验材料——这很常见,高校《天线原理》《电磁场与微波技术》课程第六章常以线性阵列(Linear Array)和圆形阵列(Circular Array)为典型载体,训练学生理解阵因子、方向图乘积定理、波束指向控制等核心概念。但真正卡住多数人的不是公式推导,而是:如何在 MATLAB 中不依赖 Antenna Toolbox 就写出可复现、可调参、可验证的阵列辐射模型?尤其当你的 MATLAB 版本是 R2018a 或更早(未预装天线工具箱),或需将代码嵌入已有项目、避免额外依赖时,纯脚本实现阵列建模就成为刚需。本文聚焦“零工具箱依赖”的底层建模路径:用向量运算构建阵元位置、用相位加权实现波束扫描、用极坐标绘图呈现方向图、用mesh和surf可视化三维空间辐射特性。适合通信工程、雷达信号处理、射频系统设计方向的工程师与高年级本科生——只要你会写for循环和复数运算,就能跑通全部流程。
2. 线性阵列建模:从阵元坐标到方向图计算的完整推导链
2.1 理解线性阵列物理结构与关键参数定义
线性阵列(ULA, Uniform Linear Array)是最基础的天线阵列形式,由 N 个相同天线单元沿一条直线等距排列构成。其性能由三个核心参数决定:阵元数量 N、相邻阵元间距 d(单位:波长 λ)、以及每个阵元的激励幅度与相位。间距 d 直接影响栅瓣出现条件(d ≥ λ/2 时易产生栅瓣),而激励相位差 Δφ 则控制主波束指向角 θ₀(满足 sinθ₀ = Δφ·λ/(2πd))。MATLAB 中不调用phased.ULA类,而是用基础矩阵运算显式构造阵元位置向量和阵因子响应,这能让你彻底掌握方向图形成的数学本质——即远场辐射场是各阵元辐射场的矢量叠加,其归一化方向图函数为:
$$ AF(\theta) = \sum_{n=0}^{N-1} w_n e^{j k d n \cos\theta} $$
其中 $k = 2\pi/\lambda$ 是波数,$w_n$ 是第 n 个阵元的复数激励权重(含幅度与相位),$\theta$ 是观察角度(从阵列法线方向起算)。这个公式就是所有后续代码的根基。
2.2 手动构建阵元位置与激励权重矩阵
我们以 8 元线性阵列为例,设定阵元间距 d = 0.5λ(避免栅瓣),工作频率 f = 3 GHz(对应 λ ≈ 0.1 m),并施加线性相位渐变实现 30° 波束扫描。以下代码完全基于 MATLAB 基础语法,无需任何工具箱:
% 参数定义 N = 8; % 阵元数量 d_lambda = 0.5; % 阵元间距(单位:波长) theta0_deg = 30; % 期望波束指向角(度) f0 = 3e9; % 工作频率(Hz) c = 3e8; % 光速(m/s) lambda = c / f0; % 波长(m) % 构建阵元位置向量(沿 x 轴,单位:米) x_pos = (0:N-1)' * d_lambda * lambda; % 列向量,尺寸 N×1 % 计算扫描所需相位差(单位:弧度) k = 2*pi / lambda; delta_phi = k * d_lambda * lambda * sind(theta0_deg); % 注意:sind() 输入为度 % 构建激励权重向量(等幅,线性相位) w = exp(1j * (0:N-1)' * delta_phi); % 复数权重,尺寸 N×1提示:
sind()函数比sin()更安全,因它直接接受角度制输入,避免sin(theta0_deg*pi/180)的手动换算错误。权重向量w是列向量,与位置向量x_pos维度一致,为后续矩阵运算铺平道路。
2.3 计算并绘制二维方向图(方位面)
方向图计算的核心是:对每个观测角度 θ,计算所有阵元到该方向的路径差引起的相位偏移,再与激励权重相乘求和。使用向量化运算可避免低效循环:
% 定义观测角度网格(-90° 到 +90°,步长 0.5°) theta_deg = -90:0.5:90; theta_rad = theta_deg * pi/180; % 向量化计算阵因子:AF(theta) = sum(w .* exp(j*k*x_pos*cos(theta))) % 利用广播机制:x_pos (N×1) 与 cos(theta_rad) (1×M) 相乘得 N×M 矩阵 AF = w.' * exp(1j * k * x_pos * cos(theta_rad)); % 结果为 1×M 行向量 % 归一化并转为 dB 刻度 AF_dB = 20*log10(abs(AF) / max(abs(AF))); % 绘制方向图 figure('Name', 'Linear Array Pattern (Theta Scan)'); plot(theta_deg, AF_dB, 'b-', 'LineWidth', 1.5); xlabel('Angle \theta (degrees)'); ylabel('Normalized Pattern (dB)'); title(sprintf('ULA: N=%d, d=%.1f\lambda, Beam at %.0f^\circ', N, d_lambda, theta0_deg)); grid on; ylim([-40, 0]);关键参数说明:
x_pos * cos(theta_rad):利用 MATLAB 广播规则,自动计算每个阵元在每个角度下的路径差(单位:米),再乘以波数k得到相位差。w.' * ...:行向量w.'(1×N)左乘 N×M 相位矩阵,结果为 1×M 向量,即每个角度的阵因子值。20*log10(...):将线性幅度转为对数刻度,便于观察旁瓣与零点。
此段代码输出的方向图清晰显示主瓣峰值位于 30°,旁瓣电平约 -13 dB,符合理论预期(8 元均匀激励 ULA 的第一旁瓣理论值为 -13.2 dB)。
3. 圆形阵列建模:坐标变换与三维方向图可视化
3.1 圆形阵列几何建模与激励策略差异
圆形阵列(Circular Array)将 N 个阵元均匀分布在半径为 R 的圆周上,其优势在于全向扫描能力与对称性。与线性阵列不同,圆形阵列的阵元位置需用极坐标转换为直角坐标,且波束扫描需同时控制方位角 φ 和俯仰角 θ,激励权重设计更复杂。关键参数包括:阵元数 N、圆半径 R(单位:波长)、以及目标扫描方向(φ₀, θ₀)。当 R 过大(如 R > 0.75λ)时,阵元间耦合增强,需考虑互耦效应——但本节聚焦理想无耦合模型,用纯几何方法建模。
3.2 构建圆形阵列位置矩阵与多维方向图计算
% 圆形阵列参数 N_circ = 12; % 阵元数量 R_lambda = 0.8; % 圆半径(单位:波长) phi0_deg = 45; % 方位角扫描目标(度) theta0_deg_circ = 60; % 俯仰角扫描目标(度) % 构建圆周上阵元位置(x, y, z 坐标,单位:米) angle_circ = linspace(0, 2*pi, N_circ+1); % 生成 N_circ 个角度(去掉最后一个重复点) angle_circ = angle_circ(1:end-1); x_circ = R_lambda * lambda * cos(angle_circ)'; y_circ = R_lambda * lambda * sin(angle_circ)'; z_circ = zeros(N_circ, 1); % 全部位于 xy 平面 % 计算扫描所需激励相位(针对目标方向 phi0, theta0) % 目标方向单位矢量:[cos(phi0)*sin(theta0), sin(phi0)*sin(theta0), cos(theta0)] ux = cosd(phi0_deg) * sind(theta0_deg); uy = sind(phi0_deg) * sind(theta0_deg); uz = cosd(theta0_deg); % 每个阵元到目标方向的路径差 = [x,y,z] · [ux,uy,uz] path_diff = x_circ.*ux + y_circ.*uy + z_circ.*uz; delta_phi_circ = k * path_diff; % 相位差向量 % 激励权重(等幅,相位补偿) w_circ = exp(1j * delta_phi_circ); % 定义三维观测网格(方位角 φ: 0~360°, 俯仰角 θ: 0~180°) phi_deg = 0:5:360; theta_deg_3D = 0:5:180; [Phi, Theta] = meshgrid(phi_deg, theta_deg_3D); Phi_rad = Phi * pi/180; Theta_rad = Theta * pi/180; % 计算三维方向图:对每个 (phi, theta),计算单位方向矢量与各阵元点积 ux_grid = cos(Phi_rad) .* sin(Theta_rad); uy_grid = sin(Phi_rad) .* sin(Theta_rad); uz_grid = cos(Theta_rad); % 向量化计算:path_diff_grid = x_circ*ux + y_circ*uy + z_circ*uz,结果为 N×M×P % 使用 bsxfun 或隐式扩展(R2016b+):reshape 位置向量为 N×1×1,广播至 M×P x3 = reshape(x_circ, [], 1, 1); y3 = reshape(y_circ, [], 1, 1); z3 = reshape(z_circ, [], 1, 1); path_diff_grid = x3.*ux_grid + y3.*uy_grid + z3.*uz_grid; % 阵因子:sum over n of w_n * exp(j*k*path_diff_n) AF_3D = squeeze(sum(w_circ.' .* exp(1j * k * path_diff_grid), 1)); % 归一化为 dB AF_3D_dB = 20*log10(abs(AF_3D) / max(abs(AF_3D(:))));3.3 用surf和polarplot呈现多维度辐射特性
圆形阵列方向图需多视角展示:极坐标图看方位面切片,三维曲面图看全空间分布。
% 绘制方位面切片(固定俯仰角 θ=90°,即 xy 平面) figure('Name', 'Circular Array Azimuth Pattern'); theta_slice_idx = find(theta_deg_3D == 90); AF_azimuth = AF_3D_dB(theta_slice_idx, :); polarplot(Phi_rad(theta_slice_idx,:), AF_azimuth, 'r-', 'LineWidth', 1.5); title(sprintf('Circular Array: N=%d, R=%.1f\\lambda, Beam at \\phi=%.0f^\\circ', ... N_circ, R_lambda, phi0_deg)); % 绘制三维方向图(使用 surf + view) figure('Name', '3D Radiation Pattern'); surf(Phi, Theta, AF_3D_dB, 'EdgeColor', 'none'); shading interp; colormap(jet); colorbar; xlabel('Azimuth \phi (degrees)'); ylabel('Elevation \theta (degrees)'); zlabel('Pattern (dB)'); title('3D Radiation Pattern of Circular Array'); view([-37.5, 30]); % 调整视角便于观察主瓣注意:
squeeze(sum(..., 1))将 N×M×P 三维数组沿第 1 维(阵元维度)求和,得到 M×P 二维方向图矩阵。surf绘图时,X/Y 轴为角度网格,Z 轴为 dB 值,直观反映能量在球面上的分布密度。
4. 阵列性能对比与关键参数调优指南
4.1 线性 vs 圆形阵列:方向图特性与适用场景对照表
| 特性 | 线性阵列(ULA) | 圆形阵列(Circular Array) |
|---|---|---|
| 扫描自由度 | 单维(仅方位角或仅俯仰角) | 双维(方位角 + 俯仰角) |
| 主瓣宽度(3dB) | ≈ 0.886λ/(N·d)(rad) | 取决于半径 R 与 N,R↑ 则主瓣↓,但栅瓣风险↑ |
| 旁瓣电平(均匀激励) | -13.2 dB(N=8) | -10 ~ -12 dB(典型 N=12) |
| 零点数量 | N-1 个(在特定角度) | 更多零点,方向图更复杂 |
| 硬件实现难度 | 低(单一直线布线) | 中(需精密圆周定位与馈电网络) |
| MATLAB 实现复杂度 | 低(一维向量运算) | 中(需三维坐标与广播计算) |
该对比并非优劣判断,而是选型依据:若系统只需水平扫描(如车载雷达),ULA 足够且高效;若需全空域覆盖(如无人机测向),圆形阵列不可替代。
4.2 三个必调参数及其对方向图的定量影响
调整以下参数时,务必同步重绘方向图并观察变化,这是理解阵列物理本质的最有效方式:
| 参数 | 默认值 | 调整效果 | 推荐调试范围 | 验证方法 |
|---|---|---|---|---|
| 阵元间距 d | 0.5λ | d < 0.5λ:主瓣展宽,分辨率↓;d > 0.5λ:出现栅瓣(虚假主瓣) | 0.4λ ~ 0.6λ(ULA) | 观察方向图是否出现 > -20 dB 的额外峰 |
| 阵元数量 N | 8 | N↑:主瓣变窄(分辨率↑),旁瓣↓,但计算量↑;N↓:主瓣宽,旁瓣高 | 4 ~ 32(依精度需求) | 测量 3dB 主瓣宽度(deg) |
| 激励幅度 taper | 均匀(全1) | 加窗(如 Hamming):旁瓣↓(-40 dB),但主瓣↑(分辨率↓) | Hamming / Taylor / Binomial | 对比加窗前后旁瓣电平与主瓣宽度 |
例如,对 8 元 ULA 施加 Hamming 窗:
w_tapered = hamming(N) .* w; % w 为原相位权重 % 后续用 w_tapered 替代 w 计算 AF执行后方向图旁瓣降至 -42 dB,但主瓣宽度从 14° 增至 18°,体现分辨率与旁瓣的固有折衷。
5. 故障排查与高频问题现场解决
5.1 “方向图主瓣不在目标角度” 的三步定位法
这是最常遇到的问题,根源几乎总在相位计算环节。按顺序检查:
- 确认角度制/弧度制混用:MATLAB 三角函数
sin()/cos()输入为弧度,sind()/cosd()输入为角度。扫描角theta0_deg若误用于sin(theta0_deg),会导致相位差错一个数量级。 - 验证波数 k 计算:
k = 2*pi/lambda,而lambda = c/f0。若f0单位错为 MHz(如3e6而非3e9),λ 被放大 1000 倍,k 错误导致相位差失效。 - 检查阵元序号与相位符号:ULA 中第 n 个阵元(n=0,1,...,N-1)的相位应为
n * delta_phi。若写成(n+1) * delta_phi或-n * delta_phi,主瓣将反向或偏移。
快速验证:将theta0_deg设为 0°,此时所有阵元应同相,方向图主瓣必须严格位于 0°。若不在此处,上述三步必有一处出错。
5.2 “三维方向图出现异常尖峰或 NaN” 的内存与精度修复
当N_circ较大(>24)且角度步长过细(<2°)时,path_diff_grid数组可能超出内存或触发浮点溢出。解决方案:
- 降维计算:不生成完整三维网格,改用
arrayfun分块计算:% 对每个 (phi, theta) 点单独计算,避免大数组 AF_3D_dB = zeros(numel(theta_deg_3D), numel(phi_deg)); for i = 1:numel(theta_deg_3D) for j = 1:numel(phi_deg) ux = cosd(phi_deg(j)) * sind(theta_deg_3D(i)); uy = sind(phi_deg(j)) * sind(theta_deg_3D(i)); uz = cosd(theta_deg_3D(i)); path_diff = x_circ.*ux + y_circ.*uy + z_circ.*uz; AF_val = sum(w_circ .* exp(1j * k * path_diff)); AF_3D_dB(i,j) = 20*log10(abs(AF_val)/max_abs_AF); end end - 精度加固:
max(abs(AF_3D(:)))若为 0(罕见但可能),log10(0)返回-Inf。添加保护:max_abs_AF = max(abs(AF_3D(:))); if max_abs_AF == 0, max_abs_AF = eps; end % eps 为最小正浮点数 AF_3D_dB = 20*log10(abs(AF_3D) / max_abs_AF);
5.3 将.rar实验包转化为可复用的函数模块
Chapter06.rar中的脚本通常是面向教学的单次运行代码。要工程化复用,需封装为函数:
function [AF_dB, theta_deg] = calc_ula_pattern(N, d_lambda, theta0_deg, f0) % CALC_ULA_PATTERN 计算线性阵列方向图 % 输入:N-阵元数, d_lambda-间距(波长), theta0_deg-扫描角(度), f0-频率(Hz) % 输出:AF_dB-归一化方向图(dB), theta_deg-角度向量(度) c = 3e8; lambda = c/f0; k = 2*pi/lambda; x_pos = (0:N-1)' * d_lambda * lambda; delta_phi = k * d_lambda * lambda * sind(theta0_deg); w = exp(1j * (0:N-1)' * delta_phi); theta_deg = -90:0.5:90; theta_rad = theta_deg * pi/180; AF = w.' * exp(1j * k * x_pos * cos(theta_rad)); AF_dB = 20*log10(abs(AF) / max(abs(AF)+eps)); end调用示例:[pat, ang] = calc_ula_pattern(16, 0.45, 22.5, 5e9); plot(ang, pat);
此举使Chapter06.rar不再是孤立实验,而成为你天线仿真工具箱中的一个可靠组件。
本文还有配套的精品资源,点击获取