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

    function feedback = LTE_mini_RX(LTE_params, UE_input, SNR, subframe_i, BS_output, UE)
% LTE mini receiver for a specific user.
% [UE_output, ACK, UE] = LTE_RX(chan_output, SNR, AtPort, subframe_i, BS, UE, BS_output)
% Author: Michal Simko, msimko@nt.tuwien.ac.at
% (c) 2008 by INTHFT
% www.nt.tuwien.ac.at
%
% input :   chan_output         ... [1 x 1]struct - channel output:
%           
%                                   [1 x nUE]struct - user specific parameters and variables
% output:   UE_output           ... [1 x nUE]struct UE output for rx_coded_bits bits before decoder and after demapper

%
% date of creation: 2010/11/16


    sigma_n2 = 10^(-SNR/10); %maybe replaced by a function

    
    % Get necessary data and convert in in the correct format
    nLayers    = BS_output.UE_signaling(1).MCS_and_scheduling.nLayers;
    nCodewords = BS_output.UE_signaling(1).MCS_and_scheduling.nCodewords;
    tx_mode    = LTE_params.UE_config.mode;
    

    UE_mapping = ones(LTE_params.Nrb,2); % assuming the user has the full bandwidth
    y_rx_carrier_freq_offset = UE_input.input;
        
    %% Calculate the correct number of subframe from 1 - 10
    subframe_corr = mod(subframe_i,10);
    if(subframe_corr == 0)
        subframe_corr = 10;
    end
    
    %% Read pregenerated reference signals
    RefSym          = LTE_params.Reference_Signal(1,subframe_corr).RefSym;
    RefMapping      = LTE_params.Reference_Signal(1,subframe_corr).RefMapping;
    total_no_refsym = LTE_params.Reference_Signal(1,subframe_corr).total_no_refsym;
    NoData_indices  = LTE_params.Reference_Signal(1,subframe_corr).NoData_indices;
    % [RefSym,RefMapping,total_no_refsym,NoData_indices]=LTE_Common_gen_Reference_Signal(LTE_params.Nrb, LTE_params.Nsub, BS.nTX, BS.NIDcell, subframe_corr);
    
    %% Generation of synchronization signals and Initialization of signals
    rb_numbers = find(UE_mapping == 1);
    PrimMapping = zeros(size(NoData_indices));
    SecMapping = zeros(size(NoData_indices));
    CHmapping = zeros(size(NoData_indices));
    CHusedElements = zeros(LTE_params.Nrb*2,1);
    if LTE_params.usePBCH
        CHmapping = CHmapping + LTE_params.PBCH(1,subframe_corr).Mapping;
        CHusedElements = CHusedElements + LTE_params.PBCH(1,subframe_corr).UsedElements;
        %         CHnsyms_subframe = CHnsyms_subframe + LTE_params.PBCH(1,subframe_corr).N_Elements;
    end
    if LTE_params.usePDCCH
        CHmapping = CHmapping + LTE_params.PDCCH(1,subframe_corr).Mapping;
        CHusedElements = CHusedElements + LTE_params.PDCCH(1,subframe_corr).UsedElements;
        %         CHnsyms_subframe = CHnsyms_subframe + LTE_params.PDCCH(1,subframe_corr).N_Elements;
    end
    if(subframe_corr == 1 || subframe_corr == 6)
        % Read pregenerated sync signals
        PrimSync         = LTE_params.Sync_Signal(1,subframe_corr).PrimSync;
        PrimMapping      = LTE_params.Sync_Signal(1,subframe_corr).PrimMapping;
        SecSync          = LTE_params.Sync_Signal(1,subframe_corr).SecSync;
        SecMapping       = LTE_params.Sync_Signal(1,subframe_corr).SecMapping;
        SyncUsedElements = LTE_params.Sync_Signal(1,subframe_corr).SyncUsedElements;
        % [PrimSync, PrimMapping, SecSync, SecMapping, SyncUsedElements] = LTE_Common_gen_Synchronization_Signal(BS.NIDcell, LTE_params.Nrb, LTE_params.Nsc, LTE_params.Nsub, subframe_corr);
        
        %     NoData_indices = NoData_indices|PrimMapping;
        %     NoData_indices = NoData_indices|SecMapping;
        
        ResMapping = LTE_params.Sync_Signal(1,subframe_corr).ResMapping;    % reserved REs, nothing is transmitted here!
        CHusedElements = CHusedElements + LTE_params.Sync_Signal(1,subframe_corr).ResUsedElements;
        %         CHnsyms_subframe = CHnsyms_subframe + LTE_params.Sync_Signal(1,subframe_corr).ResNElements;
        CHmapping = CHmapping | ResMapping;
        
        rb_rx_symbols = LTE_params.Nsc*LTE_params.Ns - total_no_refsym - SyncUsedElements(UE_mapping) - CHusedElements(UE_mapping);
        rx_user_symbols = zeros(sum(rb_rx_symbols),LTE_params.UE_config.nRX);
        H_est_user = zeros(sum(rb_rx_symbols),LTE_params.UE_config.nRX,LTE_params.BS_config.nTx);
    elseif ~LTE_params.usePDCCH
        rx_symbols  = zeros((LTE_params.Nsc*LTE_params.Ns - sum(sum(NoData_indices(1:LTE_params.Nsc,1:LTE_params.Ns)))),LTE_params.Nrb,2);
        PE_SINR_matrix = nan((LTE_params.Nsc*LTE_params.Ns - sum(sum(NoData_indices(1:LTE_params.Nsc,1:LTE_params.Ns)))),LTE_params.Nrb,2);
        H_temp_user = zeros((LTE_params.Nsc*LTE_params.Ns - sum(sum(NoData_indices(1:LTE_params.Nsc,1:LTE_params.Ns)))),LTE_params.Nrb,2,LTE_params.UE_config.nRX,LTE_params.BS_config.nTx);
    else
        rb_rx_symbols = LTE_params.Nsc*LTE_params.Ns - total_no_refsym -  CHusedElements(UE_mapping);
        rx_user_symbols = zeros(sum(rb_rx_symbols),LTE_params.UE_config.nRX);
        H_est_user = zeros(sum(rb_rx_symbols),LTE_params.UE_config.nRX,LTE_params.BS_config.nTx);
    end
    
%     %% Carrier Frequency Offset Compensation
%     if LTE_params.introduce_frequency_offset
%         if (subframe_corr == 1 || subframe_corr == 6)
%             [y_rx_sync, UE_output(uu).freq_offset_est] = LTE_rx_freq_sync(LTE_params, y_rx_carrier_freq_offset, UE(uu), UE_output(uu).freq_offset_est, RefSym, RefMapping, PrimSync, PrimMapping, SecSync, SecMapping);
%         else
%             [y_rx_sync, UE_output(uu).freq_offset_est] = LTE_rx_freq_sync(LTE_params, y_rx_carrier_freq_offset, UE(uu), UE_output(uu).freq_offset_est, RefSym, RefMapping);
%         end
%     else
%         y_rx_sync = UE_input.input;
%         UE_output(uu).freq_offset_est.error = NaN;
%         UE_output(uu).freq_offset_est.frac = NaN;
%         UE_output(uu).freq_offset_est.int = NaN;
%         UE_output(uu).freq_offset_est.res = NaN;
%     end
    y_rx_sync = UE_input.input;
    
    %% Remove CP, FFT, remove zeros
    for nn = 1:LTE_params.UE_config.nRX
        y_rx_resolved = cell(4,1);
        if(length(LTE_params.Tg)==2)
            y_rx_resolved{1} = y_rx_sync(1:LTE_params.NfftCP{1},nn);
            y_rx_resolved{2} = reshape(y_rx_sync(LTE_params.NfftCP{1}+1:LTE_params.NfftCP{1}+LTE_params.NfftCP{2}*(LTE_params.Ns-1),nn),LTE_params.NfftCP{2},LTE_params.Ns-1);
            y_rx_resolved{3} = y_rx_sync(LTE_params.NfftCP{1}+LTE_params.NfftCP{2}*(LTE_params.Ns-1)+1:2*LTE_params.NfftCP{1}+LTE_params.NfftCP{2}*(LTE_params.Ns-1),nn);
            y_rx_resolved{4} = reshape(y_rx_sync(2*LTE_params.NfftCP{1}+LTE_params.NfftCP{2}*(LTE_params.Ns-1)+1:end,nn),LTE_params.NfftCP{2},LTE_params.Ns-1);
            y_rx_assembled_ifft = [y_rx_resolved{1}(LTE_params.Index_RxCyclicPrefix{1},:) y_rx_resolved{2}(LTE_params.Index_RxCyclicPrefix{2},:)...
                y_rx_resolved{3}(LTE_params.Index_RxCyclicPrefix{1},:) y_rx_resolved{4}(LTE_params.Index_RxCyclicPrefix{2},:)];
        else
            y_rx = reshape(y_rx_sync(:,nn),LTE_params.NfftCP,LTE_params.Nsub);
            y_rx_assembled_ifft = y_rx(LTE_params.Index_RxCyclicPrefix,:);
        end
        
        y_rx_assembled_shifted = fft(1/sqrt(LTE_params.Nfft)/(sqrt(LTE_params.Nfft/LTE_params.Ntot))*y_rx_assembled_ifft);
        y_rx_assembled_padded = circshift(y_rx_assembled_shifted,LTE_params.Ntot/2);
        % remove zero DC carrier
        y_rx_assembled(:,:,nn) = y_rx_assembled_padded([1:LTE_params.Ntot/2,LTE_params.Ntot/2+2:LTE_params.Ntot+1],:);
    end
    %     power = [power,mean(mean(abs(y_rx_assembled).^2,1),2)];
    %% Disassemble reference symbols
    rx_ref_symbols = nan([size(RefSym),LTE_params.UE_config.nRX]);   %allocate memery for reference signal for every channel, the number of transmitt antennas is included in RefSym
    for tt = 1:LTE_params.BS_config.nTx
        for rr = 1:LTE_params.UE_config.nRX
            rx_ref_symbols_help = y_rx_assembled(:,:,rr);   %use recieved symbols from one recieve antenna
            rx_ref_symbols_help = rx_ref_symbols_help(RefMapping(:,:,tt));  %extract the signal on pilots positons
            if(tt>2)    %in case of 3rd and 4th transmitt antenna, there are less pilots, so we have to insert some nan symbols,to be consistent
                rx_ref_symbols_help = [rx_ref_symbols_help;nan(size(rx_ref_symbols_help))];
            end
            rx_ref_symbols(:,:,tt,rr) = reshape(rx_ref_symbols_help,size(RefSym(:,:,tt)));  %finally place the reference signal on allocated position
        end
    end
    
    %% Channel and noise estimation
    H_est = LTE_channel_estimator_mini(LTE_params, rx_ref_symbols, RefSym, RefMapping, sigma_n2, y_rx_assembled);
    

    
%% calculation of feedback
[RI_tmp,PMI_tmp,CQI_tmp, CQI_bar]=LTE_feedback(LTE_params.BS_config.nTx,sigma_n2,LTE_params,H_est,UE(1),1,LTE_params.UE_config.mode);
feedback = 0;
    
% 
%     % Feedback performed only when data is received
%     feedback_rv_idx = [UE_signaling.turbo_rate_matcher.rv_idx];
%     UE_output(uu).rv_idx = feedback_rv_idx;
%     
%     % Precoding feedback calculation
%     if LTE_params.uplink_delay ~= 0
%         %             H_est = LTE_channel_estimator(LTE_params,ChanMod, UE(uu), rx_ref_symbols, RefSym, RefMapping, ChanMod_output.genie.H_fft,sigma_n2,BS_output.cell_genie.y_tx_assembled,y_rx_assembled);
%         %             [RI_tmp,PMI_tmp]=LTE_feedback_precoding(BS.nAtPort,sigma_n2,LTE_params,UE_signaling.MCS_and_scheduling(1).CQI_params(1).modulation_order(1),ChanMod_output.genie.H_fft,UE(uu),uu);
%         %             if LTE_params.UE_config.mode == 3
%         %                 [RI_tmp,PMI_tmp,CQI_tmp]=LTE_feedback(BS.nAtPort,sigma_n2,LTE_params,H_back,UE(uu),uu,LTE_params.UE_config.mode);
%         %             else
%         [RI_tmp,PMI_tmp,CQI_tmp]=LTE_feedback(BS.nAtPort,sigma_n2,LTE_params,H_est,UE(uu),uu,LTE_params.UE_config.mode);
%         %             end
%         UE_output(uu).RI = RI_tmp;
%         UE_output(uu).PMI = PMI_tmp-1;
%         UE_output(uu).CQI = CQI_tmp;
%     end
% 
%     
% 
% 
% % Finish feedback construction
% % For now use perfect channel information. Can be changed to an SINR computed from channel estimation
% % SINR = BS_output.cell_genie.SINR(uu,:);
% % SINRs_to_CQI = SINR(1:12:end);
% % UE_output(uu).CQI_feedback = floor(LTE_common_CQI_mapping(LTE_params.CQI_mapping,SINRs_to_CQI)); % only one CQI value over bandwidth, because there is only noise added
% % UE_output(uu).CQI = UE_output(uu).CQI_feedback;
% % UE_output(uu).PMI = 1;
% % HARQ process id of this current ACK
% UE_output(uu).HARQ_process = BS_output.UE_signaling(uu).MCS_and_scheduling.HARQ_process_id;
% UE_output(uu).UE_scheduled = (BS_output.UE_signaling(uu).MCS_and_scheduling.assigned_RBs>0);
% 
% %% Calculate noise on a subcarrier basis with the genie information
% % noise_SC = BS_output.cell_genie.y_tx_assembled - y_rx_assembled;
% % SINR_SC_linear = mean(abs(noise_SC).^2,2);
% % BS_output.cell_genie.genie_SNR = SINR_SC_linear;