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

    % function CQI = LTE_feedback_OLSM(sigma_n2,channel,UE,LTE_params)
% author Stefan Schwarz
% contact stefan.schwarz@nt.tuwien.ac.at
% calculates the CQI feedback for OLSM
% this function assumes that the channel handed over already incorporates
% the precoders --> feedback delay 0 is not supported (at least the precoder is not incorporated)!
% also the CQI feedback has a granularity of 1 value for the whole number
% of resources that the UE is mapped to
% channel prediction is not supported

% for i = 1:size(channel,1)
%     H_t = reshape(channel(i,:,:),size(channel,2),size(channel,3));
%     MSE_mean = mean(mean(UE.MSE));           
%     switch LTE_params.UE_config.receiver 
%         case 'ZF'
%             F = pinv(H_t);   % ZF receiver                  
%         case 'MMSE'
%             temp = H_t'*H_t;
%             F = (temp+sigma_n2*eye(size(temp)))^-1*H_t';  % MMSE receiver
%         otherwise
%             temp = H_t'*H_t;
%             F = (temp+sigma_n2*eye(size(temp)))^-1*H_t';  % MMSE receiver
%     end
%     K = F*H_t;
%     SNR(:,i) = abs(diag(K)).^2./(sum(abs(K-diag(diag(K))).^2,2)+(sigma_n2+MSE_mean).*sum(abs(F).^2,2));
% end
% for i = 1:size(SNR,1)
%     CQIs = (0:15);
%     SINReff = UE.SINR_averager.average(SNR(i,:),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(:,:,i) = CQI_temp*ones(LTE_params.Nrb,2);
% end


function [rank_i,CQI] =  LTE_feedback_OLSM(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));
CQI = zeros(LTE_params.Nrb,2,min(2,max_rank));
CQI_temp = zeros(LTE_params.Nrb,2,max_rank,min(2,max_rank));

% if nAtPort == 2 
%     i_max = [3,2];
% 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_rank,RB_max,2);   % total sum rate over all resource blocks 
    SNR_g = zeros(max_rank,RB_max,2,4); 
else
    RB_max = LTE_params.Ntot;
    I_g = zeros(max_rank,RB_max,2);   % total sum rate over all resource blocks 
    SNR_g = zeros(max_rank,RB_max,2,4); 
end
% figure(1)
% clf
if (nAtPort == 2)
    c_i = 0;
else
    c_i = [12,13,14,15];
end
pick = round(rand);
if LTE_params.UE_config.CQI_fb || LTE_params.UE_config.RIandPMI_fb
for RB_i = 1:RB_max
    pick = pick+1;
    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 = RB_i;
        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_rank,1);   
        SNR = zeros(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(3,nAtPort,c_i,rr,LTE_params);
                if (nAtPort == 2)
%                     pick = round(rand);
                    pick = mod(pick,2);
                    WDU = W*D.^(1+pick)*U;
                else
                    pick = 1:(12*7-4)*LTE_params.Nrb;
                    k = mod(floor((pick-1)/rr),4)+1;
                    p = mod(pick-1,rr)+1;
                    period = lcm(seqperiod(k),seqperiod(p));
                    WDU = W(:,:,k(mod(RB_i-1,period)+1))*D^(p(mod(RB_i-1,period)+1))*U;                    
                end
                P = H_t*WDU;
                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(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
                I(rr) = LTE_feedback_getBICM(LTE_params,squeeze(SNR(rr,:)));
%             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 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,2),3);
[~,I1] = max(I_ges,[],1);
rank_i = I1;    % choose rank indicator to maximize mutual information
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
        if UE.CQI_fb_gran ~= 1  % single CQI value for whole bandwidth
            if rank_i == 4
                AWGN_SNR = squeeze(SNR_g(rank_i,:,:,(i2-1)*2+1:i2*2));
            elseif rank_i == 3 && i2 == 2
                AWGN_SNR = squeeze(SNR_g(rank_i,:,:,i2:rank_i));
            else
                AWGN_SNR = squeeze(SNR_g(rank_i,:,:,i2));
            end
            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)*LTE_params.Nsc+1:RB_ii*LTE_params.Nsc;
                end
                for slot_ii = 1:2
                    if rank_i == 4
                        AWGN_SNR = squeeze(SNR_g(i2,rb_ii,slot_ii,(i2-1)*2+1:min(i2*2,rank_i)));
                    elseif rank_i == 3 && i2 == 2
                        AWGN_SNR = squeeze(SNR_g(rank_i,rb_ii,slot_ii,i2:rank_i));
                    else
                        AWGN_SNR = squeeze(SNR_g(rank_i,rb_ii,slot_ii,i2));
                    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(RB_ii,slot_ii,i2) = CQI_temp;
                end
            end
        end
    end
else
    CQI = [];
end
if ~UE.RIandPMI_fb
    rank_i = [];
end
else 
    CQI = [];
    rank_i = [];
end
% PMI