Matlab Toolbox - 4G/LTE

 

 

 

 

Detecting Downlink Frame Offset

 

Description will be posted later.

 

< Detecting Frame Offset for Ideal Signal >

 

    % First you have to define properites of a eNodeB.  

    % NDLRB indicate System Bandwith in the unit of RBs.

    % NDLRB 6 = 1.4 Mhz, NDLRB 15 = 3.0 Mhz, NDLRB 25 = 5.0 Mhz,

    % NDLRB 50 = 10 Mhz, NDLRB 75 = 15 Mhz, NDLRB 100 = 20 Mhz

    % CellRefP indicate number of downlink Antenna. CellRefP = 1 means 1 transmission antenna (SISO)

    % NCellID indicate PCI (Physical Channel Identity) of the Cell

    % NSubframe indicate the subframe number.

    enb.CyclicPrefix = 'Normal';

    enb.PHICHDuration = 'Normal';

    enb.Ng = 'Sixth';

    enb.NDLRB = 6;

    enb.CellRefP = 1;

    enb.DuplexMode = 'FDD';

    enb.NFrame = 0;

    enb.NCellID = 10;

     

    txFrameGrid = [];

     

    for subframeNo = 0:9

        

    enb.NSubframe = subframeNo;

    enb.CFI = 1;

     

    PHICH_Group_Index = 0;

    PHICH_Sequence_Index = 1;

    HARQ_Indicator_Value = 0; % 0 = NACK, 1 = ACK

     

    dci.NDLRB = enb.NDLRB;

    dci.DCIFormat = 'Format1A';

    dci.AllocationType = 0;

    dci.Allocation.RIV = 18;

    dci.ModCoding = 10;

    dci.HARQNo = 0;

    dci.NewData = 0;

    dci.TPCPUCCH = 0;

    dci.DuplexMode = 'FDD';

    dci.NTxAnts = 1;

     

    [dciMessage,dciMessageBits] = lteDCI(enb,dci);

     

    C_RNTI = 100;                         

    pdcchConfig.RNTI = C_RNTI;            

    pdcchConfig.PDCCHFormat = 0;          

     

    codedDciBits = lteDCIEncode(pdcchConfig, dciMessageBits);

    pdcchDims = ltePDCCHInfo(enb);

    pdcchBits = -1*ones(pdcchDims.MTot, 1);

    candidates = ltePDCCHSpace(enb, pdcchConfig, {'bits', '1based'});

    pdcchBits ( candidates(1, 1) : candidates(1, 2) ) = codedDciBits;

     

    pdcch_sym = ltePDCCH(enb, pdcchBits);

    pdcch_sym_ind = ltePDCCHIndices(enb,{'1based','re'});

    pdcch_sym_arrayIndex = 0:length(pdcch_sym)-1;

     

     

    % Generating PDSCH Symbols

     

    pdsch.NTxAnts = 1;

    pdsch.NLayers = 1;

    pdsch.TxScheme = 'Port0';

    pdsch.Modulation = {'16QAM'};

    pdsch.RV = 0;

    pdsch.RNTI = C_RNTI;

     

    START_RB = 0;

    N_RB = 4; %enb.NDLRB;

     

    pdsch_prbs = (START_RB:(START_RB+N_RB-1)).';

    [pdsch_sym_ind,pdschIndInfo] = ltePDSCHIndices(enb,pdsch,pdsch_prbs,{'1based','re'});

    codedTrBlkSize = pdschIndInfo.G;

    dlschTransportBlk = round(rand(1,codedTrBlkSize));

    codeword = lteDLSCH(enb,pdsch,codedTrBlkSize,dlschTransportBlk);

     

    pdsch_sym = ltePDSCH(enb,pdsch,codeword);

    pdsch_sym_arrayIndex = 0:length(pdsch_sym)-1;

     

    %fill in the resource grid

     

    resourceGrid = lteDLResourceGrid(enb);

    rsAnt0 = lteCellRS(enb,0);

    indAnt0 = lteCellRSIndices(enb,0);

    resourceGrid(indAnt0) = rsAnt0;

     

    mib_bits = lteMIB(enb);

    bch_cw = lteBCH(enb,mib_bits);

     

    pss = ltePSS(enb);

    pss_arrayIndex = 0:length(pss)-1;

    pss_sym_ind = ltePSSIndices(enb,0,{'1based','re'});

     

    sss = lteSSS(enb);

    sss_arrayIndex = 0:length(sss)-1;

    sss_sym_ind = lteSSSIndices(enb,0,{'1based','re'});

     

    cfi_cw = lteCFI(enb);

    pcfich_sym = ltePCFICH(enb,cfi_cw);

    pcfich_sym_arrayIndex = 0:length(pcfich_sym)-1;

    pcfich_sym_ind = ltePCFICHIndices(enb,{'1based','re'});

     

    phich_sym = ltePHICH(enb,[PHICH_Group_Index,PHICH_Sequence_Index,HARQ_Indicator_Value]);

    phich_sym_arrayIndex = 0:length(phich_sym)-1;

    phich_sym_ind = ltePHICHIndices(enb,{'1based','re'});

     

    pbch_sym = ltePBCH(enb,bch_cw);

    pbch_sym_arrayIndex = 0:length(pbch_sym)-1;

    pbch_sym_ind = ltePBCHIndices(enb,{'1based','re'});

     

    pss_scale = 1.0;

    sss_scale = 1.0;

    phich_scale = 1.0;

    pcfich_scale = 1.0;

    pbch_scale = 1.0;

    pdcch_scale = 1.0;

    pdsch_scale = 1.0;

     

    resourceGrid(pss_sym_ind) = pss_scale .* pss;

    resourceGrid(sss_sym_ind) = sss_scale .* sss;

    resourceGrid(pcfich_sym_ind) = pcfich_scale .* pcfich_sym;

    resourceGrid(phich_sym_ind) = phich_scale .* phich_sym;

    resourceGrid(pbch_sym_ind) = pbch_scale .* pbch_sym(1:length(pbch_sym_ind));

    resourceGrid(pdcch_sym_ind) = pdcch_scale .* pdcch_sym;

    resourceGrid(pdsch_sym_ind) = pdsch_scale .* pdsch_sym;

     

    txFrameGrid = [txFrameGrid resourceGrid];

     

    end;

     

    [tx_waveform,tx_waveform_info] = lteOFDMModulate(enb,txFrameGrid);

     

    [frame_offset,offset_corr]=lteDLFrameOffset(enb,tx_waveform);

     

    dlConfig.NDLRB = enb.NDLRB;

    dlConfig.CyclicPrefix = enb.CyclicPrefix;

    dlConfig.NSubframe = 0;

    dlConfig.DuplexMode = enb.DuplexMode;

     

    freq_offset = lteFrequencyOffset(dlConfig,tx_waveform);

     

    enb.TotSubframes = 10;

    PCI = lteCellSearch(enb,tx_waveform)

     

    Result =

      10

 

 

< Detecting Frame Offset for Faded Signal >

 

    % First you have to define properites of a eNodeB.  

    % NDLRB indicate System Bandwith in the unit of RBs.

    % NDLRB 6 = 1.4 Mhz, NDLRB 15 = 3.0 Mhz, NDLRB 25 = 5.0 Mhz,

    % NDLRB 50 = 10 Mhz, NDLRB 75 = 15 Mhz, NDLRB 100 = 20 Mhz

    % CellRefP indicate number of downlink Antenna. CellRefP = 1 means 1 transmission antenna (SISO)

    % NCellID indicate PCI (Physical Channel Identity) of the Cell

    % NSubframe indicate the subframe number.

    enb.CyclicPrefix = 'Normal';

    enb.PHICHDuration = 'Normal';

    enb.Ng = 'Sixth';

    enb.NDLRB = 6;

    enb.CellRefP = 1;

    enb.DuplexMode = 'FDD';

    enb.NFrame = 0;

    enb.NCellID = 10;

     

    txFrameGrid = [];

     

    for subframeNo = 0:9

        

    enb.NSubframe = subframeNo;

    enb.CFI = 1;

     

    PHICH_Group_Index = 0;

    PHICH_Sequence_Index = 1;

    HARQ_Indicator_Value = 0; % 0 = NACK, 1 = ACK

     

    dci.NDLRB = enb.NDLRB;

    dci.DCIFormat = 'Format1A';

    dci.AllocationType = 0;

    dci.Allocation.RIV = 18;

    dci.ModCoding = 10;

    dci.HARQNo = 0;

    dci.NewData = 0;

    dci.TPCPUCCH = 0;

    dci.DuplexMode = 'FDD';

    dci.NTxAnts = 1;

     

    [dciMessage,dciMessageBits] = lteDCI(enb,dci);

     

    C_RNTI = 100;                         

    pdcchConfig.RNTI = C_RNTI;            

    pdcchConfig.PDCCHFormat = 0;          

     

    codedDciBits = lteDCIEncode(pdcchConfig, dciMessageBits);

    pdcchDims = ltePDCCHInfo(enb);

    pdcchBits = -1*ones(pdcchDims.MTot, 1);

    candidates = ltePDCCHSpace(enb, pdcchConfig, {'bits', '1based'});

    pdcchBits ( candidates(1, 1) : candidates(1, 2) ) = codedDciBits;

     

    pdcch_sym = ltePDCCH(enb, pdcchBits);

    pdcch_sym_ind = ltePDCCHIndices(enb,{'1based','re'});

    pdcch_sym_arrayIndex = 0:length(pdcch_sym)-1;

     

     

    % Generating PDSCH Symbols

     

    pdsch.NTxAnts = 1;

    pdsch.NLayers = 1;

    pdsch.TxScheme = 'Port0';

    pdsch.Modulation = {'16QAM'};

    pdsch.RV = 0;

    pdsch.RNTI = C_RNTI;

     

    START_RB = 0;

    N_RB = 4; %enb.NDLRB;

     

    pdsch_prbs = (START_RB:(START_RB+N_RB-1)).';

    [pdsch_sym_ind,pdschIndInfo] = ltePDSCHIndices(enb,pdsch,pdsch_prbs,{'1based','re'});

    codedTrBlkSize = pdschIndInfo.G;

    dlschTransportBlk = round(rand(1,codedTrBlkSize));

    codeword = lteDLSCH(enb,pdsch,codedTrBlkSize,dlschTransportBlk);

     

    pdsch_sym = ltePDSCH(enb,pdsch,codeword);

    pdsch_sym_arrayIndex = 0:length(pdsch_sym)-1;

     

    %fill in the resource grid

     

    resourceGrid = lteDLResourceGrid(enb);

    rsAnt0 = lteCellRS(enb,0);

    indAnt0 = lteCellRSIndices(enb,0);

    resourceGrid(indAnt0) = rsAnt0;

     

    mib_bits = lteMIB(enb);

    bch_cw = lteBCH(enb,mib_bits);

     

    pss = ltePSS(enb);

    pss_arrayIndex = 0:length(pss)-1;

    pss_sym_ind = ltePSSIndices(enb,0,{'1based','re'});

     

    sss = lteSSS(enb);

    sss_arrayIndex = 0:length(sss)-1;

    sss_sym_ind = lteSSSIndices(enb,0,{'1based','re'});

     

    cfi_cw = lteCFI(enb);

    pcfich_sym = ltePCFICH(enb,cfi_cw);

    pcfich_sym_arrayIndex = 0:length(pcfich_sym)-1;

    pcfich_sym_ind = ltePCFICHIndices(enb,{'1based','re'});

     

    phich_sym = ltePHICH(enb,[PHICH_Group_Index,PHICH_Sequence_Index,HARQ_Indicator_Value]);

    phich_sym_arrayIndex = 0:length(phich_sym)-1;

    phich_sym_ind = ltePHICHIndices(enb,{'1based','re'});

     

    pbch_sym = ltePBCH(enb,bch_cw);

    pbch_sym_arrayIndex = 0:length(pbch_sym)-1;

    pbch_sym_ind = ltePBCHIndices(enb,{'1based','re'});

     

    pss_scale = 1.0;

    sss_scale = 1.0;

    phich_scale = 1.0;

    pcfich_scale = 1.0;

    pbch_scale = 1.0;

    pdcch_scale = 1.0;

    pdsch_scale = 1.0;

     

    resourceGrid(pss_sym_ind) = pss_scale .* pss;

    resourceGrid(sss_sym_ind) = sss_scale .* sss;

    resourceGrid(pcfich_sym_ind) = pcfich_scale .* pcfich_sym;

    resourceGrid(phich_sym_ind) = phich_scale .* phich_sym;

    resourceGrid(pbch_sym_ind) = pbch_scale .* pbch_sym(1:length(pbch_sym_ind));

    resourceGrid(pdcch_sym_ind) = pdcch_scale .* pdcch_sym;

    resourceGrid(pdsch_sym_ind) = pdsch_scale .* pdsch_sym;

     

    txFrameGrid = [txFrameGrid resourceGrid];

     

    end;

     

    [tx_waveform,tx_waveform_info] = lteOFDMModulate(enb,txFrameGrid);

     

    chcfg.Seed = 1;

    chcfg.DelayProfile = 'EVA';

    chcfg.NRxAnts = 1;

    chcfg.InitPhase = 0;

    chcfg.ModelType = 'GMEDS';

    chcfg.NTerms = 16;

    chcfg.NormalizeTxAnts = 'On';

    chcfg.NormalizePathGains = 'On';

    chcfg.DopplerFreq = 10;

    chcfg.MIMOCorrelation = 'Low';

    chcfg.SamplingRate = tx_waveform_info.SamplingRate;

    chcfg.InitTime = 0;

     

    rx_waveform = lteFadingChannel(chcfg,tx_waveform);

     

    [frame_offset,offset_corr]=lteDLFrameOffset(enb,rx_waveform);

     

    dlConfig.NDLRB = enb.NDLRB;

    dlConfig.CyclicPrefix = enb.CyclicPrefix;

    dlConfig.NSubframe = 0;

    dlConfig.DuplexMode = enb.DuplexMode;

     

    freq_offset = lteFrequencyOffset(dlConfig,rx_waveform);

     

     

    enb.TotSubframes = 10;

    PCI = lteCellSearch(enb,tx_waveform)

     

    Result =

      10

     

 

 

Disclaimer ! :

 

This page is only to show you the overall logics and visualization for various LTE physical layer channels. I haven't investigated much about verifying about the accuracy.

If you think the code is not so efficient, it is 100% my fault. I haven't made any effort for effiecient code. I just tried to create code as simple as possible for the readers. As you know, easy-to-read code is not always efficient for a specific chipset.

If you find any mistake in terms of accuracy, it is also very highly likely be my fault. Not the problem of Matlab tool box itself.

Any comment and corrections if you find any mistake will be welcome and appreciated.