目录

0. 写在前面

1. 信道编码

2. 经过信道(❤)

3. LDPC译码

0. 写在前面

这是OFDM链路仿真系列的第一部分。

第一次写博客,望前辈们多多指教!!!

本来想着一口气写完整个过程,写起来才发现还有很多细节都需要深入考证,索性暂时将其按照各环节内容发出,后面会针对导频插入、时变信道构建、信道估计等内容及具体的Matlab代码实现陆续出几篇博客,最后会将这些内容与我对OFDM的初学经验结合,出一篇专门适合研究生初入5/6G专业“小白”(尤其是现在的我)的入门篇。

1. 信道编码

由于在5G通信标准中,业务信道采用适合长码传输的LDPC编码,而控制信道则采用适合短码传输的polor码,于是在这里信道编码采用LDPC编码。

在Matlab2018b以后,推出了5G Toolbox,这个工具箱还是非常厉害的,可以直接添加LDPC编码。当然现在Matlab版本已经出到了2022a了,可以支持的运算更加广泛,不得不说,Matlab这个工具除了不能生孩子什么都能干,但是高版本的Matlab安装需要更高的电脑配置(官网有最低配置要求),否则会卡得很。5G Toolbox中的LPDC编码还是挺费劲的,完整使用方法如下:

从MAC层传递到物理层的数据称为传输快,LDPC编码的传输块处理有以下四个阶段:

  • CRC附加
  • 码块分割和码块CRC附加
  • 使用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进行建模,因此将其设置为根据前面选择的传输块大小来实现目标码率。

但是这块显然,我还没搞懂它的真正含义,希望大佬们指教。

2. 经过信道(❤)

接下来信号将经过调制等一系列处理后进入信道,这里我们只看涉及LPDC编码的部分,方便调试时可以单独确认信道编码部分是否有问题,也方便以后移植。

chOut= double(1-2*BitDemodu);
% BitDemodu:接收端经过解调之后的序列
% chOut:可以看做是接收端做信道译码(LDPC译码)的入口
% 注意:关于矩阵的维度取决于你解调之后的维度,LPDC译码时要求nrRateRecoverLDPC的输入应为列向量!

这个地方不管你的信道是什么样,无噪声信道也好,衰落信道也好,在进行信道译码前(解调后)一定要做这个操作,我一开始在这个地方卡了很久,在Matlab官方文档的一个案例中也提到了这句话(如下图,链接:Low-density parity-check (LDPC) decoding - MATLAB nrLDPCDecode- MathWorks 中国),但是当时它给的位置并不明确,导致我加的位置不对,坑!!!

3. LDPC译码

信道译码的处理与发送端正好相反,其中的相关参数也已经在编码时说明,保持前后参数一致:

  • 速率恢复
  • LDPC译码
  • 码块分割和CRC解码
  • 传输块CRC解码
% 速率恢复
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); 

转载请注明出处。

参考资料 :

  1. 《5G移动通信系统设计与标准详解》/ /王映民, 孙韶辉等编著
  2. 《MIMO-OFDM无线通信技术及MATLAB实现》/(韩) Yong Soo Cho ... [等] 著 ;孙锴, 黄威
  3. 速率匹配:https://www.txrjy.com/thread-1191587-1-1.html
  4. LDPC编码:https://www.361shipin.com/blog/1553626454791553024
  5. 信道编码函数:https://ww2.mathworks.cn/

5G NR OFDM链路层仿真及Matlab代码实现(1):LDPC信道编译码之5G Tollbox中相关函数使用介绍相关推荐

  1. 【OFDM】多径信道下OFDM通信系统误码率仿真附matlab代码

    1 内容介绍 仿真是科学研究和工程建设中非常重要的方法.交频分复用(OFDM)技术是下一代移动通信的核心技术之一.重点研究了多径瑞利衰落信道下最大多径时延对基于OFDM技术的通信系统性能的影响. 2 ...

  2. LDPC的信道编译码的matlab仿真——LDPC译码最小和和归一化最小和

    1.问题描述: LDPC的信道编译码的matlab仿真--LDPC译码最小和和归一化最小和 2.部分程序: clc; clear all; load H; D=H(1:675,5401:6075); ...

  3. 【天文】基于matlab实现GPS卫星运动仿真附matlab代码

    1 内容介绍 基于matlab实现GPS卫星运动仿真 2 部分代码 %time是个时间参数利用它可以画出一个看起来旋转的地球 function DrawEarth(time) r=6400; j1=[ ...

  4. 【雷达通信】雷达探测项目仿真附Matlab代码

    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信.

  5. 【无人机】基于虚拟leader实现无人机编队仿真附matlab代码

    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信.

  6. 【LDPC/STBC】基于LDPC/STBC编译码的图像传输系统的MATLAB仿真

    目录 1.软件版本 2.本算法理论知识点 3.算法具体理论 4.部分核心代码 5.仿真演示

  7. 【雷达通信】雷达探测项目仿真(Matlab代码实现)

  8. 【机械】基于matlab模拟打桩机运动学仿真附matlab代码

    1 内容介绍 ​分析和比较了液压打桩机的液压控制系统原理,建立了液压系统的数学模型. 2 部分代码 clear;   %清除工作区 clc;     %清除命令区 figure('name','打桩机 ...

  9. 基于PID控制的四旋翼飞行器仿真(Matlab代码实现)

最新文章

  1. c 语言 按位与或非运算符,C++中的按位与、按位与或|、按位异或^运算符详解
  2. pandas matplotlib 直播数据分析
  3. matlab randint函数
  4. python3super用法_Python3中的super()函数详解
  5. 猜1-10的数字python脚本
  6. 排列组合(HDU-1521)
  7. X-006 FriendlyARM tiny4412 u-boot移植之Debug串口用起来
  8. prototype的相关注意点
  9. 使用Kotlin的Android ListView
  10. 输入网址的时候,浏览器是如何判断你是http协议还是https协议的
  11. 现代软件工程——第一周博客作业
  12. 在更新.net 4.5补丁后,VS2012突然不能打开项目,卸载补丁之后解决。
  13. 网页背景音乐播放器html代码
  14. 由二叉树前序序列、中序序列输出相应后续序列
  15. 路由汇总与路由聚合的区别
  16. 云服务器常见的几种防护方法
  17. H.265中针对scc的工具 -- transformskip
  18. 【Mybatis学习路线】day02mybatis的增删改查操作
  19. 【微信公众号】微信扫一扫,条形码/一维码,二维码功能解析
  20. 国风就是帅,会三板吗,看看新天吧

热门文章

  1. 给测试实习生,新人的小小建议
  2. 相机ISO是什么 ISO是什么意思?
  3. HDU1253:胜利大逃亡(BFS)
  4. 新房装修流程详细步骤有哪些? 新房装修流程注意事项有哪些?
  5. 30条爆笑的程序员梗PHP是最好的语言
  6. Golang如何正确的停止Ticker
  7. 昨夜“星城”昨夜“疯”
  8. EMC磁珠到底什么样的特性
  9. win10计算机丢失msvcr,Win10系统msvcp140.dll丢失怎样修复?
  10. 【打卡】医学搜索Query相关性判断学习赛