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

    function [LLR_SD,M,H_back,rx_layer_x_equalized] = LTE_detect_IA(MCS_and_scheduling,rx_user_symbols,H_est_user,LTE_params,BS_nAtPort,receiver,receiver_k,sigma_n2)
% Interference Alignment detection.
% Authors: Joerg Reitterer, jreitter@nt.tuwien.ac.at, Stefan Schwarz,
% sschwarz@nt.tuwien.ac.at
% (c) 2010 by INTHFT
% www.nt.tuwien.ac.at

nLayers = MCS_and_scheduling.nLayers;

rx_user_symbols_suppressed_interference = zeros(length(rx_user_symbols),nLayers);
rx_layer_x_equalized = zeros(length(rx_user_symbols),nLayers);

M = zeros(1,size(MCS_and_scheduling.CQI_params,2));
for i = 1:size(MCS_and_scheduling.CQI_params,2)
    M(i) = MCS_and_scheduling.CQI_params(i).modulation_order;
end
switch nLayers % when layer number is unequal to codeword number we need to do something
    case 2
        if(MCS_and_scheduling.nCodewords == 1) % 1 codewords, 2 layers
            M = [M,M];
        end
    case 3  % 2 codewords, 3 layers
        M = [M(1),M(2),M(2)];
    case 4  % 2 codewords, 4 layers
        M = [M(1),M(1),M(2),M(2)];
end
bittable = false(sum(M(1:nLayers)),2^max(M));
symbol_alphabet = zeros(nLayers,2^max(M));
for i = 1:nLayers
    bittable(sum(M(1:i-1))+(1:M(i)),1:2^M(i))=LTE_params.bittable{M(i)}; % Bitmapping table
    symbol_alphabet(i,1:2^M(i))=LTE_params.SymbolAlphabet{M(i)}.'; % Symbol alphabet
end
LLR_SD = zeros(sum(M),length(rx_user_symbols));   % Log likelihood Ratios of the Spere decoder

l = 1:length(rx_user_symbols);
p = mod(l-1,nLayers)+1;                 % needed for the choice of the precoding matrix (see 3GPP TS 36.213 section 7.1.3)
k = mod(floor((l-1)/nLayers),4)+1;
if (BS_nAtPort == 2)
    period = 2;
else
    period = lcm(seqperiod(k),seqperiod(p));
end
H_back = zeros(l(end),size(H_est_user,2),nLayers);
for ctr = 1:l(end)
    V = MCS_and_scheduling.V;
    U = MCS_and_scheduling.U;

    if LTE_params.IA_time_granularity == 14
        time_index = 1;
    elseif LTE_params.IA_time_granularity == 7
        time_index = LTE_params.IA_time_granularity*(MCS_and_scheduling.slot_indices(ctr)-1)+1;
    else
        time_index = 1; % at the moment only slot and subframe time granularity is implemented
    end

    H_complete = U{MCS_and_scheduling.freq_indices(ctr),time_index}'*squeeze(H_est_user(ctr,:,:))*V{MCS_and_scheduling.freq_indices(ctr),time_index};

    rx_user_symbols_suppressed_interference(ctr,:) = (U{MCS_and_scheduling.freq_indices(ctr),time_index}'*rx_user_symbols(ctr,:).');
    switch receiver
        case 'SSD'
            rx_layer_x = pinv(H_complete)*rx_user_symbols_suppressed_interference(ctr,:).';
            [Q,R] = qr(H_complete);  % for SS Decoder
            siz = size(R,2);
            if (siz < size(R,1)) % chop off unnecessary data
                R = R(1:siz,:);
                Q = Q(:,1:siz);
            end
            LLR_SD(:,ctr) = LTE_softsphere(rx_layer_x,rx_user_symbols_suppressed_interference(ctr,:),Q,R,symbol_alphabet,bittable,nLayers,M);
        case 'SSDKB'
            rx_layer_x = pinv(H_complete)*rx_user_symbols_suppressed_interference(ctr,:).';
            [Q,R] = qr(H_complete);  % for SS Decoder
            siz = size(R,2);
            if (siz < size(R,1)) % chop off unnecessary data
                R = R(1:siz,:);
                Q = Q(:,1:siz);
            end
            LLR_SD(:,ctr) = LTE_softsphere_kbest(rx_layer_x,rx_user_symbols_suppressed_interference(ctr,:),Q,R,symbol_alphabet,bittable,nLayers,M,receiver_k);
		case 'ZF'
            inv_temp = pinv(H_complete);

            rx_layer_x = inv_temp*rx_user_symbols_suppressed_interference(ctr,:).';
            rx_layer_x_equalized(ctr,:) = rx_layer_x;            
            
            Hg = inv_temp*H_complete;
            noise_enhancement_tmp = sum(abs(inv_temp).^2,2);
            noise_enhancement = [];
            for ii = 1:length(M)
                noise_enhancement = [noise_enhancement;repmat(noise_enhancement_tmp(ii),M(ii),1)];
            end
            LLR_SD(:,ctr) = LTE_demapper(rx_layer_x,symbol_alphabet,bittable,nLayers,M,Hg,noise_enhancement);
        case 'MMSE'
            temp = H_complete'*H_complete;
            inv_temp = (temp+sigma_n2*eye(size(temp)))^-1*H_complete';
            rx_layer_x = inv_temp*rx_user_symbols_suppressed_interference(ctr,:).'; % MMSE receiver
            rx_layer_x_equalized(ctr,:) = rx_layer_x;
            Hg = inv_temp*H_complete;
            noise_enhancement_tmp = sum(abs(inv_temp).^2,2);
            noise_enhancement = [];
            for ii = 1:length(M)
                noise_enhancement = [noise_enhancement;repmat(noise_enhancement_tmp(ii),M(ii),1)];
            end
            LLR_SD(:,ctr) = LTE_demapper(rx_layer_x,symbol_alphabet,bittable,nLayers,M,Hg,noise_enhancement);
        case 'MMSE_SIC' % just a hard decision SIC 
            % choose better stream to decode first
            [C,first] = max(sum(abs(H_complete).^2,1));
            if first == 1
                second = 2;
                bittab1 = bittable(1:M(first),:);
                bittab2 = bittable(M(first)+1:M(first)+M(second),:);
            else
                second = 1;
                bittab1 = bittable(M(second)+1:M(second)+M(first),:);
                bittab2 = bittable(1:M(second),:);
            end
            temp = H_complete'*H_complete;
            inv_temp = (temp+sigma_n2*eye(size(temp)))^-1*H_complete';
            rx_layer_x = inv_temp*rx_user_symbols_suppressed_interference(ctr,:).'; % calculate MMSE solution
            Hg = inv_temp(first,:)*H_complete(:,first);
            noise_enhancement_tmp = sum(abs(inv_temp(first,:)).^2,2);
            noise_enhancement = repmat(noise_enhancement_tmp,M(first),size(rx_layer_x,2));
            LLR_temp1 = LTE_demapper(rx_layer_x(first,:),symbol_alphabet(first,:),bittab1,1,M(first),Hg,noise_enhancement); 
            % hard decision
            symbols1 = symbol_alphabet(1,2.^(0:1:M(first)-1)*(1+sign(LLR_temp1))/2+1);
            % second stream
            rx_user_symbols_suppressed_interference(ctr,:) = rx_user_symbols_suppressed_interference(ctr,:)-(H_complete(:,first)*symbols1).';
            inv_temp = pinv(H_complete(:,second));
            rx2 = inv_temp*rx_user_symbols_suppressed_interference(ctr,:).';
            Hg = inv_temp*H_complete(:,second);
            noise_enhancement_tmp = sum(abs(inv_temp).^2,2);
            noise_enhancement = repmat(noise_enhancement_tmp,M(second),length(rx2));
            LLR_temp2 = LTE_demapper(rx2,symbol_alphabet(second,:),bittab2,1,M(second),Hg,noise_enhancement); 
            if first == 1
                LLR_SD(:,ctr) = [LLR_temp1;LLR_temp2];
            else
                LLR_SD(:,ctr) = [LLR_temp2;LLR_temp1];
            end
    end
end