MATLAB阵列仿真:线阵、面阵、圆阵的方向图计算与参数调优
发布时间:2026/9/15 21:29:55来源:尧图网络
简介面向无线通信、雷达与声学领域的阵列天线研究者和学习者这份Patern.rar压缩包提供了线阵、面阵、圆阵三种典型天线配置的MATLAB仿真程序用于方向图计算、可视化与阵列性能分析。压缩包共4个文件包含均匀线阵方向图、均匀面阵方向图、均匀圆阵方向图三个MATLAB源码文件.m外加一个文本说明文档整体大小仅2KB轻量易用适合快速加载运行。三个程序分别实现了阵列因子计算、二维相位控制、圆阵相位环绕算法等关键逻辑可绘制不同角度下的辐射强度曲面或曲线直观展示各阵列的波束指向与旁瓣特性。已有553人浏览学习适合天线阵列原理验证、课程实验或工程预研通过调整阵元间距、排列方式和相位分布可辅助理解波束成形、相控阵扫描及阵列设计中的参数影响是一份兼顾理论与代码实践的小巧参考资料。1. Patern.rar 这个文件名里藏着的是 MATLAB 阵列仿真的三条主线“Patern.rar_线阵_面阵_面阵 MATLAB_面阵matlab_面阵圆阵”拆开看其实就是三类最常见的阵列几何均匀直线阵ULA、均匀矩形面阵UPA、均匀圆阵UCA。做相控阵、声呐波束形成、麦克风阵列、射电干涉阵列的工程师第一步几乎都是同一件事把阵元坐标写进 MATLAB算方向图pattern看主瓣宽度、旁瓣电平和零陷位置。我见过不少同行从这类代码包里拿到程序能跑通一张图但换一个阵型、改一个频点就不知道从哪下手。原因是方向图计算的骨架没有抽象出来——坐标生成、阵面法线、角度定义、波数常数这四个东西只要有一套统一写法线阵、面阵、圆阵都能吃透。这篇就按我组织这类仿真代码的顺序把三条线讲全顺带把最容易翻车的几个参数坑和排错方法交代清楚。适合刚接触阵列信号处理的 MATLAB 用户也适合回头补参数细节的工程师。2. 线阵与面阵从阵列流型矩阵到 MATLAB 方向图实现2.1 先写阵元坐标用 meshgrid 把线阵和面阵统一成 3×M 矩阵很多教程序里线阵的方向图写得简单直接对扫描角做累加求和。这种写法逻辑对但一旦换成面阵就要重写。我习惯把所有阵列统一成“阵元位置矩阵 pos尺寸 3×M”每一列是一个阵元的[x; y; z]坐标M 是阵元总数。线阵的一维坐标(0:N-1)*d直接放第一行面阵用meshgrid展开成两组 Nx×Ny 的网格再(:).拉平成行向量。freq 3e9; c 3e8; lambda c/freq; k 2*pi/lambda; d lambda/2; Nx 8; Ny 8; [gx, gy] meshgrid((0:Nx-1)*d, (0:Ny-1)*d); pos [gx(:).; gy(:).; zeros(1, Nx*Ny)];这段代码里lambda/2是标准阵元间距理由后面讲。meshgrid生成的 gx、gy 按行展开后(2,3)位置对应的实际空间坐标是 x2d、yd也就是说第 3 列阵元在原点右侧两个波长、上方一个波长处。把 z 全置零表示所有阵元在一个水平面做方向图仿真时不会引入高度相位差。注意如果是极化或者共形阵列z 也要参与相位计算不能用零占位。统一成 3×M 之后线阵就是只留第一行有值的特例pos [0:M-1].*d; pos [pos; zeros(2, M)]。这样三类阵列共用一个方向图计算函数后面代码只需要换输入坐标。2.2 方向图计算的核心阵列流型矩阵 A 的一次性向量化求法方向图的理论基础是阵列流型矩阵steering matrixA。第 m 个阵元在第 n 个观察方向上的相移是exp(1j*k*(r_m·u_n))其中 u_n 是观察方向的单位向量r_m 是阵元位置向量。把全部组合算出来A 就是 M×N 的复矩阵。MATLAB 里写成三行theta linspace(0, pi/2, 91); % 俯仰角从 z 轴往下算 phi linspace(-pi, pi, 361); % 方位角从 x 轴往 y 轴转 [PHI, THETA] meshgrid(phi, theta); ux sin(THETA).*cos(PHI); uy sin(THETA).*sin(PHI); uz cos(THETA); U [ux(:).; uy(:).; uz(:).]; A exp(1j * k * (pos. * U));这里把 θ 限制在 0 到 π/2是因为面阵辐射通常只关心前半空间想画半球就把上限改成 pi。pos. * U是 M×N 矩阵每个元素表示第 m 个阵元在方向 n 上的投影距离乘以波数 k 之后取指数就是相位项。这个矩阵乘法避开了双重 for 循环91×361 的网格对 64 元面阵是瞬时计算。接下来是波束形成权重 w。最常用的约定是想在 u0 方向形成主瓣就用该方向的共轭相位作为权重即w conj(A(:, idx0))。此时全阵输出幅度为pattern abs(w. * A)归一化后转 dB 显示。idx0 find(abs(THETA(:)-pi/6)1e-6 abs(PHI(:)-0)1e-6, 1); w conj(A(:, idx0)); % 是共轭转置普通转置用 . pattern w. * A; pattern_dB 20*log10(abs(pattern)/max(abs(pattern))); figure; imagesc(phi*180/pi, theta*180/pi, reshape(pattern_dB, size(THETA))); axis xy; colorbar; xlabel(方位角 (度)); ylabel(俯仰角 (度));逻辑说明w. * A得到 1×N 的复输出取模得幅度除以最大值再取 20 倍对数得到以 dB 为单位的相对方向图。reshape这一步不能丢因为 A 的列是按点模展开的必须恢复到 θ×φ 的网格才能用imagesc正确成像。2.3 阵元间距 d 和 锥削权重方向图的两个开关方向图里最敏感的参数是阵元间距 d。d λ/2 是均匀阵列的常规工作点既能避免栅瓣又不会让阵元间互耦影响过大。这里把 d 换成 λ/3主瓣会明显变宽旁瓣电平下降换成 0.6λ半功率宽度变小但扫描到大角度时栅瓣开始从边缘进入可见区域。判断标准很简单只要 d λ/2扫描角增大到某个值时阵列流型会出现第二个相同的峰值这就是栅瓣。锥削权重taper用于压低旁瓣。注意 MATLAB 的信号处理工具箱里chebwin(M, R)和taylorwin(M, nbar, sll)都可以直接生成一维权值但面阵要沿两个维度分别计算再外积w1d chebwin(Nx, 30); % 30 dB 旁瓣电平设定 w2d w1d * w1d.; % 外积得到 Nx×Nx 二维窗 w w2d(:); % 展开成列向量用这个 w 替换原来的conj(A(:, idx0))方向图旁瓣会被压低到 -30 dB 附近代价是主瓣变宽约一成。这个权重的相位已经固定为 0只控制幅度它不能替代波束扫描需要的共轭相位。工程里最常见的做法是“共轭相位 × 幅度锥削”逐元素相乘二者缺一个都不是完整的波束形成。3. 面阵与圆阵的几何差异方位俯仰定义权都别搞混3.1 圆阵坐标极坐标转笛卡尔后没有天然网格均匀圆阵的坐标不落在矩形网格上M 个阵元等角度分布在半径 R 的圆周上。生成代码比面阵短但角度定义更容易乱M 16; R 1.2 * lambda; % 半径取得比波长略大 alpha (0:M-1) * 2*pi/M; % 阵元方位角 pos [R*cos(alpha); R*sin(alpha); zeros(1,M)];逻辑说明alpha 是每个阵元相对 x 轴的方位角阵元 1 在 (R, 0) 的位置后续按逆时针排。半径 R 的实际含义是“口径”不是“阵元间距”。圆阵相邻阵元的弧间距是2πR/M工程上要让弧间距接近 λ/2所以 R 的推荐值大约是λ*M/(4π)。这里取 1.2λ 是为了让方向图稍微有一点“圆阵的大旁瓣特征”方便观察。圆阵的流型矩阵与面阵完全同构A exp(1j * k * (pos. * U))。U 的定义仍然用 θ 和 φ但此时 θ0 方向z 轴是圆阵的法线方向而不是某个阵元的法线方向。由于圆阵没有“端射”和“宽边”之分波束在方位角 360° 范围内扫描时形状几乎不变——这是圆阵相对线阵的核心优势。3.2 波束扫描时三类阵列的行为差异线阵扫描到大角度比如偏离法线 60° 以上时有效孔径投影缩小主瓣明显展宽这叫 scan loss。面阵在俯仰和方位两个方向同时存在这个问题俯仰角接近 90° 时等效于一维线阵在端射方向工作波束变得很胖。圆阵没有一致的端射方向扫描损失相对小但代价是旁瓣基座电平比同口径面阵高通常只能做到 -13 dB 左右除非加锥削或改用稀疏阵列优化。下表是三类阵列在 MATLAB 仿真里最需要记住的差异阵列类型坐标生成方式角度参考系主瓣随扫描变化常见口径选择线阵 ULA一维等差坐标偏离法线角 θ大角度明显展宽N*dd≈λ/2面阵 UPAmeshgrid 矩形网格俯仰 θ 从 z 轴方位 φ 从 x 轴二维同时展宽Nxd × Nyd圆阵 UCA极坐标转笛卡尔θ0 为阵面法线方位扫描基本不变弧间距≈λ/23.3 圆阵波束形成的相位共轭权重为什么要用 NaN 防护给圆阵做波束形成权重公式仍然是w conj(A(:, idx0))但这里有一个细节圆阵流型矩阵里可能包含数值极小的cos(PHI)和sin(PHI)组合在计算 idx0 时如果直接找PHI 0浮点数比较会落空。我一般用find(abs(THETA(:)-theta0)tol abs(PHI(:)-phi0)tol, 1)这种方式取索引而不是。tol 可以取 1e-6。一旦索引为空conj(A(:, []))会得到空权重方向图全是 NaN图像一片空白这是圆阵仿真新手最容易碰到的情况。4. 面阵 matlab 仿真必调的 3 个参数和 4 类典型错误4.1 必调参数表网格分辨率、频点、锥削深度面阵仿真的结果往往被三个参数决定任何一个不对画出来的图都看不出问题但数值全错参数推荐初值调参影响注意事项扫描网格步长1°0.5° 更稳峰值定位精度找零点时用 0.1° 加密工作频率 f3 GHz 或自定决定 λ 和 k频率与波长必须同一单位制锥削旁瓣电平30 dB主瓣宽度 15% 左右用 chebwin 或 taylorwin 时别传错单位网格分辨率这个参数最容易忽略。分辨率太粗比如 5°会造成主瓣峰值被低估、旁瓣被高估算出的半功率宽度偏大。方向图扫描建议先用 1° 粗看结构确认主瓣位置后再加密到 0.1° 做精确提取。4.2 错误一角度用度sin 和 cos 默认吃弧度这是 MATLAB 代码里最频繁的低级错误。写theta 0:1:90然后直接sin(theta)得到的角度全部按弧度解析方向图会在意料之外的位置出现“伪主瓣”。我给出的解法是在代码开头统一用弧度定义变量输出弧度只在显示和坐标轴标注时转成角度。如果坚持用角度就必须写sind(THETA)、cosd(THETA)。注意sind/cosd与sin/cos混用会产生完全错误的相位差人还很难看出来。4.3 错误二波数 k 写少了一个 2π方向图流型exp(1j*k*(pos.*U))里k 2π/λ。有些人图省事写成k 1/lambda结果相位只走了真实路径的 1/6.28方向图主瓣消失变成一团随机噪声。排查方法很容易取单阵元方向图看它在扫描范围内是否恒为 0 dB如果不是那 k 一定是错的。也可以用代码自检A_single exp(1j * k * (pos(:,1). * U)); max(abs(A_single(:))) % 恒等于 1单阵元的流型幅度必须恒为 1这是相位项的基本性质任何偏离都在提醒你波数或者单位出了问题。4.4 错误三扫描角度组合顺序与 reshape 维度不匹配对 91×361 的网格U是 3×32851。pos. * U是 M×32851。如果中间某一步把 PHI 和 THETA 的顺序写反比如先 meshgrid(theta, phi)后面的reshape(pattern, size(THETA))尺寸仍然是对的但图像的长轴和短轴被调换主瓣位置会沿边角移动。这类错误不报错只出诡异图像。排查手段是打印尺寸并抽查几个点[size(THETA) size(PHI)] idx_c find(abs(THETA(:)-pi/4)1e-6 abs(PHI(:)-0)1e-6); pattern(idx_c) % 与理论值对比4.5 错误四波长单位不统一导致阵元间距变成千分之一波长freq 3e9 配 c 3e8 得到 λ 0.1 m。如果阵元坐标写成(0:N-1)*d且 d 0.05单位是米没问题。但如果看到别人代码里频点是 2.4GHz而坐标是 12.5cm谁换算谁错。我的习惯是全部用波长做单位令 d 0.5单位λ坐标就是0:0.5:(N-1)*0.5频率和光速完全不出现。这样所有长度都是波长倍数方向图的角度结果与频率无关方便做归一化设计。提示功率方向图显示用20*log10(abs(pattern)/max(abs(pattern)))不要用10*log10。幅度方向图是电压量纲转 dB 一律乘 20如果是功率信号才用 10。5. 用 MATLAB 验证阵列方向图的快速技巧从主瓣宽度到零点位置拿到一张方向图不能只看“像不像”。我一般用三个独立手段验证代码和参数是否正确。第一用解析公式对拍法线方向的主瓣宽度。均匀线阵的半功率波束宽度近似为 0.886λ/(Nd) 弧度面阵在 φ0 方向也服从这个公式只要把 N 换成该方向上的阵元数。下面是直接对比d 0.5; N 8; HPBW_theory 0.886 / (N*d) * 180/pi; % 12.8 度 [~, pidx] findpeaks(pattern_dB(:,181), NPeaks, 1); half_power pattern_dB(:,181) -3.01 pattern_dB(:,181) -3.00;pattern_dB(:,181)是指 φ0 这一列剖面。由于网格是 1°直接找大于 -3.01 dB 的位置数量乘上步长就是数值半功率宽度。和理论值误差超过 0.3° 时优先检查 k 和坐标单位然后检查是否有锥削权重。如果有 chebwin 锥削理论宽度需要除以展开系数约 1.1~1.2不能直接用公式。第二个技巧是用findpeaks查旁瓣电平。把方向图剖面转成 dB 后直接找出所有局部峰值排除主瓣附近 ±2° 区域剩下的最高峰就是最大旁瓣电平。均匀面阵不加锥削的理论峰值旁瓣约 -13.2 dB如果算出 -20 dB说明权重加了锥削如果算出 -6 dB说明栅瓣已经进入可见区阵元间距一定超过了 λ/2。这个判断逻辑不需要额外工具箱把峰值坐标和高度打印出来即可。第三是零点定位。均匀阵列的方向图零点出现在沿某方向的阵列流型相位差刚好是 2π 整数倍的位置所以方向图剖面会周期性跌落。用差分找局部极小值可以快速定位第一零点进而判断阵列有效口径。小技巧是先用 0.1° 插值方向图再找零点否则 1° 网格会把零点的深度展平到 -20 dB 附近。最后一个实战建议把方向图计算封装成函数输入是pos、theta、phi输出是pattern_dB。线阵、面阵、圆阵都走同一个入口后续做任意几何阵列的互耦修正、幅度误差、多波束形成时只需要替换 pos 和权重生成部分不需要动方向图引擎。这样验证也集中只要对拍过一次线阵解析解其他阵列的代码正确性就都有了基线。本文还有配套的精品资源点击获取
网站建设高端定制企业官网