阵列天线方向图MATLAB仿真资源包:线阵/面阵/非均匀/加权对比
简介:这份资源围绕阵列天线方向图展开,面向无线通信、天线设计方向的学习者与工程人员,帮助理解单元个数、阵元间距与波长变化对辐射特性的影响。压缩包共4个文件,以m脚本为主,整体约2KB,体积轻量,便于在MATLAB环境中直接运行与修改参数。内容涉及2单元、4单元、8单元等不同阵列规模,以及λ/2、λ、λ/4等间距条件下的方向图对比,可直观观察主瓣宽度、增益变化与旁瓣抑制效果。已有2136人学习下载,说明其在相关课程实验与自学场景中具有一定参考价值。读者可借助这些脚本复现不同参数组合下的方向图曲线,对照理解波束赋形与相位控制的基本规律,并在此基础上调整参数开展扩展实验,为阵列配置选型与性能分析提供可操作的练习素材。
1. 阵列天线方向图对比:一份能直接跑起来的 MATLAB 资源包
做阵列天线仿真的人大概都经历过这个阶段:公式推了一遍,代码写了一版,方向图出来却和预期对不上,主瓣宽度、副瓣电平、栅瓣位置全凭感觉调。这份资源包把均匀线阵、均匀面阵、非均匀间距阵、加权阵几种典型结构的方向图计算整理成一套可运行的 MATLAB 脚本,每个脚本对应一种阵列形式,参数集中在文件头部,改完直接出图。它解决的不是“方向图是什么”这种教科书问题,而是“我手上这个阵元数、间距、加权方式,方向图到底长什么样、副瓣压到多少、扫描时会不会冒栅瓣”这类落地问题。适合正在做阵列综合、波束成形入门验证,或者需要快速对比不同布阵方案的高年级学生和一线射频工程师。资源本身不依赖工具箱之外的第三方库,MATLAB R2018b 以上版本即可跑通。
2. 方向图计算的底层逻辑:从阵因子到归一化增益
2.1 阵因子为什么是方向图的核心
阵列方向图由阵元方向图和阵因子共同决定。工程上做对比时,通常假设阵元为全向或理想余弦方向图,把注意力放在阵因子上,因为阵因子决定了主瓣指向、副瓣电平、零点和栅瓣这些关键指标。均匀线阵的阵因子写成:
AF(θ) = Σ w_n · exp(j·k·d·n·sinθ),n = 0…N-1
其中 k = 2π/λ,d 为阵元间距,w_n 为第 n 个阵元的复加权。这个式子是后面所有脚本的骨架,区别只在于 w_n 怎么取、d 是否等间距、求和维度是一维还是二维。资源包里每个脚本开头都有一段注释,把当前阵列的阵因子表达式写清楚,改参数前先对一遍公式,能省掉大量“图不对但不知道哪错”的时间。
归一化处理是另一个容易翻车的点。方向图通常按最大辐射方向归一化,即除以 |AF(θ)| 的最大值,得到 0 dB 主瓣。如果直接画线性幅度,副瓣和主瓣的差距看不出来;如果归一化时取了错误的角度范围,主瓣可能被截断。脚本里统一用AF_norm = 20*log10(abs(AF)/max(abs(AF))),并在注释里标明扫描角度范围要覆盖主瓣和至少前三个副瓣。
2.2 四种阵列形式的参数映射
资源包覆盖的四种形式,参数含义各不相同,混用会直接导致结果失真。下面这张表是各脚本头部参数的实际含义,照着填不会错:
| 阵列形式 | 关键参数 | 典型取值 | 影响指标 |
|---|---|---|---|
| 均匀线阵 | N、d/λ | N=8,d=0.5λ | 主瓣宽度、栅瓣 |
| 均匀面阵 | Nx、Ny、dx、dy | 8×8,0.5λ | 二维波束形状 |
| 非均匀间距阵 | 间距向量 d_vec | 0.4λ~0.7λ 混合 | 副瓣电平 |
| 加权阵 | 权向量 w | 汉明窗/切比雪夫 | 副瓣抑制、主瓣展宽 |
均匀线阵的 d 超过 0.5λ 就会出现栅瓣,这是物理规律不是代码 bug;非均匀间距阵的间距向量长度必须等于 N-1,少一个元素求和维度就对不上;加权阵的权向量长度必须等于阵元数,且归一化方式要和阵因子公式一致。这些约束在脚本里用assert做了检查,跑之前会先报错而不是出一张错图。
2.3 一个最小可运行示例
以均匀线阵为例,核心计算部分不到二十行,但每一行都有对应的物理含义:
% 均匀线阵方向图计算 N = 8; % 阵元数 d = 0.5; % 阵元间距,单位波长 theta = -90:0.1:90; % 扫描角度,度 k = 2*pi; % 波数,d 已按波长归一化 % 阵因子求和:每个阵元的相位差为 k*d*n*sin(theta) AF = zeros(size(theta)); for n = 0:N-1 AF = AF + exp(1j*k*d*n*sind(theta)); end % 归一化并转 dB AF_norm = 20*log10(abs(AF)/max(abs(AF))); plot(theta, AF_norm); xlabel('角度 (度)'); ylabel('归一化增益 (dB)'); ylim([-40 0]); grid on;这段代码里d用的是波长归一化值,所以k直接取 2π,不需要再除 λ。sind而不是sin,是因为 theta 以度为单位,换成弧度会得到完全错误的周期。ylim([-40 0])是刻意截断的,低于 -40 dB 的副瓣在工程上意义不大,截断后主瓣和近区副瓣的对比更清楚。如果要做扫描对比,把exp(1j*k*d*n*sind(theta))改成exp(1j*k*d*n*(sind(theta)-sind(theta0))),theta0 为扫描角,这是相控阵波束扫描的标准写法。
3. 四种阵列的对比实操:改参数、出图、读指标
3.1 均匀线阵与面阵的对比流程
线阵脚本跑通后,面阵脚本的改动集中在双重求和。面阵的阵因子是两个方向线阵阵因子的乘积(当行列加权可分离时),脚本里用矩阵运算实现:
% 均匀面阵方向图,8x8,间距 0.5 波长 Nx = 8; Ny = 8; dx = 0.5; dy = 0.5; theta = -90:1:90; phi = 0:1:360; % 构建角度网格 [TH, PH] = meshgrid(theta, phi); AF = zeros(size(TH)); for m = 0:Nx-1 for n = 0:Ny-1 AF = AF + exp(1j*2*pi*(m*dx*sind(TH).*cosd(PH) + n*dy*sind(TH).*sind(PH))); end end AF_norm = 20*log10(abs(AF)/max(abs(AF(:)))); surf(TH, PH, AF_norm); shading interp;这里max(abs(AF(:)))的(:)不能省,二维矩阵直接取 max 得到的是行向量,归一化会按列进行,图会歪。meshgrid的顺序是 theta 在外、phi 在内,和surf的坐标顺序一致,反过来画出来是转置的。面阵的栅瓣条件比线阵严格,dx 和 dy 任一超过 0.5λ 都会在对应切面出现栅瓣,脚本里对两个间距分别做了检查。
对比线阵和面阵时,重点看三个指标:主瓣的 -3 dB 宽度、第一副瓣电平、扫描到 ±60° 时主瓣是否明显展宽。8 元均匀线阵、0.5λ 间距、等幅加权时,第一副瓣约 -13.2 dB,这是等幅阵的经典值,如果跑出来不是这个数,先查归一化和角度步长。面阵在同样参数下,两个主切面的副瓣和线阵一致,但对角切面的副瓣会略高,这是二维布阵的固有特性,不是脚本问题。
3.2 非均匀间距与加权的调参方法
非均匀间距阵的目的是打散周期性,把栅瓣能量分散成多个低副瓣。资源包里的间距向量是手动给定的,改法有两种:一是围绕 0.5λ 做小幅随机扰动,二是按特定比例递增。前者实现简单但副瓣不稳定,后者可控性更好。脚本里给了一组示例间距[0.42 0.55 0.48 0.61 0.45 0.58 0.51](对应 8 阵元的 7 个间距),跑出来的第一副瓣比等间距低 3~5 dB,代价是主瓣略微展宽。
加权阵的调参更直接,权向量换成窗函数即可:
% 汉明加权均匀线阵 N = 16; d = 0.5; w = hamming(N); % 生成汉明权 w = w / sum(w); % 权归一化,保证主瓣增益为 0 dB theta = -90:0.1:90; AF = zeros(size(theta)); for n = 0:N-1 AF = AF + w(n+1) * exp(1j*2*pi*d*n*sind(theta)); end AF_norm = 20*log10(abs(AF)/max(abs(AF)));w = w/sum(w)这一步是为了让主瓣峰值归一化到 0 dB,如果不除,不同窗之间的主瓣高度不可比。汉明窗能把副瓣压到 -43 dB 左右,但主瓣宽度大约是等幅阵的 1.5 倍,这是副瓣抑制的固有代价。切比雪夫加权可以在给定副瓣电平下得到最窄主瓣,但权向量需要用chebwin(N, 副瓣dB)生成,副瓣设得越低主瓣越宽,脚本注释里给了 -20 dB 和 -30 dB 两组参考值。
3.3 出图后怎么读指标
图出来只是第一步,读指标才是对比的目的。主瓣宽度按 -3 dB 点量,脚本里用find定位归一化增益首次低于 -3 的两个角度,差值即波束宽度。副瓣电平取主瓣之外的最大峰值,注意要排除主瓣附近的过渡区,否则会把主瓣肩部误判为副瓣。栅瓣的判断看 ±90° 范围内是否出现与主瓣同量级的峰值,等幅均匀阵在 d>0.5λ 时必然出现,加权阵在 d 更大时也会出现,加权只能压幅度不能消栅瓣。
扫描角的对比容易被忽略。把扫描角设到 60°,均匀线阵的主瓣会从 12.8° 展宽到约 25°,增益下降 1~2 dB,这是扫描损失,脚本里单独画了扫描前后的对比曲线。如果扫描到 60° 后副瓣明显抬高,说明间距偏大,需要回到 0.5λ 以下重新布阵。这些指标在四类阵列之间横向对比时,建议固定 N 和 d,只改布阵或加权方式,否则变量太多读不出结论。
4. 避坑与排查:方向图跑歪的五个常见原因
4.1 角度单位混用导致周期错乱
现象:方向图出现密集振荡,主瓣位置和理论值对不上。原因:sin和sind混用,theta 以度定义却用了弧度函数,周期被压缩了 57 倍。解决:全脚本统一用sind/cosd,或者在入口处theta = deg2rad(theta)后统一用弧度函数,二选一,不要中途切换。
4.2 归一化取错维度
现象:面阵方向图整体偏移,最大值不在 0 dB。原因:二维矩阵用max(abs(AF))得到行向量,除法按列广播,等价于每列单独归一化。解决:改成max(abs(AF(:))),先拉成一维再取最大值。线阵是一维向量不受影响,所以这个坑往往在从线阵切到面阵时才暴露。
4.3 间距向量长度不匹配
现象:非均匀间距阵报维度错误,或者求和结果只有一半阵元的贡献。原因:N 个阵元对应 N-1 个间距,间距向量少一个元素时循环越界或提前截断。解决:脚本里加assert(length(d_vec) == N-1),改参数时先过断言。这个检查看起来多余,但改间距做对比时最容易漏。
4.4 加权向量未归一化
现象:不同加权方式的主瓣高度不一致,副瓣对比失去意义。原因:窗函数生成的权向量和不为 1,主瓣峰值随权向量总和变化。解决:加权后统一w = w/sum(w),再做阵因子求和。注意切比雪夫权的和不一定为 1,同样要归一化。
4.5 扫描角公式漏减参考相位
现象:设了扫描角但主瓣仍指向 0°。原因:阵因子里的相位项只写了k*d*n*sind(theta),没有减去k*d*n*sind(theta0),扫描角没有进入相位差。解决:改成exp(1j*k*d*n*(sind(theta)-sind(theta0))),theta0 为期望扫描角。这个错误在只做接收方向图时不容易发现,一做发射扫描就露馅。
5. 进阶用法:把单点对比变成批量扫描的验证习惯
单张方向图只能看一个工况,真正做选型对比时,我习惯把参数扫一遍再下结论。资源包里的脚本都是单次运行结构,改成批量扫描不需要重写,在外面套一层循环即可。比如对比不同阵元数对主瓣宽度的影响:
% 批量扫描阵元数,记录 -3dB 波束宽度 N_list = [4 8 16 32]; bw = zeros(size(N_list)); for idx = 1:length(N_list) N = N_list(idx); d = 0.5; theta = -90:0.05:90; AF = zeros(size(theta)); for n = 0:N-1 AF = AF + exp(1j*2*pi*d*n*sind(theta)); end AF_norm = 20*log10(abs(AF)/max(abs(AF))); % 找主瓣两侧 -3dB 点 below = find(AF_norm <= -3); bw(idx) = theta(below(end)) - theta(below(1)); end disp(table(N_list', bw', 'VariableNames', {'N','Beamwidth_deg'}));这段代码的关键在theta步长取 0.05°,步长太粗时 -3 dB 点定位误差能到 1° 以上,对比 N=4 和 N=32 时这个误差会盖过真实差异。below(end)和below(1)取的是所有低于 -3 dB 的角度首尾,前提是主瓣只有一个且副瓣都低于 -3 dB,等幅阵满足这个条件,加权阵副瓣压得深也满足,但如果副瓣高于 -3 dB(极端加权或栅瓣),这个取法会出错,需要先找主瓣峰值再向两侧搜索。
批量跑完我一般会看三件事:波束宽度是否随 N 近似按 1/N 下降、第一副瓣是否稳定在 -13.2 dB 附近、扫描 60° 时增益损失是否在 2 dB 以内。三个都对上,说明脚本和参数都没问题,可以放心拿去做方案对比。有一次我偷懒没做批量验证,直接拿单点图去汇报,结果换了个阵元数后副瓣冒到 -8 dB,回头查是间距设成了 0.6λ,栅瓣被当成了副瓣。从那以后我每次改完参数都强制跑一遍批量扫描,把波束宽度和副瓣电平打成表再出图,图可以骗人,表不会。希望这套脚本和排查清单能帮你在阵列对比上少走几个弯路。
本文还有配套的精品资源,点击获取