☰
频谱感知算法性能分析:能量检测、匹配滤波与循环平稳特征检测对比
2026/10/18 12:37:41 网站建设 项目流程

简介:面向无线通信与认知无线电领域的学习者和研究者,资源包聚焦能量检测、匹配滤波检测与循环平稳特征检测三种传统频谱感知算法,通过Matlab仿真对比不同信噪比下的检测性能。内含3个m脚本文件,整体仅3KB,分别是能量检测、匹配滤波和循环平稳特征检测的实现代码,结构清晰、便于直接运行与二次修改。已有723人学习下载。借助该资源,读者可直观观察误检率与漏检率随SNR变化的趋势,深入理解各算法的适用场景:能量检测简单通用但低信噪比下性能受限,匹配滤波检测精度高但依赖信号先验信息,循环平稳特征检测擅长识别周期信号但计算量较大。可满足课程实验、课题研究或毕业设计的算法对比需求,对于算法选型与系统设计具有实用参考价值。

1. 传统频谱感知算法性能分析:先搞清这套分析在解决什么问题

做信号检测的人第一次接触“频谱感知算法性能分析”这类项目,最容易犯的错就是把三种算法丢进同一个仿真里直接对比检测概率曲线。结果往往是:能量检测在 -10dB 就掉头向下,匹配滤波一路高挺,循环平稳特征检测的曲线波动得看不懂,最后谁也说不出结论。这个标题真正的重点是“性能分析”四个字——不是比谁检测得漂亮,而是把信号模型、判决门限、虚警概率、检测概率、蒙特卡洛统计这五件事做成一套能交代清楚、能复现的流程。适合谁:做认知无线电基带验证、电磁环境监测、以及拿信号检测算法做课题的从业者和学生,还有那些想给算法结论配上完整置信区间的同学。

2. 性能评估框架先立住:从二元假设检验到四组核心指标

2.1 二元假设检验:把“有没有信号”写成两个概率

频谱感知的本质是在一个频段上回答“现在有没有信号占用”。工程上这件事被写成二元假设检验,两个假设分别是:

  • H0:接收到的只有噪声,r[n] = w[n]
  • H1:接收到信号叠加噪声,r[n] = s[n] + w[n]

这里的 r[n] 是复基带采样序列,n = 1, 2, …, N,N 就是一次检测使用的样本块长;w[n] 是复高斯白噪声,实部虚部独立同分布。整篇性能分析的所有工作,都是在给定观测 r[n] 的情况下,设计一个判决规则,把观测划到 H0 或 H1 里去。

判决规则通常归结为一个标量检验统计量 T(r) 和一条判决门限 λ:T 超过 λ 判 H1,否则判 H0。于是“性能好不好”完全由两类错误概率决定。第一类是虚警概率 Pfa,含义是明明只有噪声,却误判成有信号;第二类是漏检概率,含义是信号明明在,却没认出来,它的互补量就是检测概率 Pd。任何传统频谱感知算法,最终要交代的都是这三个数字:T 怎么算、λ 怎么定、对应什么水平的 Pfa 和 Pd。

这里要强调一个选型逻辑:传统频谱感知几乎清一色采用 Neyman-Pearson 准则,也就是先给定 Pfa 的上限,再去最大化 Pd。原因很实际——在电磁环境里,信号出现的先验概率和“漏检一次”的代价都难以量化,贝叶斯准则需要的风险函数根本凑不齐,NP 准则只需要你明确“我能容忍虚警多少”,工程上天然可操作。所以后面所有门限公式,都是从“固定 Pfa”这个出发点反推出来的。

2.2 四组核心性能指标:Pd、Pfa、ROC 与检测灵敏度

做性能分析时,我不会只看某个信噪比下的单个检测概率,那样得出的结论没有迁移性。一套完整的传统频谱感知性能分析,至少要输出四组量。

第一组是检测概率 Pd 随信噪比变化的曲线,信噪比从高往低扫,Pd 从 1 掉到接近 Pfa,这条曲线直接给出算法的“工作底限”。第二组是虚警概率 Pfa,必须单独统计,而且要和预设的目标值对得上——如果你预设 Pfa=0.1,仿真统计出来的 Pfa 是 0.15,说明门限推导或者蒙特卡洛实现有问题,整个结果都不可信。第三组是 ROC 曲线,横轴 Pfa、纵轴 Pd,一条曲线描绘在固定信噪比下“放宽虚警能换来多少检测增益”,这是三套算法做公平比较的标准画法。第四组是检测灵敏度,定义为在给定工作点(比如 Pfa≤0.1、Pd≥0.9)下所需的最低信噪比,它是比“某点 Pd”更凝练的算法名片。

除了这四组,我一般会把单次检测的计算复杂度也列进去。原因很直接:循环平稳特征检测的灵敏度往往比能量检测好,但是计算量可能大一两个数量级;如果目标是放在低功耗传感器节点上,再好的灵敏度也用不了。复杂度虽然不影响曲线绘制,但它决定了一个算法“值不值得用”,性能分析报告里必须有它的位置。

2.3 仿真参数清单:锁死采样率、块长与 SNR 口径

性能分析里超过一半的分歧,最后都查到参数口径不统一。我做过一次对比,同一套能量检测代码,有人用符号信噪比 Es/N0,有人用带内总信噪比,有人用每个样本的信噪比,三个口径下“能工作的最低信噪比”可以差出 3~6dB。所以在写任何代码之前,先把参数清单钉死。

参数建议初始值备注
调制方式QPSKBPSK 也可以,循环平稳检测的谱线会更强
过采样因子 os4升余弦脉冲成型必须过采样
符号块长 Msym256对应检测块长 N = os × Msym = 1024
脉冲成型滚降系数0.35影响带宽占用,不影响算法对比
信噪比口径Es/N0符号级,复噪声 E|w|² = N0
信噪比扫描范围-20dB ~ -2dB覆盖三种算法的工作区间
蒙特卡洛次数10000 次/点Pfa 低时必须加大,见避坑章
随机种子固定结果可复现,这是最低要求

按上面的口径,符号信噪比 Es/N0 和复噪声方差的关系是:先生成归一化信号 s_norm,使其平均功率为 1,那么给定 SNR_db 时,噪声方差 sigma2 = 10^(SNR_db/10) 的倒数。生成复噪声时,实部虚部分别用方差 sigma2/2。这个约定我建议直接写进代码头,避免后面自己都忘了。

下面是信号生成的参考实现,它生成一段带升余弦成形的 QPSK 复基带信号,并归一化到单位平均功率:

% gen_qpsk_signal.m % 生成QPSK复基带信号,升余弦脉冲成型,输出功率归一到1 function [s_norm, params] = gen_qpsk_signal(Msym, os, rolloff) Rs = 1; % 符号速率,归一化为1 fs = os * Rs; % 采样率 = os × Rs data = randi([0 3], 1, Msym); % 随机QPSK符号 syms = exp(1j*pi/4 + 1j*(pi/2)*data); % QPSK星座映射 rrc = rcosdesign(rolloff, 6, os); % 升余弦滤波器,跨度6符号 s_tx = upfirdn(syms, rrc, os); % 过采样脉冲成型 s_tx = s_tx(1 : os*Msym); % 截断到整块长度 s_norm = s_tx / sqrt(mean(abs(s_tx).^2)); % 功率归一化 params = struct('fs', fs, 'Rs', Rs, 'os', os, 'Msym', Msym); end

这段代码里 rcosdesign 和 upfirdn 依赖通信工具箱,如果环境里没装,手动生成 RRC 滤波器系数再卷积也能达到同样效果,不影响后续性能分析。功率归一化是关键一步:它把“信号功率”从具体幅度里抽离出来,后续加噪声只需要按 SNR 换算 sigma2,所有算法在同一个功率基准上比较。

3. 三大传统算法怎么对比:能量检测、匹配滤波与循环平稳特征检测

3.1 能量检测:免先验、低复杂度的主力

能量检测的原理一句话就能说清:信号加噪声的平均能量,比纯噪声的平均能量高,所以拿样本平均能量当统计量。它最大的价值是不需要知道信号长什么样——不需要载波频率准确值,不需要符号速率,不需要调制方式,只需要一个噪声方差估计。这使它成为频谱感知里最“皮实”的算法,也是几乎所有性能分析的基准线。

统计量和门限的实现在 MATLAB 里非常短:

% ed_detector.m % 能量检测:统计量 = 样本平均能量,门限由Pfa和高斯近似推出 function [T, th] = ed_detector(r, sigma2, Pfa) N = length(r); T = sum(abs(r).^2) / N; % 检验统计量 q_inv = sqrt(2) * erfinv(1 - 2*Pfa); % 标准正态分位数 Q^{-1}(Pfa) th = sigma2 * (1 + q_inv * sqrt(2/N)); % 判决门限 end

这里的门限来源值得说透:在 H0 下,T 的分布近似为均值 sigma2、标准差 sigma2·sqrt(2/N) 的高斯分布,因此要保证 Pfa 不超过目标值,门限就得放在均值右边 Q^{-1}(Pfa) 个标准差的位置。erfinv 是 MATLAB 自带的误差函数逆,不需要额外工具箱;q_inv 就是标准正态分布的右尾分位数,例如 Pfa=0.1 时 q_inv≈1.28,Pfa=0.01 时约 2.33。

使用这个函数时要注意两个参数:sigma2 必须是复噪声的总方差 E|w|²,而不是实部或虚部单维的方差;N 是一次判决的样本块长。高斯近似在 N 比较小时会偏乐观,经验上 N≥256 才建议直接用这个闭式门限。块长 N 越大,标准差项 sqrt(2/N) 越小,相同 Pfa 下门限越靠近噪声均值,算法对弱信号的灵敏度就越高——代价是检测占用的时间变长。

能量检测的优点是复杂度只有 O(N),实现三行,工程部署成本极低。缺点也明确:它对噪声方差估计误差非常敏感,噪声功率估计偏大 1dB,门限就跟着偏,实际 Pd 可能掉十几个百分点。这个特性在后面避坑章节还要专门展开。

3.2 匹配滤波:理论最优,但先验条件苛刻

匹配滤波的原理是:如果接收端知道发射波形的完整形状,最合理的做法就是把接收信号和已知波形做相关,把能量“挤”到相干积累上。在已知波形、相位、定时的前提下,匹配滤波是 Neyman-Pearson 意义下的最优检测器——没有任何算法能在相同 Pfa 下给出更高的 Pd,所以它的性能曲线通常被当作整个频谱感知问题的理论上界。

实现上它也是一个简短函数:

% mf_detector.m % 匹配滤波:已知参考波形,相关积累后取模平方 function [T, th] = mf_detector(r, s_ref, sigma2, Pfa) N = length(r); % 相关积累除以sqrt(N),使H0下统计量均值等于sigma2 c = sum(r .* conj(s_ref)) / sqrt(N); T = abs(c)^2; % 相关能量作为统计量 th = -sigma2 * log(Pfa); % H0下指数分布的精确门限 end

s_ref 是归一化平均功率为 1 的参考波形。这个归一化为什么重要:在 H0 下,c 是复高斯量,E|c|² = sigma2,所以 |c|² 服从均值为 sigma2 的指数分布,门限就有了精确闭式解 th = -sigma2·ln(Pfa),不需要像能量检测那样依赖高斯近似。在 H1 下,均值变成 N·Es + sigma2,即每样本相关积累带来了 N 倍的信噪比增益。正是这个 N 倍增益,让匹配滤波在低信噪比区域的曲线明显优于能量检测。

把匹配滤波用对地方有三个前提:参考波形必须和发射波形一致,采样定时要对齐到符号点,残余载波频偏要小到相关峰不会明显展宽。任何一个条件不满足,增益都会缩水,典型场景里频偏 0.1% 符号速率时,Pd 就可能从 0.95 掉到 0.8 以下。所以我在性能分析里把匹配滤波的曲线标注为“理想上界”,并额外加一条带频偏失配的曲线,否则报告会给人误导性结论。

3.3 循环平稳特征检测:抗噪声不确定性的偏门武器

循环平稳特征检测的思路和前面两个完全不同:通信信号因为带有载波、符号速率这些周期性结构,其统计特性随时间呈周期性变化;而平稳噪声没有这个性质。算法就在这些周期性上做文章,最直观、最容易复现的工程实现是“平方谱线法”——对 BPSK/QPSK 这类信号做平方运算后,会在两倍符号速率处产生离散谱线,噪声平方后只有平坦谱底,两者天然可分。

% squaring_detector.m % 循环平稳检测:平方后在符号速率处找离散谱线 function T = squaring_detector(r, Rs, fs) y = r.^2; % 平方产生循环谱线 N = length(y); bin = round(Rs/fs * N) + 1; % 循环频率 Rs 对应的FFT bin win = hann(N).'; % 加窗抑制谱泄漏 Y = fft(y .* win) / sum(win); % 加权FFT T = abs(Y(bin)); % 谱线幅度作为统计量 end

这个统计量在 H0 下只有随机起伏的谱底,在 H1 下会出现一个明显尖峰。它的门限不像前两个算法有干净的闭式解——因为平方运算改变了噪声分布,谱底的统计特性取决于窗函数和块长。常见做法是预先采集一段纯噪声样本,统计谱线幅度的均值和标准差,再用“均值 + 3~4 倍标准差”标定门限。这也是循环平稳检测在工程上比前两者麻烦的地方。

它的优势体现在噪声功率不确定的场景:能量检测对噪声方差估计误差敏感,循环平稳检测只关心某个循环频率处有没有谱线,噪声功率整体变化并不会直接改变谱底形状,所以同样在噪声不确定性 1~2dB 的场景下,循环平稳特征检测能比能量检测多扛住约 3~5dB 的信噪比恶化。代价是计算量大,FFT 加上前期的分段处理,复杂度明显高于能量检测;而且它需要知道符号速率 Rs——不知道就得先做参数估计,又是一层成本。

3.4 三算法的适用边界对比

算法所需先验抗噪声不确定性复杂度典型灵敏度区间(N=1024)工程定位
能量检测仅噪声方差差O(N)-12 ~ -6dB频谱感知的默认选择
匹配滤波完整波形、定时、频偏中等O(N)-18 ~ -12dB性能上界,用于对照
循环平稳特征检测符号速率好O(N log N) 以上-15 ~ -8dB噪声环境复杂时的加强方案

这个表是我个人经验的汇总,具体数字会随块长、Pfa、脉冲成型参数浮动,但相对关系是稳定的:匹配滤波最好,循环平稳次之,能量检测最差;反过来看鲁棒性和实现成本,顺序完全颠倒。性能分析的价值正在这里——不只看谁曲线高,还要看谁在非理想条件下衰减得慢,谁在目标硬件上跑得动。

4. 蒙特卡洛跑性能:门限推导、主循环与 ROC 绘制

4.1 判决门限推导:从 Neyman-Pearson 准则到闭式公式

门限推导是性能分析里最核心的数学环节,也是很多人当成玄学跳过去的地方。实际上推导的逻辑链很短:先写出统计量在 H0 下的分布,再解“Pfa ≤ 目标值”这个不等式,反解出门限。以能量检测为例,H0 下 T 近似服从高斯分布,所以门限写成:

λ = sigma2 × (1 + Q^{-1}(Pfa) × sqrt(2/N))

对应的检测概率闭式公式是:

Pd = Q((λ/sigma2 - (1+SNR_lin)) / ((1+SNR_lin)×sqrt(2/N)))

其中 SNR_lin 是线性域符号信噪比,Q 是标准正态右尾函数。这两个公式看起来不起眼,却是整篇性能分析承上启下的关键:它们给出了一个不需要跑仿真就能画出的“解析期望值”,蒙特卡洛的结果必须落在这条线上附近才说明实现正确。我一般把这两个公式直接写进主循环里,让理论线和仿真线同时画出来,一旦偏差超过 0.02,先怀疑代码而不是先怀疑算法。

4.2 蒙特卡洛主循环:一次仿真得到 Pd 与 Pfa

蒙特卡洛的思路是大量重复随机试验,用频率估计概率。下面这段代码是能量检测 Pd vs SNR 的主循环,三算法的结构完全相同,只是替换统计量和门限:

% mc_energy.m % 能量检测蒙特卡洛:扫SNR,统计Pd和Pfa clear; rng(2024); % 固定随机种子,保证可复现 M = 10000; % 每个SNR点试验次数 N = 1024; % 检测块长 Pfa_target = 0.1; % 目标虚警率 snr_db = -20:2:-4; % 符号信噪比扫描 [s_norm, ~] = gen_qpsk_signal(256, 4, 0.35); % 归一化信号 for s = 1:length(snr_db) sigma2 = 1 / (10^(snr_db(s)/10)); % 按Es/N0换算噪声方差 [~, th] = ed_detector(zeros(1,N), sigma2, Pfa_target); % 理论门限 det_cnt = 0; fa_cnt = 0; half = M/2; for m = 1:M w = sqrt(sigma2/2) .* (randn(1,N) + 1j*randn(1,N)); if m <= half r = s_norm + w; % H1:信号加噪声 else r = w; % H0:纯噪声 end T = sum(abs(r).^2) / N; if T > th if m <= half, det_cnt = det_cnt + 1; else, fa_cnt = fa_cnt + 1; end end end pd_sim(s) = det_cnt / half; pf_sim(s) = fa_cnt / half; end

这段代码有几个值得说明的工程细节。首先是噪声生成:sigma2 是复噪声总方差,实部虚部各分一半,这是复基带仿真的标准约定,少除一个 2 会让实际 SNR 比标注高 3dB。其次是 M/2 的分配方式:一半试验用于统计 Pd,一半用于统计 Pfa,二者共享同一个门限,保证统计口径一致。最后是门限计算用的理论公式,而不是用样本估计噪声方差——这一步是为了验证算法实现;等到做工程性能评估时,再换成由纯净频段估计出的噪声功率,对比两条曲线的差距。

运行这段代码,9 个 SNR 点共 9 万次试验,每试验 1024 个样本,MATLAB 里单核大约几十秒到一两分钟,是可以接受的范围。如果嫌慢,可以把内层循环改成向量化批量生成噪声矩阵,代价是内存占用变大,我通常先按循环写通逻辑,再按需优化。

4.3 画 ROC 曲线的正确姿势:先收集统计量,再扫描门限

ROC 曲线是算法对比的“标准赛场”,但它有一个容易踩的效率坑:如果每个门限值都重新跑一遍 M 次蒙特卡洛,那 200 个门限就要跑 200M 次试验,完全没有必要。正确做法是只生成一次 H0 和 H1 的观测,把对应的统计量全部存下来,然后对门限做扫描,用向量比较统计检测次数。

% roc_energy.m % ROC曲线:先收集统计量,再对门限网格扫描 clear; rng(7); M = 5000; half = M/2; N = 1024; snr_db = -10; % 固定信噪比画一条ROC sigma2 = 1 / (10^(snr_db/10)); [s_norm, ~] = gen_qpsk_signal(256, 4, 0.35); T1 = zeros(1, half); T0 = zeros(1, half); for m = 1:half w1 = sqrt(sigma2/2).*(randn(1,N)+1j*randn(1,N)); T1(m) = sum(abs(s_norm+w1).^2)/N; % H1统计量 w0 = sqrt(sigma2/2).*(randn(1,N)+1j*randn(1,N)); T0(m) = sum(abs(w0).^2)/N; % H0统计量 end th_grid = linspace(min([T0 T1]), max([T0 T1]), 300); for i = 1:length(th_grid) pd_roc(i) = mean(T1 > th_grid(i)); % 不同门限下的Pd pf_roc(i) = mean(T0 > th_grid(i)); % 不同门限下的Pfa end % 绘制:横轴pf_roc,纵轴pd_roc,不同SNR各画一条 figure; plot(pf_roc, pd_roc, 'LineWidth', 1.5); xlabel('虚警概率 Pfa'); ylabel('检测概率 Pd'); grid on; title(['ROC, SNR=', num2str(snr_db), 'dB']);

这个写法的优点不只是快,还稳定:所有 ROC 点来自同一批数据的统计量,曲线是单调的,不会出现相邻门限点之间抖动。换个 SNR 只需要改 snr_db 重新收集一次统计量,再把新曲线画到同一张图上,就能得到一族 ROC,这才是算法对比的标准画法。横轴 Pfa 如果特别关注低虚警区,比如 0.001 以下,建议把横轴改成对数刻度,否则低端的差异在图上根本看不见。

5. 性能分析避坑笔记:五个让结果失真或白跑的坑

5.1 坑一:噪声方差直接用真值,性能曲线好看到失真

现象:仿真里理论线和蒙特卡洛线贴合得堪称完美,Pd 曲线漂亮得像教科书插图,拿去和实测数据一对比就全面翻车。原因:蒙特卡洛用的 sigma2 是“上帝视角”的真值,而任何真实接收机里的噪声功率都得靠估计——估计就有偏差,门限跟着偏差,检测性能随之恶化。解决:性能分析至少跑两条曲线,一条用真值 sigma2 表示理想情况,另一条用带偏差的估计值,比如人为把 sigma2 调偏 0.5~1dB,再看 Pd 掉多少。这个差值就是系统对噪声不确定性的敏感度,报告里必须写。

5.2 坑二:蒙特卡洛次数不够,Pfa 曲线抖动得像噪声

现象:目标 Pfa 设成 0.01,跑完仿真统计出来的 Pfa 在 0.005 和 0.018 之间来回跳,曲线根本没有参考价值。原因:Pfa 是小概率事件,一次试验判错的概率本来就低,M 不够时统计量方差太大。解决:记住一条经验法则,M 至少要大于 10/Pfa。要验证 0.01 的虚警率就至少跑 1000 次,但这只够“数量级不跑偏”;想要曲线平滑,我习惯 M 取 100 倍于 1/Pfa,也就是 0.01 对应一万人次。只扫 Pd 的时候 M 可以小一些,涉及 Pfa 的统计千万别省。

5.3 坑三:匹配滤波仿真忘记加频偏,检测概率虚高

现象:匹配滤波在 -18dB 还能保持 0.9 的检测概率,所有人都觉得不可思议,结果一看代码,相关器直接用发射波形逐点对齐。原因:完美对齐在真实接收机里不存在,无线信道里必然有残余载波频偏和定时误差。解决:在仿真链路里加两个失配源——频偏设为符号速率的 0.01%~0.1%,定时偏移设为采样间隔的 0.1~0.3 倍。加了失配再画曲线,匹配滤波的曲线会明显下移,这才是工程上能兑现的性能。我在报告里习惯给理想曲线和失配曲线各画一条,中间包络就是“实现损耗带”。

5.4 坑四:循环平稳检测的循环频率没对准,谱线能量漏掉了

现象:循环平稳检测的统计量时大时小,Pd 曲线不稳定,同样的 SNR 这次 0.7 下次 0.9。原因:平方谱线法要在 FFT 的某个 bin 上找谱线,如果符号速率 Rs 对应的 bin 计算带了取整误差,或者发送端和接收端的符号时钟有微小偏差,谱线能量就散到相邻 bin 里,统计量被稀释。解决:检测时不要只取单个 bin,在目标 bin 附近取 3~5 个 bin 的幅度最大值或能量和;另一个做法是加长 FFT,频率分辨率变细,对时钟偏差的容忍度就提高。这是在工程上逐步总结出的参数经验,建议直接写进检测代码的默认设置。

5.5 坑五:SNR 口径不统一,三套算法完全没法比

现象:A 同学说能量检测 -12dB 还能用,B 同学说 -5dB 就不行了,两人吵半天,最后发现一个用 Es/N0,一个用带内总信噪比,一个把复噪声功率算错了一倍。原因:信噪比定义直接决定曲线平移,口径不一致时所有对比都是无效的。解决:在任何性能分析报告里,第一页就写清四件事——SNR 定义、噪声方差约定、检测块长、目标 Pfa。流片或仿真项目里,我甚至会在代码头部用注释块把这些条件钉进去,防止隔了两个月自己都忘了当时的口径。这段血泪经验,建议还没被坑过的同学直接抄走。

6. 收个尾:用解析边界校准仿真,别让性能曲线骗你

性能分析做到最后,我最依赖的一个习惯是“双层校准”。第一层,不跑任何蒙特卡洛,直接用闭式公式把理论 Pd vs SNR 曲线画出来;第二层,用固定随机种子跑一次小规模蒙特卡洛,比如 M=500,把仿真点和理论线叠在一起看。偏差在 ±0.02 以内,说明实现正确;超出这个范围,先回去查代码,而不是急着分析算法。

% validate_ed.m % 校准流程:理论线 vs 小规模蒙特卡洛抽样点 clear; rng(42); N = 1024; Pfa_target = 0.1; M_check = 500; snr_db = -12:2:-6; [s_norm, ~] = gen_qpsk_signal(256, 4, 0.35); for s = 1:length(snr_db) sigma2 = 1/(10^(snr_db(s)/10)); SNR_lin = sigma2^-1; % 线性域SNR th = sigma2*(1 + sqrt(2/N)*sqrt(2)*erfinv(1-2*Pfa_target)); pd_theory(s) = qfunc((th - sigma2*(1+SNR_lin)) / ... (sigma2*(1+SNR_lin)*sqrt(2/N))); % 小规模仿真 det = 0; for m = 1:M_check r = s_norm + sqrt(sigma2/2).*(randn(1,N)+1j*randn(1,N)); if sum(abs(r).^2)/N > th, det = det + 1; end end pd_sim(s) = det / M_check; end disp([snr_db(:), pd_theory(:), pd_sim(:)]); % 两列应基本重合

这段校准代码里的 qfunc 是通信工具箱函数,没有就用 0.5*erfc(x/sqrt(2)) 替代,两者完全等价。校准通过以后,再把 M 放到一万以上跑正式曲线,得到的每个点才有解释意义。这个习惯帮我挡掉了至少三次因为代码笔误导致的“重大发现”——有一次我以为能量检测在 -14dB 有奇效,后来发现是噪声功率少除了一个 2。

作为收尾,还有一个记录习惯分享给你:每次仿真跑完,把随机种子、SNR 口径、块长、Pfa、M 次数这五项写进结果文件名里。一个叫 pd_result_seed42_Pfa01_N1024.mat 的文件,三个月后打开依然能看懂;而一个叫 result1.mat 的文件,基本等同于没存。这套分析方向的值不值得投入,我的判断标准很简单:你说话时能不能报出每个曲线的完整条件,能报出来,分析就是扎实的,不能报,先按上面的流程补课。希望帮到你。

本文还有配套的精品资源,点击获取

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

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

立即咨询