初识LTE(三):码率匹配和码率分块

一.码率匹配

1.码率匹配原理

什么是码率匹配呢?就是Turbo编码原本码率是1/3,如果信道很好,那我可以少发一点1/2就可以了,这就是码率匹配

码率匹配原理如下

那么,如何解码率匹配呢,那些比特可是结结实实的少发了呀!

实际上,就是用0填充,LTE称其为打孔和解打孔操作

2. 码率匹配代码

%------------------------码率匹配-----------------------%
%-----------------------author:lzx-------------------------%
%-----------------------date:2022年7月1日17点45分-----------------%
function y= RateMatcher(in, Kplus, Rate)
% Rate matching per coded block, with and without the bit selection.
% D是发送比特的长度
D = Kplus+4;
if numel(in)~=3*D, error('Kplus (2nd argument) times 3 must be size of input 1.');end % Parameters
% 矩阵的列固定为32,然后去满足够的行以放下所有比特
% 多余的Nd个填Null
colTcSb = 32;
rowTcSb = ceil(D/colTcSb);
Kpi = colTcSb * rowTcSb;
Nd = Kpi - D;% Bit streams
% 取出Turbo编码的三个比特流
d0 = in(1:3:end); % systematic
d1 = in(2:3:end); % parity 1st
d2 = in(3:3:end); % parity 2nd
% 交织
i0=(1:D)';
Index=indexGenerator(i0,colTcSb, rowTcSb, Nd);
Index2=indexGenerator2(i0,colTcSb, rowTcSb, Nd);
% Sub-block interleaving - per stream
v0 = subBlkInterl(d0,Index);
v1 = subBlkInterl(d1,Index);
v2 = subBlkInterl(d2,Index2);
vpre=[v1,v2].';
v12=vpre(:);%   Concat 0, interleave 1, 2 sub-blk streams
% Bit collection
% 比特收集
wk = zeros(numel(in), 1);
wk(1:D) = v0(~isnan( v0 ));
wk(D+1:end) = v12(~isnan( v12 ));% Apply rate matching
% 裁剪
N=ceil(D/Rate);
y=wk(1:N);endfunction v = indexGenerator(d, colTcSb, rowTcSb, Nd)
% Sub-block interleaving - for d0 and d1 streams onlycolPermPat = [0, 16, 8, 24, 4, 20, 12, 28, 2, 18, 10, 26, 6, 22, 14, 30,...1, 17, 9, 25, 5, 21, 13, 29, 3, 19, 11, 27, 7, 23, 15, 31];% For 1 and 2nd streams only
y = [NaN*ones(Nd, 1); d];       % null (NaN) filling
inpMat = reshape(y, colTcSb, rowTcSb).';
permInpMat = inpMat(:, colPermPat+1);
v = permInpMat(:);endfunction v = indexGenerator2(d, colTcSb, rowTcSb, Nd)
% Sub-block interleaving - for d2 stream onlycolPermPat = [0, 16, 8, 24, 4, 20, 12, 28, 2, 18, 10, 26, 6, 22, 14, 30,...1, 17, 9, 25, 5, 21, 13, 29, 3, 19, 11, 27, 7, 23, 15, 31];
pi = zeros(colTcSb*rowTcSb, 1);
for i = 1 : length(pi)pi(i) = colPermPat(floor((i-1)/rowTcSb)+1) + colTcSb*(mod(i-1, rowTcSb)) + 1;
end% For 3rd stream only
y = [NaN*ones(Nd, 1); d];       % null (NaN) filling
inpMat = reshape(y, colTcSb, rowTcSb).';
ytemp = inpMat.';
y = ytemp(:);
v = y(pi);endfunction out=subBlkInterl(d0,Index)
out=zeros(size(Index));
IndexG=~isnan(Index);
IndexB=isnan(Index);
MyIndex=Index(IndexG);
out(IndexG)=d0(MyIndex);
Nd=sum(IndexB);
out(IndexB)=nan(Nd,1);
end
%------------------------解码率匹配-----------------------%
%-----------------------author:lzx-------------------------%
%-----------------------date:2022年7月1日17点53分-----------------%
function out = RateDematcher(in, Kplus)
% Undoes the Rate matching per coded block.
%#codegen
% 之前被打孔掉的比特用0填充即可,为什么?
% Parameters
colTcSb = 32;
D = Kplus+4;
rowTcSb = ceil(D/colTcSb);
Kpi = colTcSb * rowTcSb;
Nd = Kpi - D;tmp=zeros(3*D,1);
tmp(1:numel(in))=in;% no bit selection - assume full buffer passed in
i0=(1:D)';
Index= indexGenerator(i0,colTcSb, rowTcSb, Nd);
Index2= indexGenerator2(i0,colTcSb, rowTcSb, Nd);
Indexpre=[Index,Index2+D].';
Index12=Indexpre(:);% Bit streams
tmp0=tmp(1:D);
tmp12=tmp(D+1:end);
v0 = subBlkDeInterl(tmp0, Index);
d12=subBlkDeInterl(tmp12, Index12);
v1=d12(1:D);
v2=d12(D+(1:D));% Interleave 1, 2, 3 sub-blk streams - for turbo decoding
temp = [v0 v1 v2].';
out = temp(:);
endfunction v = indexGenerator(d, colTcSb, rowTcSb, Nd)
% Sub-block interleaving - for d0 and d1 streams onlycolPermPat = [0, 16, 8, 24, 4, 20, 12, 28, 2, 18, 10, 26, 6, 22, 14, 30,...1, 17, 9, 25, 5, 21, 13, 29, 3, 19, 11, 27, 7, 23, 15, 31];% For 1 and 2nd streams only
y = [NaN*ones(Nd, 1); d];       % null (NaN) filling
inpMat = reshape(y, colTcSb, rowTcSb).';
permInpMat = inpMat(:, colPermPat+1);
v = permInpMat(:);endfunction v = indexGenerator2(d, colTcSb, rowTcSb, Nd)
% Sub-block interleaving - for d2 stream onlycolPermPat = [0, 16, 8, 24, 4, 20, 12, 28, 2, 18, 10, 26, 6, 22, 14, 30,...1, 17, 9, 25, 5, 21, 13, 29, 3, 19, 11, 27, 7, 23, 15, 31];
pi = zeros(colTcSb*rowTcSb, 1);
for i = 1 : length(pi)pi(i) = colPermPat(floor((i-1)/rowTcSb)+1) + colTcSb*(mod(i-1, rowTcSb)) + 1;
end% For 3rd stream only
y = [NaN*ones(Nd, 1); d];       % null (NaN) filling
inpMat = reshape(y, colTcSb, rowTcSb).';
ytemp = inpMat.';
y = ytemp(:);
v = y(pi);endfunction out=subBlkDeInterl(in,Index)
out=zeros(size(in));
IndexG=find(~isnan(Index)==1);
IndexOut=Index(IndexG);
out(IndexOut)=in;
end

二.码块分割

1.码块分割的原理

解码就是逆操作,这里就不展开了

2.代码

%------------------------码块分割-----------------------%
%-----------------------author:lzx-------------------------%
%-----------------------date:2022年7月2日20点35分-----------------%
function  [C, Kplus] = CblkSegParams(tbLen)
%#codegen
%% Code block segmentation
% C: 被分为了多少个码块
% KPlus: 被分割完的会有两个长度,一个是K-一个是K+,详情看我博客
blkSize = tbLen + 24;
maxCBlkLen = 6144;
% 无需分块
if (blkSize <= maxCBlkLen)C = 1;          % number of code blocksb = blkSize;    % total bits
% 计算C
elseL = 24;C = ceil(blkSize/(maxCBlkLen-L));b = blkSize + C*L;
end% Values of K from table 5.1.3-3
validK = [40:8:512 528:16:1024 1056:32:2048 2112:64:6144].';
% 找到Kplus
% First segment size
temp = find(validK >= b/C);
Kplus = validK(temp(1), 1);     % minimum K
%------------------------找到分块后每块的长度-----------------------%
%-----------------------author:lzx-------------------------%
%-----------------------date:2022年7月2日20点50分-----------------%
function E = CbBitSelection(C, G, Nl, Qm)
%#codegen
% Bit selection parameters
% G = total number of output bits
% Nl   Number of layers a TB is mapped to (Rel10)
% Qm    modulation bits
Gprime = G/(Nl*Qm);
gamma = mod(Gprime, C);
E=zeros(C,1);
% Rate matching with bit selection
% 余数以下的小一点,大于的大一点
for cbIdx=1:Cif ((cbIdx-1) <= (C-1-gamma))E(cbIdx) = Nl*Qm*floor(Gprime/C);elseE(cbIdx)   = Nl*Qm*ceil(Gprime/C);end
end

这里做一个补充,代码中获得总比特数G的式子是

G=ceil((Kplus+4)/CodingRate);

这明显只适用于不分块的情况,正确的应该是

G=ceil((Kplus+4)*C/CodingRate);

分析一下为什么,正常总比特应该如何计算呢

应该是输入数据长度inLen加上CRC和Turbo编码的长度,CRC会增加24比特,Turbo增加四比特

合计就是(inLen+C*(4+24))再进行码率匹配

但是注意,为了方便Kplus的选取,我们的输入长度总是Kplus-24的长度,所有代码都是这样的,或是他的倍数,因此两者殊途同归!

但是要注意把C补上

三.CRC

CRC纠错遍布在整个LTE中,整个TB需要添加CRC,分割后每个码块也要添加CRC

CRC的远离大致是补零后整除,不会的可以在一些通信原理书上学习一下

四.LTE发送总流程

如下图,重组后进行扰码,调制,然后发送,这就是DLSCH的总流程

初识LTE(三):码率匹配和码率分块相关推荐

  1. 初识LTE(五):完整的SISO LTE 物理层实现

    文章目录 初识LTE(五):完整的SISO LTE 物理层实现 零.代码地址 一.实现整体过程 1.参数初始化 commlteSISO_params commlteSISO_initialize pr ...

  2. 爱立信与中国联通成功完成国内首个LTE三载波聚合大规模部署测试

    近日,爱立信与中国联通网络技术研究院.联通四川省公司.联通成都市分公司.Qualcomm Incorporated子公司Qualcomm Technologies, Inc.合作成功实现了国内首个三载 ...

  3. RTKLIB专题学习(七)---精密单点定位实现初识(三)

    RTKLIB专题学习(七)-精密单点定位实现初识(三) 上两篇我们介绍了RTKLIB中精密单点定位的大致流程,今天我们对照RTKLIB学习手册,来学习相应改正公式和误差源 1.在PPP模式中 RTKL ...

  4. 初识MIMO(三):天线分集技术及其仿真

    初识MIMO(三):天线分集技术及其仿真 零 代码地址 https://github.com/liu-zongxi/MIMO_simulation 请大家看完觉得有用别忘了点赞收藏,github项目给 ...

  5. 宇视摄像机码流类型定码率和变码率的区别?

    问题:宇视摄像机码流类型定码率和变码率的区别? 答案: 定码率:数据以恒定的码率进行传输,波动较小 变码率:码率会根据实况质量进行调整,波动较大

  6. 监控技术:smart265和H.265的主要区别 动态码率和变码率的主要区别

    smart265和H.265的主要区别在于二者编码所使用的码率不同,smart开启之后,在二者保证图像质量的前提下,smart265所使用的码率低于H.265所说用的码率.在空闲场景的图片上,smar ...

  7. nginx -rtmp多码率,动态码率二级m3u8适应

    视频看这里 此处是youtube的播放链接,需要科学上网.喜欢我的分享,记得订阅我的频道,打开旁边的小铃铛,谢谢支持. 前言 之前的一篇博文 https://xugaoxiang.com/2020/0 ...

  8. ffmpeg使用,读取码率和写入码率的注意事项

    bool AudioStream::GetMetaData(const char* srcfile) 此函数是用来读取码率的函数 wav格式文件转mp3时 if (AudioParaChangeFla ...

  9. [32期] 想学PHP来兄弟连是正确的选择 初识兄弟连三周

    各位同学,大家好. 我是兄弟连第32期学员,陈文,我有一个用了近10年的个性签名:做一个有思想的好人,喝好咖啡,听好音乐,敏锐有活力,有激情爱探索,感染周围的人.这个签名表达了我积极进取的人生观,鼓励 ...

最新文章

  1. android检测蓝牙设备连接不上,Android检查设备连接状态
  2. python for i in range 三维_python中的三维卷积
  3. win10 Linux子系统 交叉编译器注意事项
  4. 第一阶段_第一部分_工具介绍
  5. Windows环境配置Anaconda+cuda+cuDNN+pytorch+jupyter notebook
  6. 西门子cpu指示灯含义_西门子S7200仿真软件如何使用?
  7. 大学电路题目怎么搜_长沙理工大学2020真题浅析
  8. 深度学习(四)卷积神经网络入门学习(1)
  9. 织梦CMS被挂马特征汇总
  10. 使用Kotlin在活动之间进行Android意向处理
  11. Unity2021如何设置中文模式
  12. CentOS 安装SVN以及可视化管理工具iF.SVNAdmin
  13. Win10找回自带的Windows照片查看器:打开jpg、png、gif格式的图片
  14. ECOTT凭借蕴含韩国传统的“韩纸防疫口罩”和控制体重零食“黑心魔芋”打入国际市场
  15. python过滤_在纯Python中映射,过滤和减少
  16. js通过开始时间和结束时间计算出中间的所有日期,并且转换为层级结构数组对象,用于甘特图头部日期数据
  17. 分享一个简单易用的python并行模块【PP模块】
  18. 王者显示重连服务器失败,最强王者三国手游服务器连接失败 最强王者三国手游曹操学什么技能...
  19. JPA 7. Spring 整合 JPA
  20. android 自定义声音,如何在Android设备中添加自己的自定义声音

热门文章

  1. 有什么适合记者做笔记,整理采访稿的应用?
  2. 大兴区优秀青年人才培养措施等奖励及申报条件,补贴30-80万
  3. Summary_JavaScript中数字的小数点保留两位小数
  4. 关于食品企业的健康发展,重视品牌概念是关键
  5. 品牌需要来看看这个UP主眼里的“她困境”
  6. python网络爬虫实列——站长之家url解码编码
  7. 使用盛派Senparc SDK微信开发
  8. 动手开发一个名为“微天气”的微信小程序(下)
  9. mac mds是什么_什么是mds和mdworker,为什么它们在我的Mac上运行?
  10. 信息安全导论复习(1-5章)