MATLAB阵列仿真:线阵、面阵、圆阵的方向图计算与参数调优
2026/9/15 21:29:49 网站建设 项目流程

简介:面向无线通信、雷达与声学领域的阵列天线研究者和学习者,这份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)位置对应的实际空间坐标是 x=2d、y=d,也就是说第 3 列阵元在原点右侧两个波长、上方一个波长处。把 z 全置零表示所有阵元在一个水平面,做方向图仿真时不会引入高度相位差。注意如果是极化或者共形阵列,z 也要参与相位计算,不能用零占位。

统一成 3×M 之后,线阵就是只留第一行有值的特例:pos = [0:M-1].*d; pos = [pos; zeros(2, M)]。这样三类阵列共用一个方向图计算函数,后面代码只需要换输入坐标。

2.2 方向图计算的核心:阵列流型矩阵 A 的一次性向量化求法

方向图的理论基础是阵列流型矩阵(steering matrix)A。第 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*d,d≈λ/2
面阵 UPAmeshgrid 矩形网格俯仰 θ 从 z 轴,方位 φ 从 x 轴二维同时展宽Nxd × Nyd
圆阵 UCA极坐标转笛卡尔θ=0 为阵面法线方位扫描基本不变弧间距≈λ/2

3.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/cosdsin/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.4(GHz)而坐标是 12.5(cm),谁换算谁错。我的习惯是全部用波长做单位:令 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 附近。

最后一个实战建议:把方向图计算封装成函数,输入是posthetaphi,输出是pattern_dB。线阵、面阵、圆阵都走同一个入口,后续做任意几何阵列的互耦修正、幅度误差、多波束形成时,只需要替换 pos 和权重生成部分,不需要动方向图引擎。这样验证也集中:只要对拍过一次线阵解析解,其他阵列的代码正确性就都有了基线。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询