www.gusucode.com > LTE仿真Matlab源码 > LTE_rx_turbo_rate_matcher.m

    function dk = LTE_rx_turbo_rate_matcher(LTE_params,ek,UE_signaling,UE,stream_index)
% LTE Turbo Code Rate Matcher, as of TS 36.212, Section 5.1.4.1.
% [dk] = LTE_rx_turbo_rate_matcher(ek,UE_signaling,UE)
% Author: Josep Colom Ikuno, jcolom@nt.tuwien.ac.at
% (c) 2008 by INTHFT
% www.nt.tuwien.ac.at
%
% input :   input_bits        ... ek (soft bits)
%           UE_signaling      ... BS signaling
% output:   output_bits       ... rate de-matched bits

% Nomenclature scheme
%        _______________________        ________________        ___________________________
%  dk-> | sub-block interleaver | vk-> | bit collection | wk-> | bit selection and pruning | ek->
%       |_______________________|      |________________       |___________________________|
%
% date of creation: 2008/08/11
% last changes: 
%   2008/09/15  Bosanska    added input [1 x 1]struct UE
%   2009/04/22  Jcolom      Changed how N_IR is set according to the new version of the standard (8.6.0)

C = length(ek);
wk = cell(1,C);
vk = cell(1,C);
dk = cell(1,C);
if UE.mode==3 || UE.mode==4
    K_MIMO = 2;
else
    K_MIMO = 1;
end
M_limit = 8;

N_IR = floor(UE.N_soft / (K_MIMO*min(LTE_params.HARQ_processes,M_limit)));

for i=1:C
    % Actual bit selection and pruning (genie driven)
    bit_selection_and_pruning_mapping = UE_signaling.turbo_rate_matcher(stream_index).bit_selection_and_pruning_mapping{i};
    wk{i} = LTE_common_turbo_rate_matching_bit_selection_and_pruning(ek{i},...
        bit_selection_and_pruning_mapping,...
        2,...
        UE_signaling.turbo_rate_matcher(stream_index).subblock_interleaver(i).K_pi*3);
    
    % Circular buffer
    wk_length = length(wk{i});
    vk_length = wk_length/3;
    vk12 = reshape(wk{i}(vk_length+1:end),2,[]);
    vk{i} = [wk{i}(1:vk_length); vk12(1,:); vk12(2,:)];
    
    UE_signaling.turbo_rate_matcher(stream_index).ek_sizes(i) = length(bit_selection_and_pruning_mapping);
end
% Sub-block interleaver
dk = subblock_interleaver(LTE_params,UE_signaling.TB_segmentation(stream_index).C,UE_signaling.turbo_rate_matcher(stream_index),vk);
end

function dk = subblock_interleaver(LTE_params,C,signaling,vk)
% LTE Turbo Sub-Block deinterleaver, as of TS 36.212, Section 5.1.4.1.
% New implementation due to trying to find a deeply esoteric bug hidden
% somewhere in the channel coding and segmentation code.
% Author: Josep Colom Ikuno, josep.colom@nt.tuwien.ac.at
% (c) 2010 by INTHFT
% www.nt.tuwien.ac.at
%
% date of creation: 2010/11/03
% last changes:

dk = cell(1,C);
for i_=1:C
    codeblock = vk{i_};
    R_tc  = signaling.subblock_interleaver(i_).R_tc;
    N_d   = signaling.subblock_interleaver(i_).Nd;
    d_k2  = LTE_common_soft_bit_interleaver(codeblock(3,:),signaling.subblock_interleaver(i_).vk2_mapping,0); % Interleave flag set to 0 (deinterleave)
    d_k01 = [
        reshape(codeblock(1,:),R_tc,[])
        reshape(codeblock(2,:),R_tc,[])
        ];
    d_k01 = d_k01(:,LTE_params.sub_block_interleaver_permutation_pattern_plus_one);
    d_k0  = reshape(d_k01(1:R_tc,:)',1,[]);
    d_k1  = reshape(d_k01((R_tc+1):end,:)',1,[]);
    % Final assembly removal of filler bits
    dk{i_} = [
        d_k0((N_d+1):end)
        d_k1((N_d+1):end)
        d_k2((N_d+1):end)
        ];
end

end