概述
文章目录
- 前言
- 一、PBCH信道简介
- 二、PBCH代码实现
- 1.物理层模块
- 2.代码
- 总结
- 参考
前言
本文介绍了PBCH信道的理论知识,并对PBCH信道的实现进行探讨!
一、PBCH信道简介
功能:PBCH信道承载了小区的系统信息,用于小区的搜索过程。
用户想要接入到基站,需要获取小区的系统信息,才能知道小区是如何配置的。小区通过BCCH逻辑信道向小区内的UE广播发送系统参数信息,系统信息分别为MIB(MasterInformationBlock) 和 SIB(SystemInformationBlock)。对应到物理层实际传输的信道,MIB信息由PBCH信道传输,SIB信息由PDSCH信道传输。LTE信道分类之前进行了描述。
MIB信息中承载着最基本的信息,这些信息包含PDSCH的信道解码,UE只有解出MIB中的信息,才能利用MIB中的参数继续解码PDSCH中的数据,包括解码SIB包含的信息。
MIB信息包括:下行带宽参数,PHICH配置参数,系统帧号(SystemFrameNum)、协议中考虑预留和字节对齐等因素,MIB消息占用24bit。
资源分配
PBCH信道在时域上位于每个系统子帧0的第二个slot上的前4个ofdm符号,在频域上占据72个中心子载波。
时域上MIB消息占用了4个ofdm符号长度,每个ofdm符号在频域上分配了6个RB,每个RB12个子载波,频域上一共占用72个子载波。
之所以把BCH传输限制在72个中心子载波,是因为UE在第一次接收BCH的MIB信息之前,并不知道系统的带宽,因此,在第一次接收BCH的时候,假定小区的系统带宽等于最小的系统带宽,即6个RB,对应72个子载波。当解码完MIB信息,就能获得系统的下行带宽了。而且 ,无论LTE的带宽为多少,规定MIB消息总是占用带宽的中心频率的72个子载波。
二、PBCH代码实现
1.物理层模块
2.代码
PBCH结构体所声明的参数如下:
/* PBCH object */
typedef struct SRSLTE_API {
srslte_cell_t cell;
uint32_t nof_symbols;
/* buffers */
cf_t* ce[SRSLTE_MAX_PORTS];
cf_t* symbols[SRSLTE_MAX_PORTS];//调制的符号buffer
cf_t* x[SRSLTE_MAX_PORTS];
cf_t* d;
float* llr; //解调的软信息buffer
float* temp;
float rm_f[SRSLTE_BCH_ENCODED_LEN];//编码之后buffer
uint8_t* rm_b;//速率匹配之后的buffer
uint8_t data[SRSLTE_BCH_PAYLOADCRC_LEN]; //CRC之后bit缓存buffer
uint8_t data_enc[SRSLTE_BCH_ENCODED_LEN];//编码之后的缓存buffer
uint32_t frame_idx;
/* tx & rx objects */
srslte_modem_table_t mod;//调制对象
srslte_sequence_t seq;//scramble初始序列
srslte_viterbi_t decoder;//解码对象
srslte_crc_t crc;//crc校验对象
srslte_convcoder_t encoder;//编码对象
bool search_all_ports;
} srslte_pbch_t;
CRC校验:对不同的发射端口对应不同的CRC校验掩码。24bit的MIB信息,加上16bit的校验码。
srslte_crc_attach(&q->crc, q->data, SRSLTE_BCH_PAYLOAD_LEN);
srslte_crc_set_mask(q->data, q->cell.nof_ports);
卷积码编码:编码速率为1/3。输入为40bit,输出为120bit。
srslte_convcoder_encode(&q->encoder, q->data, q->data_enc, SRSLTE_BCH_PAYLOADCRC_LEN);
速率匹配:内交织模块,按照交织矩阵进行交织,然后进行bit收集和打孔。
一般来说,速率匹配之后得到的bit信息应该小于输入的信息。但是在PBCH信道,在速率匹配的实现过程中,反而进行了信息复制,速率匹配之后的数据为1920bit。实际上,在内交织模块,按照交织矩阵的列数为32来算,由于编码之后的每一路信号为40bit,需要对dk进行补24个0,来满足交织矩阵的列数。故速率匹配输入的dk三路信息比特收集后得到192bit信息,然后将其复制10份,输出1920bit信息。(至于为什么要复制到1920bit的信息,目前我也不能确定,是否是协议中就规定了normal循环前缀的模式下,PBCH信道所使占用的资源粒子RE固定为240个呢?但是为何要占用这么多个RE呢?)
srslte_rm_conv_tx(q->data_enc, SRSLTE_BCH_ENCODED_LEN, q->rm_b, 4 * nof_bits);
加扰:扰码在normal循环前缀的模式下,扰码初始生成序列为1920bit,对应编码生成的1920bit的信息。实际上,1920bit的扰码序列是对应的40ms内的4帧的MIB消息。
srslte_scrambling_b_offset(&q->seq, &q->rm_b[frame_idx * nof_bits], frame_idx * nof_bits, nof_bits);
调制:MIB消息信息使用QPSK调制方式,1920bit调制成960个符号,一个符号承载2bit的信息。
srslte_mod_modulate(&q->mod, &q->rm_b[frame_idx * nof_bits], q->d, nof_bits);
层映射:和映射到的天线口相关,暂时考虑只有一个天线空口的情况。
资源映射:产生的960个符号为4帧的符号数,对应40ms,每一帧240个符号,映射到240个预留的RE上。
srslte_pbch_put(q->symbols[i], &sf_symbols[i][SRSLTE_SLOT_LEN_RE(q->cell.nof_prb, q->cell.cp)], q->cell);
下面来看代码具体怎么实现资源映射的:
首先需要了解RB的资源占用,一个RB在频域上占据12个子载波,时域上占据一个slot.长度。normal循环前缀的情况下, 一个slot为7个ofdm符号长度。
MIB消息时域上占用了4个ofdm符号的长度,频域上占据6个RB,每个RB在频域上12个子载波,所以从图中可以看到MIB消息所用的RE的个数为:6*(4*12-8)=240。代码实现如下:
从时域上来进行映射,时域上一共占据4个ofdm符号长度,对于第一个和第二个ofdm时隙长度,每一个ofdm符号时间内有6*4=24个RE要映射参考信号。
prb_cp_ref(&input, &output, cell.id % 3, 4, 4 * 6, put);//带参考信号资源映射。
prb_cp(&input, &output, 6);//第三、第四个ofdm符号的资源映射。
总结
本文对PBCH信道所涉及的LTE知识进行了简介,并对PBCH信道的代码实现进行了介绍。对于为何MIB消息要分配占用240个RE,存有疑问。另外,为了更方便的调试PBCH信道物理层的代码,从LTE开源协议栈中将代码进行了PBCH信道的物理层函数测试代码进行了提取,能够更加直观的查看每个物理层模块的输入输出。
参考
[1] https://www.sharetechnote.com/html/Handbook_LTE_PBCH.html
[2] 3GPP演进系统技术原理与设计。
最后
以上就是害怕星月为你收集整理的LTE协议栈---物理层PBCH信道前言一、PBCH信道简介二、PBCH代码实现总结参考的全部内容,希望文章能够帮你解决LTE协议栈---物理层PBCH信道前言一、PBCH信道简介二、PBCH代码实现总结参考所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复