目录
0. 写在前面
1. 信道编码
2. 经过信道(❤)
3. LDPC译码
这是OFDM链路仿真系列的第一部分。
第一次写博客,望前辈们多多指教!!!
本来想着一口气写完整个过程,写起来才发现还有很多细节都需要深入考证,索性暂时将其按照各环节内容发出,后面会针对导频插入、时变信道构建、信道估计等内容及具体的Matlab代码实现陆续出几篇博客,最后会将这些内容与我对OFDM的初学经验结合,出一篇专门适合研究生初入5/6G专业“小白”(尤其是现在的我)的入门篇。
由于在5G通信标准中,业务信道采用适合长码传输的LDPC编码,而控制信道则采用适合短码传输的polor码,于是在这里信道编码采用LDPC编码。
在Matlab2018b以后,推出了5G Toolbox,这个工具箱还是非常厉害的,可以直接添加LDPC编码。当然现在Matlab版本已经出到了2022a了,可以支持的运算更加广泛,不得不说,Matlab这个工具除了不能生孩子什么都能干,但是高版本的Matlab安装需要更高的电脑配置(官网有最低配置要求),否则会卡得很。5G Toolbox中的LPDC编码还是挺费劲的,完整使用方法如下:
从MAC层传递到物理层的数据称为传输快,LDPC编码的传输块处理有以下四个阶段:
num_bit = 256000;%传输块的长度
bgn = 1; %
CodeRate = 0.5; %码元速率
CRCMode='24A'; %
rv = 0; %
modulation = 'QPSK'; %调制方式
nlayers = 1; %
% 产生256000个信息比特
OFDM_sigbits = randi([0,1],num_bit,1);
%CRC附加
crc = nrCRCEncode(OFDM_sigbits,CRCMode);
crcLen = length(crc); % 这个长度在译码会用到
% 码块分割和码块CRC附加
cbs = nrCodeBlockSegmentLDPC(crc,bgn);
% LDPC编码
dataEnc = nrLDPCEncode(cbs,bgn);
% 速率匹配
RateMatchLength=ceil(num_bit/CodeRate);
RateMatch = nrRateMatchLDPC(dataEnc,RateMatchLength,rv,modulation,nlayers);
Matlab官方文档使用说明:
% ----CRC附加----
crc = nrCRCEncode(OFDM_sigbits,CRCMode)
% OFDM_sigbits :matrix of real numbers。Input data, specified as a matrix of real numbers. Each column of the matrix is treated as a separate data block.
% CRCMode:CRC polynomial, specified as '6', '11', '16', '24A', '24B', or '24C'. For details on the associated polynomials, see TS 38.212 Section 5.1.
% OFDM_sigbits:输入矩阵,默认为实数矩阵,每一列当做一个数据。
% CRCMode:CRC多项式,指定为'6', '11', '16', '24A', '24B', or '24C'其中一种。
% 关于CRC多项式,在《5G移动通信系统设计与标准详解》P310有如下介绍:
%----码块分割和码块CRC附加----
cbs = nrCodeBlockSegmentLDPC(crc,bgn);
% crc:Input data block, specified as a column vector of real numbers.
% bgn:Base graph number, specified as 1 or 2.
% crc:就是上一步得到的CRC序列
% bgn:基图编号,指定为1或2。关于这个部分在《5G移动通信系统设计与标准详解》P293中有介绍:
正因为这个原因,本文使用的案例中,cbs的维度为8448*31:
% LDPC编码
dataEnc = nrLDPCEncode(cbs,bgn);
% cbs:Code block segments before encoding, specified as a matrix or a column vector. The number of columns in in is equal to the number of scheduled code block segments in the transport block. The number of rows in in is equal to the length of the code block segment, including the filler bits, if any.Filler bits are represented by -1 and are treated as 0 when performing encoding.
% bgn:Base graph number, specified as 1 or 2. The values correspond to the two base graphs defined in TS 38.212 Section 5.3.2 [1]
% cbs:就是上面算的那个
% bgn:同上
% 速率匹配
RateMatchLength=ceil(num_bit/CodeRate);
RateMatch = nrRateMatchLDPC(dataEnc,RateMatchLength,rv,modulation,nlayers);
% dataEnc:LDPC-encoded input data, specified as a matrix. Each column of in is a codeword. The number of columns in the input argument in is equal to the number of scheduled code blocks in a transport block. Each column is rate-matched separately, and the results are concatenated in out.
% RateMatchLength:Length of the rate-matched and concatenated output vector, specified as a positive integer. outlen is the number of coded bits available for transmission in the transport block
% rv:Redundancy version, specified as an integer from 0 to 3.
% modulation:Modulation scheme, specified as 'pi/2-BPSK', 'QPSK', '16QAM', '64QAM', or '256QAM'. This modulation scheme determines the modulation type of the codeword and the number of bits used per modulation symbol.
% nlayers:Number of transmission layers associated with the transport block, specified as an integer from 1 to 4.
% dataEnc:经过LDPC编码庵后的数据。它会对每列分别进行速率匹配,结果串联输出。
% RateMatchLength:由于码元速率是0.5,本案例没有考虑资源块。
% rv:冗余版本,指定为 0 到 3 之间的整数。
% modulation:调制方式
% nlayers:与传输块关联的传输层数,指定为 1 到 4 之间的整数。
关于速率匹配内容,建议参考:S^2: NR 速率匹配,匹配的是啥? - 技术综合版块 - 通信人家园 - Powered by C114
总的来说,就是由于发送端在进行信道编码后会产生超量的校验比特,以及包括一些DCI调度信息,导致每次传输时,由实际资源数所决定的可用的比特数小于编码比特数量。那么就需要在传输之前将无法传输的bit扣除,以“匹配”实际资源。
注意:根据可用资源,速率匹配和码块连接过程的输出位数必须与PDSCH(物理下行共享信道)的位容量匹配。在本例中,由于没有对PDSCH进行建模,因此将其设置为根据前面选择的传输块大小来实现目标码率。
但是这块显然,我还没搞懂它的真正含义,希望大佬们指教。
接下来信号将经过调制等一系列处理后进入信道,这里我们只看涉及LPDC编码的部分,方便调试时可以单独确认信道编码部分是否有问题,也方便以后移植。
chOut= double(1-2*BitDemodu);
% BitDemodu:接收端经过解调之后的序列
% chOut:可以看做是接收端做信道译码(LDPC译码)的入口
% 注意:关于矩阵的维度取决于你解调之后的维度,LPDC译码时要求nrRateRecoverLDPC的输入应为列向量!
这个地方不管你的信道是什么样,无噪声信道也好,衰落信道也好,在进行信道译码前(解调后)一定要做这个操作,我一开始在这个地方卡了很久,在Matlab官方文档的一个案例中也提到了这句话(如下图,链接:Low-density parity-check (LDPC) decoding - MATLAB nrLDPCDecode- MathWorks 中国),但是当时它给的位置并不明确,导致我加的位置不对,坑!!!
信道译码的处理与发送端正好相反,其中的相关参数也已经在编码时说明,保持前后参数一致:
% 速率恢复
rateRecover = nrRateRecoverLDPC(chOut,num_bit,CodeRate,rv,modulation,nlayers);
% LDPC译码
% maxNumIter:解码迭代的最大次数,指定为正整数标量。 当所有奇偶校验都满足时,或在 maxNumIter 迭代次数之后终止解码。
maxNumIter = 25;
decBits = nrLDPCDecode(rateRecover,bgn,maxNumIter);
% 码块分割和CRC解码
% crcLen:这个在译码中有,实际上如果采用的是24A的CRC多项式,那crcLen=num_bit+24
dataDec = nrCodeBlockDesegmentLDPC(decBits,bgn,crcLen);
% 传输块CRC解码
sigbits_out = nrCRCDecode( dataDec,CRCMode);
转载请注明出处。