trBlkLen = 1384; % 原始加CRC前的信息BIT长度
D = trBlkLen + 24 +4;
Rsubblock_TC = ceil(D/32);%计算矩阵化的行数
sub_block_interleaver_len = Rsubblock_TC*32;%交织大小
Kpi = sub_block_interleaver_len;%Kpi,输出数据长度
codewordLen = 7200; % 根据时频空域资源,确定输出Bit长度,E值。
rv = 0;%决定速率匹配比特选择的起始位置
crcPoly = '24A';% CRC加扰多项式
Ptabale = [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];%Inter-column permutation pattern
colum_index = Ptabale + 1;
input = randi([0, 1], trBlkLen, 1);
trblockwithcrc = lteCRCEncode(input,crcPoly);%CRC加扰
codeblocks = lteCodeBlockSegment(trblockwithcrc);%分块
% turbocodedblocks = lteTurboEncode(codeblocks);%双归零编码
% aa = turbocodedblocks{1,1};%
turbocodedblocks = 1:D*3;aa=turbocodedblocks;
%---------------- 速率匹配 验证与Matlab库函数的一致性 ---------------
bb = reshape(aa,3,[]);
dummyBitsNum = sub_block_interleaver_len - D;
bb2 = [NaN*ones(3,dummyBitsNum),double(bb)];
dk0 = bb2(1,:);
dk1 = bb2(2,:);
dk2 = bb2(3,:);
Vk0 = reshape(dk0,32,[]).';%按行输入,排32列。
Vk1 = reshape(dk1,32,[]).';
Vk2 = reshape(dk2,32,[]).';
%--------------------- interleave dk0,dk1 ----------------------
Vk0_interleave = Vk0(:,colum_index) ;
Vk1_interleave = Vk1(:,colum_index) ;
%---------------------- dk0 dk2 按列读出 ------------------------
Vk0_interleaveOut = reshape(Vk0_interleave,1,[]);
Vk1_interleaveOut = reshape(Vk1_interleave,1,[]);
%--------------------- interleave dk2 --------------------------
pi_k2 = zeros(1,Kpi);
for k = 0:Kpi-1
% floor(k/Rsubblock_TC) + 1
% mod(k,Rsubblock_TC)
% pi_k(k+1) = Ptabale(floor(k/Rsubblock_TC) + 1) + 32*mod(k,Rsubblock_TC) + 1;
pi_k2(k+1) = mod(Ptabale(floor(k/Rsubblock_TC) + 1) + 32*mod(k,Rsubblock_TC) + 1,Kpi);
end
Vk2_interleave = dk2(pi_k2+1);
%--------------------- bit collection -------------------------
cc = reshape([Vk1_interleaveOut;Vk2_interleave],1,[]);
w = [Vk0_interleaveOut,cc];
%---------------------- bit selection & transmition -------------------------
E = codewordLen;
Kw = 3*Kpi;
Ncb = Kw;
k0 = Rsubblock_TC*2;
j = 0;k=0;e = zeros(1,E);
index = find(w>=1 & w<=4236);
ww = w(index);
while k<E
Wtemp = w(mod(k0+j,Ncb)+1);
if Wtemp>=1 & Wtemp<=4236
k = k+1;
e(k) = Wtemp;
end
j = j+1;
end
%--------------------------------------------------------------
codeword = lteRateMatchTurbo(turbocodedblocks,codewordLen,rv);%The bit selection stage assumes a QPSK transmission mapped onto a single layer.
% codeword2 = (2*codeword -1) ;
cmp = [e;codeword.'];
% rateRecovered = lteRateRecoverTurbo(codeword,trBlkLen,rv);
% rateRecovered{1,1}
% rateRecovered2 = (sign(rateRecovered{1,1})+1) /2
通过最终比较,发现LTE的matlab库函数速率匹配输出的索引codeword与手动计算的最终结果e存在固定的关系;
matlab的库输入是按照下列顺序排列时候,输出索引就正好差3倍