ARTICLE DETAIL

资讯详情

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

IAA迭代自适应算法:从加权最小二乘到稳健DOA估计

IAA迭代自适应算法:从加权最小二乘到稳健DOA估计 做阵列测向这几年我见过太多方法在仿真里漂亮一到实测就崩盘。MUSIC的分辨率确实让人着迷但现实中的相干源、单快拍、低信噪比随便来一个都能让子空间类方法哑火。后来接触到了IAA迭代自适应方法才真正理解了什么叫“非参数、不需要先验信息也能稳着出谱”。不过IAA论文里那套推导符号极其劝退我当年也是抄完代码后好一阵子才想明白它本质上是一条从加权最小二乘WLS出发通过迭代更新权重来逼近DOA估计的路线。这篇文章就把这条路线完整走一遍适合正在啃IAA论文、或者想在DOA估计中引入IAA的同学作为参考。1. 从问题说起DOA估计到底在解什么1.1 阵列信号模型先把符号统一DOA估计说白了就是回答一个问题来波方向在哪。我们假定接收端是一个由M个阵元组成的阵列以均匀线阵为例阵元间距通常是半个波长。当某个远场窄带信号以角度 $\theta$ 入射时第m个阵元相对参考阵元会有一个相位差把所有阵元的相位差写成向量就是这个角度对应的导向矢量$$a(\theta) \begin{bmatrix} 1 \ e^{j2\pi\frac{d}{\lambda}\sin\theta} \ \vdots \ e^{j2\pi(M-1)\frac{d}{\lambda}\sin\theta} \end{bmatrix}$$如果有K个信号同时入射每个快拍的接收数据可以写成$$y(n) A(\theta)s(n) e(n)$$其中 $A(\theta)$ 是 $M \times K$ 的阵列流形矩阵它把K个导向矢量按列拼接起来$s(n)$ 是K个信号的复包络$e(n)$ 是噪声通常建模为高斯白噪声。整个DOA估计问题就是从一段观测 $y(1), \dots, y(N_t)$ 中把 $\theta_1, \dots, \theta_K$ 找出来。注意这里我故意没有说“先估计信源个数再估计角度”因为实际工程里信源个数这个参数本身就不容易给定。IAA的高明之处就在于它跳过了“先定阶、再测向”这个传统套路。1.2 传统方法的翻车现场最朴素的测向方法是延迟求和也叫常规波束成形。它就是把阵列数据往每个候选方向上投影哪个方向投影能量大就认为哪个方向有信号$$P_{CBF}(\theta) a^H(\theta)\hat{R}_y a(\theta)$$这里 $\hat{R}_y \frac{1}{N_t}\sum_n y(n)y^H(n)$ 是采样协方差矩阵。这个方法的优点是稳健、计算量小缺点是分辨率被“瑞利限”卡死。阵列孔径就那么长波束主瓣宽度摆在那里两个角度距离小于波束宽度时这个方法是分辨不出来的。接着大家就想到了Capon波束形成也就是最小方差无失真响应。它在保持期望方向增益为1的前提下最小化输出功率相当于把干扰方向“压”出零点。这个思路在理论上是漂亮的但问题也明显它需要求协方差矩阵的逆快拍不足或者协方差矩阵病态时结果会剧烈抖动对角加载那个参数又得反复试。然后是MUSIC。MUSIC把接收数据分解成信号子空间和噪声子空间利用两个子空间的正交性构造谱峰。这个方法分辨率高但有几个致命问题必须先知道信源个数相干信号会导致信号子空间“降秩”谱峰直接消失低信噪比下噪声子空间估计不准性能掉得很快。我在实测里最头疼的就是相干源问题两个目标一旦相干MUSIC几乎必然只剩一个峰。1.3 IAA想解决的三件事IAA的出现其实是冲着传统方法的三个痛点去的第一不需要预先知道信源个数。IAA是在整个候选角度网格上估计功率谱有能量的角度自然形成峰值信源个数是“事后数峰”得到的。第二能处理相干信号。因为IAA不是子空间分解类方法它不依赖信号子空间的秩所以相干源对它来说只是两个功率点。第三对快拍数不敏感。推导到后面你就会发现IAA的核心更新公式在单快拍下也能成立。这在实际场景里非常有用比如机载雷达、跳频通信里往往没有足够的时间积累多个快拍。当然代价也有那就是计算量。IAA需要迭代每次迭代都要对协方差矩阵求逆网格点数一多计算负担确实上去了。这块我在后面实操部分会展开讲。2. WLS框架IAA的地基2.1 最小二乘估计的局限要理解IAA得先回到最小二乘这层地基。假设我们有线性观测模型$$y As e$$其中 $y$ 是 $M \times 1$ 的观测向量$A$ 是 $M \times K$ 的已知字典矩阵$s$ 是待估计的信号向量$e$ 是噪声。经典LS估计就是最小化误差的2范数平方$$\hat{s}_{LS} \arg\min_s |y - As|_2^2$$解是 $\hat{s}_{LS} (A^H A)^{-1} A^H y$。这个解在噪声是独立同分布的白噪声时是很好的因为每个观测分量的可信度相同最小化平方和很公平。问题在于实际阵列信号里的噪声和干扰并不是白化的。换个说法$e$ 的协方差矩阵 $Q E[ee^H]$ 不一定是单位阵的倍数。比如存在一个强干扰源时干扰会在某些方向上注入很大的能量此时如果还对所有观测分量一视同仁地做最小二乘估计结果会被强干扰带偏方差非常大。这就是LS在复杂电磁环境下的先天不足。2.2 加权最小二乘的求解过程WLS的思路很直观既然不同观测分量的可信度不一样那就给可信度高的分量更大的权重给可信度低的分量更小的权重。数学上就是最小化加权范数$$\hat{s}_{WLS} \arg\min_s (y - As)^H Q^{-1} (y - As)$$这里的 $Q^{-1}$ 就是权重矩阵。为什么要用协方差矩阵的逆而不是直接用协方差矩阵因为你希望当某个方向噪声功率大时对应分量的权重变小。协方差矩阵 $Q$ 度量了噪声的“大小”它的逆天然就把大噪声压下去了。对 $s$ 求导并令导数为零可以得到$$\hat{s}_{WLS} (A^H Q^{-1} A)^{-1} A^H Q^{-1} y$$这个公式是WLS的标准形式。你可以把它理解成先用 $Q^{-1/2}$ 对观测向量和字典矩阵做一次“白化”然后在白化后的空间里做普通LS。白化让各个分量的噪声变成等方差LS在这个空间里又是最优的。从直觉上讲$Q^{-1}$ 的作用有两层。一层是噪声白化让不同阵元的噪声功率一样另一层是干扰抑制如果某个方向有强干扰而这份干扰又反映在 $Q$ 里那么 $Q^{-1}$ 会对准那个方向形成一个凹陷。理论上当干扰的协方差建模得足够准确加权最小二乘就能把干扰的影响基本消除。2.3 把WLS放进DOA估计的语境现在把WLS拿来做DOA估计。我们并不想一次性把所有方向的信号幅度都解出来而是想逐个角度地判断“这个方向有没有信号”。所以对每个候选角度 $\theta_k$构造一个“单参数模型”$$y a_k s_k \text{其他信号} \text{噪声}$$如果“其他信号噪声”的协方差矩阵能够被估计出来比如记为 $R$那么对 $s_k$ 的WLS估计就是$$\hat{s}_k \frac{a_k^H R^{-1} y}{a_k^H R^{-1} a_k}$$这个式子其实是单参数WLS的特例因为 $A$ 退化成一个向量 $a_k$。同时它也跟Capon波束成形器的输出完全一致。换句话说一旦你用某个协方差矩阵 $R$ 定义了权重那么“自适应测向”的核心运算就是上面这个式子。这就是IAA和WLS之间最关键的桥IAA无非是把这个 $R$ 从一个固定常量变成随迭代不断更新的量。每一次迭代都在用当前对信号功率的估计结果重新构造协方差矩阵然后再对每个角度做一次WLS估计。权重矩阵不再是拍脑袋定的而是从数据里迭代学出来的。3. IAA核心推导迭代自适应公式手把手推一遍3.1 初始化匹配滤波给的起点IAA的第一步是用匹配滤波初始化每个候选角度的功率。匹配滤波的思路很朴素用每个方向的导向矢量去跟接收数据做相关相关能量大的方向就可能是信号方向。初始信号幅度估计为$$\hat{s}_k^{(0)} \frac{a_k^H y}{a_k^H a_k}$$初始功率就取模平方$$p_k^{(0)} |\hat{s}_k^{(0)}|^2$$对均匀线阵来说$a_k^H a_k M$所以匹配滤波输出其实就是常规波束成形的输出。这一步虽然分辨率不高但能给出一个大致的功率分布足以支撑第一轮协方差矩阵的构建。如果你处理的是多快拍数据初始功率也可以写成所有快拍平均的结果$$p_k^{(0)} \frac{1}{N_t}\sum_{n1}^{N_t}|\hat{s}_k^{(0)}(n)|^2$$初始化的质量会影响收敛速度但IAA对初始化不算太敏感。我试过用全零以外的多种初始化方式包括直接把 $p_k^{(0)}$ 设成同样的常数迭代十几轮之后基本都能收敛到相近的结果。当然用匹配滤波初始化是最稳、最省事的做法。3.2 协方差矩阵建模从功率到干扰抑制有了每个角度的初始功率就可以构造全面的协方差矩阵。假设我们把整个角度域离散成 $K_g$ 个候选格点那么信号协方差矩阵可以写成$$R \sum_{k1}^{K_g} p_k a_k a_k^H \sigma I$$其中 $\sigma I$ 是噪声项实际实现里通常用对角加载来代替保证矩阵可逆。这个 $R$ 的物理含义非常清楚它表示在当前功率估计下阵列接收数据的协方差结构。如果某个格点 $k$ 的功率 $p_k$ 很大说明那里大概率有一个信号那么 $R$ 里就包含了来自这个“信号”的贡献。为什么IAA要用包含所有候选角度的 $R$而不是把当前估计的角度 $k$ 本身也去掉严格来说估计第 $k$ 个角度的信号幅度时更“干净”的做法是用删除了第 $k$ 个方向贡献的协方差矩阵。但那样每个角度都要单独构造一个不同的逆矩阵计算量不可接受。IAA选择用统一的 $R$ 来近似代价是当前角度自身的功率会混在干扰协方差里但在高分辨率网格和迭代收敛后这种影响会变得很小。这是IAA在计算量和精确性之间做的巧妙折中。3.3 单角度WLS求解核心公式诞生接下来是整篇文章最核心的推导。对第 $k$ 个候选角度我们希望估计信号幅度 $s_k$。把其他所有格点的贡献都当作“干扰”用当前协方差矩阵 $R$ 来白化它。于是构造如下加权最小二乘问题$$\min_{s_k} \left(y - a_k s_k\right)^H R^{-1} \left(y - a_k s_k\right)$$展开目标函数$$J(s_k) y^H R^{-1} y - y^H R^{-1} a_k s_k - s_k^H a_k^H R^{-1} y s_k^H a_k^H R^{-1} a_k s_k$$令 $\alpha -y^H R^{-1} a_k$$\beta a_k^H R^{-1} a_k$注意 $\beta$ 是一个正实数因为 $R^{-1}$ 是Hermitian正定矩阵。于是$$J y^H R^{-1} y \alpha s_k \alpha^* s_k^* \beta |s_k|^2$$把 $s_k u jv$ 拆成实部和虚部分别对 $u$ 和 $v$ 求导并令其为零。经过整理可以得到$$\hat{s}_k \frac{a_k^H R^{-1} y}{a_k^H R^{-1} a_k}$$这个式子太重要了值得停下来多看两眼。它的结构是一个归一化的匹配滤波但匹配空间不是原始的观测空间而是经过 $R^{-1}$ “白化”之后的空间。$R^{-1}$ 在这里同时起到了两个作用一是压制其他方向强信号带来的干扰二是把非白噪声白化使得最终估计结果近似最优。说白了这就是“自适应”二字的来源。第一次迭代时 $R$ 由匹配滤波初始化得到里面的干扰信息还不准但每迭代一轮$R$ 变得更准确$R^{-1}$ 对干扰的抑制能力也更强于是 $p_k$ 的估计就更准反过来又让下一轮 $R$ 更准。这就是一个典型的期望最大化式循环。3.4 功率更新与迭代循环得到信号幅度估计后功率更新很简单$$p_k |\hat{s}_k|^2$$多快拍情况下则是把所有快拍的估计结果取平均$$p_k \frac{1}{N_t}\sum_{n1}^{N_t}|\hat{s}_k(n)|^2$$至此一次完整的迭代就结束了。整个IAA算法可以浓缩成下面这个循环初始化用匹配滤波得到每个候选角度的初始功率 $p_k^{(0)}$。构建协方差矩阵$R \sum_k p_k a_k a_k^H \sigma I$。对每个候选角度计算信号幅度$\hat{s}_k \frac{a_k^H R^{-1} y}{a_k^H R^{-1} a_k}$。更新功率$p_k |\hat{s}_k|^2$。检查收敛如果 $\frac{|p^{(i)} - p^{(i-1)}|_2}{|p^{(i-1)}|_2} \epsilon$停止否则回到第2步。收敛之后把 $p_k$ 按角度画出来就是IAA的功率谱。谱峰对应的角度就是DOA估计结果。这里有一个值得琢磨的细节第3步和第4步之间其实是有内在一致性的。如果信噪比很高、干扰抑制得很干净那么 $\hat{s}_k$ 会非常接近真实信号幅度功率更新自然准确反过来如果 $R$ 里错误地把某个没有信号的角度的功率设得很大那么 $R^{-1}$ 就会在那个方向形成一个“坑”下一轮这个方向的功率就会被压下去。这种负反馈机制保证了算法不太容易发散也是IAA稳健性的核心保障。4. 从公式到代码实现中的关键细节4.1 初始化与迭代停止条件先说初始化。理论上可以用任何非负的功率向量启动但匹配滤波初始化有三个好处计算量小只需要做一次矩阵向量乘物理意义明确等价于常规波束成形的输出迭代收敛快因为初始值已经离真实功率分布不远了。迭代停止条件有两种常见做法。一种是严格检查收敛比如设置 $\epsilon 10^{-3}$ 或 $10^{-4}$每次迭代后计算功率向量变化的相对范数。另一种更工程化的做法是固定迭代次数比如统一迭代10到15次。论文里一般认为10次左右已经能得到很稳定的结果15次以上基本没有肉眼可见的变化。我自己在MATLAB里跑仿真时通常设固定15次省去每次判断收敛的开销。需要提醒的是收敛阈值不要设得太苛刻。IAA在迭代后期功率谱的变化幅度非常小但严格收敛可能需要更多轮次计算收益却不明显。工程上讲与其多跑5轮去追求千分之一的谱变化不如把省下来的算力放到提高网格密度上去。4.2 噪声项处理与对角加载$R$ 的构造里如果完全没有噪声项当候选格点数 $K_g$ 小于阵元数 $M$ 的时候$A P A^H$ 很可能不满秩求逆直接出问题。就算 $K_g \geq M$数值上也可能接近奇异。所以实践中几乎都会做对角加载也就是在 $R$ 上加一个 $\sigma I$。$\sigma$ 怎么选这直接决定算法稳定性。我的经验是用当前 $R$ 的迹取一个比例$$\sigma \delta \cdot \frac{\text{trace}(A P A^H)}{M}$$其中 $\delta$ 在 $10^{-3}$ 到 $10^{-2}$ 之间比较合适。这个取值思路是加载量跟信号总功率保持一个固定的相对水平这样在信噪比变化时能自适应地调整加载强度而不是用一个绝对常数。另一个思路是利用采样协方差矩阵的底噪水平比如把 $\hat{R}_y$ 的最小特征值放大若干倍作为 $\sigma$。这种方法在信噪比较低时更精准但需要额外做一次特征分解计算量稍大。对普通仿真和大多数实测场景前者已经够用。4.3 计算复杂度与工程加速IAA的复杂度大头在后三行第2步要对 $M \times M$ 矩阵求逆第3步要对每个候选角度计算两个二次型 $a_k^H R^{-1} y$ 和 $a_k^H R^{-1} a_k$。如果网格点数 $K_g 181$阵元数 $M 8$迭代15次整体计算量大概是 $15 \times (181 \times 8^2 8^3)$这在现代CPU上算毫秒级完全不是问题。但如果阵元数涨到64、网格点到361或者需要对几百个快拍逐个处理时就要考虑加速手段。这里分享三个实测有效的做法。第一个做法是用Cholesky分解替代显式求逆。对正定矩阵 $R$先做Cholesky分解 $R L L^H$然后把 $a_k^H R^{-1} y$ 拆成 $a_k^H (L^H)^{-1} L^{-1} y$用两次前代/回代求解线性方程组避免显式计算逆矩阵。数值稳定性更好速度也更快。第二个做法是预计算那些与迭代无关的部分。所有候选角度的导向矢量可以事先存成 $M \times K_g$ 的矩阵每次迭代中反复用的 $a_k^H$ 和 $a_k$ 也都是现成的。真正需要每次计算的只有 $R^{-1}$以及它跟 $y$、$a_k$ 的乘积。第三个做法是并行化。第3步里每个角度 $k$ 的计算是相互独立的天然适合用MATLAB的parfor或者Python的多进程并行。当网格点很多时并行效率可以逼近线性加速。5. 常见问题与实测经验5.1 问题排查速查表我把实际调试中遇到过的问题整理成了一张表遇到类似现象可以直接对照排查。现象可能原因解决方案谱峰不明显整个谱都很平对角加载量过大把 $\delta$ 调小或改用特征值底噪估计谱峰位置在几轮迭代中漂移网格太粗加密角度网格或对谱峰附近做二次插值相干源只出一个峰网格失配或功率初始化偏差适当提高迭代次数并检查两个源是否落在相邻格点矩阵求逆报错或出现NaN$R$ 接近奇异检查是否忘了加对角加载项多快拍时功率谱有毛刺快拍间信号有起伏先对快拍做归一化再进入IAA这些情况里最隐蔽的是第二个。IAA本身对网格失配比MUSIC要不敏感一些但如果你把网格设得太粗比如3度一个格点两个真实角度落在两个格点之间谱峰就可能在相邻格点之间跳来跳去。解决办法一是加密网格二是对最终谱峰用抛物线拟合把小数级的角度差补回来。5.2 几个容易忽略的经验提醒第一WLS的权重矩阵 $R^{-1}$ 不是“越白越好”。有些同学看到 $R^{-1}$ 就以为是对所有干扰做白化想让噪声完全变成白噪声。但IAA的 $R$ 里包含信号本身的功率这个信号功率在对角线上会抬高 $R$ 的迹从而削弱 $R^{-1}$ 对信号方向的放大作用。换句话说IAA的权重矩阵实际上是一种“温和”的白化它压制干扰但并不彻底抵消信号。这个特性让IAA在低信噪比下比Capon更稳定。第二不要追求迭代到完美收敛。我见过有人把收敛阈值设成 $10^{-8}$结果跑了50轮还没停下来。IAA的本质是迭代加权最小二乘它没有全局最优解的那种“保证”但它的谱峰位置在早期迭代里就已经基本稳定。后面那些迭代更多是在微调谱峰的锐度和旁瓣电平。固定10到15次迭代既省时间又足够准。第三如果你把IAA的结果当成下一步处理的基础比如交给跟踪滤波器时建议把谱峰旁边的两个格点功率也保留下来。IAA的谱峰不是纯粹的脉冲它会带有一定的展宽直接丢掉这些信息可能会造成角度估计偏差。我做过一次对比用谱峰加左右两点做加权平均得到的角度比单纯用谱峰位置要稳定得多。第四关于深度学习与IAA结合的方向。现在DOA估计领域里像SubspaceNet这类数据驱动方法越来越多但IAA这种“可解释的迭代优化”并不会过时。很多混合方案是让网络先给出一个粗略的目标数目和角度先验然后用IAA做精细估计。如果你有精力可以往这个方向试试我个人认为这是工程落地价值很高的一个分支。最后说一点我自己的体会IAA这套推导表面上看是一堆矩阵公式本质上其实就是“迭代加权最小二乘”这六个字。权重矩阵不是固定不变的而是随着当前对信号功率估计的更新不断自我修正。想清楚这一点你就不会再被论文里那些符号绕晕。我在实际项目里用得最多的是把IAA当做一个“稳定器”——在MUSIC因为相干源失效、Capon因为协方差病态发抖的时候用IAA兜底出角度初值。虽然它比常规方法多跑好几轮矩阵求逆但换来的是在复杂电磁环境下不用提心吊胆地调参数。测向这个领域稳定压倒一切。
返回列表