news 2026/10/27 1:11:08

TD-LTE随机接入前导检测仿真:ZC序列与PRACH频域相关实现解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
TD-LTE随机接入前导检测仿真:ZC序列与PRACH频域相关实现解析

简介:面向TD-LTE随机接入过程的前导序列检测需求,该MATLAB仿真资源提供了从ZC序列生成、层映射/解映射到检测主程序的完整可运行代码,代码基于Matlab 2020b编写,适合通信方向学生、算法工程师及科研人员快速验证相关算法,解决随机接入前导检测流程不清晰、仿真链路搭建困难的问题。RAR压缩包内共7个文件,包含6个.m脚本和1个.md使用说明文档,压缩包仅13KB,脚本覆盖前导序列生成、层映射与解映射、主程序运行及映射调试等环节,结构清晰便于按模块学习。已有121人浏览学习该资源。配套说明文档简述运行步骤与函数用途,程序采用模块化设计,替换数据即可直接运行,即便初学者也能轻松上手;借助这套代码可系统理解TD-LTE随机接入前导检测的完整链路、信道仿真细节及层映射处理方式,是课程设计、毕业设计或科研预研中实用的算法验证参考。

1. 拿这套 TD-LTE 随机接入前导检测仿真,先把链路跑通

做 TD-LTE 随机接入过程仿真时,前导序列检测是最先卡人的一环。终端拿 ZC 序列生成 preamble 发到基站侧,基站要在一个 PRACH 窗口内同时回答三个问题:有没有随机接入请求、来的是哪个前导序号、时间提前量是多少。这套基于 MATLAB 的仿真资源把这条链路完整拉通了——ZC 根序列生成、循环移位配置、PRACH 频域资源映射、接收端频域相关检测、门限判定,以及 AWGN/多径/频偏信道下的性能变化,都有可运行的脚本和配套说明文档。

它把随机接入物理层这条主链路单独抠出来,做成能改参数、能出曲线的基带等效仿真。上手后你调 u、Ncs、SNR、频偏这几个值,很快就能看懂相关峰是怎么从噪声里冒出来的,也能复现“频偏大了检测概率掉一半”这类真实性能现象。适合正在做 LTE 物理层课设的人,也适合需要快速验证检测思路的从业者。

2. 前导序列能被检测出来的底层逻辑:ZC 性质与 PRACH 资源配置

2.1 ZC 序列的三个性质决定了检测方案

在 TD-LTE 里,前导序列来自 ZC(Zadoff-Chu)序列。定义式是 x_u(n) = exp(-jπun(n+1)/Nzc),Nzc 取 839(前导格式 0~3),u 是根序列索引,取值 1~838。因为 839 是素数,所有非零 u 都满足与 Nzc 互质,所以根序列一共有 838 个可用。ZC 序列有三个直接决定检测方案的性质,任何一个被破坏,检测算法都得换思路。

第一是恒包络,|x_u(n)| 恒等于 1,发射端功率放大器不需要过多回退,这对上行链路很重要。第二是理想周期自相关,在零时延处自相关值为 N,其他时延处直接掉到接近 0,这是“相关峰能被检测出来”的数学基础。第三是 DFT 不变性,ZC 序列做 FFT 之后仍然是 ZC 序列,只是多了个常数相位,这直接决定了接收端可以在频域做共轭相乘,再 IFFT 回时域找峰,比时域滑动相关省一个量级的计算量。

正因为有这么好的性质,3GPP 才把前导序列的定义直接建立在 ZC 上。仿真时你在 MATLAB 里生成一个 839 点的 ZC 序列,用根序列 u 做检测模板,收到的信号只要带着同样的 ZC 结构,相关峰就会在对应时延处冒出来。理解这一点之后,后面所有代码都很好读。

2.2 循环移位与零相关区参数:一个根序列怎么服务多用户

实际小区里不止一个终端需要随机接入。如果大家都用同一个根序列,那相关峰就分不开。解决办法是循环移位:x_u,v(n) = x_u((n+Cv) mod Nzc),Cv = v·Ncs。循环移位本质上是在时域给序列加了一个“时间偏移”,而 ZC 的周期自相关性质保证了不同循环移位的序列之间相关值几乎为 0。基站用根序列去相关,不同 Cv 的终端会在不同的时延位置上冒峰,互不干扰。

Ncs 是零相关区配置,由 zeroCorrelationZoneConfig 参数决定。3GPP 36.211 给出了一张表,非高速场景下 Ncs 从 0 到 419 不等。Ncs 选得越大,能承受的时延扩展越大,对小区覆盖半径更友好,但一个根序列能产生的正交前导数量 floor(Nzc/Ncs) 就越少。比如 Ncs=32 时一个根序列能产生 26 个前导,Ncs=119 时就只能产生 7 个。

仿真里怎么理解 Ncs 的物理含义?839 点序列持续 800μs,单点间隔约为 0.954μs,所以 Ncs 个点对应 Ncs × 0.954μs 的时间窗。考虑往返时延,覆盖半径约为 Ncs × 143 米。常用配置里,Ncs=32 对应约 4.6km 覆盖,Ncs=119 对应约 17km。这个估算在随机接入规划里很常用,仿真时如果检测出来的时延经常超过 Ncs 的容忍范围,就要考虑是不是 Ncs 配置不够。

zeroCorrelationZoneConfigNcs时间窗(μs)覆盖半径(km)
63230.54.6
95956.38.4
119388.713.3
12119113.517.0
14279266.339.9
15419399.859.9

2.3 PRACH 时频资源与前导格式:839 是怎么落地的

前导序列不是在任意时刻任意频点都能发。3GPP 定义了 PRACH(物理随机接入信道)的时频资源,前导格式决定时域占用长度。格式 0 最常用:T_SEQ=800μs,T_CP=103.13μs,总长 1ms,一个子帧刚好放得下。格式 1/2/3 对应更大小区半径,格式 4 是 TDD 专用短序列(139 点),FDD 场景不用。

频域上,PRACH 占用 6 个 RB(72 个 15kHz 子载波的带宽),但 PRACH 自身的子载波间隔是 1.25kHz,所以这个带宽内实际可以放下约 839 个 PRACH 子载波。839 × 1.25kHz ≈ 1.05MHz,小于 6 个 RB 的 1.08MHz,两侧留出保护。前导的发送过程是:ZC 序列先做 DFT 变到频域,映射到 PRACH 子载波位置,再做 IFFT 得到时域波形,前面加 CP。接收端倒过来,去 CP 后 FFT,提取 PRACH 频域位置,乘本地模板的共轭,IFFT 回时域找峰。

这里有一个仿真里常见的混淆点:PRACH 的 1.25kHz 子载波间隔决定了它的 FFT 栅格和数据信道(15kHz)不是同一套。如果你想在完整的 20MHz/2048 点 FFT 链路里提取 PRACH,需要先做频域抽取或单独按 1.25kHz 栅格处理。课程设计级别的仿真一般直接把 PRACH 单独拿出来跑基带等效仿真,采样率用 1.28MHz(1024 × 1.25kHz),FFT 点数用 1024。这样既保留了时延分辨率和频偏影响,又不用背整个 OFDM 帧结构。

3. 发送端到接收端:频域相关检测的 MATLAB 实现

3.1 发送端:ZC 生成 + 循环移位 + 频域映射

发送端的核心函数就是把 3.1、2.2、2.3 的数学定义转成 MATLAB 代码。下面这个函数接收根序列索引 u、循环移位序号 v、零相关区 Ncs 和 FFT 点数 Nfft,返回时域发送波形和本地频域模板。

function [tx_wave, ZF] = generate_prach_preamble(u, v, Ncs, Nfft) % u : 根序列索引, 取值 1~838 % v : 循环移位序号, 取值范围 0~floor(Nzc/Ncs)-1 % Ncs : 零相关区配置, 见 36.211 表 5.7.2-2 % Nfft : PRACH 频域 FFT 点数, 仿真中取 1024 Nzc = 839; % 前导格式 0~3 的序列长度 Cv = v * Ncs; % 实际循环移位量 n = (0:Nzc-1).'; % 1) 根 ZC 序列: x_u(n) = exp(-j*pi*u*n*(n+1)/Nzc) zc_root = exp(-1j * pi * u .* n .* (n + 1) / Nzc); % 2) 循环移位: x_u,v(n) = x_u((n + Cv) mod Nzc) idx = mod(n + Cv, Nzc) + 1; % MATLAB 下标从 1 开始 zc_pre = zc_root(idx); % 3) 补零 FFT 到 Nfft 点, 得到频域表示 ZF = fft(zc_pre, Nfft); % 4) 映射到 PRACH 占用的子载波, 简化做法: 放到 Nfft 中间 prach_freq = zeros(Nfft, 1); k0 = round((Nfft - Nzc) / 2) + 1; prach_freq(k0:k0+Nzc-1) = ZF(1:Nzc); % 5) IFFT 生成时域波形, 乘以 sqrt(Nfft) 保持正交归一 tx_wave = ifft(prach_freq, Nfft) * sqrt(Nfft); end

代码逻辑上先把根 ZC 序列在时域生成出来,再做循环移位,之后补零 FFT 到 Nfft 点。这种写法和 3GPP 定义的顺序一致,排查问题的时候能直接对照公式。第 4 步把 839 个频域点放到 Nfft 中间,等价于把 PRACH 放在信道带宽的中心位置,左右两侧自然形成保护子载波,这是基带等效仿真最常用的简化。

参数方面,u 和 v 的组合对应小区里 64 个前导序列中的某一个。u 的取值范围受 gcd(u, Nzc)=1 约束,v 的最大值由 floor(Nzc/Ncs) 决定,Ncs 越大能用的 v 越少。Nfft 取 1024 时等效采样率是 1.28MHz,时域单点间隔 0.781μs,这个分辨率对随机接入检测来说足够用。如果你想把仿真做细,可以把 Nfft 提到 2048 或 4096,但相关峰的位置和检测概率不会因此有明显变化,只是曲线更平滑。

补零 FFT 和严格 Nzc 点 DFT 之间有细微差别:补零等效于频域插值,但不会改变序列的周期相关性质。仿真里用它没问题,真正做协议一致性测试时才需要按 24576 点全速率去处理。

3.2 接收端:FFT 提取 + 频域共轭相关 + 峰值搜索

接收端检测函数做的事和发送端严格对称:时域信号 FFT 回频域、提取 PRACH 子载波、与本地模板共轭相乘、IFFT 回时域找峰。

function [detected, delay_est, peak_power, corr_p] = detect_preamble(rx_tail, ZF, k0, Nzc, Nfft) % rx_tail : 去掉 CP 后的 PRACH 时域段, 长度应为 Nfft % ZF : 本地根序列的频域模板 (发送端函数输出) % k0 : PRACH 起始子载波索引 % Nzc : 前导序列长度 839 % Nfft : FFT 点数 R = fft(rx_tail, Nfft); % 时域转频域 % 提取 PRACH 频域位置上的接收数据 Y = R(k0:k0+Nzc-1); % 频域共轭相关: 接收频域 × 本地频域共轭 Corr_f = Y .* conj(ZF(1:Nzc)); % IFFT 回时域, 相关峰的横坐标就是时延采样点 corr_t = ifft(Corr_f, Nfft); corr_p = abs(corr_t).^2; % 相关功率谱 % 峰值搜索 [peak_power, delay_est] = max(corr_p); detected = peak_power > 1; % 实际门限在外面由噪声估计决定 end

这段代码里最关键的步骤是Y .* conj(ZF(1:Nzc))。因为 DFT 不变性,频域相乘加 IFFT 等效于时域循环相关,所以不用在时域做 839 次滑动相关,一次 FFT 加一次 IFFT 就拿到完整相关谱,这是工程上最常用的高效实现。

delay_est 的单位是采样点,换算成绝对时延要乘以 0.781μs。如果发送端做了循环移位 Cv,那峰值实际出现在 (Cv + 真实时延) mod Nzc 的位置,基站侧减去 Cv 才是真正的时间提前量。接收端如果直接用根序列做模板,测出来的“时延”天然带了 Cv 的偏移,这个偏移在代码里要用mod(delay_est - Cv, Nzc)去掉。

detected 的判断不能写死,我在函数里用一个占位的阈值,实际操作时把 corr_p 传出来,在外面结合噪声底噪算自适应门限。之所以这么设计,是因为固定门限在不同 SNR 下完全不靠谱,低信噪比时会把噪声峰误判成前导,高信噪比时又会漏检。

3.3 门限怎么取:噪声底噪估计与虚警约束

门限用固定值还是自适应值,直接决定检测曲线长什么样。我一般从相关功率谱尾部取一段没有信号的区域来估计噪声底噪,然后在这个底噪上叠加一个固定 dB 门限。

% 噪声底噪估计与门限计算 noise_win = corr_p(end-128:end-1); % 取相关谱尾部作为噪声区 noise_est = median(noise_win); % 中位数比均值更抗强峰干扰 threshold = noise_est * db2pow(13); % 13dB 门限 % 判定 detected = peak_power > threshold;

为什么门限定 13dB?这里面有个理论参考值。对于 839 点 ZC 相关,相关峰功率和噪声底噪的比值约等于 1 + Nzc × SNR_linear。在 SNR=-14dB(线性约 0.04)时,这个比值约为 34.6,也就是 15.4dB。门限取 13dB 时还有约 2.4dB 的余量;SNR 掉到 -16dB 时比值约 11dB,就基本贴到门限了。所以你可以用 13dB 作为默认值,然后根据自己仿真的 SNR 工作点上下调整。

虚警概率也可以从门限推出来。相关谱噪声功率近似服从指数分布,单点超过 13dB 门限的概率约为 exp(-20) ≈ 2e-9,839 个检测点合起来每子帧虚警约 1.7e-6,远低于 LTE 基站侧 0.1% 的虚警要求。如果仿真中发现虚警太多,优先检查噪声功率估计是否有偏,尤其是多径信道下尾部相关功率不一定能代表纯噪声。

提示:如果你在调整门限时发现检测概率和虚警概率同时上升,这是正常现象。实际系统是在虚警约束下最大化检测概率,13dB 是一个兼顾两者的起点,不是黄金值。

4. 把信道拉进仿真:频偏、多径与蒙特卡洛框架

4.1 频偏建模:相位旋转对相关峰的压制

TD-LTE 终端在发起随机接入前还没建立上行同步,频偏可能来自晶体振荡器偏差、多普勒或者开机初期的频率粗估误差。频偏对 ZC 检测的影响很直观:时域上加一个线性相位旋转,频域等效于把 ZC 序列整体移位,相关峰幅度被压低,峰值位置也会偏移。

function rx_fo = apply_frequency_offset(tx, f_offset_hz, fs) % tx : 输入时域信号 % f_offset_hz : 频偏, 单位 Hz, 正数表示正频偏 % fs : 采样率, 本仿真中为 1.28MHz t = (0:length(tx)-1).' / fs; rx_fo = tx .* exp(1j * 2 * pi * f_offset_hz * t); end

仿真时建议把频偏设成 50Hz、200Hz、500Hz、1000Hz 四档去扫。你会看到一个规律:频偏小于 100Hz 时相关峰变化不大,到 500Hz 时峰值已经开始明显下压,超过 1000Hz 后检测概率可能直接掉到一半以下。原因在于 PRACH 子载波间隔只有 1.25kHz,频偏超过这个间隔的四分之一就会让频域相关能量严重泄漏。

如果检测算法里没有频偏补偿,这个现象无法避免。所以在带频偏的仿真里,接收端要先做频偏粗估计。最简单的办法是利用 CP 两段重复结构做相位差估计,或者直接在 [-1kHz, 1kHz] 区间按 50Hz 步进扫频,选相关峰最大的那个频偏补偿值。扫频慢,但原理直观,适合先把链路跑通。

4.2 多径信道:comm.MultipathFadingChannel 参数配置

多径信道用 MATLAB 通信工具箱的 comm.MultipathFadingChannel 就够了。关键是 SampleRate 必须和前面定义的 PRACH 等效采样率一致,否则 PathDelays 换算成采样点时会出错。

chan = comm.MultipathFadingChannel( ... 'SampleRate', 1.28e6, ... 'PathDelays', [0 50e-9 110e-9 170e-9 290e-9], ... 'AveragePathGains', [0 -3 -6 -8 -10], ... 'MaximumDopplerShift', 5, ... 'Seed', 17); rx_mp = chan(tx_with_cp); % 输入要带 CP, 和多径时延对应

这套参数模拟的是典型城市宏站环境,5 径时延从 0 到 290ns,功率从 0dB 衰减到 -10dB,属于中等频率选择性信道。MaximumDopplerShift 设 5Hz 对应低速步行场景,如果你要仿真高速移动,可以把它改成 300Hz 甚至 500Hz,但要注意这时候相关峰的波动会变大,单次仿真的结果随机性更强。

参数本仿真取值说明
SampleRate1.28e6必须等于 Nfft × 1.25kHz
PathDelays[0 50 110 170 290] ns典型城区 5 径时延谱
AveragePathGains[0 -3 -6 -8 -10] dB多径功率时延谱
MaximumDopplerShift5 Hz低速;高速场景改 300~500Hz
Seed17固定随机种子,保证蒙特卡洛可复现

如果你没有通信工具箱,也可以手写一个抽头延时模型,把每条径的时延换成采样点,然后按增益累加。这样做的好处是能完全控制信道实现,坏处是体现不了多普勒扩展和每条径的独立衰落过程,性能会和 comm 库结果有偏差。仿真做对比分析时,我建议以 comm.MultipathFadingChannel 为准。

4.3 完整仿真脚本的组织方式

把发送端、信道、接收端串起来时,最容易出错的地方是 CP 的添加和去除位置。PRACH 的 CP 长度是 103.13μs,在 1.28MHz 采样率下约等于 132 个采样点,为了对齐 FFT 栅格,仿真里取 128 是常见做法。

% 完整闭环仿真框架 u = 29; v = 3; Ncs = 32; Nfft = 1024; Nzc = 839; k0 = round((Nfft - Nzc) / 2) + 1; cp_len = 128; snr_list = -16:2:0; pd = zeros(size(snr_list)); Ntrials = 100; % 固定信道随机种子, 保证不同 SNR 下的对比不被随机量干扰 chan = comm.MultipathFadingChannel( ... 'SampleRate', 1.28e6, ... 'PathDelays', [0 50e-9 110e-9 170e-9 290e-9], ... 'AveragePathGains', [0 -3 -6 -8 -10], ... 'MaximumDopplerShift', 5, 'Seed', 17); for s = 1:length(snr_list) n_hit = 0; for k = 1:Ntrials % 发送 [tx, ZF] = generate_prach_preamble(u, v, Ncs, Nfft); tx_cp = [tx(end-cp_len+1:end); tx]; % 加 CP % 信道: 多径 + 频偏 + AWGN rx_mp = chan(tx_cp); rx_fo = apply_frequency_offset(rx_mp, 100, 1.28e6); rx_noisy = awgn(rx_fo, snr_list(s), 'measured'); % 接收: 去 CP (这里用理想定时) rx_tail = rx_noisy(cp_len+1:end); % 检测 [det, ridx, ~, corr_p] = detect_preamble(rx_tail, ZF, k0, Nzc, Nfft); noise_win = corr_p(end-128:end-1); threshold = median(noise_win) * db2pow(13); % 正确判据: 检出 + 峰值位置落在预期范围 expected_idx = mod(v * Ncs, Nzc); if det && abs(mod(ridx - expected_idx, Nzc)) <= 2 n_hit = n_hit + 1; end end pd(s) = n_hit / Ntrials; end plot(snr_list, pd, 'o-'); grid on; xlabel('SNR (dB)'); ylabel('Detection Probability');

这个框架里有几个细节值得注意。expected_idx 只算了循环移位 Cv,没有算信道实际时延,因为在这段代码里多径首径时延是 0,所以期望峰值位置就是 Cv。如果你的信道模型加了额外时延,expected_idx 要加上时延对应的采样点数,这是检测判据里最容易写错的地方。

awgn 函数用 'measured' 模式,它会先测量输入信号功率再叠加指定 SNR 的噪声,这样可以避免信号功率归一化带来的误差。多径信道会改变信号功率,所以先在 awgn 之前经过信道,再让 awgn 自动测量,比先加噪声再过信道更稳妥。

5. 前导检测实战避坑:四个常见问题与排查

5.1 相关峰怎么都找不到

现象:detect_preamble 恒返回 0,peak_power 比门限低几个数量级,怎么调 SNR 都没反应。

原因:大概率是定时窗口错了。接收端去 CP 的位置和发送端对不上,PRACH 窗口外的数据几乎没有 ZC 结构,相关峰自然出不来。其次常见原因是门限设太高,有人把 13dB 写错成 30dB,低 SNR 下永远检不出。

解决:第一步做理想闭环,不加噪声不加信道,确认发送和接收是同一条序列;第二步加一个固定时延,确认峰值位置跟着移动;第三步才把噪声和门限加进来。我一般先在代码里写死一个很小的门限(比如 1e-3),把相关功率谱画出来,肉眼确认峰的形态,再换成自适应门限跑统计。

5.2 循环移位方向搞反

现象:检测到的时延始终比真实时延多一个或少一个 Cv,SNR 再高也差这么一点。

原因:3GPP 定义是 x_u,v(n) = x_u((n+Cv) mod Nzc),实现时有人直觉写成 n-Cv;另外 MATLAB 下标从 1 开始,取模后忘记 +1 也会差一个位置。

解决:用 Cv=0 和 Cv=Ncs 两组做无信道测试,峰值位置应该分别等于实际时延和 Cv+实际时延。如果发现 Cv 的贡献符号不对,把mod(n + Cv, Nzc) + 1换成mod(n - Cv, Nzc) + 1。这类问题在理想闭环下只要几个点就能定位,不要直接进蒙特卡洛。

5.3 频偏一大,检测概率骤降

现象:SNR 在 0dB 以上,频偏加到 800Hz,检测概率掉到 50% 以下。

原因:ZC 序列的频域相关对频偏敏感。频偏 Δf 相当于把频域序列循环移位了 Δf/1.25kHz 个格子,移位不是整数时,等效于在时域相关峰上乘了一个 sinc 包络,峰值被压低;移位超过半个子载波间隔时,峰就开始明显下降。

解决:接收端先做频偏补偿,再进相关检测。最简单的是用 CP 相关估计频偏,对去 CP 前信号的两段重复部分做共轭相关,相位差 Δφ 除以 2πT_cp 就是频偏;精度不够就用扫频法,0~±1kHz 按 50Hz 步进扫,选相关峰最大的频偏值。扫频慢但直观,适合先把链路跑通。

5.4 FFT 点数和采样率不匹配

现象:检测峰在某些 SNR 点跳变,或者性能曲线有明显断裂,改 Nfft 后 k0 怎么调都别扭。

原因:把 PRACH 直接塞进数据信道的 FFT 网格,忽略了 PRACH 子载波间隔 1.25kHz 和数据 15kHz 的差异;或者 Nfft 与 fs 不满足 fs = Nfft × 1.25kHz,导致频域提取位置偏了。

解决:固定 fs_prach = 1.28MHz、Nfft = 1024,k0 的计算用round((Nfft-Nzc)/2)+1统一生成,不要手写死。每次改采样率,都要同步检查 k0、cp_len、频偏时间序列三处是否一致。

提示:判断参数是否自洽的快速方法——把 fs、Nfft、k0、cp_len 四个值打印出来看一眼,如果 fs/Nfft 不等于 1.25kHz,PRACH 频域定位一定是错的。

6. 用蒙特卡洛把性能测出来:检测概率与虚警概率的验证

仿真的最终目标是给出检测概率随 SNR 变化的曲线。这里有一个很容易被忽略的工程细节:如果蒙特卡洛循环里没有固定随机种子,每次重跑曲线都会抖,而且抖的幅度可能超过 5%,你根本分不清是算法改动有效还是统计涨落。

rng(42); % 固定全局随机种子, 保证整条蒙特卡洛曲线可复现 % 检测概率统计 pd = zeros(size(snr_list)); for s = 1:length(snr_list) n_hit = 0; for k = 1:Ntrials [tx, ZF] = generate_prach_preamble(u, v, Ncs, Nfft); tx_cp = [tx(end-cp_len+1:end); tx]; rx_mp = chan(tx_cp); rx_fo = apply_frequency_offset(rx_mp, f_off, 1.28e6); rx = awgn(rx_fo, snr_list(s), 'measured'); rx_tail = rx(cp_len+1:end); [det, ridx, ~, corr_p] = detect_preamble(rx_tail, ZF, k0, Nzc, Nfft); threshold = median(corr_p(end-128:end-1)) * db2pow(13); if det && abs(mod(ridx - Cv, Nzc)) <= 2 n_hit = n_hit + 1; end end pd(s) = n_hit / Ntrials; end

验证检测概率曲线时,我会先看几个锚点:SNR=-14dB 时检测概率应该不低于 90%(这是在 13dB 门限、839 点相关下的理论预期,也是实际 LTE 基站侧的典型要求);SNR 降到 -18dB 时曲线应该开始明显下跌;而 SNR 高于 -8dB 时曲线应该拉平在接近 1 的位置。如果曲线不是这个形态,优先怀疑定时同步或者门限估计有问题,而不是 ZC 检测本身。

虚警概率的验证要另外做一组实验:不发送前导,直接把纯噪声送进检测器,统计被误判为检测成功的比例。这组实验里噪声功率要按同样 SNR 标定,否则虚警曲线没有意义。注意虚警测试和检测测试要用不同的随机种子段,混用会引入人为相关性。

这套仿真最坑的地方其实不在代码,而在参数自洽。我自己有一版仿真改了采样率忘同步更新 k0 和 cp_len,检测概率曲线怎么调都不对,最后逐行核对发现 fs/Nfft 不等于 1.25kHz,频域提取位置整个偏掉了。从那以后我每次搭检测链路,都会先把 fs、Nfft、k0、cp_len 四个值打印出来核对一遍,再进蒙特卡洛循环。希望帮到你。

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/27 1:10:45

硬件交付P1-2检查:从供电纹波到时序抖动的硬核验收指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/27 1:10:08

SiC模块驱动协同设计:从SST到PCS的六个关键问题

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/27 1:08:33

基于SpringBoot和Vue的网上书店前后端分离实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/27 1:07:12

STM32G431六路互补PWM配置与死区时间验证实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/27 1:06:31

STM32编码器测速实战:从脉冲计数到速度闭环的完整链路解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/27 1:06:21

四旋翼PID分层控制与6-DOF动力学建模实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华