阵列信号处理里做源数目估计,是个绕不开的前置环节。你后面不管是做波束形成、空间谱估计还是盲源分离,第一步都得先知道“到底有几个源”。估多了,协方差矩阵秩虚高,谱峰分裂;估少了,弱信号直接被吞掉,连补救的机会都没有。我这些年在这个环节上踩的坑,比后面做DOA估计加起来还多。这篇就围绕AIC、MDL、MEVARC这三套经典判据,把原理、实操、参数选择和避坑经验一次讲透,适合刚接触阵列信号处理的学生,也适合需要快速复现对比实验的工程人员。
1. 源数目估计的整体设计与判据选型思路
1.1 为什么源数目估计是阵列处理的“地基”
先把场景说清楚。假设你有一个M元均匀线阵,空间里有K个远场窄带信号源,接收数据写成矩阵形式就是X = AS + N,A是M×K的阵列流形矩阵,S是K×T的源信号,N是噪声。对接收数据求协方差矩阵R = E[XX^H],理论上它可以分解成信号子空间和噪声子空间两部分,特征值大的那K个对应信号,剩下M-K个小的对应噪声。
问题在于,实际拿到的只有有限快拍,协方差矩阵是估计出来的,特征值不会干净地分成两堆,中间总有一段“灰色地带”。源数目估计的本质,就是在这堆特征值里找一个合理的分界点。这个分界点找得准不准,直接决定了后续所有处理的上限。我见过太多人DOA估计结果一塌糊涂,回头一查,根子就在源数目估错了。
AIC(赤池信息准则)、MDL(最小描述长度准则)、MEVARC(基于特征值方差的自适应判据)这三者,走的是三条不同的路子。AIC和MDL属于信息论判据,核心是把“拟合优度”和“模型复杂度”放在一起权衡;MEVARC则是从特征值的统计特性出发,用方差信息做自适应判决。理解它们的分歧点,比记住公式重要得多。
1.2 三套判据的定位差异与选型逻辑
AIC的思路是:模型越复杂,拟合越好,但要惩罚复杂度。它的准则函数里,似然项鼓励多选源,惩罚项拉回来,两者相减取最小。问题在于AIC的惩罚项偏弱,在大快拍、高信噪比下它倾向于过估计,也就是把噪声特征值也当成信号。这不是实现bug,是它数学结构决定的。
MDL在AIC基础上把惩罚项加重了,用的是对数形式的惩罚,理论上有一致性——快拍趋于无穷时它能收敛到真值。代价是低信噪比、小快拍时它容易欠估计,弱源直接被漏掉。所以你会看到一个很典型的现象:同一组数据,AIC估出来偏大,MDL估出来偏小,真值往往夹在中间。
MEVARC不太一样,它不单纯看特征值大小,而是看相邻特征值之间的“间隔”与特征值方差的比值,做自适应门限。它的优势是在非均匀噪声、色噪声环境下比前两者稳,但对参数设置更敏感,门限系数选不好,结果波动会很大。
选型上我的经验是:先明确你的场景约束。快拍数充足、信噪比高、追求不漏源,用AIC;快拍紧张、噪声环境相对干净、要求一致性,用MDL;噪声有色或者各阵元噪声功率不一致,优先试MEVARC,但要留出调参余量。最稳妥的做法是三套都跑,交叉验证,别指望单一判据包打天下。
1.3 实验框架的搭建原则
做对比实验,最忌讳的是每次改一个参数就重写一遍脚本。我的做法是把数据生成、协方差估计、特征值分解、判据计算、结果统计这五块彻底解耦。数据生成部分固定随机种子,保证三套判据吃的是同一批数据;特征值分解只做一次,三套判据共用,避免重复计算带来的数值差异。
这里有个容易被忽略的点:特征值一定要按降序排列后再送进判据。我见过有人直接拿eig出来的原始顺序去算,结果判据函数里的索引全乱了,估出来的源数目忽大忽小,查了半天以为是算法问题,其实是排序没做。这个坑很低级,但真的常见。
2. 三套判据的核心原理与公式拆解
2.1 AIC判据的似然结构与过估计根源
AIC的准则函数写成:
AIC(k) = -2·ln(L_k) + 2·p(k)
其中L_k是假设源数目为k时的最大似然,p(k)是自由参数个数。在高斯假设下,把协方差矩阵的特征值λ_i(降序)代进去,可以得到工程上常用的形式:
AIC(k) = -2T·(M-k)·ln( (∏_{i=k+1}^{M} λ_i)^{1/(M-k)} / ( (1/(M-k))·∑_{i=k+1}^{M} λ_i ) ) + 2k(2M-k)
这里T是快拍数,M是阵元数。括号里那一坨,本质是噪声特征值的几何平均与算术平均之比的对数,再乘以负号。几何平均永远小于等于算术平均,所以这个比值小于等于1,取对数后为负,前面再乘负号就变成正的。k越大,参与计算的噪声特征值越少,这个比值越接近1,似然项越小;但惩罚项2k(2M-k)随k增大而增大。两者博弈,取最小处即为估计值。
关键在于惩罚项的系数。AIC的惩罚是线性的2倍,相对似然项的增长速度偏慢,所以当信噪比高、快拍多时,似然项的下降主导,k会一直增大到把噪声也纳进来。这就是过估计的数学根源,不是调参能解决的。
2.2 MDL判据的惩罚加重与欠估计倾向
MDL的准则函数:
MDL(k) = -T·(M-k)·ln( 几何平均/算术平均 ) + 0.5·k(2M-k)·ln(T)
对比AIC,两处变化:似然项前面的系数从2T变成了T(不同文献写法有差异,本质是归一化方式不同),惩罚项从2k(2M-k)变成了0.5·k(2M-k)·ln(T)。当T较大时,ln(T)显著大于1,惩罚被大幅加重。这就是MDL一致性好的原因——快拍越多,惩罚越狠,过估计被压住。
但反过来,低信噪比下似然项本身就不够突出,惩罚又重,k很容易被压到真值以下。我实测过一组数据,两个源功率差10dB,快拍200,MDL直接把弱源漏了,估成1。这不是MDL坏了,是它在这种场景下的固有倾向。所以看到MDL欠估计,先别怀疑代码,先看信噪比和源功率差。
2.3 MEVARC的自适应方差判决机制
MEVARC走的是另一条路。它不构造全局的似然-惩罚权衡,而是逐个考察相邻特征值的间隔。核心思想是:信号特征值和噪声特征值之间的跳变,应该显著大于噪声特征值内部的波动。具体做法是计算相邻特征值之差Δ_i = λ_i - λ_{i+1},再除以特征值的局部方差估计,得到一个归一化的判决量,与自适应门限比较。
它的判决量大致形如:
MEVARC(k) = Δ_k / σ_k
其中σ_k是第k个特征值附近的方差估计。门限通常取一个与阵元数、快拍数相关的经验系数。这个判据的好处是不依赖高斯噪声的强假设,对色噪声有一定鲁棒性;坏处是σ_k的估计本身有误差,门限系数选得不合适,判决量会在真值附近抖动。
我的经验是,MEVARC的门限系数不要照搬文献默认值,要拿你的实际数据做一轮标定。方法很简单:构造几组已知源数目的仿真数据,扫一遍门限系数,看哪个值在多数场景下判决最稳,再固定下来用。这一步花不了多少时间,但能省掉后面大量返工。
2.4 三套判据的横向对比
| 判据 | 核心机制 | 主要倾向 | 适用场景 | 主要风险 |
|---|---|---|---|---|
| AIC | 似然+线性惩罚 | 过估计 | 高信噪比、大快拍、怕漏源 | 噪声被误判为源 |
| MDL | 似然+对数惩罚 | 欠估计 | 快拍充足、噪声干净、要一致性 | 弱源被漏掉 |
| MEVARC | 特征值间隔/方差 | 依赖门限 | 色噪声、非均匀噪声 | 门限敏感、结果抖动 |
这张表建议贴在显示器边上。每次结果异常,先对照表格看是判据的固有倾向还是实现问题,能省掉一半的排查时间。
3. 实操过程与核心环节实现
3.1 数据生成与协方差估计的规范写法
数据生成这块,我习惯把阵列流形、源信号、噪声分开写,方便单独调参。均匀线阵的流形矩阵,阵元间距取半波长,导向矢量按exp(-j·2π·d·sin(θ)/λ)构造。源信号用复高斯随机序列,功率按设定信噪比缩放。噪声默认复高斯白噪声,要做色噪声实验时再单独加协方差整形。
协方差估计用样本协方差R = (1/T)·X·X^H。这里有个细节:快拍数T和阵元数M的关系很关键。T < M时样本协方差是奇异的,特征值分解出来的小特征值全是数值噪声,三套判据都会失准。我的经验是T至少取3M以上,条件允许就取5M到10M,判据的稳定性会明显提升。
特征值分解用eig,取对角线后降序排列。这里务必用sort做显式降序,别依赖eig的输出顺序。分解完把特征值存下来,三套判据共用同一组,保证对比的公平性。
3.2 AIC与MDL的代码实现要点
AIC和MDL的实现结构几乎一样,差别只在惩罚项。我通常写一个公共函数,输入特征值、快拍数、阵元数,输出每个k对应的准则值,最后取argmin。核心循环里,对每个k从0到M-1,计算噪声特征值子集的几何平均和算术平均之比,取对数,乘系数,加惩罚。
几个实现上的坑:第一,几何平均用exp(mean(log(λ)))算,别直接连乘,M大时连乘会溢出或下溢。第二,算术平均的分母是M-k,k=M-1时只剩一个特征值,几何平均等于算术平均,比值为1,对数为0,这是正常的边界情况,别当成异常。第三,argmin返回的是索引,记得减1才是源数目,因为k从0开始。
实测中我还遇到过一个数值问题:当某个噪声特征值极小、接近零时,log会出问题。解决办法是给特征值加一个极小的正则项,比如1e-12,或者直接对特征值做归一化后再算。这个细节文献里很少提,但实际数据里真会遇到。
3.3 MEVARC的门限标定与判决流程
MEVARC的实现分两步:先算相邻特征值间隔和局部方差,再拿判决量和门限比。局部方差我用的是滑动窗口估计,窗口大小取3到5,太小方差估不准,太大又把信号跳变平滑掉了。判决量算出来后,从k=1开始往后扫,第一个超过门限的位置就是估计的源数目。
门限标定我一般这样做:固定阵元数和快拍数,源数目从1到M/2扫一遍,每个源数目生成50组数据,统计不同门限下的正确率,选正确率最高的门限。这个过程可以脚本化,跑一次存成表,以后同配置直接查表。别小看这一步,MEVARC的稳定性很大程度上就靠这个标定。
3.4 对比实验的组织与结果记录
实验组织上,我按“信噪比×快拍数×源数目”三维网格来跑,每个格点重复100次蒙特卡洛,统计每套判据的估计均值、标准差和正确率。结果用表格记录,重点看三个指标:过估计率、欠估计率、完全正确率。
跑完一轮典型配置(M=8,K=2,信噪比从-5dB到20dB,快拍从50到1000),我观察到的规律是:低信噪比小快拍区,AIC过估计明显,MDL欠估计明显,MEVARC介于两者之间但方差大;高信噪比大快拍区,三者都趋于准确,AIC偶尔还会多估一个。这个规律和理论预期一致,说明实现是对的。
4. 常见问题与排查技巧实录
4.1 判据结果跳变不稳定的排查顺序
结果忽大忽小,先查三件事:特征值有没有降序排列、快拍数是否远小于阵元数、随机种子是否固定。这三条占了不稳定问题的八成。排除了之后,再看是不是弱源功率太低导致似然项不突出,这时候换MDL或调MEVARC门限往往能救。
4.2 过估计与欠估计的针对性处理
AIC过估计,最直接的办法是换MDL,或者给AIC的惩罚项加一个经验系数做修正。MDL欠估计,可以适当降低惩罚权重,或者改用AIC交叉验证。MEVARC抖动,回去重新标定门限,别用默认值硬扛。
4.3 常见问题速查表
| 现象 | 可能原因 | 处理办法 |
|---|---|---|
| 三套判据结果都偏大 | 快拍太少或噪声非白 | 增加快拍、检查噪声模型 |
| AIC稳定偏大 | 判据固有倾向 | 换MDL或加惩罚修正 |
| MDL稳定偏小 | 弱源被漏 | 降惩罚权重或换AIC |
| MEVARC结果抖动 | 门限不适配 | 重新标定门限系数 |
| 特征值出现负值 | 数值误差 | 加正则项或归一化 |
最后分享一个我常用的技巧:把三套判据的准则函数曲线画在同一张图上,横轴是k,纵轴是归一化后的准则值。真值附近通常能看到AIC和MDL的极小值点分居两侧,MEVARC的判决点落在中间。这条曲线比单个数字直观得多,调参和排查时看一眼就心里有数。这个习惯帮我省了大量反复试错的时间,你也可以试试。