
简介本资源面向信号处理方向的本科生与硕士生聚焦阵列信号处理中的核心问题——信源数目估计完整实现了AIC、MDL、HQ和EDC四种经典信息论准则算法并提供可直接运行的MATLAB代码及可视化结果。压缩包共6个文件27KB含4幅关键结果图png格式展示不同信噪比或快拍数下的估计性能对比、1个主程序m文件xinyuanshumu_page42.m及1份说明文本readme.txt结构简洁、即下即用。已有254人学习下载适用于课程设计、毕业设计及科研入门阶段对模型选择准则的原理理解与仿真实践。读者可快速复现四种准则在不同参数条件下的估计偏差、稳定性与过估计/欠估计行为掌握信源数估计的评估逻辑与MATLAB实现范式。1. 项目概述从“听声辨位”到“数人头”的信号处理艺术在阵列信号处理这个领域有一个基础但至关重要的问题就像在一场嘈杂的鸡尾酒会上你首先得知道到底有几个人在同时说话才能去分辨他们各自说了什么。这个“数人头”的过程在技术上被称为“信源数目估计”。无论是雷达探测空中多个目标、声纳定位水下舰艇还是无线通信中区分多个用户准确估计信源数目都是后续波达方向估计、信号分离等高级处理步骤的基石。如果连有多少个信号源都搞错了后面的所有分析都将是空中楼阁。今天要深入探讨的正是基于AICAkaike Information Criterion赤池信息准则、MDLMinimum Description Length最小描述长度、HQHannan-Quinn准则和EDCEfficient Detection Criterion有效检测准则这四大经典信息论准则来实现阵列信号的信源数目估计。这四种方法堪称该领域的“四大名捕”它们不直接去“听”信号内容而是通过分析接收数据协方差矩阵的特征值分布以一种优雅的数学方式推断出最有可能的信号源数量。整个项目将围绕如何在MATLAB环境中从理论推导到代码实现完整复现这一过程。对于从事雷达、声纳、通信、语音增强或任何涉及多源信号处理的工程师和研究者来说掌握这套方法就等于握住了打开阵列信号处理大门的钥匙。2. 核心原理特征值舞台上的“侦探游戏”要理解AIC、MDL、HQ、EDC如何工作我们必须先走进它们共同的舞台接收数据协方差矩阵的特征值分解。想象一下我们有一个由M个阵元组成的阵列接收来自K个远场窄带信源的信号KM。在理想情况下如果没有噪声接收数据的协方差矩阵的秩就等于信源数K这意味着它只有K个非零特征值剩下的M-K个特征值都是零。但现实总是充满噪声噪声的存在会让所有特征值都大于零其中对应信号的K个大特征值主特征值会显著大于剩下的M-K个小特征值噪声特征值。于是我们的问题就变成了如何从M个从大到小排列的特征值 λ1 ≥ λ2 ≥ ... ≥ λM 中准确地区分出前K个属于信号的“大值”和后M-K个属于噪声的“小值”AIC、MDL等准则正是这场区分游戏的裁判。它们的基本思想是构建一个关于可能信源数kk0,1,...,M-1的代价函数这个函数由两部分构成一部分是模型拟合数据的似然度拟合优度另一部分是对模型复杂度的惩罚。拟合优度随k增大而改善模型更复杂更能匹配数据但惩罚项也随之增加。准则的目标就是找到使这个代价函数最小的k值作为信源数K的估计。2.1 四大准则的数学面孔令 L(k) 为在假设信源数为k时数据的负对数似然函数与拟合优度相关值越小拟合越好。经过推导对于高斯白噪声背景下的阵列信号模型这个函数可以表示为特征值的几何平均和算术平均的函数。四大准则最终都呈现为如下形式的代价函数J(k) L(k) Penalty(k)其中惩罚项Penalty(k)体现了各准则对模型复杂度的不同容忍度AIC (Akaike Information Criterion):Penalty(k) k * (2M - k)核心思想基于信息论旨在最小化估计模型与真实模型之间的Kullback-Leibler散度。其惩罚项与参数个数成线性关系相对“宽松”。特点在样本数有限时倾向于高估信源数过拟合。因为它对增加模型复杂度的惩罚相对较轻。MDL (Minimum Description Length):Penalty(k) 0.5 * k * (2M - k) * log(N)核心思想源于信息论中的Rissanen的MDL原理认为最好的模型是能以最短编码长度描述数据的模型。惩罚项与样本数N的对数成正比。特点是一致估计量当样本数N趋于无穷时它估计正确的概率趋于1。通常比AIC更保守在高信噪比和大样本下性能优异不易过拟合。HQ (Hannan-Quinn Criterion):Penalty(k) k * (2M - k) * c * log(log(N))其中c为大于1的常数通常取1。核心思想在AIC和BIC贝叶斯信息准则与MDL渐进等价之间寻求折衷。其惩罚项的增长速度介于AIC的常数级和MDL的log(N)级之间。特点也是一致估计量。它的惩罚项增长比MDL慢因此在样本量不是极端大时可能比MDL稍微“敏感”一些但比AIC稳定。EDC (Efficient Detection Criterion):Penalty(k) k * (2M - k) * C(N)其中C(N)是一个满足特定条件的函数常见形式为C(N) N^{-1/2} * log(N)或C(N) log(N)的变体。核心思想由Wax和Kailath提出旨在构建一个对所有信噪比和样本数都保持良好检测性能的通用准则。其惩罚函数的设计更具灵活性。特点通过调整惩罚函数试图在有限样本和低信噪比情况下获得更稳健的表现。性能介于AIC和MDL之间有时能提供更好的折衷。注意以上给出的惩罚项形式是经过化简、在阵列信号数目估计特定问题下的最终表达式。在实际的MATLAB代码中我们计算的是完整的代价函数值。L(k)的具体形式为N * (M-k) * log( G(k) / A(k) )其中G(k)是后M-k个特征值的几何平均A(k)是它们的算术平均。这个比值刻画了噪声特征值的“平坦度”理想噪声特征值相等时比值为1取log后为0。2.2 准则选择的实战考量理解了数学原理在实际项目中如何选择呢这取决于你的具体场景追求理论严谨与大样本性能首选MDL。它是公认的标杆尤其在学术研究和算法对比中。担心漏检对过拟合有一定容忍度可以考虑AIC。在信源信号较弱或样本数很少时AIC可能比MDL更早地“发现”信号但代价是可能有虚警。寻求折衷与稳健性HQ和EDC是很好的选择。特别是在样本量适中、信噪比变化范围大的实际系统中它们往往能提供更稳定可靠的结果。作为性能对比基线通常会将四种方法同时实现在同一组数据上运行直观对比它们在不同信噪比、样本数下的估计结果这本身就是一项非常有价值的工作。3. MATLAB实现全流程拆解理论需要代码来落地。下面我们将一步步拆解如何在MATLAB中实现这个估计器。整个过程可以分为数据生成、特征值提取、准则计算和结果判断四个核心环节。3.1 仿真环境与数据生成首先我们需要一个可控的仿真环境来产生阵列接收数据。clear; clc; close all; % 1. 参数设置 M 8; % 阵列阵元数 K_true 3; % 真实信源数 N 100; % 快拍数样本数 SNR_dB 10; % 信噪比 (dB) theta [-10, 5, 20]; % 三个信源的来波方向度 d_lambda 0.5; % 阵元间距与波长的比值通常取0.5以避免栅瓣 % 2. 生成阵列流型矩阵 A (M x K_true) A zeros(M, K_true); for k 1:K_true A(:, k) exp(1j * 2 * pi * d_lambda * (0:M-1) * sind(theta(k))) / sqrt(M); end % 3. 生成信源信号 S (K_true x N) S (randn(K_true, N) 1j * randn(K_true, N)) / sqrt(2); % 复高斯随机信号 % 4. 生成噪声 V (M x N) noise_power 10^(-SNR_dB/10); % 将信噪比转换为噪声功率假设信号功率归一化为1 V sqrt(noise_power/2) * (randn(M, N) 1j * randn(M, N)); % 5. 生成接收数据 X (M x N) X A * S V;这段代码构建了一个经典的均匀线阵接收模型。A是阵列流型矩阵其每一列代表一个来自特定方向的信源在阵列上的响应。S是信源发出的信号我们假设它们是彼此不相关的复高斯随机过程。V是加性高斯白噪声。最终得到的X就是我们的仿真接收数据。实操心得在生成信号和噪声时我们进行了归一化/sqrt(2)这是因为randn生成的是功率为1的实高斯随机变量对于复信号x a jb其功率为E[|x|^2] E[a^2] E[b^2] 112。除以sqrt(2)后复信号的功率被归一化为1。这样设置使得信噪比SNR的定义非常清晰SNR 信号功率 / 噪声功率其中信号功率隐含为1噪声功率由noise_power变量控制。3.2 核心计算特征值分解与准则实现这是算法的核心。我们需要计算采样协方差矩阵并进行特征值分解。% 6. 计算采样协方差矩阵 R_hat (M x M) R_hat (X * X) / N; % 最大似然估计 % 7. 特征值分解 lambda eig(R_hat); % 获取特征值 lambda sort(lambda, descend); % 降序排列λ1 λ2 ... λM % 8. 初始化准则函数值数组 K_candidate 0:M-1; % 可能的信源数候选从0到M-1 num_candidate length(K_candidate); AIC_val zeros(1, num_candidate); MDL_val zeros(1, num_candidate); HQ_val zeros(1, num_candidate); EDC_val zeros(1, num_candidate); % 9. 循环计算每个候选k对应的准则值 for idx 1:num_candidate k K_candidate(idx); % 计算后 (M-k) 个特征值假设为噪声特征值 noise_lambda lambda(k1:end); % 计算几何平均 (Geometric Mean) 和算术平均 (Arithmetic Mean) % 为防止数值下溢通常对几何平均取对数计算 L M - k; % 噪声特征值的个数 if L 0 log_geo_mean sum(log(noise_lambda)) / L; arith_mean mean(noise_lambda); % 计算负对数似然项 L(k) (忽略常数项) L_k N * L * log(arith_mean) - N * sum(log(noise_lambda)); % 等价于 N*L*log(arith_mean/geo_mean) % 注意有些文献公式是 N*L*log( arith_mean / geo_mean )这里展开计算避免除零。 % 计算惩罚项 penalty_param k * (2*M - k); % 惩罚项中的公共参数 % AIC AIC_val(idx) L_k penalty_param; % MDL MDL_val(idx) L_k 0.5 * penalty_param * log(N); % HQ HQ_val(idx) L_k penalty_param * log(log(N)); % c取1 % EDC (采用一种常见形式: penalty 0.5 * penalty_param * sqrt(N) * log(N) ) % 注意EDC形式多样这里选择一种性能较好的。你可以尝试其他形式如 penalty_param * sqrt(N)。 EDC_val(idx) L_k 0.5 * penalty_param * sqrt(N) * log(N); else % 当kM时L0似然项无定义赋予一个极大值 AIC_val(idx) inf; MDL_val(idx) inf; HQ_val(idx) inf; EDC_val(idx) inf; end end % 10. 估计信源数找到准则函数最小值对应的k [~, idx_aic] min(AIC_val); [~, idx_mdl] min(MDL_val); [~, idx_hq] min(HQ_val); [~, idx_edc] min(EDC_val); K_est_AIC K_candidate(idx_aic); K_est_MDL K_candidate(idx_mdl); K_est_HQ K_candidate(idx_hq); K_est_EDC K_candidate(idx_edc); fprintf(真实信源数: %d\n, K_true); fprintf(AIC 估计结果: %d\n, K_est_AIC); fprintf(MDL 估计结果: %d\n, K_est_MDL); fprintf(HQ 估计结果: %d\n, K_est_HQ); fprintf(EDC 估计结果: %d\n, K_est_EDC);3.3 结果可视化与特征值观察为了更直观地理解算法为何能工作可视化特征值和准则函数曲线至关重要。% 11. 可视化 figure(Position, [100, 100, 1200, 800]); % 子图1特征值分布图 subplot(2, 3, 1); stem(1:M, lambda, filled, LineWidth, 1.5); xlabel(特征值序号); ylabel(特征值大小); title(采样协方差矩阵特征值分布); grid on; hold on; plot([K_true0.5, K_true0.5], ylim, r--, LineWidth, 2); legend(特征值, 真实信源数位置, Location, best); hold off; % 子图2AIC准则曲线 subplot(2, 3, 2); plot(K_candidate, AIC_val, b-o, LineWidth, 1.5, MarkerFaceColor, b); xlabel(假设信源数 k); ylabel(AIC(k)); title([AIC准则 (估计K, num2str(K_est_AIC), )]); grid on; hold on; plot(K_est_AIC, AIC_val(idx_aic), rs, MarkerSize, 10, LineWidth, 2); hold off; % 子图3MDL准则曲线 subplot(2, 3, 3); plot(K_candidate, MDL_val, r-s, LineWidth, 1.5, MarkerFaceColor, r); xlabel(假设信源数 k); ylabel(MDL(k)); title([MDL准则 (估计K, num2str(K_est_MDL), )]); grid on; hold on; plot(K_est_MDL, MDL_val(idx_mdl), bd, MarkerSize, 10, LineWidth, 2); hold off; % 子图4HQ准则曲线 subplot(2, 3, 4); plot(K_candidate, HQ_val, g-^, LineWidth, 1.5, MarkerFaceColor, g); xlabel(假设信源数 k); ylabel(HQ(k)); title([HQ准则 (估计K, num2str(K_est_HQ), )]); grid on; hold on; plot(K_est_HQ, HQ_val(idx_hq), mo, MarkerSize, 10, LineWidth, 2); hold off; % 子图5EDC准则曲线 subplot(2, 3, 5); plot(K_candidate, EDC_val, m-d, LineWidth, 1.5, MarkerFaceColor, m); xlabel(假设信源数 k); ylabel(EDC(k)); title([EDC准则 (估计K, num2str(K_est_EDC), )]); grid on; hold on; plot(K_est_EDC, EDC_val(idx_edc), k*, MarkerSize, 10, LineWidth, 2); hold off; % 子图6四种准则对比归一化后 subplot(2, 3, 6); % 归一化以便在同一尺度下比较 AIC_norm (AIC_val - min(AIC_val)) / (max(AIC_val) - min(AIC_val) eps); MDL_norm (MDL_val - min(MDL_val)) / (max(MDL_val) - min(MDL_val) eps); HQ_norm (HQ_val - min(HQ_val)) / (max(HQ_val) - min(HQ_val) eps); EDC_norm (EDC_val - min(EDC_val)) / (max(EDC_val) - min(EDC_val) eps); plot(K_candidate, AIC_norm, b-o, LineWidth, 1.5); hold on; plot(K_candidate, MDL_norm, r-s, LineWidth, 1.5); plot(K_candidate, HQ_norm, g-^, LineWidth, 1.5); plot(K_candidate, EDC_norm, m-d, LineWidth, 1.5); xlabel(假设信源数 k); ylabel(归一化准则值); title(四种准则函数对比 (归一化)); legend(AIC, MDL, HQ, EDC, Location, best); grid on; hold off;运行这段代码你会得到一系列图表。特征值分布图能清晰显示前K_true个“大”特征值和后面“小”特征值之间的落差。各个准则函数曲线则会呈现出一个典型的“先下降后上升”或达到平台期的趋势其最小值点对应的k就是估计的信源数。对比图能让你一目了然地看到不同准则在相同数据下的决策差异。4. 性能评估与关键参数影响分析一个算法实现出来更关键的是要知道它在什么情况下好用什么情况下会“失灵”。我们需要系统地评估AIC、MDL、HQ、EDC的性能。4.1 蒙特卡洛仿真统计正确估计概率单次运行有随机性我们需要进行大量重复实验来统计性能。通常使用正确估计概率作为衡量标准。% 蒙特卡洛仿真参数 MC_trials 1000; % 蒙特卡洛实验次数 SNR_range -10:2:20; % 信噪比扫描范围 (dB) N_range [50, 100, 200, 500]; % 快拍数扫描范围 K_true 3; M 8; % 初始化结果存储矩阵 % 维度: (SNR个数) x (快拍数种类) x (准则种类) P_correct_AIC zeros(length(SNR_range), length(N_range)); P_correct_MDL zeros(length(SNR_range), length(N_range)); P_correct_HQ zeros(length(SNR_range), length(N_range)); P_correct_EDC zeros(length(SNR_range), length(N_range)); for i_snr 1:length(SNR_range) SNR_dB SNR_range(i_snr); for i_n 1:length(N_range) N N_range(i_n); count_correct_AIC 0; count_correct_MDL 0; count_correct_HQ 0; count_correct_EDC 0; parfor mc 1:MC_trials % 使用parfor并行加速计算 % 每次实验重新生成数据 theta sort(rand(1, K_true)*60 - 30); % 随机生成角度在-30到30度之间 A exp(1j * pi * (0:M-1) * sind(theta)); % d_lambda0.5 S (randn(K_true, N) 1j * randn(K_true, N)) / sqrt(2); noise_power 10^(-SNR_dB/10); V sqrt(noise_power/2) * (randn(M, N) 1j * randn(M, N)); X A * S V; % 计算协方差矩阵和特征值 R_hat (X * X) / N; lambda eig(R_hat); lambda sort(lambda, descend); % 计算准则函数此处可调用一个封装好的函数代码略 [K_est_AIC, K_est_MDL, K_est_HQ, K_est_EDC] estimate_source_number(lambda, M, N); % 统计正确次数 if K_est_AIC K_true count_correct_AIC count_correct_AIC 1; end if K_est_MDL K_true count_correct_MDL count_correct_MDL 1; end if K_est_HQ K_true count_correct_HQ count_correct_HQ 1; end if K_est_EDC K_true count_correct_EDC count_correct_EDC 1; end end % 计算正确概率 P_correct_AIC(i_snr, i_n) count_correct_AIC / MC_trials; P_correct_MDL(i_snr, i_n) count_correct_MDL / MC_trials; P_correct_HQ(i_snr, i_n) count_correct_HQ / MC_trials; P_correct_EDC(i_snr, i_n) count_correct_EDC / MC_trials; end end % 可视化性能曲面或曲线 figure; for i_n 1:length(N_range) subplot(2, 2, i_n); plot(SNR_range, P_correct_AIC(:, i_n), b-o, LineWidth, 1.5); hold on; plot(SNR_range, P_correct_MDL(:, i_n), r-s, LineWidth, 1.5); plot(SNR_range, P_correct_HQ(:, i_n), g-^, LineWidth, 1.5); plot(SNR_range, P_correct_EDC(:, i_n), m-d, LineWidth, 1.5); xlabel(SNR (dB)); ylabel(正确估计概率); title([快拍数 N , num2str(N_range(i_n))]); legend(AIC, MDL, HQ, EDC, Location, southeast); grid on; ylim([0, 1.05]); end4.2 关键影响因素与性能规律通过大量的仿真我们可以总结出以下规律这也是在实际应用中调参和选型的依据影响因素对AIC/MDL/HQ/EDC性能的影响原因与解释信噪比 (SNR)决定性因素。SNR越高所有方法的正确估计概率越高。低SNR下信号特征值与噪声特征值差异小难以区分。MDL、HQ、EDC在低SNR下通常比AIC更稳健不易过估。高SNR使得信号子空间对应的特征值“凸起”更明显与噪声子空间的界限更清晰。快拍数 (N)极其重要。N越大采样协方差矩阵R_hat越接近真实协方差矩阵R特征值估计越准确。MDL的一致性要求大样本N较小时性能下降明显。AIC受N影响相对小但小样本下过估更严重。大样本下噪声特征值的估计更集中于真实噪声功率方差变小更容易与信号特征值分离。阵元数 (M)提供自由度。M越大可估计的信源数上限越高KM同时噪声子空间维度越大统计特性越好。但M增大会增加计算量。更多的阵元提供了更多的观测数据提高了空间分辨力和估计的稳定性。信源数 (K_true)问题本身的难度。K_true越接近M估计越困难。信源间相关性越强估计也越困难本仿真假设信源不相关。当K_true很大时信号子空间和噪声子空间都变得“拥挤”特征值差异变小。相关信源会导致信号子空间“坍缩”有效秩降低。信源角度间隔影响可分辨性。角度间隔小于阵列瑞利限时两个信源在特征值上可能表现为一个“合并”的大特征值导致低估。角度间隔小意味着阵列流型向量相关性高信号子空间几乎重叠从数据中难以区分出两个独立的信源。注意事项蒙特卡洛仿真非常耗时尤其是当MC_trials很大时。务必使用MATLAB的并行计算工具箱parfor来加速。同时注意内存使用避免在循环中存储不必要的大矩阵。5. 高级话题与实战扩展掌握了基础实现和性能评估后我们可以探讨一些更深入的问题和实际应用中常见的扩展。5.1 特征值阈值法与信息论准则法的对比除了AIC/MDL这类信息论准则还有一种更直观的方法特征值阈值法。其思想是直接设定一个阈值η将大于η的特征值判为信号反之判为噪声。% 特征值阈值法示例 lambda ... % 已排序的特征值 % 方法1固定阈值 (需要先验知识不实用) % threshold 1.5 * mean(lambda); % 例如阈值设为所有特征值均值的1.5倍 % 方法2基于特征值间隙 (Eigenvalue Gap) gap -diff(lambda); % 计算相邻特征值之差负差分 [~, idx_gap] max(gap(1:end-1)); % 找到最大的gap通常发生在信号与噪声交界处 K_est_gap idx_gap; % 方法3基于AIC/MDL思想的自动化阈值 (更稳健) % 可以遍历所有可能的k计算噪声特征值的方差或波动性选择一个突变点。阈值法简单快速但阈值η的选择非常关键且通常依赖于信噪比等先验信息自适应性差。信息论准则法的优势在于其完全基于数据驱动无需手动设置阈值理论更完备。5.2 相干/相关信源情况下的处理前面的讨论都基于信源信号彼此不相关的假设。但在多径传播等场景中信源可能是相干的完全相关或高度相关的。这会严重破坏子空间方法包括AIC/MDL的基础导致信号子空间“维数坍缩”特征值分布发生畸变使得估计结果严重偏低。解决方法通常包括空间平滑技术将均匀线阵划分为重叠的子阵列对子阵列的协方差矩阵进行平均可以解相关。这需要在数据预处理阶段完成。使用修正的准则有些研究提出了针对相关信源的修正MDL准则但通用性和稳健性有待考究。转向其他方法在强相关环境下基于信息论准则的特征值方法可能不是最佳选择需要考虑基于盖尔圆定理、矩阵分解等其他方法。5.3 实际工程中的技巧与陷阱采样协方差矩阵的估计R_hat X*X/N是最常用的估计。但当快拍数N非常少与阵元数M相当时R_hat可能是病态的奇异或接近奇异。此时特征值分解结果不可靠。可以考虑使用对角加载技术R_tilde R_hat sigma^2 * eye(M)其中sigma^2是一个小的正数用于改善矩阵的条件数。特征值计算稳定性对于大型矩阵直接使用eig()函数可能效率较低且数值稳定性一般。对于协方差矩阵这类埃尔米特正定矩阵使用svd()函数对数据矩阵X进行奇异值分解是更数值稳定的方法因为X的奇异值的平方就是R_hat的特征值除以N。复数数据处理阵列信号通常是复数的。确保你的所有运算特征值分解、矩阵乘法都支持复数。MATLAB的eig()和svd()函数天然支持复数。结果的后处理与确认有时准则函数可能会出现多个局部极小值或者最小值出现在边界k0或kM-1。需要结合先验知识进行判断。例如在雷达中信源数不可能为0在通信中用户数通常远小于天线数。可以设置一个合理的上下限。6. 从仿真到实战代码封装与集成建议为了将这套方法用于实际项目或研究良好的代码封装至关重要。6.1 函数封装示例function [K_est, criteria_vals] estimate_source_number_info_criteria(X, method) % ESTIMATE_SOURCE_NUMBER_INFO_CRITERIA 基于信息论准则估计信源数目 % 输入: % X - M x N 的接收数据矩阵 (M: 阵元数, N: 快拍数) % method - 字符串指定准则AIC, MDL, HQ, EDC, 或 ALL % 输出: % K_est - 估计的信源数目。如果methodALL则返回一个1x4向量 [K_aic, K_mdl, K_hq, K_edc] % criteria_vals - 准则函数值向量或矩阵如果methodALL [M, N] size(X); % 计算采样协方差矩阵 R_hat (X * X) / N; % 使用SVD更稳定lambda svd(X, econ).^2 / N; [~, S, ~] svd(X, econ); lambda diag(S).^2 / N; lambda sort(lambda, descend); K_candidate 0:M-1; num_cand length(K_candidate); % 预分配 if strcmp(method, ALL) criteria_vals zeros(4, num_cand); K_est zeros(1, 4); else criteria_vals zeros(1, num_cand); K_est 0; end for idx 1:num_cand k K_candidate(idx); L M - k; if L 0 noise_lambda lambda(k1:end); log_geo_mean sum(log(noise_lambda)) / L; arith_mean mean(noise_lambda); L_k N * L * log(arith_mean) - N * sum(log(noise_lambda)); % 负对数似然项 penalty_param k * (2*M - k); if strcmp(method, ALL) || strcmp(method, AIC) criteria_vals(1, idx) L_k penalty_param; end if strcmp(method, ALL) || strcmp(method, MDL) criteria_vals(2, idx) L_k 0.5 * penalty_param * log(N); end if strcmp(method, ALL) || strcmp(method, HQ) criteria_vals(3, idx) L_k penalty_param * log(log(N)); end if strcmp(method, ALL) || strcmp(method, EDC) % 这里EDC采用另一种常见形式penalty_param * sqrt(N) criteria_vals(4, idx) L_k penalty_param * sqrt(N); end else % k M 的情况 if strcmp(method, ALL) criteria_vals(:, idx) inf; else criteria_vals(idx) inf; end end end % 找出最小值 if strcmp(method, ALL) [~, idx_min] min(criteria_vals, [], 2); K_est K_candidate(idx_min); else [~, idx_min] min(criteria_vals); K_est K_candidate(idx_min); end end6.2 集成到信号处理链路在实际的雷达或通信系统中信源数目估计模块通常位于信号处理链的前端原始ADC数据 - 脉冲压缩/滤波 - 数据矩阵X - 信源数目估计 - 波达方向估计/波束成形 - 目标跟踪/信号解调你需要考虑实时性要求。对于快拍数N较大的情况协方差矩阵计算和特征值分解是主要计算负担。如果系统要求高实时性可能需要使用滑动窗或递归更新的方式更新协方差矩阵R_hat而不是每次都重新计算。研究快速特征值分解或子空间跟踪算法如PASTd算法避免每次完整的特征值分解。在硬件上考虑使用FPGA或GPU加速矩阵运算。信源数目估计的准确性直接影响到后续DOA估计的性能。一个常见的做法是将AIC/MDL的估计结果作为一个初始值或参考再结合其他先验信息如目标运动连续性、跟踪门限进行综合判断以提高整个系统的鲁棒性。例如在雷达系统中如果连续多帧估计的信源数稳定在某个值附近那么这个结果就比单帧结果更可信。本文还有配套的精品资源点击获取