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

    function [rank_i,PMI,CQI] =  LTE_feedback_CLSM(nAtPort,sigma_n2,LTE_params,channel,UE,uu)
% author Stefan Schwarz
% contact stefan.schwarz@nt.tuwien.ac.at
% calculates the PMI, RI and CQI feedback

%% channel prediction
% save channel matrix for channel prediction 
UE.previous_channels = circshift(UE.previous_channels,[0,0,-1,0,0]);
UE.previous_channels(:,:,end,:,:)=channel(:,:,:,:);
H_est_complete = LTE_channel_predictor(UE.previous_channels,LTE_params.uplink_delay,LTE_params.ChanMod_config.filtering,UE.predict);

%% some initializations
% rank_i = min(size(H_est_complete,3),size(H_est_complete,4));    % NOTE: remove when rank_i feedback is supported!
H = reshape(mean(mean(H_est_complete,1),2),size(H_est_complete,3),size(H_est_complete,4)); 
max_rank = min(size(H));
PMI = zeros(LTE_params.Nrb,2);
PMI_temp = zeros(max_rank,LTE_params.Nrb,2);
% CQI = zeros(LTE_params.Nrb,2,min(2,max_rank));
% CQI_temp = zeros(LTE_params.Nrb,2,max_rank,min(2,max_rank));
CQI = zeros(LTE_params.Nrb,2,max_rank);
CQI_temp = zeros(LTE_params.Nrb,2,max_rank,max_rank);


if nAtPort == 2 
    i_max = [3,2];
%     i_max = [1,1];
else
    i_max = [15,15,15,15];
end

if LTE_params.feedback.channel_averaging % use channel averaging
    RB_max = LTE_params.Nrb;
    I_g = zeros(max(i_max)+1,max_rank,RB_max,2);   % total sum rate over all resource blocks 
    SNR_g = zeros(max(i_max)+1,max_rank,RB_max,2,4); 
else
    gran = 4;
    RB_max = LTE_params.Nrb*gran;
    I_g = zeros(max(i_max)+1,max_rank,RB_max,2);   % total sum rate over all resource blocks 
    SNR_g = zeros(max(i_max)+1,max_rank,RB_max,2,4); 
end
% figure(1)
% clf
I_RB = zeros(max(i_max)+1,max_rank);   
for RB_i = 1:RB_max
    for slot_i = 1:2  
        if LTE_params.feedback.channel_averaging
            freq_band = (RB_i-1)*LTE_params.Nsc+1:min(RB_i*LTE_params.Nsc,size(H_est_complete,1));
        else
            freq_band = round(((RB_i-1)*LTE_params.Nsc/gran+1+min(RB_i*LTE_params.Nsc/gran,size(H_est_complete,1)))/2);
        end
        H_est = H_est_complete(freq_band,(slot_i-1)*LTE_params.Ns+1:slot_i*LTE_params.Ns,:,:);
        
        if UE.RIandPMI_fb % wheter RI and PMI feedback is activated 
            rank_loop = 1:max_rank;
        else    % iterate only over the actual RI value if RI feedback is deactivated         
            rank_loop = LTE_params.scheduler.nLayers(uu);
        end
%         rank_loop = 4;
        H_t = reshape(mean(mean(H_est,1),2),size(H_est,3),size(H_est,4));   % Channel of current RB and slot 
        if ~LTE_params.feedback.ignore_channel_estimation % channel estimation error will be ignored if set so
            MSE_mean = mean(UE.MSE(:,freq_band),2);                         % Channel estimator MSE 
        else
            MSE_mean = zeros(size(UE.MSE,1),1);
        end
        I = zeros(max(i_max)+1,max_rank);   
        SNR = zeros(max(i_max)+1,max(rank_loop),max(rank_loop));
        for rr = rank_loop    % Iterate over all possible layer numbers, to find the one that delivers the maximum sum rate   
            if rr == 2 && nAtPort == 2 
                i_start = 1;
                i_stop = i_max(rr);
            else
                i_start = 0;
                i_stop = i_max(rr);
            end
            for i = i_start:i_stop
                [Z W U D] = LTE_common_get_precoding_matrix(4,nAtPort,i,rr,LTE_params);
                P = H_t*W;
                switch LTE_params.UE_config.receiver 
%                   switch 'ZF'
                    case 'ZF'
                        F = pinv(P);   % ZF receiver                  
                    case 'MMSE'
                        temp = P'*P;
                        F = (temp+sigma_n2*eye(size(temp)))^-1*P';  % MMSE receiver
%                     case 'SSD'
%                         Jr = real(H_t*W);
%                         Ji = imag(H_t*W);
%                         J = [Jr(1,1),-Ji(1,1),Jr(1,2),-Ji(1,2);Ji(1,1),Jr(1,1),Ji(1,2),Jr(1,2);Jr(2,1),-Ji(2,1),Jr(2,2),-Ji(2,2);Ji(2,1),Jr(2,1),Ji(2,2),Jr(2,2)]; % Lattice generator
%                         % calculate error covariance matrix, assuming AWGN
%                         E(:,:,i) = (J'*J)^-1;
%                         F = eye(size(P,1));
                    otherwise
                        temp = P'*P;
                        F = (temp+sigma_n2*eye(size(temp)))^-1*P';  % MMSE receiver
                end
                K = F*P;
                SNR(i+1,rr,1:rr) = abs(diag(K)).^2./(sum(abs(K-diag(diag(K))).^2,2)+(sigma_n2+MSE_mean(1:rr)).*sum(abs(F).^2,2));
%                 I(i+1,rr) = sum(log2(1+SNR(i+1,rr,:)));  % rate of one resource block for different precoders and ranks
%                 for r_ = 1:rr
%                     I(i+1,rr) = I(i+1,rr) + LTE_feedback_getBICM(LTE_params,squeeze(SNR(i+1,rr,rr)));
%                 end
                if rr == 4
                        I(i+1,rr) = LTE_feedback_getBICM(LTE_params,squeeze(SNR(i+1,rr,1:2)))+LTE_feedback_getBICM(LTE_params,squeeze(SNR(i+1,rr,3:4))); % LTE just supports 2 codewords which are mapped like this to the four layers
                elseif rr == 3
                        I(i+1,rr) = LTE_feedback_getBICM(LTE_params,squeeze(SNR(i+1,rr,1)))+LTE_feedback_getBICM(LTE_params,squeeze(SNR(i+1,rr,2:3)));
                elseif rr == 2
                        I(i+1,rr) = LTE_feedback_getBICM(LTE_params,squeeze(SNR(i+1,rr,1)))+LTE_feedback_getBICM(LTE_params,squeeze(SNR(i+1,rr,2)));
                else
                        I(i+1,rr) = LTE_feedback_getBICM(LTE_params,squeeze(SNR(i+1,rr,1)));
                end
            end
        end
        I_g(:,:,RB_i,slot_i) = I_g(:,:,RB_i,slot_i) + I;
        SNR = 10*log10(SNR);
        SNR(isnan(SNR))= -inf;
        SNR_g(:,1:max(rank_loop),RB_i,slot_i,1:max(rank_loop)) = SNR;
        if ~LTE_params.feedback.channel_averaging
             I_RB = I_RB+I;
             if ~mod(RB_i,gran)
                [~,C1] = max(I,[],1);
%                 if slot_max == 1
%                     PMI_temp(:,RB_i/gran,:) = repmat(C1',[1,1,2]);
%                 else
                    PMI_temp(:,RB_i/gran,slot_i) = C1;
%                 end
                I_RB = 0;
             end
        else
            if UE.PMI_fb_gran == 1 
                [~,C1] = max(I,[],1);
%                 if slot_max == 1
%                     PMI_temp(:,RB_i,:) = repmat(C1',[1,1,2]);
%                 else
                    PMI_temp(:,RB_i,slot_i) = C1;
%                 end
            end
        end
%         if UE.PMI_fb_gran == 1 
%             [~,C1] = max(I,[],1);
%             PMI_temp(:,RB_i,slot_i) = C1;
%         end
    end
end

I_ges = sum(sum(I_g,3),4);
[~,I1] = max(max(I_ges,[],1));
rank_i = I1;    % choose rank indicator to maximize mutual information
if UE.PMI_fb_gran ~= 1
    if UE.PMI_fb
        [~,I2] = max(I_ges(:,rank_i));
        PMI = I2*ones(LTE_params.Nrb,2);
    else
        PMI = LTE_params.scheduler.PMI;
    end
    if LTE_params.UE_config.CQI_fb % wheter CQI feedback is used
%         for i2 = 1:min(2,rank_i)   % iterate over the number of streams
         for i2 = 1:rank_i   % iterate over the number of layers
            if UE.CQI_fb_gran ~= 1  % single CQI value for whole bandwidth
%                 if rank_i == 4
%                     AWGN_SNR = squeeze(SNR_g(PMI(1),rank_i,:,:,(i2-1)*2+1:i2*2));
%                 elseif rank_i == 3 && i2 == 2
%                     AWGN_SNR = squeeze(SNR_g(PMI(1),rank_i,:,:,i2:rank_i));
%                 else
%                     AWGN_SNR = squeeze(SNR_g(PMI(1),rank_i,:,:,i2));
%                 end
                AWGN_SNR = squeeze(SNR_g(PMI(1),rank_i,:,:,i2));
                CQIs = (0:15);
%                 SINReff = UE.SINR_averager.average(10.^(AWGN_SNR(:)/10),CQIs,[LTE_params.CQI_params(CQIs+1).modulation_order]);
                SINReff = UE.SINR_averager.average(10.^(AWGN_SNR(:)/10),CQIs,[LTE_params.CQI_params(20).modulation_order,LTE_params.CQI_params(CQIs(2:end)).modulation_order]);
                CQI_temp = LTE_common_CQI_mapping_table(LTE_params.CQI_mapping,SINReff,CQIs+1);
                CQI(:,:,i2) = CQI_temp*ones(LTE_params.Nrb,2);
            else  % single CQI value for every resource block
                for RB_ii = 1:LTE_params.Nrb
                    if LTE_params.feedback.channel_averaging
                        rb_ii = RB_ii;
                    else
                        rb_ii = (RB_ii-1)*gran+1:RB_ii*gran;
                    end
                    for slot_ii = 1:2
%                         if rank_i == 4
%                             AWGN_SNR = squeeze(SNR_g(PMI(1),rank_i,rb_ii,slot_ii,(i2-1)*2+1:min(i2*2,rank_i)));
%                         elseif rank_i == 3 && i2 == 2
%                             AWGN_SNR = squeeze(SNR_g(PMI(1),rank_i,rb_ii,slot_ii,i2:rank_i));
%                         else
%                             AWGN_SNR = squeeze(SNR_g(PMI(1),rank_i,rb_ii,slot_ii,i2));
%                         end
                        AWGN_SNR = squeeze(SNR_g(PMI(1),rank_i,rb_ii,slot_ii,i2));
                        CQIs = (0:15);
                        SINReff = UE.SINR_averager.average(10.^(AWGN_SNR(:)/10),CQIs,[LTE_params.CQI_params(20).modulation_order,LTE_params.CQI_params(CQIs(2:end)).modulation_order]);
                        CQI_temp = LTE_common_CQI_mapping_table(LTE_params.CQI_mapping,SINReff,CQIs+1);
                        CQI(RB_ii,slot_ii,i2) = CQI_temp;
                    end
                end
            end
        end
    else
        CQI = [];
    end
else
%     for i2 = 1:min(2,rank_i)   % iterate over the number of streams
     for i2 = 1:rank_i   % iterate over the number of layers
        if UE.PMI_fb
            PMI = squeeze(PMI_temp(rank_i,:,:));
        else
            PMI = LTE_params.scheduler.PMI;
        end    
        if LTE_params.UE_config.CQI_fb % wheter CQI feedback is used
        AWGN_SNR = [];
            if UE.CQI_fb_gran ~= 1
                for RB_ii = 1:LTE_params.Nrb
                    if LTE_params.feedback.channel_averaging
                        rb_ii = RB_ii;
                    else
                        rb_ii = (RB_ii-1)*gran+1:RB_ii*gran;
                    end
                    for slot_ii = 1:2
%                         if rank_i == 4
%                             AWGN_SNR = [AWGN_SNR,squeeze(SNR_g(PMI(RB_ii,slot_ii),rank_i,rb_ii,slot_ii,(i2-1)*2+1:i2*2))];
%                         elseif rank_i == 3 && i2 == 2
%                             AWGN_SNR = [AWGN_SNR,squeeze(SNR_g(PMI(RB_ii,slot_ii),rank_i,rb_iii,slot_ii,i2:rank_i))];
%                         else
%                             AWGN_SNR = [AWGN_SNR,squeeze(SNR_g(PMI(RB_ii,slot_ii),rank_i,rb_ii,slot_ii,i2))];
%                         end
                          AWGN_SNR = [AWGN_SNR,squeeze(SNR_g(PMI(RB_ii,slot_ii),rank_i,rb_ii,slot_ii,i2))];
                    end
                end
                CQIs = (0:15);
                SINReff = UE.SINR_averager.average(10.^(AWGN_SNR(:)/10),CQIs,[LTE_params.CQI_params(20).modulation_order,LTE_params.CQI_params(CQIs(2:end)).modulation_order]);
                CQI_temp = LTE_common_CQI_mapping_table(LTE_params.CQI_mapping,SINReff,CQIs+1);
                CQI(:,:,i2) = CQI_temp*ones(LTE_params.Nrb,2);
            else
                for RB_ii = 1:LTE_params.Nrb
                    if LTE_params.feedback.channel_averaging
                        rb_ii = RB_ii;
                    else
                        rb_ii = (RB_ii-1)*gran+1:RB_ii*gran;
                    end
                    for slot_ii = 1:2
%                         if rank_i == 4
%                             AWGN_SNR = squeeze(SNR_g(PMI(RB_ii,slot_ii),rank_i,rb_ii,slot_ii,(i2-1)*2+1:i2*2));
%                         elseif rank_i == 3 && i2 == 2
%                             AWGN_SNR = squeeze(SNR_g(PMI(RB_ii,slot_ii),rank_i,rb_ii,slot_ii,i2:rank_i));
%                         else
%                             AWGN_SNR = squeeze(SNR_g(PMI(RB_ii,slot_ii),rank_i,rb_ii,slot_ii,i2));
%                         end
                        AWGN_SNR = squeeze(SNR_g(PMI(RB_ii,slot_ii),rank_i,rb_ii,slot_ii,i2));
                        CQIs = (0:15);
                        SINReff = UE.SINR_averager.average(10.^(AWGN_SNR(:)/10),CQIs,[LTE_params.CQI_params(20).modulation_order,LTE_params.CQI_params(CQIs(2:end)).modulation_order]);
                        CQI_temp = LTE_common_CQI_mapping_table(LTE_params.CQI_mapping,SINReff,CQIs+1);
                        CQI(RB_ii,slot_ii,i2) = CQI_temp;
                    end
                end
            end
        else
            CQI = [];
        end
    end
end
if ~UE.PMI_fb
    PMI = [];
end
% PMI
% CQI
% rank_i
% error('jetzt')