资讯动态

Matlab仿真相控阵波束扫描动画:从原理到工程实践

发布时间:2026/9/4 5:29:53 来源:尧图企业网站定制
简介本资源是一份面向通信工程、雷达系统及信号处理方向初学者与实践者的MATLAB相控阵波束扫描仿真教学包聚焦于波束形成原理、动态扫描机制与方向图可视化等核心概念。资源包含2个精炼的MATLAB脚本文件.m格式总大小仅2KB其中figPattern.m负责构建线性相控阵阵列模型并计算空间波束响应polarplotdb.m则实现极坐标下归一化波束方向图的动态绘制与帧序列生成可直观呈现波束随相位差变化而实时扫描的过程。已有1060人学习下载适用于课程设计、毕业设计前期验证及工具链快速上手。读者可直接运行脚本观察波束指向偏转、主瓣展宽、旁瓣抑制等关键现象无需额外工具箱依赖基础phased工具箱函数调用已内嵌注释同时获得可复用的波束扫描动画生成模板与参数化建模思路。1. 从静态到动态为什么我们需要“动起来”的波束图在雷达、通信和声纳这些领域相控阵天线是个绕不开的核心技术。我们经常在教科书或者论文里看到一张张漂亮的波束方向图它们清晰地展示了天线在不同角度上的辐射强度。但说实话这些静态的图片对于理解相控阵最核心的“波束扫描”能力总感觉隔了一层纱。你看到的是一个结果却看不到它“动”起来的过程。波束是怎么从指向0度“唰”一下转到30度的扫描过程中波束形状会怎么变化旁瓣电平会不会突然升高这些动态的、连续的过程才是工程实践中真正关心的问题。这就是为什么我们需要用Matlab来仿真并绘制波束扫描的“动图”。它不仅仅是为了让演示更酷炫更深层的价值在于可视化验证与直观调试。当你通过代码控制阵元间的相位差连续变化并实时生成每一帧波束图时你就能亲眼目睹理论公式如何转化为屏幕上跳动的图形。你会发现某些扫描角度下主瓣确实如预期般移动但旁瓣可能会畸变你也能验证你编写的波束指向算法其计算出的相位权重是否真的让波束对准了目标方向。这个过程是把抽象的阵列因子和方向图函数变成了一种可以交互、可以观察的“物理实验”。对于学习者这是建立直观感受的最佳途径对于工程师这是快速验证设计、排查潜在问题的利器。今天我就以最常见的均匀线阵为例带你一步步实现这个从静态到动态的飞跃把波束“扫”给你看。2. 仿真基石均匀线阵波束形成的数学与Matlab实现在让波束动起来之前我们必须先扎实地掌握生成一张静态波束图的所有环节。这就像拍电影你得先会拍好一帧静止的画面。2.1 核心模型从阵元到方向图我们考虑一个由N个相同阵元组成的均匀直线阵列阵元间距为d通常取为半个波长d λ/2以避免出现栅瓣。假设有一平面波以角度θ相对于阵列法线方向入射。每个阵元接收到的信号存在一个空间上的波程差这导致了相位差。对于远场模型第n个阵元假设从0开始编号相对于参考点如阵列中心的相位延迟为Δφ_n (2π / λ) * n * d * sin(θ)如果我们希望对来自θ0方向的信号进行同相叠加即波束指向θ0就需要在第n个阵元上施加一个补偿相位w_n exp(-j * (2π / λ) * n * d * sin(θ0))这个w_n就是波束形成或移相的权重。整个阵列对来自θ方向信号的响应即阵列方向图函数是各阵元加权后响应的叠加AF(θ) Σ_{n0}^{N-1} [ w_n * exp(j * (2π / λ) * n * d * sin(θ)) ] Σ_{n0}^{N-1} [ exp(j * (2π / λ) * n * d * (sin(θ) - sin(θ0))) ]这个求和公式是核心。它的幅度|AF(θ)|就描述了阵列在不同θ方向上的增益相对大小。当θ θ0时指数项为零所有阵元信号同相相加得到最大增益这就是主瓣峰值。2.2 Matlab代码实现从公式到图形理解了公式用Matlab实现就是水到渠成。我们先搭建一个生成静态波束图的函数。function [theta_deg, AF_dB] uniform_line_array_pattern(N, d_lambda, theta0_deg) % 生成均匀线阵静态波束方向图 % 输入 % N: 阵元数量 % d_lambda: 阵元间距以波长为单位通常为0.5 % theta0_deg: 波束指向角度度 % 输出 % theta_deg: 角度向量度 % AF_dB: 对应的阵列因子幅度dB % 参数设置 theta_deg -90:0.1:90; % 角度扫描范围步进0.1度以保证曲线平滑 theta_rad deg2rad(theta_deg); % 转换为弧度 theta0_rad deg2rad(theta0_deg); % 初始化阵列因子 AF zeros(size(theta_rad)); % 计算每个角度上的阵列响应 for idx 1:length(theta_rad) psi 2 * pi * d_lambda * (sin(theta_rad(idx)) - sin(theta0_rad)); % 避免psi为0时求和公式的分母为零此时阵列因子为N if abs(psi) 1e-10 AF(idx) N; else AF(idx) abs(sin(N * psi / 2) / sin(psi / 2)); end end % 归一化并转换为dB AF_normalized AF / max(AF); % 归一化到0-1 AF_dB 20 * log10(AF_normalized); % 转换为分贝值 % 将-Inf对应0值设置为一个很小的dB值便于绘图 AF_dB(AF_dB -60) -60; end这个函数是核心计算模块。接下来我们写一个绘图脚本调用它% 静态波束图绘制示例 clear; clc; close all; % 定义阵列参数 N 16; % 16个阵元 d_lambda 0.5; % 半波长间距 theta0_deg 20; % 波束指向20度方向 % 计算方向图 [theta_deg, AF_dB] uniform_line_array_pattern(N, d_lambda, theta0_deg); % 绘图 figure(‘Position‘ [100, 100, 800, 500]); plot(theta_deg, AF_dB, ‘b-‘, ‘LineWidth‘, 1.5); grid on; hold on; xlabel(‘角度 (度)‘, ‘FontSize‘, 12); ylabel(‘归一化方向图增益 (dB)‘, ‘FontSize‘, 12); title(sprintf(‘均匀线阵波束方向图 (N%d, d%.1f\\lambda, 指向%.0f°)‘, N, d_lambda, theta0_deg), ‘FontSize‘, 14); xlim([-90, 90]); ylim([-40, 0]); % 标记主瓣指向 [~, idx_max] max(AF_dB); plot(theta_deg(idx_max), AF_dB(idx_max), ‘ro‘, ‘MarkerSize‘, 10, ‘LineWidth‘, 2); text(theta_deg(idx_max)5, AF_dB(idx_max)2, sprintf(‘主瓣: %.1f°‘, theta_deg(idx_max)), ‘FontSize‘, 11); % 标记-3dB波束宽度 half_power_level max(AF_dB) - 3; % -3dB点 idx_3dB find(AF_dB half_power_level); beamwidth_3dB theta_deg(idx_3dB(end)) - theta_deg(idx_3dB(1)); plot(theta_deg(idx_3dB([1,end])) [half_power_level, half_power_level], ‘k--‘, ‘LineWidth‘, 1.2); text(mean(theta_deg(idx_3dB([1,end]))), half_power_level-2, sprintf(‘-3dB波束宽度: %.2f°‘, beamwidth_3dB), ‘HorizontalAlignment‘, ‘center‘, ‘FontSize‘, 11); hold off;运行这段代码你就能得到一张标准的、指向20度的静态波束方向图。图中清晰地标出了主瓣位置和-3dB波束宽度这是评估天线性能的两个关键指标。注意这里使用的sin(Nx/2)/sin(x/2)是均匀线阵阵列因子的解析表达式计算效率远高于对每个阵元进行循环叠加。但在实际工程中阵元可能具有不同的幅相加权如切比雪夫加权用于降低旁瓣或者阵列是非均匀的那时就必须回到循环叠加或矩阵运算的基本方法。3. 让波束“扫”起来动画生成的核心逻辑与Matlab技巧有了生成单帧静态图的能力制作动画就变成了一个“循环更新捕获”的过程。Matlab提供了强大的图形句柄和动画函数能让这个过程非常高效。3.1 动画循环的构建思路动画的本质是连续显示一系列静态图片。对于波束扫描动画我们需要定义扫描序列确定波束指向角theta0如何随时间变化。可以是线性扫描如从-60度到60度也可以是步进扫描。在循环中更新图形对于每一个theta0重新计算方向图数据并更新图形对象如线条plot的数据而不是销毁重画。这是流畅动画的关键。控制帧率与捕获控制循环的速度以产生合适的动画效果并可以选择将每一帧图像捕获下来最终合成GIF或视频文件。3.2 使用drawnow与图形对象更新的高效方法最基础的动画可以用for循环加pause实现但pause会阻塞Matlab且不精确。更专业的方法是使用drawnow命令。drawnow强制Matlab刷新图形窗口并处理任何挂起的回调。在动画循环中在更新完图形数据后立即调用drawnow可以确保图形被实时渲染。结合set函数更新图形对象属性效率最高。下面是一个实现线性扫描动画的核心代码段% 初始化图形窗口和线条对象 figure(‘Position‘ [100, 100, 800, 500]); h_plot plot(NaN, NaN, ‘b-‘, ‘LineWidth‘, 1.5); % 先创建一个空的线条对象 hold on; % ... (设置坐标轴、标签、标题等这些在动画中不变) grid on; xlim([-90, 90]); ylim([-40, 0]); xlabel(‘角度 (度)‘); ylabel(‘增益 (dB)‘); h_title title(‘‘); % 创建一个空的标题对象用于动态更新 % 定义扫描参数 scan_angles -60:1:60; % 波束从-60度扫描到60度步长1度 % 预计算所有角度对应的方向图数据提升效率可选但推荐 % 这里为了演示清晰在循环内计算 % 动画主循环 for i 1:length(scan_angles) theta0_current scan_angles(i); % 计算当前指向的方向图 [theta_deg, AF_dB] uniform_line_array_pattern(N, d_lambda, theta0_current); % 更新图形对象的数据 set(h_plot, ‘XData‘, theta_deg, ‘YData‘, AF_dB); % 更新标题显示当前指向角 set(h_title, ‘String‘, sprintf(‘波束扫描动画 - 当前指向: %.1f°‘, theta0_current)); % 强制刷新图形 drawnow limitrate; % 使用‘limitrate‘可以优化性能防止刷新过快 % 如果需要保存为GIF在此处捕获帧 % frame getframe(gcf); % ... 将frame写入GIF文件 ... end这段代码中h_plot是线条对象的句柄。在循环外创建它在循环内只更新它的XData和YData属性避免了反复调用plot创建新对象从而大幅提升动画流畅度。drawnow limitrate是R2014b以后版本提供的优化命令它会智能限制刷新率在保证流畅的同时减少CPU占用。3.3 将动画保存为GIF文件为了分享和演示我们常需要将动画保存为GIF图。Matlab没有直接的saveas支持GIF动画但可以通过getframe捕获每一帧并用imwrite函数逐帧写入。% 在动画循环前初始化GIF文件 filename ‘beam_scanning_animation.gif‘; for i 1:length(scan_angles) % ... (计算数据、更新图形同上) ... drawnow; % 捕获当前帧 frame getframe(gcf); im frame2im(frame); [imind, cm] rgb2ind(im, 256); % 将RGB图像转换为索引图像 % 写入GIF文件 if i 1 % 第一帧创建文件 imwrite(imind, cm, filename, ‘gif‘, ‘Loopcount‘, inf, ‘DelayTime‘, 0.1); else % 后续帧追加 imwrite(imind, cm, filename, ‘gif‘, ‘WriteMode‘, ‘append‘, ‘DelayTime‘, 0.1); end end disp([‘动画已保存至: ‘, filename]);这里的‘DelayTime‘, 0.1参数控制了帧之间的延迟单位秒相当于控制了动画播放速度。你可以根据扫描步长和想要的快慢来调整这个值。实操心得在保存高分辨率或长时间GIF时可能会遇到文件过大或生成慢的问题。一个技巧是在getframe之前可以适当调整图形窗口的尺寸set(gcf, ‘Position‘ [x,y,width,height])缩小窗口尺寸能显著减小每帧图像的数据量加快写入速度。生成完毕后GIF本身可以被缩放观看对动态演示效果影响不大。4. 超越基础多波束、扫描方式与性能可视化掌握了基本动画制作后我们可以让仿真变得更丰富、更贴近实际应用场景。静态图只能展示一个状态而动图可以对比展示多个状态的变化过程。4.1 对比动画不同阵元数对波束宽度的影响阵元数量N直接决定了天线的孔径大小进而影响波束宽度和增益。用一个动画来对比不同N值下的扫描过程理解会深刻得多。思路是在一个图形窗口创建多个子图subplot每个子图显示一个不同N值的阵列在扫描。让它们同步扫描观察主瓣宽度和旁瓣结构的差异。% 对比不同阵元数量的扫描动画 N_list [8, 16, 32]; % 要对比的阵元数 d_lambda 0.5; scan_angles -60:2:60; % 扫描角度步长可以大一些 figure(‘Position‘ [100, 100, 1200, 400]); % 为每个N值创建子图和线条对象 h_plots gobjects(length(N_list), 1); % 图形对象数组 for sp 1:length(N_list) subplot(1, length(N_list), sp); h_plots(sp) plot(NaN, NaN, ‘b-‘, ‘LineWidth‘, 1.5); grid on; xlim([-90, 90]); ylim([-40, 0]); xlabel(‘角度 (度)‘); ylabel(‘增益 (dB)‘); title(sprintf(‘N %d‘, N_list(sp))); end % 动画循环 for i 1:length(scan_angles) theta0_current scan_angles(i); for sp 1:length(N_list) % 切换到对应子图 subplot(1, length(N_list), sp); % 计算方向图 [theta_deg, AF_dB] uniform_line_array_pattern(N_list(sp), d_lambda, theta0_current); % 更新线条 set(h_plots(sp), ‘XData‘, theta_deg, ‘YData‘, AF_dB); % 动态更新标题显示当前指向 title(sprintf(‘N %d, 指向: %.1f°‘, N_list(sp), theta0_current)); end % 为所有子图添加一个总标题位于图形窗口顶部 sgtitle(sprintf(‘均匀线阵波束扫描对比 (阵元间距 d %.1f\\lambda) - 当前指向: %.1f°‘, d_lambda, theta0_current)); drawnow limitrate; pause(0.05); % 加入微小暂停使动画更易观察 end这个动画能清晰展示阵元数越多孔径越大波束越窄、越尖锐指向性越好。在扫描到边缘角度时不同阵列的波束畸变程度也不同这是一个非常直观的教学和演示工具。4.2 扫描方式演示线性扫描 vs 步进扫描 vs 随机指向在实际系统中波束扫描策略多种多样。动画是演示这些策略差异的绝佳方式。线性连续扫描如上例波束指向角连续变化。适用于搜索模式。步进扫描波束在几个离散的预设角度间跳变。适用于跟踪多个已知目标。随机/自适应指向波束根据算法如Capon波束形成器实时指向信号最强的方向。我们可以修改扫描序列scan_angles来轻松实现前两种% 线性扫描连续 scan_angles_linear -60:0.5:60; % 小步长连续感强 % 步进扫描离散驻留 scan_angles_step []; for target_angle [-45, -15, 15, 45] % 在每个目标角度驻留10帧 scan_angles_step [scan_angles_step, repmat(target_angle, 1, 10)]; end % 添加扫描过渡可选可以在步进间插入短暂的线性扫描帧使动画更平滑在动画循环中使用不同的scan_angles序列就能观察到波束移动模式的根本区别。对于第三种“自适应指向”则需要引入信号模型和自适应算法如MVDR计算每个时刻的最优权值w_n再生成方向图。这超出了本文基础范围但动画框架是完全通用的只需在循环体内替换方向图计算部分即可。4.3 动态性能指标可视化实时显示波束宽度与旁瓣电平在动画过程中我们不仅可以看图形还可以将关键性能指标实时计算并显示出来让分析更深入。例如在每一帧中我们可以计算并显示瞬时-3dB波束宽度HPBW。最高旁瓣电平SLL。指向精度误差理论指向角与实际最大增益角度的偏差。% 在动画循环体内计算完AF_dB后 % 1. 计算-3dB波束宽度 half_power max(AF_dB) - 3; idx_3dB find(AF_dB half_power); if length(idx_3dB) 2 HPBW theta_deg(idx_3dB(end)) - theta_deg(idx_3dB(1)); else HPBW NaN; end % 2. 计算最高旁瓣电平简单方法找到主瓣区域外的最大值 % 首先找到主瓣区域假设主瓣在峰值附近±10°内 [~, idx_main] max(AF_dB); mainlobe_region (theta_deg (theta_deg(idx_main)-10)) (theta_deg (theta_deg(idx_main)10)); AF_dB_sidelobe AF_dB; AF_dB_sidelobe(mainlobe_region) -Inf; % 将主瓣区域置为负无穷 SLL max(AF_dB_sidelobe); % 最高旁瓣电平 % 3. 在图形上以文本形式动态显示这些指标 % 先删除上一帧的文本对象如果存在 if exist(‘h_text‘, ‘var‘) isvalid(h_text) delete(h_text); end info_str sprintf(‘HPBW: %.2f°\\nSLL: %.2f dB‘, HPBW, SLL); h_text text(-80, -10, info_str, ‘FontSize‘, 10, ‘BackgroundColor‘, ‘w‘, ‘EdgeColor‘, ‘k‘);将这些动态指标加入动画你就得到了一个功能强大的实时波束分析工具。它能让你立刻发现当波束扫描到大角度时波束宽度会变宽旁瓣电平可能会升高这些都是相控阵扫描中的典型现象。5. 仿真进阶从理想模型到现实因素考量到目前为止我们的模型都是理想的所有阵元完全相同间距精确加权相位无误差。但现实世界充满不完美。仿真的高级阶段就是引入这些非理想因素观察它们如何影响波束扫描。5.1 引入阵元幅相误差实际阵元存在制造公差、老化、温度变化等导致其幅度和相位响应与理想值有偏差。我们可以在权重向量w_n中引入随机误差来模拟。function [theta_deg, AF_dB] array_pattern_with_errors(N, d_lambda, theta0_deg, amp_error_std, phase_error_std_deg) % 生成带有幅相误差的波束方向图 % amp_error_std: 幅度误差标准差线性值如0.1表示10%的波动 % phase_error_std_deg: 相位误差标准差度 theta_deg -90:0.1:90; theta_rad deg2rad(theta_deg); theta0_rad deg2rad(theta0_deg); % 生成理想的波束形成权重 n (0:N-1)‘ - (N-1)/2; % 以阵列中心为相位参考点更常见 w_ideal exp(-1j * 2 * pi * d_lambda * n * sin(theta0_rad)); % 引入随机幅相误差 rng(‘default‘); % 固定随机种子使结果可复现 amp_error 1 amp_error_std * randn(N, 1); % 幅度误差均值1 phase_error_deg phase_error_std_deg * randn(N, 1); % 相位误差度 phase_error_rad deg2rad(phase_error_deg); % 转换为弧度 % 施加误差后的权重 w_actual amp_error .* w_ideal .* exp(1j * phase_error_rad); % 计算阵列响应 AF zeros(size(theta_rad)); for idx 1:length(theta_rad) steering_vector exp(1j * 2 * pi * d_lambda * n * sin(theta_rad(idx))); AF(idx) abs(w_actual‘ * steering_vector); % 向量内积求和 end AF_normalized AF / max(AF); AF_dB 20 * log10(AF_normalized); AF_dB(AF_dB -60) -60; end在动画中你可以固定一组随机误差然后扫描波束观察主瓣增益下降、旁瓣电平抬升、波束指向偏差等现象。更进一步的你可以做蒙特卡洛仿真在每一帧扫描中都使用不同的随机误差样本动画将展示波束图的统计性抖动这比任何文字都更能说明系统对误差的敏感性。5.2 扫描过程中的栅瓣现象当阵元间距d大于半波长d λ/2时在扫描过程中可能会出现栅瓣——即在非预期方向出现与主瓣增益相当的波瓣。这会导致空间模糊是必须避免的。动画可以完美演示栅瓣的产生条件。只需在仿真中设置d_lambda 0.7或更大然后让波束扫描。你会观察到当波束指向某个角度后在另一个对称角度突然“冒出来”一个几乎一样高的波瓣。% 演示栅瓣现象的动画参数 N 16; d_lambda 0.7; % 大于0.5故意引入栅瓣条件 scan_angles 0:1:60; % 从法线方向开始扫描 % ... (动画初始化代码同上) ... for i 1:length(scan_angles) theta0_current scan_angles(i); [theta_deg, AF_dB] uniform_line_array_pattern(N, d_lambda, theta0_current); % 更新图形... % 特别地可以计算并标出栅瓣位置 % 栅瓣出现条件sin(θ_grating) - sin(θ0) ± m * λ/d, m±1,±2... % 当θ0不为0时可以计算理论栅瓣角度 theta0_rad deg2rad(theta0_current); grating_lobe_sin sin(theta0_rad) - 1/d_lambda; % 对应m-1的情况 if abs(grating_lobe_sin) 1 theta_grating_deg rad2deg(asin(grating_lobe_sin)); % 在图上用特殊标记标出这个位置 % plot(theta_grating_deg, interp1(theta_deg, AF_dB, theta_grating_deg), ‘r*‘, ‘MarkerSize‘, 15); end drawnow; end通过这个动画你能直观理解为什么教科书上强调“d ≤ λ/2”是无栅瓣扫描的必要条件。当波束扫描角增大时出现栅瓣的风险也增大。5.3 宽带信号与波束色散前面的讨论都基于窄带假设即所有阵元上的复权重只是相位调整。对于宽带信号不同频率分量经历的相位差不同会导致波束指向随频率变化称为波束色散或孔径渡越时间效应。仿真这个现象需要引入频率变量。我们可以模拟一个频带如f0 ± Δf计算每个频率点上的波束方向图然后在动画中让波束扫描的同时用不同颜色或线型叠加显示几个典型频率点的方向图。% 宽带波束色散演示 fc 3e9; % 中心频率 BW 0.2; % 相对带宽 20% freqs fc * [1-BW/2, 1, 1BW/2]; % 低、中、高三个频率 lambda_freqs 3e8 ./ freqs; % 各频率对应的波长 N 16; d 0.5 * (3e8/fc); % 按中心频率的半波长设计物理间距 theta0_deg 30; % 期望指向30度 figure; hold on; colors {‘r‘, ‘g‘, ‘b‘}; legend_str cell(1, length(freqs)); for f_idx 1:length(freqs) d_lambda d / lambda_freqs(f_idx); % 计算当前频率下的电尺寸以波长为单位 [theta_deg, AF_dB] uniform_line_array_pattern(N, d_lambda, theta0_deg); plot(theta_deg, AF_dB, ‘Color‘, colors{f_idx}, ‘LineWidth‘, 1.2, ‘LineStyle‘, ‘--‘); legend_str{f_idx} sprintf(‘f %.2f GHz‘, freqs(f_idx)/1e9); end grid on; xlim([-90, 90]); ylim([-40, 0]); xlabel(‘角度 (度)‘); ylabel(‘增益 (dB)‘); title(sprintf(‘宽带波束色散效应 (指向%.0f°带宽%.0f%%)‘, theta0_deg, BW*100)); legend(legend_str, ‘Location‘, ‘best‘);这生成的是静态对比图。要制作动画可以让theta0_deg扫描并在每一帧中同时画出三个频率的方向图。你会看到在低频和高频波束的实际指向会偏离设定的theta0_deg且主瓣宽度也不同。这个动画深刻揭示了时延线True Time Delay TTD在宽带相控阵中的重要性——仅用移相器无法在所有频率上对准同一个方向。6. 工程实践中的调试与可视化技巧将仿真用于实际工程调试时有一些技巧能让你的“动图”更具洞察力。6.1 交互式参数调整动画与其写死参数不如做一个带控件的交互界面。Matlab的uicontrol或更现代的App Designer可以轻松实现。例如创建几个滑动条slider分别控制阵元数N、阵元间距d、扫描速度以及一个开关来引入/关闭幅相误差。当你在界面上拖动滑块时动画实时变化。这不仅能用于演示更是强大的参数敏感性分析工具。你可以立刻看到增加N如何让波束变窄增大d如何诱使栅瓣在扫描角较小时就出现。6.2 结合热力图展示空时扫描单一的波束方向图是角度维的切片。对于空时自适应处理STAP或MIMO雷达我们关心的是角度-多普勒二维谱。这时动画可以展示这个二维谱随时间或脉冲重复间隔的变化。用imagesc或surf绘制二维热力图并让其在时间维度上动态更新可以直观展示杂波脊、目标点的移动等复杂现象。虽然计算量更大但视觉冲击力和揭示问题的能力是无可替代的。6.3 性能指标的历史曲线在动画旁边开辟一个小窗格绘制关键指标如主瓣增益、最高旁瓣电平、指向误差随扫描角变化的曲线。随着动画进行这条曲线被实时绘制出来。这相当于为动态过程提供了“数据记录”让你一眼就能看出扫描到哪个角度时性能开始恶化为系统设计提供定量边界。实现这个功能需要在动画循环中将计算得到的指标如第4.3节所述保存到数组里并在另一个axes中更新plot。% 在图形窗口中创建两个子图一个用于波束动画一个用于性能曲线 figure(‘Position‘ [100, 100, 1200, 500]); % 子图1波束动画 subplot(1,2,1); h_beam_plot plot(NaN, NaN, ‘b-‘, ‘LineWidth‘, 1.5); % ... 初始化波束图坐标轴 ... % 子图2性能历史曲线 subplot(1,2,2); hold on; h_hpbw_plot plot(NaN, NaN, ‘r-‘, ‘DisplayName‘, ‘-3dB波束宽度‘); h_sll_plot plot(NaN, NaN, ‘b--‘, ‘DisplayName‘, ‘最高旁瓣电平‘); xlabel(‘扫描角度 (度)‘); ylabel(‘指标值‘); title(‘扫描性能历史‘); legend(‘Location‘, ‘best‘); grid on; % 初始化存储数组 scan_angle_history []; hpbw_history []; sll_history []; % 动画循环 for i 1:length(scan_angles) theta0_current scan_angles(i); % ... 计算波束图AF_dB和指标HPBW, SLL ... % 更新波束图子图 set(h_beam_plot, ‘XData‘, theta_deg, ‘YData‘, AF_dB); title(subplot(1,2,1), sprintf(‘当前指向: %.1f°‘, theta0_current)); % 更新历史数据并绘制曲线 scan_angle_history(end1) theta0_current; hpbw_history(end1) HPBW; sll_history(end1) SLL; set(h_hpbw_plot, ‘XData‘, scan_angle_history, ‘YData‘, hpbw_history); set(h_sll_plot, ‘XData‘, scan_angle_history, ‘YData‘, sll_history); % 调整曲线图的X轴范围 xlim(subplot(1,2,2), [min(scan_angles), max(scan_angles)]); drawnow; end这种“主视图仪表盘”的动画布局极大地提升了仿真的分析能力。它把动态过程背后的数据趋势清晰地呈现出来让你对系统性能有一个全局的、连续的理解。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价