天天看點

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 個元素。

srsLTE - PCFICH 源碼解析 01

    接下來第二步就是對 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函數來完成的)。

srsLTE - PCFICH 源碼解析 01

    實際上加擾的關鍵在于生成的 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 - PCFICH 源碼解析 01

    最後我們在 srslte_lte_encode 中加入額外的列印消息,列印出當 CFI = 1 時、小區 ID = 100、subframe = 0 時的結果。我們還可以列印出在 subframe = 0 的時候生成的 cinit(略),cinit 的結果是 103012,可以根據 cinit 算出 x2,進一步根據 TS36.211 7.2 算出 scramble sequence。有興趣的朋友可以手動算一下。

srsLTE - PCFICH 源碼解析 01

繼續閱讀