一、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
微信扫一扫
支付宝扫一扫