ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

MATLAB仿真均匀直线阵常规波束形成:从导向矢量到方向图

MATLAB仿真均匀直线阵常规波束形成:从导向矢量到方向图 先说我入坑时的事第一次在MATLAB里画出均匀直线阵Uniform Linear ArrayULA的方向图时主瓣竟然指向了负30度而我在代码里明明写的期望方向是正30度。查了好半天问题居然出在一个复数指数的符号上。从那次以后我就意识到阵列信号处理里真正卡人的往往不是算法本身而是藏在公式背后的物理直觉。均匀直线阵的常规波束形成Conventional BeamformingCBF是阵列信号处理最基础、也最绕不开的一块内容。雷达、声呐、无线通信、麦克风阵列几乎所有涉及多通道信号处理的系统里都能看到它的影子。它的思想不复杂让来自某个方向的信号在各阵元上同相叠加其他方向的信号因为相位没有对齐而被自然压制。用MATLAB做这件事代码量不大但要把里面的门道讲清楚足够写一整篇文章。这篇文章我会从数学建模开始一路写到可以跑的MATLAB代码再通过参数扫描实验把方向图、波束宽度、旁瓣、栅瓣这些概念全部串起来。适合刚接触阵列信号处理的学生也适合已经跑过一些代码、但对原理还差一层窗户纸的工程师。1. 均匀直线阵的数学建模从几何时延到导向矢量1.1 远场窄带假设是整套理论的基石做阵列仿真前必须先搞清楚我们站在什么样的假设下说话。常规波束形成通常建立在两个前提上远场、窄带。远场的意思是信号源离阵列足够远远到入射波到达各阵元时可以近似看成平面波而不是球面波。从几何上看既然是平面波各阵元接收到的波形形状完全一样只是存在一个时间差时延。窄带的意思是信号带宽相对载频很小小到我们可以把一个时间段内的信号近似看成单频复正弦。这两个假设放一起就得到了一个关键结论各阵元之间的差异最终可以完全用一个相位差来表示。时延换算成相位差公式就是相移等于角频率乘以时延。把时延做傅里叶变换到频域等效于在复平面上旋转一个角度。这就是为什么阵列信号处理里处处是复数指数而不是真实的正弦波——我们在做窄带信号分析时用的是复解析表示相位信息就藏在指数项里。如果信号带宽很大远场窄带假设不成立那就不能简单用相位差来代替时延需要走宽带波束形成的路子比如用真时延线或者频域子带分解。但在入门阶段我们先把窄带吃透。1.2 阵元几何与时延公式设均匀直线阵有 N 个各向同性阵元从左到右排列阵元间距为 d。取第 0 号阵元为参考点信号入射方向与阵列法线的夹角为 θ。这里约定 θ 在法线右侧为正左侧为负。从几何关系可以知道第 n 个阵元相对第 0 号阵元在信号传播方向上的投影距离差是 n·d·sinθ。如果信号先到达第 0 号阵元那么到达第 n 个阵元的时间就会晚 τ_n n·d·sinθ / c其中 c 是传播速度。写成相位差就是φ_n 2π·f0·τ_n 2π·d·sinθ / λ · n这里 λ c / f0 是载波波长。这个式子非常关键相位差与阵元序号 n 成线性关系比例系数是 2π·d·sinθ / λ。从另一个角度看这个线性相位递增关系就是阵列的“空间采样”只不过采样对象不再是时间波形而是空间波前。1.3 导向矢量与阵列信号模型既然知道了每个阵元的相对相位我们就可以定义阵列对一个来自角度 θ 的远场窄带信号的响应向量也就是导向矢量steering vectora(θ) [1, e^{j2πd·sinθ/λ}, e^{j2π·2d·sinθ/λ}, ..., e^{j2π(N-1)d·sinθ/λ}]^T这里的转置 T 表示它是一个列向量。它的物理含义是当幅度为 1 的信号从 θ 方向入射时阵列各阵元实际接收到的复基带信号就是这个向量。有了导向矢量完整的阵列接收模型就能写出来了x(t) a(θ_s)·s(t) n(t)其中 x(t) 是 N×1 的阵列快拍向量s(t) 是信号复包络θ_s 是信号真实入射方向n(t) 是 N×1 的噪声向量噪声通常建模为零均值复高斯白噪声各阵元之间独立。这个模型是整个仿真地基后面所有代码都建立在这个表达式上。2. 常规波束形成的核心逻辑补偿相位、同相叠加2.1 延迟-相加的直观理解常规波束形成有个别名叫延迟-相加Delay-and-Sum。名字已经把原理说透了既然信号到达各阵元有先有后那我就把先到的信号往后拖后到的信号往前补让它们在某一个时刻“对齐”然后再相加。对齐之后期望方向来的信号是相干的相加时幅度直接叠加噪声是不相干的相加时功率只按能量叠加。这一来一去信噪比就上去了。打个比方一个合唱队每个人都按自己的节奏唱你听到的是一片混乱但如果指挥让大家合着拍子唱声音就汇聚起来变得洪亮。波束形成干的就是这回事。它本质上是在空间上做了一次“匹配”。在窄带条件下“延迟”这个动作不再需要真的去移动时间轴只需要乘上一个相位因子就能实现。这就是为什么常规波束形成的权重向量如此简洁。2.2 数学表达与归一化问题要观察 θ0 方向我们构造权重向量w a(θ0) / N这里的除以 N 是归一化。它保证了当信号确实从 θ0 方向入射时波束形成输出 y(t) w^H·x(t) 的信号分量幅度就是 s(t)不会有 N 倍放大。上标 H 表示共轭转置。为什么取共轭因为我们要做的是“补偿相位”。导向矢量每一项是 e^{jφ}补偿的时候就要乘 e^{-jφ}权重向量对应元素自然就是导向矢量的共轭。所以 w^H·a(θ0) (1/N)·a(θ0)^H·a(θ0) 1。从匹配滤波的角度看当噪声是空间白噪声时这个权重向量就是在最大化输出信噪比意义上最优的。这也是为什么它叫“常规”却不“平庸”——它对处于白噪声环境下的信号具有统计最优性。只是它没有考虑强干扰的抑制遇到方向性干扰时会显得力不从心这才有了后面MVDR、LCMV等自适应波束形成算法的存在空间。2.3 方向图函数所有秘密都在阵因子里波束形成的响应随入射角变化画出来就是方向图。数学上方向图就是输出对来自不同方向单位幅度信号的响应幅度F(θ) |w^H·a(θ)| |(1/N)·Σ_{n0}^{N-1} e^{j2πnd(sinθ - sinθ0)/λ}|这是一个等比级数求和。令 u sinθu0 sinθ0经过整理得到F(u) |sin(πNd(u - u0)/λ) / (N·sin(πd(u - u0)/λ))|这个式子叫阵因子array factor。它决定了阵列方向图的主要结构它的形状只由 N、d、λ、θ0 这几个参数决定。分子分母都含正弦函数所以阵因子本质上是一个周期性的峰值函数。当 πNd(u-u0)/λ mπ 且分母不为零时F(u)1也就是出现波束最大值。最大值所在位置满足d(u - u0) / λ m其中 m 是整数。m0 对应主瓣也就是我们期望的波束方向。m取其他值时如果 u 在 [-1,1] 区间内有解就会出现额外的波束峰这就是栅瓣。除了峰值阵因子还给出两个重要结论第一主瓣两侧会在 sin(πNd(u-u0)/λ)0 的位置陷入零陷零陷之间的区域形成旁瓣第二第一旁瓣峰值出现在分子接近 1 的位置对于均匀加权它的电平大约是 -13.2 dB。2.4 主瓣宽度、旁瓣电平与栅瓣三个必须会看的指标半功率波束宽度HPBW方向图从主瓣峰值下降 3 dB 时对应的角度范围。对大阵列近似公式是HPBW ≈ 0.886λ / (N·d) 弧度注意单位是弧度转成角度要乘以 180/π。从公式能看出阵元数越多、间距越大波束越窄分辨率越高。第一旁瓣电平SLL均匀加权时固定是 -13.2 dB不随阵元数变化。想压低旁瓣就得对幅度做锥削比如用海明窗、切比雪夫窗。代价是主瓣会展宽。这个权衡在工程上无处不在。栅瓣当 d/λ 1/(1|sinθ0|) 时m ≠ 0 的峰值就可能落入可见区域出现栅瓣。最常用的规避措施是取 d λ/2这样即使在 θ0 ±90° 的极限扫描角下栅瓣条件也不会满足。这也是为什么绝大多数阵列仿真都默认半波长间距。3. MATLAB仿真代码从零搭建可复现的CBF工程3.1 参数设置的思路动手写代码前先规划参数。仿真要回答的是“常规波束形成在MATLAB里怎么跑”所以参数要选得有代表性既要能看清主瓣又要方便观察旁瓣还不能出现栅瓣。我用的参数如下载频 f0 1 GHz对应波长 λ 0.3 m阵元数 N 16阵元间距 d 0.5λ半波长期望信号方向 θ0 30°采样率 fs 20 MHz快拍数 snap 2000输入信噪比 SNR_dB 10 dB这里有一个容易被忽略的小问题既然我们做的是窄带仿真为什么还要设采样率和快拍数因为我们要生成一段有限长的复基带信号来模拟时间采样过程后续验证处理增益的时候用得上。如果只是画方向图其实完全不需要生成时域数据直接用导向矢量计算方向响应即可。但为了让仿真更完整我把两部分都包括进去。3.2 阵列数据生成远场窄带信号的数值构造MATLAB里生成阵列数据核心就一条x a(θ_s)·s n。其中 s 是基带复信号我用了频率偏移 100 kHz 的复正弦这样既保留了复数信号的相位信息又能在验证SNR时方便计算功率。% 参数设置 c 3e8; f0 1e9; lambda c / f0; d 0.5 * lambda; % 阵元间距单位米 N 16; % 阵元数 theta0_deg 30; % 期望方向单位度 theta_s_deg 30; % 信号真实方向这里取同向 SNR_dB 10; snap 2000; % 快拍数 fs 20e6; % 采样率 % 角度转弧度 theta0 deg2rad(theta0_deg); theta_s deg2rad(theta_s_deg); % 导向矢量 a_theta0 exp(1j * 2 * pi * d / lambda * (0:N-1). * sin(theta0)); a_s exp(1j * 2 * pi * d / lambda * (0:N-1). * sin(theta_s)); % 基带信号幅度为1的复正弦频率为100kHz t (0:snap-1) / fs; s exp(1j * 2 * pi * 100e3 * t); % 噪声复高斯白噪声实部虚部独立 noise (randn(N, snap) 1j * randn(N, snap)) / sqrt(2); noise_power 10^(-SNR_dB / 10); % 阵列接收数据 x a_s * s sqrt(noise_power) * noise;注意这段代码里导向矢量用矩阵乘法乘以 s得到的是 N×snap 的矩阵每一行对应一个阵元的接收时间序列。噪声功率设置有一点微妙复噪声的实部和虚部各有方差 0.5叠加起来总功率为 1所以乘以 sqrt(noise_power) 后噪声单阵元功率正好等于 noise_power与信号功率 1 的信噪比设定一致。3.3 CBF权重计算与输出信号权重向量的构造是一行代码的事但缩放的细节要讲清楚。我用的是 w a_theta0 / N这样输出信号的幅度不会被放大。如果你想让波束形成输出信号功率与输入信号功率的比值正好反映阵列增益这个归一化是必须的。% 常规波束形成权重 w a_theta0 / N; % 波束形成输出 y w * x;算完 y 后可以分别算信号分量和噪声分量看输出信噪比。信号分量就是 wa_ss噪声分量是 y 减去信号分量。由于仿真中的噪声是随机生成的单次实验的SNR有起伏更稳健的做法是多次蒙特卡洛统计。3.4 方向图绘制与结果解读方向图计算不需要时域数据直接用权重向量和扫描角度的导向矢量做内积就行。扫描角从 -90° 到 90°步长取 0.1°既平滑又不会太慢。% 扫描角度 theta_scan_deg -90:0.1:90; theta_scan deg2rad(theta_scan_deg); % 扫描方向的导向矢量矩阵维度 N × length(theta_scan) A_scan exp(1j * 2 * pi * d / lambda * (0:N-1). * sin(theta_scan)); % 方向图响应 pattern abs(w * A_scan); % 归一化并转dB pattern_dB 20 * log10(pattern / max(pattern) eps); figure; plot(theta_scan_deg, pattern_dB, LineWidth, 1.5); xlabel(角度 (°)); ylabel(归一化幅度 (dB)); title(均匀直线阵常规波束形成方向图); grid on; ylim([-60, 5]);这段代码最关键的地方是 A_scan 的计算。它通过 (0:N-1). 构造一个 N×1 的列向量乘以 1×M 的 sin(theta_scan) 行向量得到一个 N×M 矩阵。每一列对应一个扫描角度的导向矢量。这个维度技巧是MATLAB阵列仿真里最常用的操作建议记牢。画出来的方向图主瓣应该在 30° 处峰值 0 dB两侧对称分布着旁瓣第一旁瓣大约在 -13 dB 附近。如果看到主瓣偏了、或者旁瓣不对称大概率是导向矢量的相位符号处理有问题。3.5 用蒙特卡洛验证10lgN增益常规波束形成最诱人的特性之一是白噪声下输出信噪比相对输入信噪比提高了 10·log10(N) dB。既然我们的仿真生成了时域数据就可以用蒙特卡洛验证这个结论。% 蒙特卡洛验证阵列增益 MC 5000; gain_list zeros(1, MC); for k 1:MC noise (randn(N, snap) 1j * randn(N, snap)) / sqrt(2); x a_s * s sqrt(noise_power) * noise; y w * x; s_out w * (a_s * s); n_out y - s_out; SNR_out mean(abs(s_out).^2) / mean(abs(n_out).^2); gain_list(k) SNR_out / (10^(SNR_dB / 10)); end gain_dB 10 * log10(mean(gain_list)); fprintf(实测阵列增益: %.2f dB, 理论值: %.2f dB\n, gain_dB, 10*log10(N));跑完这个脚本实测增益会非常接近 12.04 dB也就是 10·log10(16)。如果这个值对不上通常说明噪声功率设定或者信号功率计算出了问题。这一步验证很重要它能帮你确认前面的信号模型和权重归一化都没写错。4. 参数扫描实验系统认识N、d和窗函数的影响4.1 阵元数N对波束宽度与旁瓣的影响理论公式说主瓣宽度随 N 增大而变窄这个不看图很难形成直观感受。我把 N 分别设成 8、16、32其他参数不变画在同一张图上对比。figure; hold on; N_list [8, 16, 32]; legend_str cell(1, length(N_list)); for idx 1:length(N_list) N_cur N_list(idx); a_cur exp(1j * 2 * pi * d / lambda * (0:N_cur-1). * sin(theta0)); w_cur a_cur / N_cur; A_cur exp(1j * 2 * pi * d / lambda * (0:N_cur-1). * sin(theta_scan)); p_cur abs(w_cur * A_cur); p_dB 20 * log10(p_cur / max(p_cur) eps); plot(theta_scan_deg, p_dB, LineWidth, 1.2); legend_str{idx} [N , num2str(N_cur)]; end legend(legend_str, Location, south); xlabel(角度 (°)); ylabel(归一化幅度 (dB)); title(不同阵元数对方向图的影响); grid on; ylim([-60, 5]);结果一目了然N 越大主瓣越尖但旁瓣数量变多了位置更密集第一旁瓣仍然在 -13.2 dB。这些旁瓣分布在角度域的不同位置实际系统中就是潜在的干扰进入通道。我在实际做这个实验时还顺手统计了半功率宽度。下表是仿真读数阵元数N半功率波束宽度约第一旁瓣电平约812.7°-13.2 dB166.3°-13.1 dB323.1°-13.2 dB可以看到波束宽度大致按比例收缩旁瓣电平基本不变。这个结论对阵列孔径设计很有指导意义想要更远处两个目标能被分辨开就要增大阵列孔径也就是增加 N 或增大 d。4.2 阵元间距d与栅瓣的关系阵元间距 d 的选择是阵列设计里最容易出问题的地方。d 太大会出现栅瓣太小又会让波束变宽。理论上栅瓣出现在满足 d(sinθ_grating - sinθ0)/λ m 的角度。当 d 0.5λ 时即使扫描角到 ±90°这个等式也只可能有 m0 的解所以无栅瓣。我把 d 分别取 0.5λ、0.75λ、1.0λ期望方向仍为 30°扫描范围还是 -90° 到 90°。可以看到d 0.75λ 时在 -90° 附近已经出现一个不弱于主瓣的峰d 1.0λ 时栅瓣直接对称出现在 -30° 附近而且幅度和主瓣一样高。这组实验的价值在于栅瓣不是仿真画出来的假象而是真实的物理响应。一旦有干扰或目标落在栅瓣方向系统就会产生严重的方向模糊甚至把干扰当成目标。所以工程里如果想把阵列孔径做大往往会用非均匀间距来破坏栅瓣形成条件这是一个很有意思的进阶方向。4.3 期望方向θ0对栅瓣出现条件的影响栅瓣条件里除了 d还跟 sinθ0 有关。同一个阵列扫描角度越大越容易冒出栅瓣。原因在于 u sinθ 在可见区间的范围随 θ 扩大而变宽给 m±1 的整数解提供了更多空间。我试过 d 0.8λ 时期望方向 0° 还看不到栅瓣但期望方向 60° 时栅瓣已经在 -90° 附近出现。这提醒我们如果系统要求在很大的扇区范围内扫描半波长间距基本是唯一的稳妥选择只有扫描范围被限制在正负 30° 以内时才可以把 d 放宽到 0.6λ 甚至更大。把这个关系做成一个简单判断式角度以弧度计扫描范围上限为 θmax那么安全间距要满足d/λ ≤ 1 / (1 |sinθmax|)当 θmax 90° 时右边等于 0.5这就是半波长间距的由来。当 θmax 30° 时右边大约 0.667允许的间距就宽松一些。用这个公式可以在设计阶段快速判断阵列间距是否安全。4.4 加窗锥削旁瓣抑制与主瓣展宽的权衡均匀加权得到 -13.2 dB 的第一旁瓣在很多应用里不够用。比如雷达要检测弱小目标强目标的高旁瓣可能淹没弱目标。解决办法是对阵元幅度进行锥削也就是加窗。在常规波束形成里加窗不是在时域加而是对权重向量的幅度做加权。MATLAB里可以这样% 30dB切比雪夫窗 wnd chebwin(N, 30); % 锥削后的权重归一化保持期望方向增益为1 w_win (wnd .* a_theta0) / (wnd * a_theta0); % 方向图 pattern_win abs(w_win * A_scan); pattern_win_dB 20 * log10(pattern_win / max(pattern_win) eps); figure; plot(theta_scan_deg, pattern_dB, LineWidth, 1.2); hold on; plot(theta_scan_deg, pattern_win_dB, LineWidth, 1.2); legend(均匀加权, 30dB切比雪夫窗, Location, south); grid on; xlabel(角度 (°)); ylabel(归一化幅度 (dB)); ylim([-80, 5]);切比雪夫窗可以把旁瓣压到 -30 dB但主瓣明显变宽半功率宽度可能从 6.3° 涨到 8° 左右。这是物理上的必然要压低旁瓣就得牺牲主瓣分辨率。窗函数设计本质上是在做这个权衡不止是阵列信号处理谱估计、FIR滤波器设计里都是一个道理。5. 从常规波束形成到更实际的场景5.1 二维阵列扩展思路均匀直线阵只能在一个平面内形成波束实际系统里目标可能在方位和俯仰两个维度上都变化这就需要平面阵、圆阵或者共形阵。平面阵的导向矢量是行、列两个方向导向矢量的克罗内克积本质上还是常规波束形成的思路只不过把一维的投影关系扩展到二维。学会了直线阵再看平面阵就会觉得顺理成章。5.2 为什么自适应波束形成要以CBF为基线常规波束形成对方向性干扰没有抑制能力。假设期望信号在 30°一个强干扰在 -20°CBF 的输出会把干扰也收进来导致信干噪比大幅下降。自适应波束形成比如MVDR会额外求解一个优化问题在期望方向增益恒定的约束下最小化输出总功率。这相当于在约束条件下自动把零陷对准干扰方向。但自适应算法有个天然弱点对导向矢量误差非常敏感阵列幅相误差、角度指向偏差都可能让算法把期望信号当成干扰来抑制。所以实际系统中CBF往往是稳健算法和自适应算法之间的基线参考。调试自适应波束形成时先用CBF跑通信道路径再用自适应权替换是工程上很常见的流程。5.3 实际系统中不可避免的误差与校准问题理论仿真里导向矢量精确已知真实硬件里却处处是误差。阵元位置偏差、互耦效应、通道幅度相位不一致都会让实际导向矢量偏离理论值。方向图上表现为旁瓣抬高、波束指向偏移、零陷变浅甚至消失。处理办法是实测校准在暗室里放置已知位置的校正源测出每个通道的幅度相位响应生成实测导向矢量表再用这个表去替换理论公式。对于初学者我的建议是先不要被这些工程细节吓住仿真的价值在于让你理解理想系统下的规律但心里要清楚实测数据一定比仿真复杂得多这也是为什么仿真验证后还需要外场实验或者暗室测试。6. 新手最容易踩的五个坑及排查思路6.1 峰值跑到对称角度这是最经典的坑。期望方向 30°画出来主瓣在 -30°那几乎可以断定是导向矢量里复数指数的符号与权重的关系搞反了。检查要点权重向量应该取导向矢量的共轭也就是 w 和 a(θ0) 的关系应该满足 w^H·a(θ0) 1。如果写成 w a_theta0 / N但后面方向图计算时又漏了共轭转置峰值就会翻到负方向。6.2 方向图不平滑或出现异常深谷扫描角步长过大会看到方向图在旁瓣区域出现明显的折线步长 1° 在 N 较大时尤其明显。解决办法是缩小步长比如 0.1° 或者更细。另一个情况是画 dB 方向图时没有加 eps导致某些零陷位置出现 -Inf呈现为断崖。虽然从数学角度这是正常的但观感很差加一个 eps 就好。6.3 输出幅度莫名增大N倍如果权重没有除以 N波束形成输出信号幅度会比原始信号大 N 倍表现为输出SNR虽然正确但绝对幅度完全不对。在级联处理时这种幅度失真会影响后续幅度检波和CFAR门限的设置。把 w a_theta0 改成 w a_theta0 / N问题就解决了。6.4 用实数噪声导致频谱不正常有的同学习惯用 randn 直接生成噪声忘了加虚部导致噪声频谱变成共轭对称与复数基带信号模型不匹配。这会让输出信噪比的蒙特卡洛统计产生偏差。正确做法是使用复高斯噪声 (randn 1j*randn)/sqrt(2)它的实部虚部独立总功率为 1。6.5 栅瓣藏在-90°到90°之外当阵元间距大于半波长栅瓣不一定在可见区域内完整显现有可能只是部分进入。用角度域画图时栅瓣的周期性规律不太直观这时候改用 u sinθ 作为横轴重新画方向图栅瓣的位置就变成了等间隔排列非常清楚。这也是我从实践中摸索出来的小技巧分析栅瓣问题优先用 sinθ 域而不是角度域。6.6 维度不匹配MATLAB报错“Matrix dimensions must agree”多半是导向矢量维度或扫描矩阵方向搞乱了。一个简单的检查原则阵列数据矩阵是 N×snap导向矢量和权重向量是 N×1扫描导向矢量矩阵是 N×M方向图结果自然是 1×M。养成用 size() 检查维度的习惯这类问题几分钟就能定位。常见问题典型原因排查方法主瓣在对称位置导向矢量相位符号与权重共轭关系不对验证 w^H·a(θ0) 是否为 1方向图折线严重扫描角步长过大步长设为 0.1° 或更小dB图中出现断崖log10(0) 产生 -Inf加 eps 后取对数输出幅度放大N倍权重未归一化检查是否除以 N蒙特卡洛增益不对噪声未用复高斯、信号功率计算错误核对噪声功率与信号功率定义阵列相关性维度错混淆了 N×snap 与 N×M 的维度用 size() 逐步检查这六个坑我每个都亲自踩过一遍。现在回想起来99% 的问题其实都出在“物理模型没吃透就急着写代码”上。先把导向矢量、方向图、栅瓣条件这几个概念在纸上画清楚再动手写MATLAB效率会高很多。这么多年做阵列信号处理下来我最大的体会是均匀直线阵看起来是最简单的阵列结构但几乎所有阵列信号处理的核心概念——导向矢量、波束宽度、旁瓣抑制、栅瓣规避、空间匹配滤波、自适应权重——都能在它身上得到最直接的体现。把这个案例彻底吃透后面不管是平面阵、圆阵还是MVDR、MUSIC算法都会顺畅很多。建议你把代码跑通以后再把 N 改成 8 和 32把 d 改成 0.3λ 和 0.8λ把 θ0 改成 0° 和 60°反复对比方向图的变化。自己动手调出来的直觉比看十遍公式都管用。
返回列表