简介:这份资源面向电子工程、通信与雷达方向的学生和研究人员,提供基于MATLAB的直线天线阵仿真完整案例,帮助理解阵元间距、馈电相位与频率对阵列辐射特性的影响。压缩包共9个文件,约1.1MB,包含1个m脚本文件与8个png图像,脚本用于构建偶极子天线单元、定义直线阵列几何结构并执行频率扫描与方向图绘制,图像则直观呈现不同配置下的二维与三维远场辐射结果,便于对照分析主瓣宽度、旁瓣电平与增益变化。目前已有611人学习下载,说明该案例在相关课程设计与科研入门中具有一定参考价值。读者可借助脚本快速复现仿真流程,通过修改阵元间距、相位偏移等参数观察波束方向控制效果,并结合输出图像评估阵列性能,为天线阵列的设计验证与迭代优化提供可运行的代码基础与可视化依据。
1. 直线天线阵仿真:从阵列因子到方向图的那点事
做天线设计的都绕不开一个坎:单天线的方向图太宽、增益不够,想压窄波束、提高定向性,就得把多个辐射单元按一定规律排成阵列。直线天线阵是最基础也最实用的一种,等间距排成一条线,通过控制单元之间的幅度和相位关系,就能把主瓣指向想要的方向,同时把旁瓣压下去。这套逻辑在雷达、通信基站、卫星链路里反复出现,但真到自己动手推公式、画方向图的时候,很多人就卡在“阵列因子到底怎么算”“相位差和扫描角什么关系”这些细节上。这份基于 MATLAB 的直线天线阵仿真资源,就是把这些环节串起来:从阵列理论出发,用代码把方向图函数画出来,再调参数看波束怎么变。适合正在学天线阵列基础、需要快速验证设计参数、或者想拿一套能跑的代码改吧改吧就用的人。
2. 阵列因子与方向图:先把数学骨架搭起来
2.1 为什么从阵列因子入手
直线天线阵的总辐射方向图,可以拆成两个部分:单个单元的方向图,乘以阵列因子。单元方向图取决于你用的什么天线,比如半波振子、微带贴片,但阵列因子只跟单元的排布方式、激励幅度和相位有关。做仿真的时候,通常先把单元当成理想全向源,单独看阵列因子的行为,这样能把波束扫描、旁瓣电平这些核心特性拎清楚。等阵列因子调明白了,再乘上真实单元方向图,结果就接近实际了。
阵列因子的数学表达不复杂。假设 N 个单元沿 z 轴等间距 d 排布,第 n 个单元的激励幅度为 a_n,相位为 β_n,那么阵列因子可以写成:
AF(θ) = Σ_{n=0}^{N-1} a_n · exp(j·(k·d·n·cosθ + β_n))
其中 k = 2π/λ 是波数,θ 是从阵列轴线量起的角度。如果所有单元等幅激励,且相位按等差数列递变,这个求和可以化简成闭式:
AF(θ) = |sin(N·ψ/2) / sin(ψ/2)|
ψ = k·d·cosθ + β
这个闭式就是均匀直线阵的经典结果。MATLAB 里用这个公式画方向图,比循环求和快得多,也方便扫参数。
2.2 用 MATLAB 把方向图画出来
下面这段代码实现了一个均匀直线阵的阵列因子计算和方向图绘制。参数包括单元数 N、间距 d(以波长为单位)、扫描角 θ₀。扫描角通过设置递变相位 β = -k·d·cosθ₀ 来实现波束偏转。
% 均匀直线阵阵列因子方向图 clear; close all; N = 8; % 单元数 d = 0.5; % 单元间距,单位波长 theta0 = 30; % 波束扫描角,度 lambda = 1; % 归一化波长 k = 2*pi/lambda; % 波数 theta = linspace(0, 180, 3601); % 角度范围 0~180 度 theta_rad = deg2rad(theta); theta0_rad = deg2rad(theta0); beta = -k*d*cos(theta0_rad); % 递变相位,实现扫描 psi = k*d*cos(theta_rad) + beta; % 总相位差 AF = abs(sin(N*psi/2) ./ (sin(psi/2) + eps)); % 加 eps 防止除零 AF = AF / max(AF); % 归一化 figure; plot(theta, 20*log10(AF), 'LineWidth', 1.5); xlabel('角度 \theta (度)'); ylabel('归一化幅度 (dB)'); title(['均匀直线阵方向图 N=', num2str(N), ', d=', num2str(d), '\lambda, \theta_0=', num2str(theta0), '°']); grid on; ylim([-40 0]);这段代码里几个关键点:d = 0.5表示半波长间距,这是最常用的配置,既能避免栅瓣,又能让互耦不至于太强。theta0设成 30 度,波束就会偏向 30 度方向。eps加在分母上是为了防止sin(psi/2)在零点附近除零报错。归一化之后用20*log10转成 dB 看,动态范围更直观。
跑完这段,你会看到主瓣在 30 度附近,第一旁瓣大概在 -13 dB 左右,这是均匀激励的典型值。想压旁瓣,就得换幅度加权,比如切比雪夫或泰勒加权,那是后面的事。
2.3 参数变化对方向图的影响
把 N 从 8 改成 16,主瓣宽度差不多减半,但旁瓣电平不变。把 d 从 0.5 改成 1.0,栅瓣就冒出来了——在可见空间里出现和主瓣一样高的假瓣,这是阵列设计里的大忌。扫描角越大,主瓣宽度也会略微展宽,这叫波束展宽效应,在宽角扫描的时候必须考虑。
| 参数 | 典型值 | 影响 |
|---|---|---|
| 单元数 N | 8~64 | N 越大,主瓣越窄,增益越高 |
| 间距 d | 0.5λ | 大于 0.5λ 可能出栅瓣,小于 0.5λ 互耦增强 |
| 扫描角 θ₀ | 0~60° | 扫描角越大,主瓣展宽,增益下降 |
| 幅度加权 | 均匀/切比雪夫 | 加权可压旁瓣,但主瓣会变宽 |
这些规律在仿真里改一个参数跑一次就能看到,比翻书直观得多。我一般会先把 N 和 d 固定,扫一遍 theta0,看看波束扫描过程中旁瓣怎么变,心里有个数再去调加权。
3. 从理想阵列到实际单元:把方向图乘起来
3.1 单元方向图怎么加进去
前面算的都是阵列因子,默认单元是全向的。实际天线单元有自己方向图,比如半波振子,它的方向图是:
F_unit(θ) = cos(π/2 · cosθ) / sinθ
总方向图就是 F_total(θ) = F_unit(θ) · AF(θ)。在 MATLAB 里加这一步很简单,把单元方向图算出来,和阵列因子逐点相乘,再归一化画图。
% 半波振子单元方向图 F_unit = abs(cos(pi/2 * cos(theta_rad)) ./ (sin(theta_rad) + eps)); F_total = F_unit .* AF; F_total = F_total / max(F_total); figure; plot(theta, 20*log10(F_total), 'LineWidth', 1.5); xlabel('角度 \theta (度)'); ylabel('归一化幅度 (dB)'); title('考虑单元方向图后的总方向图'); grid on; ylim([-40 0]);跑完对比一下,你会发现总方向图在端射方向(0 度和 180 度)被压下去了,因为半波振子在那两个方向不辐射。这就是单元方向图的作用——它给阵列因子加了个包络,把某些方向的辐射掐掉。
3.2 互耦效应:仿真里最容易忽略的坑
理想阵列假设单元之间互不影响,但实际里单元靠得近,互相耦合会改变每个单元的输入阻抗和方向图。d = 0.5λ 的时候互耦已经不可忽略了,d 再小就更严重。仿真里要模拟互耦,得用全波仿真工具,比如矩量法或者有限元,MATLAB 本身做这个不是强项,但可以用一些近似模型,比如在激励里加个耦合系数矩阵。
常见做法是:先用阵列因子快速扫参数,确定大致方案,再用全波仿真验证。如果一上来就全波仿真,参数扫描太慢,迭代周期长。我一般先用 MATLAB 把阵列因子和单元方向图乘起来看趋势,觉得差不多了再上 HFSS 或者 CST 做精细验证。
3.3 波束扫描的相位配置
波束扫描靠的是递变相位。上面代码里beta = -k*d*cos(theta0_rad)就是给相邻单元之间加一个固定相位差。这个相位差可以用移相器实现,也可以用数字波束形成在基带做。仿真的时候,扫描角设多少,beta 就跟着算多少,一一对应。
注意一点:扫描角不能太大。均匀直线阵在扫描到端射方向(θ₀ = 0 或 180 度)时,主瓣会严重展宽,增益掉得厉害,而且旁瓣抬升。一般建议扫描范围控制在 ±60 度以内,再大就得考虑其他阵列形式了。
% 扫描角扫描,观察主瓣宽度变化 theta0_list = [0, 15, 30, 45, 60]; figure; hold on; for theta0 = theta0_list theta0_rad = deg2rad(theta0); beta = -k*d*cos(theta0_rad); psi = k*d*cos(theta_rad) + beta; AF = abs(sin(N*psi/2) ./ (sin(psi/2) + eps)); AF = AF / max(AF); plot(theta, 20*log10(AF), 'DisplayName', ['\theta_0=', num2str(theta0), '°']); end xlabel('角度 \theta (度)'); ylabel('归一化幅度 (dB)'); title('不同扫描角下的方向图'); legend show; grid on; ylim([-40 0]);这段跑完,你能清楚看到扫描角增大时主瓣怎么变宽、旁瓣怎么变。这些曲线拿去做报告或者写论文都够用了。
4. 避坑与排查:仿真跑不通的时候看这里
4.1 方向图出现栅瓣
现象:方向图里除了主瓣,还冒出几个和主瓣差不多高的瓣。原因:单元间距 d 大于 0.5λ,导致可见空间内出现多个栅瓣。解决:把 d 降到 0.5λ 或更小。如果因为口径限制必须用大间距,那就得换非均匀排布或者用稀布阵来打散栅瓣。
4.2 除零报错或曲线断裂
现象:MATLAB 报 Inf 或 NaN,曲线画出来断断续续。原因:sin(psi/2)在 psi = 0 时为零,分母为零。解决:分母加eps,或者用sin(N*psi/2) ./ (N*sin(psi/2))的归一化形式,在 psi 趋近零时取极限 N。我一般直接加 eps,简单省事。
4.3 扫描角对不上
现象:设了 theta0 = 30 度,但主瓣最大值不在 30 度。原因:相位符号搞反了,或者角度定义和公式不一致。解决:检查 beta 的符号,确认 theta 是从阵列轴线量起还是从法线量起。MATLAB 里cos和sind别混用,角度制弧度制要统一。
4.4 归一化后旁瓣电平不对
现象:旁瓣电平不是预期的 -13 dB,偏高或偏低。原因:归一化方式不对,或者角度采样太稀,峰值没采到。解决:用AF = AF / max(AF)做归一化,角度采样至少 0.1 度一个点。如果还不对,检查是不是把单元方向图乘进去之后忘了重新归一化。
4.5 代码跑得慢
现象:N 很大或者角度点很多的时候,循环求和慢得离谱。原因:用了 for 循环逐点算阵列因子。解决:用闭式公式代替循环,MATLAB 的向量化运算快得多。上面代码里全是向量化操作,N = 1000 也是秒出。
5. 进阶技巧:加权、零陷与验证方法
5.1 幅度加权压旁瓣
均匀激励的旁瓣在 -13 dB 左右,很多场景不够用。切比雪夫加权可以在给定旁瓣电平下做到最窄主瓣,泰勒加权则在近旁瓣和远旁瓣之间折中。MATLAB 里可以用chebwin生成切比雪夫窗,直接当幅度加权用。
% 切比雪夫加权,旁瓣电平 -30 dB SLL = -30; % 旁瓣电平 dB a = chebwin(N, -SLL); % 生成加权系数 a = a / max(a); % 归一化 % 带加权的阵列因子 AF_w = zeros(size(theta)); for n = 0:N-1 AF_w = AF_w + a(n+1) * exp(1j*(k*d*n*cos(theta_rad) + n*beta)); end AF_w = abs(AF_w); AF_w = AF_w / max(AF_w); figure; plot(theta, 20*log10(AF), '--', 'LineWidth', 1.2); hold on; plot(theta, 20*log10(AF_w), 'LineWidth', 1.5); xlabel('角度 \theta (度)'); ylabel('归一化幅度 (dB)'); title('均匀加权 vs 切比雪夫加权'); legend('均匀加权', '切比雪夫加权 -30dB'); grid on; ylim([-50 0]);跑完对比,切比雪夫加权的旁瓣确实压到了 -30 dB,但主瓣比均匀加权宽了不少。这就是旁瓣和主瓣宽度的权衡,没有免费午餐。
5.2 零陷控制
干扰方向想挖个零陷,可以用自适应波束形成,比如 MVDR。仿真里构造一个干扰方向的导向矢量,算加权系数,让阵列在那个方向响应为零。这个在 MATLAB 里用矩阵运算几行就能实现,但前提是得知道干扰方向,或者用盲自适应算法。
5.3 验证方法:解析解对数值解
写完仿真代码,怎么知道对不对?最简单的办法是拿解析解对。均匀直线阵的闭式解就是标准答案,数值求和的结果应该和闭式解完全吻合。如果对不上,检查求和范围、相位符号、角度定义。另一个验证是能量守恒:方向图在整个可见空间积分应该等于总辐射功率,归一化之后可以大致检查一下。
我一般会先把 N=2 的简单情况手算一遍,和代码结果对,确认公式没写错,再往上加单元数。这个习惯帮我省了很多调试时间。
5.4 从仿真到实测的差距
仿真再准,和实测也有差距。互耦、加工误差、馈电网络不一致、测试环境反射,都会让实测方向图和仿真对不上。常见做法是仿真时留点余量,比如旁瓣设计到 -25 dB,实测能到 -20 dB 就满意了。如果实测差太多,先查馈电相位是不是按设计走的,再看单元是不是坏了,最后才怀疑仿真模型。
从那以后我每次做阵列仿真,都强制走一遍“闭式解对数值解、单元方向图乘阵列因子、扫描角扫一遍看趋势”这三步,确认没问题再往下做。希望帮到你。
本文还有配套的精品资源,点击获取