一、PDCCH简介
PDCCH是LTE系统中的一种物理信道(Physical Channel),它是DownLink控制信道,并且承载了用于UE上行和下行的控制信息。PDCCH使用了一种称为“交织”(Interleaving)的技术,可以提高反转码(Turbo编码、LDPC编码)的效率,以提高整个系统的性能。
PDCCH使用了多重码流(Multiple Streams)的方式,每个码流都可以承载一个或多个控制信息,例如:DPCCH、DPCCH、UL-SCH等,每个码流都有独立的格子(Resource Blocks)用于传输数据,这种格子叫做Control Resource Block(CRB)。
下面是一个简单的PDCCH结构图:
+---------------------------+ | CCE | +---------------------------+ | | | PDCCH | | | +---------------------------+ | PCFICH | +---------------------------+
图中,PCFICH(Physical Control Format Indicator Channel)是PDCCH的同步信道,用于传输当前发射的PDCCH所使用的子载波数(即控制信道的带宽),CCE(Control Channel Element)是将PDCCH映射到物理资源上的最小单位,PDCCH则是承载控制信息的物理信道。
二、PDCCH参数详解
1. CFI(Control Format Indicator)
CFI用于指示当前所用的PDCCH控制信道的无线资源块(Resource Block)数量,以便UE可以正确地解码控制信息。
通过多种传输方案,可以同时传输不同CFI的PDCCH,例如,在一个2×2 MIMO Antenna中,可以同时传输CFI为1和CFI为2的两个PDCCH。
2. DCI(Downlink Control Information)格式
DCI格式是用于将控制信息传输到UE的二进制格式,常用的DCI格式包括:
(1)DCI Format 0
DCI格式0是用于向UE传输短控制信息的格式,例如:传输调度、传输应答、传输状态更新等。DCI格式0的结构图示如下:
+---------------------------+ | HARQ Process Number | +---------------------------+ | Transport Block | | | +---------------------------+ | Redundancy | | Version Number | +---------------------------+
其中,HARQ Process Number表示用于当前传输的提示,Transport Block表示传输的数据,Redundancy和Version Number是用于纠错的冗余信息。
(2)DCI Format 1
DCI格式1是用于告诉UE哪些资源块可以用于传输数据,而且需要接收到哪些数据,同时还可以传输短控制信息。DCI格式1的结构示例如下:
+---------------------------+ | RNTI | +---------------------------+ | Transport Block | | | +---------------------------+ | Antenna Info | +---------------------------+ | DCI Format | +---------------------------+ | Redundancy | +---------------------------+
其中,RNTI(Radio Network Temporary Identifier)是用于标识UE的ID,Transport Block、Antenna Info、DCI Format和Redundancy与DCI格式0相同。
3、调制方式(QAM)
QAM表示传输数据的调制方式,常用的调制方式有QPSK、16QAM和64QAM。
4、码率(Modulation and Coding Scheme)
码率指将帧中的数据转化为信号后所使用的码流速率,常用的码率有MCS1 ~ MCS28.
三、PDCCH解调和检测
在UE端,PDCCH需要进行解调和检测,以正确地解码控制信息,并执行相关操作。解调和检测的过程如下:
1、解调(Demodulation)
UE会接收到一个包含PDCCH的信号,然后将其解调成二进制,解调后的结果称为符号,符号用于执行后续的解码过程。
2、RAZ(Re-Addition of the Zeros)
该步骤是将PDCCH的码组中零振幅插入到对应符号位置,以保证每个符号位宽都相等。
3、deinterleaving
该步骤是对RAZ后的数据进行“反交织”操作,以减少误码率。反交织使用了一种称为“循环交织器”(Cyclic Interleaver)的算法,它将RAZ后的二进制串分组,并将它们放到不同的位置上。下面是一个反交织过程的示例:
Before: 01101010111 After: 01011101101
4、解码(Decoding)
在解调、RAZ和反交织之后,UE开始将数据解码成有效信息。解码使用了LDPC(Low Density Parity Check)技术、Turbo编码技术等方法。
四、PDCCH代码示例
1、生成PDCCH码字
//生成PDCCH的码字 int[] generatePdcchBits(int cfi, int[] dciBits, int[] cellRNTIBits, int[] nBitsDonlp1) { //头部信息 int[] headerBits = generatePdcchHeaderBits(cfi, cellRNTIBits, nBitsDonlp1); //计算总长度 int length = headerBits.length + dciBits.length; //拼接码字 int[] bits = new int[length]; System.arraycopy(headerBits, 0, bits, 0, headerBits.length); System.arraycopy(dciBits, 0, bits, headerBits.length, dciBits.length); //返回码字 return bits; } //生成PDCCH头部 int[] generatePdcchHeaderBits(int cfi, int[] cellRNTIBits, int[] nBitsDonlp1) { //头部信息的长度和格式 int headerLength = 24; int headerFormat = 0; //将头部信息转换为二进制码组 int[] bits = new int[headerLength]; bits[0] = headerFormat; //头部信息格式 bits[1] = cfi; //控制信道无线资源块数量 bits[2] = cellRNTIBits[0]; //RNTI位0 bits[3] = cellRNTIBits[1]; //RNTI位1 System.arraycopy(nBitsDonlp1, 0, bits, 4, nBitsDonlp1.length); //Donlp位数值 //返回头部信息 return bits; }
2、解调PDCCH码字
//解调PDCCH码字 int[] demodulatePdcchBits(int[] input, int bitsPerSymbol, double[] constellation) { //计算符号数量 int symbols = input.length / bitsPerSymbol; //创建符号数组 int[] output = new int[symbols]; //解调各个符号 for (int i = 0; i < symbols; i++) { int begin = i * bitsPerSymbol; int end = (i + 1) * bitsPerSymbol - 1; //将当前符号的二进制码组转换为十进制数 String binary = ""; for (int j = begin; j <= end; j++) binary += input[j]; int decimal = Integer.parseInt(binary, 2); //使用星座图将十进制数映射到复数上 int realIndex = decimal / (int) Math.sqrt(constellation.length); int imagIndex = decimal % (int) Math.sqrt(constellation.length); output[i] = complex(realIndex, imagIndex, constellation); } //返回解调后的符号数组 return output; } //将十进制实部和虚部的索引映射到复数上 int complex(int realIndex, int imagIndex, double[] constellation) { double real = constellation[realIndex]; double imag = constellation[imagIndex]; return (int) (real + imag * 1j); }
3、反交织PDCCH码字
//PDCCH反交织操作 int[] deinterleavePdcchBits(int[] input, int[] interleavingTable) { //创建反交织后的数据 int[] output = new int[input.length]; //按照交织表将数据从input中反交织到output中 for (int i = 0; i < input.length; i++) output[interleavingTable[i]] = input[i]; //返回反交织后的数据 return output; }
4、解码PDCCH码字
//解码PDCCH码字 int[] decodePdcchBits(int[] input, int maxIterations, LDPC ldpc) { //先进行纠错译码,再进行PDCCH码字分解 int[] output = ldpc.decode(input, maxIterations); int[] dciBits = extractDciBits(output); //返回解码后的控制信息 return dciBits; } //从PDCCH码字中分离出控制信息 int[] extractDciBits(int[] input) { //获取PDCCH格式 int pdcchFormat = input[0]; //获取DCI位数 int nDCIBits = 0; switch (pdcchFormat) { case 0: nDCIBits = 22; break; case 1: nDCIBits = 30; break; } //获取控制信息 int[] dciBits = new int[nDCIBits]; System.arraycopy(input, 24, dciBits, 0, nDCIBits); //返回控制信息 return dciBits; }
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/272081.html