srsLTE - PCFICH 源码解析 01

    接下来我们就看 pcfich.c 中的 srslte_pcfich_encode 函数。这个函数实现的功能就是 eNB 在 PCFICH 物理层的处理流程:从 encode CFI 一直到把符号 mapping 到资源粒(resource element)上。关于 PCFICH 的介绍这里就不做详细描述了,在shareTechNote 或者其他地方都能找到相关的描述。

    srslte_pcfich_encode 的第一步是将 2bits 的 CFI 做 channel coding 得到 32bit 的 CFI code word;这里调用了 srslte_pcfich_encode 函数,输入是 CFI(这里就不是 2bits 的数了,直接是十进制的 1,2,3), 输出是 q -> data;中间的 coding 过程也很直接,即从预先定义的 cfi_table 中直接找对应的序列即可,只是注意 CFI = 1 对应的是 table 中的第 0 个元素。


    接下来第二步就是对 32bits 的 channel coding 结果进行加扰(scrambling),这里调用了 srslte_scrambling_b 函数来完成。该函数的输入是存放在 &q -> seq[subframe] 当中的 scrambling code 和上一步 channel coding 的输出 q -> data,输出也存放在 q -> data 当中。在这个函数中主要就是做 XOR 运算,通过调用 srslte_scrambling_b 函数来完成(实际是通过调用该函数中的 scrambling_b_word函数来完成的)。


    实际上加扰的关键在于生成的 scrambling code ,从 TS36.211 可以看到不同信道(PCFICH, PBCH, PDSCH 等)的 scrambling code 的不同就在于c_init:PCFICH 的 cinit 与 slot number(in one radio frame)、小区 ID 有关。

    生成的 scrambling code 存放在 &q -> seq[subframe] 当中,这步是在 encode 前的 srslte_pcfich_set_cell 初始化函数中就已经完成了。函数中 for 循环表示每个 cinit 是随 nsf(subframe number)变化的,初始化中会生成 10个 subframe 对应的 cinit。for 循环中调用 srslte_sequence_pcfich 函数,实际这个函数又是调用了 srslte_sequence_LTE_pr函数来完成扰码的生成。这个函数中 seed 就是 PCFICH 的 cinit,len=32 是对应的扰码序列的长度,与 PCFICH code word 的长度是一样的。


    最后我们在 srslte_lte_encode 中加入额外的打印消息,打印出当 CFI = 1 时、小区 ID = 100、subframe = 0 时的结果。我们还可以打印出在 subframe = 0 的时候生成的 cinit(略),cinit 的结果是 103012,可以根据 cinit 算出 x2,进一步根据 TS36.211 7.2 算出 scramble sequence。有兴趣的朋友可以手动算一下。


猜你喜欢

转载自blog.csdn.net/liu_xuxiang/article/details/80978348