以非限制集format0 为例
一、参数配置
根据高层信令配置:
- **prach_ConfigIndex** = 17
该索引通常对应特定的 PRACH 时频资源配置,但对于前导序列生成,核心参数是 `zeroCorrelationZoneConfig`。
- **zeroCorrelationZoneConfig** = 6
对应非限制集(unrestricted set)下的 N_{CS} 值。
- **rootSequenceIndex** = 2(示例起始根序列)

当 `zeroCorrelationZoneConfig = 6` 时,N_{CS}=32。
1.2 前导序列基本参数
对于长序列(Preamble Format 0~3),前导序列长度 L_{RA}=839。

二、每个根序列可生成的 preamble 数量
在非限制集中,一个根序列通过循环移位可生成的前导序列个数为:
N_{pre}\^{(u)} = \\left\\lfloor \\frac{L_{RA}}{N_{CS}} \\right\\rfloor
代入 L_{RA}=839,N_{CS}=32:
N_{pre}\^{(u)} = \\left\\lfloor \\frac{839}{32} \\right\\rfloor = 26
即每个根序列可以生成 **26** 个不同的前导序列。
三、循环移位 C_v 的确定
循环移位的索引 v 取值范围为:
v = 0, 1, \\dots, \\left\\lfloor \\frac{L_{RA}}{N_{CS}} \\right\\rfloor - 1
即:
v = 0, 1, \\dots, 25
循环移位值 C_v 为:
C_v = v \\cdot N_{CS}
因此:
C_0 = 0,\\ C_1 = 32,\\ C_2 = 64,\\ \\dots,\\ C_{25} = 25 \\times 32 = 800
四、ZC 序列生成与循环移位
4.1 ZC 基序列
对于物理根序列索引 u,ZC 序列定义为:
x_u(i) = e\^{-j\\frac{\\pi u i (i+1)}{L_{RA}}}, \\quad i = 0, 1, \\dots, L_{RA}-1
其中 L_{RA}=839。
4.2 循环移位生成前导序列
每个根序列 u 与每个 v 组合生成一个前导序列:
x_{u,v}(n) = x_u\\left( (n + C_v) \\bmod L_{RA} \\right), \\quad n = 0, 1, \\dots, L_{RA}-1
五、生成 64 个 preamble 的根序列使用策略
系统需要生成 64 个前导序列。每个根序列可提供 26 个,因此所需的根序列个数为:
N_{\\text{root}} = \\left\\lceil \\frac{64}{26} \\right\\rceil = 3
即需要 **3** 个根序列。第一个根序列提供 26 个,第二个根序列再提供 26 个(累计 52 个),第三个根序列提供剩余的 12 个(64-52=12)。第三个根序列只需使用前 12 个循环移位(v=0 \\sim 11)。
5.1 根序列的选择顺序
协议规定了根序列的逻辑索引到物理索引的映射(Table 6.3.3.1-4)。示例中起始根序列取 u=2,则下一个根序列为 u=837(映射规则通常为对称使用),再下一个为 u=3 等,直到满足 64 个。

六、完整计算示例(以 u=2 为例)
6.1 生成 x_2(i)
x_2(i) = e\^{-j\\frac{\\pi \\cdot 2 \\cdot i (i+1)}{839}}, \\quad i=0,\\dots,838
6.2 应用循环移位得到 preamble
- 当 v=0,C_0=0:
x_{2,0}(n) = x_2(n)
- 当 v=1,C_1=32:
x_{2,1}(n) = x_2((n+32) \\bmod 839)
其前几个样点:
x_{2,1}(0) = x_2(32) = e\^{-j\\frac{\\pi \\cdot 2 \\cdot 32 \\cdot 33}{839}}
x_{2,1}(1) = x_2(33) = e\^{-j\\frac{\\pi \\cdot 2 \\cdot 33 \\cdot 34}{839}}
x_{2,1}(2) = x_2(34) = e\^{-j\\frac{\\pi \\cdot 2 \\cdot 34 \\cdot 35}{839}}
- 类似地,v=2 对应 C_2=64,直至 v=25 对应 C_{25}=800。
这样,根序列 u=2 产生了 26 个 preamble 序列。
6.3 后续根序列
按照协议规定的顺序,下一个根序列(例如 u=837)同样生成 26 个 preamble,再下一个根序列(例如 u=3)只需生成前 12 个(v=0 \\sim 11),总共达到 64 个。
**NOTE: 按照上述的描述,总共有64个循环移位,循环移位的索引即为实际发送的preambel_id(**公众号:手搓物理层 )
七、matlab源码
L_RA = 839;
zeroCorrelationZoneConfig = 7; %% matalb的索引是从1开始的
Ncs_r = [0,13,15,18,22,26,32,38,46,59,76,93,119,167,279,419];
Ncs = Ncs_r(zeroCorrelationZoneConfig); %Ncs选择了32
u = [129, 710, 140, 699, 120, 719, 210, 629, 168, 671, 84, 755, 105, 734, 93, 746, 70, 769, 60, 779,
2, 837, 1, 838, 56, 783, 112, 727, 148, 691, 80, 759, 42, 797, 40, 799, 35, 804, 73, 766];
u_idx = 21; % 根序列索引是21,即选择的root value 是从上面数组的2开始
i_u = 0:(L_RA-1);
x_root = exp(-j*pi*u(u_idx)*i_u.*(i_u + 1)/L_RA); % 根据对应根序列的值,生成基序列
v = 0:floor(L_RA/Ncs)-1; % 一个根序列通过循环移位可以生成所有的preamble序列
Cv = v*Ncs;
x_u_shift_num = length(Cv);
% 假设循环移位是5,也就是发送的preamble_id是4
m = 5;
n = 0:L_RA-1;
preamble_zc = x_root(mod(n+Cv(m),L_RA)+1);
% 协议规定对生成的zc序列先做一次DFT,类似于做了一次预编码;借助与matlab fft函数
preamble_zcdft = fft(preamble_zc);
最后一步参考协议(某种意义相当于做了一次传输预编码,为了削峰,防止ofdm引入的峰均比较高问题 公众号:手搓物理层)

八、总结
本文以 `zeroCorrelationZoneConfig = 6`(N_{CS}=32)为例,详细介绍了非限制集下 PRACH 前导序列的生成过程:
-
根据配置查表得到 N_{CS};
-
计算每个根序列可生成的 preamble 数 \\lfloor L_{RA}/N_{CS}\\rfloor;
-
确定循环移位范围 v=0,\\dots,\\lfloor L_{RA}/N_{CS}\\rfloor-1,并计算 C_v = v\\cdot N_{CS};
-
生成 ZC 基序列 x_u(i);
-
对每个根序列应用循环移位 C_v 得到 x_{u,v}(n);
-
按照协议顺序选择根序列,直至累计生成 64 个 preamble。
该流程同时适用于 LTE 和 NR 的长序列 PRACH 场景,是理解随机接入物理层的关键。
**参考资料**:
- 3GPP TS 38.211 "NR; Physical channels and modulation"
下次分享PRACH的preamble检测部分