我是靠谱客的博主 害怕星月,最近开发中收集的这篇文章主要介绍LTE协议栈---物理层PBCH信道前言一、PBCH信道简介二、PBCH代码实现总结参考,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

  • 前言
  • 一、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.物理层模块

PBCH物理层模块

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代码实现总结参考所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部