一、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/zh-tw/n/272081.html