简介:这份PDF资料面向电子工程、通信专业学生及天线设计从业者,系统讲解天线设计基础与MATLAB方向图仿真方法,帮助读者从理论概念过渡到工程实践。内容涵盖天线定义、分类、互易定理等基本概念,并详细推导半波振子天线方向图的MATLAB绘制方法,包括polar极坐标与plot二维图的实现要点及注意事项;同时介绍线性阵列天线的方向图乘积定理,结合20单元线阵仿真案例,分析相位误差对副瓣的影响以及扫描角度过大时栅瓣出现、增益下降等现象,并给出差方向图与不加权方向图的仿真对比。资源包为1个PDF文件,大小约1.78MB,结构紧凑,便于集中阅读。目前已有2015人学习下载,适合希望掌握天线方向图仿真流程、理解阵列天线特性的读者参考,也可为实际工程项目中的天线设计与验证提供思路。
1. 天线方向图仿真:从一条公式到一张能交付的图
很多人第一次接触天线设计,是从一条看起来平平无奇的公式开始的:远场某方向上的辐射强度,等于阵元激励与阵因子的乘积。可真到要交一张方向图时,问题立刻变成——主瓣宽度怎么算、旁瓣压到多少算合格、扫描时栅瓣什么时候冒出来。用 MATLAB 仿真天线方向图,本质是把这些抽象指标变成可复现的曲线:横轴角度、纵轴归一化增益,主瓣、旁瓣、零点一目了然。它适合三类人:做课程设计的学生、需要快速验证阵列参数的系统工程师、以及要给硬件同事一个“预期长什么样”的算法开发者。下面这套流程,我按自己反复用过的顺序拆开讲,从单阵元一路推到线阵与面阵,参数怎么设、坑在哪,都落到能直接跑的代码上。
2. 先把方向图算对:阵因子、方向图乘积与坐标选择
2.1 为什么先写阵因子而不是直接调工具箱
天线方向图的核心是阵因子(array factor)。均匀线阵的阵因子有闭式解,先手写一遍,你才能理解后面工具箱里每个参数在改什么。常见做法是:把阵元位置、激励幅度、相位写成向量,对每个观察角做一次相位累加。这样做的另一个好处是,当你要换成非均匀阵或共形阵时,只需改位置向量,不用推翻整个框架。
% 均匀线阵阵因子:N 阵元,间距 d(波长倍数),扫描角 theta0(度) N = 8; % 阵元数 d = 0.5; % 阵元间距,单位波长 theta0 = 0; % 主瓣指向,度 theta = -90:0.1:90; % 观察角,度 k = 2*pi; % 波数,波长归一化后为 2*pi psi = k*d*cosd(theta) - k*d*cosd(theta0); % 相邻阵元相位差 AF = zeros(size(theta)); for n = 0:N-1 AF = AF + exp(1j*n*psi); % 逐阵元累加 end AF = abs(AF)/max(abs(AF)); % 归一化这段代码里,d取 0.5 波长是避免栅瓣的常用下限;theta0改变的是相位差里的参考项,等价于给每个阵元加线性相位。psi用cosd而不是cos,是因为角度以度为单位,混用弧度和度是新手最常见的翻车点。归一化放在最后,保证主瓣峰值为 1,方便对比不同阵元数的旁瓣。
2.2 方向图乘积定理:阵元方向图不能丢
只算阵因子,得到的是理想各向同性阵元的结果。真实阵元有自身方向图,总方向图等于阵因子乘阵元方向图,这就是方向图乘积定理。我一般会用一个余弦模型近似阵元方向图,快速看主瓣形状的变化。
% 阵元方向图:余弦模型,指数 q 控制波束宽度 q = 1.5; element = cosd(theta).^q; element(element < 0) = 0; % 背瓣截断 pattern = AF .* element; % 乘积定理 pattern = pattern / max(pattern);q越大,单个阵元波束越窄,阵因子旁瓣会被压得更低,但主瓣也会变宽。这一步的意义在于:如果你只盯着阵因子调间距,忽略阵元方向图,实测旁瓣往往比仿真高,因为阵元本身的背向辐射和互耦没被建模。常见做法是先用这个模型定趋势,再用全波仿真校准。
2.3 极坐标还是直角坐标:交付图的选择
方向图交付时,极坐标适合看主瓣形状和前后比,直角坐标适合读旁瓣电平和零点位置。MATLAB 里polarplot和plot都能画,但要注意角度范围。线阵通常只看 -90 到 90 度,面阵要看两个切面。我习惯同时出两张图:一张极坐标看整体,一张直角坐标读数值。
figure; subplot(1,2,1); polarplot(deg2rad(theta), pattern); title('极坐标方向图'); subplot(1,2,2); plot(theta, 20*log10(pattern)); xlabel('角度 (度)'); ylabel('归一化增益 (dB)'); grid on; ylim([-40 0]); title('直角坐标方向图');20*log10把线性幅度转成 dB,旁瓣电平直接读。注意pattern里可能有零,取对数前加一个极小值eps更稳。这一步的参数说明:ylim下限设 -40 dB 是常规做法,低于这个值的旁瓣对多数场景没意义。
3. 从线阵推到面阵:扫描角、栅瓣与切面提取
3.1 扫描角改变时,栅瓣什么时候出现
线阵扫描时,栅瓣出现的条件是阵元间距大于半波长除以最大扫描角余弦。很多人只记“半波长”,忘了扫描角一偏,允许的间距更小。我一般会写一段循环,把不同扫描角下的方向图叠在一起看。
d_list = [0.5 0.7 1.0]; % 不同间距 theta0 = 30; % 扫描到 30 度 figure; hold on; for d = d_list psi = 2*pi*d*cosd(theta) - 2*pi*d*cosd(theta0); AF = zeros(size(theta)); for n = 0:N-1 AF = AF + exp(1j*n*psi); end AF = abs(AF)/max(abs(AF)); plot(theta, 20*log10(AF+eps), 'DisplayName', ['d=' num2str(d)]); end legend; grid on; ylim([-40 0]);当d=1.0且扫描 30 度时,你会看到主瓣之外冒出一个几乎等高的瓣,这就是栅瓣。解决方式只有两个:减小间距,或减小扫描范围。工程上常用 0.5 到 0.6 波长,牺牲一些增益换扫描无模糊。
3.2 面阵方向图:两个维度的相位怎么叠加
面阵可以看成两个线阵的乘积。假设矩形阵在 x 和 y 方向分别有 Nx、Ny 个阵元,间距 dx、dy,扫描角用方位角 phi 和俯仰角 theta 表示。阵因子是两维相位累加的外积。
Nx = 8; Ny = 8; dx = 0.5; dy = 0.5; theta0 = 0; phi0 = 0; theta = 0:1:90; phi = 0:1:360; [TH, PH] = meshgrid(theta, phi); psix = 2*pi*dx*(sind(TH).*cosd(PH) - sind(theta0)*cosd(phi0)); psiy = 2*pi*dy*(sind(TH).*sind(PH) - sind(theta0)*sind(phi0)); AFx = zeros(size(TH)); AFy = zeros(size(TH)); for n = 0:Nx-1 AFx = AFx + exp(1j*n*psix); end for n = 0:Ny-1 AFy = AFy + exp(1j*n*psiy); end AF2 = abs(AFx.*AFy); AF2 = AF2/max(AF2(:));这里TH和PH是网格,psix、psiy分别对应两个方向的相位差。注意sind(TH).*cosd(PH)是方向余弦的展开,别写成cosd(TH),那是另一套坐标定义。算完后用surf或imagesc看三维方向图,再用切面提取 E 面和 H 面。
3.3 切面提取:E 面和 H 面怎么切
面阵结果是一个二维矩阵,交付时通常只给两个正交切面。E 面一般取 phi=0 度,H 面取 phi=90 度。提取时注意索引对应关系,别把 theta 和 phi 弄反。
phi_idx_E = find(phi == 0); phi_idx_H = find(phi == 90); E_plane = AF2(phi_idx_E, :); H_plane = AF2(phi_idx_H, :); figure; plot(theta, 20*log10(E_plane+eps), 'LineWidth', 1.5); hold on; plot(theta, 20*log10(H_plane+eps), 'LineWidth', 1.5); legend('E 面','H 面'); grid on; ylim([-40 0]); xlabel('俯仰角 (度)'); ylabel('归一化增益 (dB)');如果phi向量步长不是整数,find可能返回空,改用min(abs(phi-0))找最近索引更稳。切面提取后,主瓣宽度、旁瓣电平都能直接读,这也是和硬件测试对比时最常用的两张图。
4. 避坑与排查:方向图仿真里最容易翻车的五件事
4.1 角度单位混用导致主瓣指向完全错
现象:设了扫描角 30 度,方向图主瓣却出现在别处,甚至对称地跑到负角度。原因:cos和cosd混用,或者把度直接喂给需要弧度的函数。解决:统一用d后缀函数,或在入口处deg2rad一次,之后全用弧度。我习惯在脚本开头写一行theta = deg2rad(theta_deg),后面不再碰度。
4.2 归一化位置不对,旁瓣电平读出来是正的
现象:画 dB 图时旁瓣比主瓣还高,或者整体在 0 dB 以上。原因:先取了对数再归一化,或者对未归一化的阵因子直接取对数。解决:先AF = abs(AF)/max(abs(AF)),再20*log10(AF+eps)。归一化必须在取对数之前,且要加eps防止log(0)。
4.3 阵元间距取整波长,栅瓣被当成主瓣
现象:扫描时出现两个等高瓣,以为是自己算错了。原因:d取了 1.0 波长,栅瓣和主瓣一样高。解决:检查d是否大于1/(1+|cos(theta0)|),线阵扫描时把d压到 0.5 到 0.6。如果必须大间距,就限制扫描范围,并在报告里注明栅瓣风险。
4.4 面阵切面索引取错,E 面和 H 面互换
现象:E 面图看起来像 H 面,主瓣宽度对不上。原因:meshgrid后TH和PH的维度顺序与索引不一致。解决:用size(TH)确认维度,提取切面时先打印phi_idx对应的角度值。更稳妥的做法是单独构造两个一维角度向量,分别算切面,而不是从二维矩阵里切。
4.5 忽略阵元方向图,实测旁瓣偏高
现象:仿真旁瓣 -25 dB,实测只有 -18 dB。原因:只算阵因子,没乘阵元方向图,也没考虑互耦和边缘绕射。解决:至少乘一个余弦模型,把背瓣截断;有条件时用全波仿真提取阵元方向图再代入。仿真报告里注明“理想阵因子结果”,避免和实测直接对标。
5. 进阶技巧:把方向图仿真做成可复用的参数化脚本
5.1 用函数封装,一次改参多次出图
把阵因子、阵元方向图、切面提取写成独立函数,主脚本只负责给参数和画图。这样换阵元数、换间距、换扫描角时,不用复制粘贴。我一般会建三个文件:array_factor.m、element_pattern.m、plot_pattern.m。函数签名里把N、d、theta0、theta都作为输入,输出归一化方向图。
function AF = array_factor(N, d, theta0, theta) % 均匀线阵阵因子,theta 单位度 psi = 2*pi*d*cosd(theta) - 2*pi*d*cosd(theta0); AF = zeros(size(theta)); for n = 0:N-1 AF = AF + exp(1j*n*psi); end AF = abs(AF)/max(abs(AF)); end封装后,主脚本里一行AF = array_factor(8, 0.5, 0, theta);就能拿到结果。参数说明:N是阵元数,d是波长倍数,theta0是扫描角,theta是观察角向量。注意函数里不要再做单位转换,调用方保证传入度。
5.2 用参数扫描表批量出图
把要对比的参数写成表格,循环调用函数,自动保存图片。这样出报告时不用一张张手动改。
| 参数 | 含义 | 常用范围 | 影响 |
|---|---|---|---|
| N | 阵元数 | 4 到 64 | N 越大主瓣越窄,旁瓣越多 |
| d | 阵元间距(波长) | 0.5 到 0.7 | 越大栅瓣风险越高 |
| theta0 | 扫描角(度) | -60 到 60 | 越大允许间距越小 |
| q | 阵元方向图指数 | 1.0 到 2.5 | 越大主瓣越宽,旁瓣越低 |
N_list = [4 8 16]; figure; hold on; for N = N_list AF = array_factor(N, 0.5, 0, theta); plot(theta, 20*log10(AF+eps), 'DisplayName', ['N=' num2str(N)]); end legend; grid on; ylim([-40 0]); xlabel('角度 (度)'); ylabel('归一化增益 (dB)');这张图能直观看到:N 从 4 增到 16,主瓣宽度大约减半,旁瓣数量增加但第一旁瓣电平趋近 -13 dB。这个 -13 dB 是均匀线阵的经典值,如果你算出来差很多,回去检查归一化和阵元方向图。
5.3 验证方法:用已知闭式解对拍
均匀线阵的阵因子有闭式解:AF = sin(N*psi/2)/sin(psi/2)。写一段对拍代码,把循环累加结果和闭式解比较,误差应该在1e-12量级。这一步能排除相位符号、归一化、单位混用的问题。
psi = 2*pi*0.5*cosd(theta) - 2*pi*0.5*cosd(0); AF_loop = array_factor(8, 0.5, 0, theta); AF_closed = abs(sin(8*psi/2)./sin(psi/2)); AF_closed = AF_closed/max(AF_closed); err = max(abs(AF_loop - AF_closed)); disp(['最大误差: ' num2str(err)]);如果err大于1e-10,先看psi在零点附近是否除了零,加eps再比。对拍通过后,这套脚本就可以放心用来扫参数了。
5.4 一个我常犯的错:忘了保存参数
早期我调方向图,改一个参数跑一次,图存了一堆,回头不知道哪张对应哪个间距。后来养成习惯:每张图标题里带上N、d、theta0,文件名用pattern_N8_d0.5_th0.png这种格式。参数一多,后悔药没处买。现在我会在脚本开头写一个params结构体,画图时自动拼标题,省得事后翻记录。
希望帮到你。
本文还有配套的精品资源,点击获取