☰
MATLAB仿真均匀直线阵常规波束形成:从导向矢量到方向图
2026/10/5 4:19:51 网站建设 项目流程

先说我入坑时的事:第一次在MATLAB里画出均匀直线阵(Uniform Linear Array,ULA)的方向图时,主瓣竟然指向了负30度,而我在代码里明明写的期望方向是正30度。查了好半天,问题居然出在一个复数指数的符号上。从那次以后我就意识到,阵列信号处理里真正卡人的往往不是算法本身,而是藏在公式背后的物理直觉。

均匀直线阵的常规波束形成(Conventional Beamforming,CBF)是阵列信号处理最基础、也最绕不开的一块内容。雷达、声呐、无线通信、麦克风阵列,几乎所有涉及多通道信号处理的系统里都能看到它的影子。它的思想不复杂:让来自某个方向的信号在各阵元上同相叠加,其他方向的信号因为相位没有对齐而被自然压制。用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 vector):

a(θ) = [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)·Σ_{n=0}^{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 是整数。m=0 对应主瓣,也就是我们期望的波束方向。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 后,可以分别算信号分量和噪声分量,看输出信噪比。信号分量就是 w'a_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 dB
166.3°-13.1 dB
323.1°-13.2 dB

可以看到,波束宽度大致按比例收缩,旁瓣电平基本不变。这个结论对阵列孔径设计很有指导意义:想要更远处两个目标能被分辨开,就要增大阵列孔径,也就是增加 N 或增大 d。

4.2 阵元间距d与栅瓣的关系

阵元间距 d 的选择是阵列设计里最容易出问题的地方。d 太大会出现栅瓣,太小又会让波束变宽。理论上,栅瓣出现在满足 d(sinθ_grating - sinθ0)/λ = m 的角度。当 d = 0.5λ 时,即使扫描角到 ±90°,这个等式也只可能有 m=0 的解,所以无栅瓣。

我把 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°,反复对比方向图的变化。自己动手调出来的直觉,比看十遍公式都管用。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询