Matlab Toolbox - 4G/LTE

 

 

 

 

RMC Dlownlink - CellRefP = N, NLayer = M, NTxAnts = N

 

 

< Generating RMC Downlink Signal >

 

 

    rc = 'R.10';

     

    rmc = lteRMCDL(rc)

    pdsch = rmc.PDSCH

     

    txData = [0;0;0;0];

    [txWaveform, txGrid, rmcCfgOut] = lteRMCDLTool(rmc, txData);

     

    SF_RE_NUM = rmc.NDLRB*12*14;

    TxAntIndex = 0;

    TxAnt = TxAntIndex + 1;

     

    txGrid = txGrid(:,:,TxAnt);

    txGridChMap = txGrid(:,:,1);

     

    crs_scale = 0.2;

    pss_scale = 0.3;

    sss_scale = 0.3;

    phich_scale = 0.7;

    pcfich_scale = 0.8;

    pbch_scale = 0.7;

    pdcch_scale = 0.5;

    pdsch_scale = 0.4;

     

    noPdschSubframe = [5];

     

    for i=0:9

        rmc.NSubframe = i;

        pdsch = rmc.PDSCH;

        indexOffset = (rmc.NDLRB * 12 * 14) * rmc.NSubframe;

        crs_sym_ind = lteCellRSIndices(rmc);

        if rmc.CellRefP == 2

            crs_sym_ind = reshape(crs_sym_ind,[length(crs_sym_ind)/2, 2]);

            crs_sym_ind_p0 = crs_sym_ind(:,1);

            crs_sym_ind_p1 = crs_sym_ind(:,2);

        elseif rmc.CellRefP == 4

            crs_sym_ind = reshape(crs_sym_ind,[length(crs_sym_ind)/3, 3]);

            crs_sym_ind_p0 = crs_sym_ind(:,1);

            crs_sym_ind_p1 = crs_sym_ind(:,2);

            crs_sym_ind_p2_3 = crs_sym_ind(:,3);

            crs_sym_ind_p2_3 = reshape(crs_sym_ind_p2_3,[length(crs_sym_ind_p2_3)/2, 2]);

            crs_sym_ind_p2 = crs_sym_ind_p2_3(:,1);

            crs_sym_ind_p3 = crs_sym_ind_p2_3(:,2);

        end    

        

        if (i == 0) || (i == 5)

            pss_sym_ind = ltePSSIndices(rmc)+indexOffset;

            sss_sym_ind = lteSSSIndices(rmc)+indexOffset;

        end

        

        pcfich_sym_ind = ltePCFICHIndices(rmc)+indexOffset;

        phich_sym_ind = ltePHICHIndices(rmc)+indexOffset;

     

        if i == 0

            pbch_sym_ind = ltePBCHIndices(rmc)+indexOffset;

        end

        

        dci.NDLRB = rmc.NDLRB;

        dci.DCIFormat = pdsch.DCIFormat;

        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(rmc,dci);

        

        pdcchConfig.RNTI = pdsch.RNTI;

        pdcchConfig.PDCCHFormat = pdsch.PDCCHFormat;

        

        codedDciBits = lteDCIEncode(pdcchConfig, dciMessageBits);

        pdcchDims = ltePDCCHInfo(rmc);

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

        candidates = ltePDCCHSpace(rmc, pdcchConfig);

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

        pdcch_sym = ltePDCCH(rmc, pdcchBits);

        

        pdcch_sym_ind = ltePDCCHIndices(rmc)+indexOffset;

        

            

        if ismember(i,noPdschSubframe) == false

           if iscell(pdsch.PRBSet) == true

              [pdsch_sym_ind,pdschIndInfo] = ltePDSCHIndices(rmc,pdsch,cell2mat(pdsch.PRBSet(i+1)));

           else   

              [pdsch_sym_ind,pdschIndInfo] = ltePDSCHIndices(rmc,pdsch,pdsch.PRBSet);

           end   

           pdsch_sym_ind = pdsch_sym_ind + indexOffset;

        end   

        

     

        if TxAntIndex == 0

           txGridChMap(crs_sym_ind_p0-SF_RE_NUM*TxAntIndex) = crs_scale;

        elseif TxAntIndex == 1

           txGridChMap(crs_sym_ind_p1-SF_RE_NUM*TxAntIndex) = crs_scale;     

        elseif TxAntIndex == 2

            txGridChMap(crs_sym_ind_p2-SF_RE_NUM*TxAntIndex) = crs_scale;

        elseif TxAntIndex == 3

            txGridChMap(crs_sym_ind_p3-SF_RE_NUM*TxAntIndex) = crs_scale;

        end    

        

        if TxAntIndex == 0

            txGridChMap(pss_sym_ind) = pss_scale;

            txGridChMap(sss_sym_ind) = sss_scale;

        end

        txGridChMap(pcfich_sym_ind(:,TxAnt)-SF_RE_NUM*TxAntIndex) = pcfich_scale;

        txGridChMap(phich_sym_ind(:,TxAnt)-SF_RE_NUM*TxAntIndex) = phich_scale;

        txGridChMap(pbch_sym_ind(:,TxAnt)-SF_RE_NUM*TxAntIndex) = pbch_scale;

        

        txGridChMap(pdcch_sym_ind(:,TxAnt)-SF_RE_NUM*TxAntIndex) = pdcch_scale .* pdcch_sym(:,TxAnt);

        

        if ismember(i,noPdschSubframe) == false

            txGridChMap(pdsch_sym_ind(:,TxAnt)-SF_RE_NUM*TxAntIndex) = pdsch_scale;

        end

    end

     

    ylabelText = {'0','1','2','3','4','5','6','7','8','9', ...

              '10','11','12','13','14','15','16','17','18','19', ...

              '20','21','22','23','24','25','26','27','28','29', ...

              '30','31','32','33','34','35','36','37','38','39', ...

              '40','41','42','43','44','45','46','47','48','49', ...

              '50','51','52','53','54','55','56','57','58','59', ...

              '60','61','62','63','64','65','66','67','68','69', ...

              '70','71','72','73','74','75','76','77','78','79', ...

              '80','81','82','83','84','85','86','87','88','89', ...

              '90','91','92','93','94','95','96','97','98','99'};

    ytick = 7:12:(rmc.NDLRB*12);

     

    subplot(2,2,1);

    imagesc(abs(txGrid));

    axis xy;

    xlabel('Subframe');

    ylabel('RB');

    set(gca,'xtick',8:14:140);

    set(gca,'xticklabel',{'0','1','2','3','4','5','6','7','8','9','10'});

    set(gca,'ytick',ytick);

    set(gca,'yticklabel',ylabelText);

     

     

    subplot(2,2,3);

    imagesc(abs(txGridChMap));

    axis xy;

    xlabel('Subframe');

    ylabel('RB');

    set(gca,'xtick',8:14:140);

    set(gca,'xticklabel',{'0','1','2','3','4','5','6','7','8','9','10'});

    set(gca,'ytick',ytick);

    set(gca,'yticklabel',ylabelText);

     

    subplot(2,2,[2 4]);

    imagesc(abs(txGridChMap));

    axis xy;

    xlabel('Symbol');

    ylabel('RB');

    xlim([0.5 14.5]);

    ylim([0.5 12*rmc.NDLRB]);

    set(gca,'xtick',1:14);

    set(gca,'xticklabel',{'0','1','2','3','4','5','6','7','8','9','10','11','12','13'});

    set(gca,'ytick',ytick);

    set(gca,'yticklabel',ylabelText);

     

    mymap = [0.0 0.0 0.0

             1.0 1.0 0.0

             1.0 0.0 0.0

             0.5 0.0 0.0

             0.0 1.0 0.0

             0.0 0.5 0.0

             0.0 0.0 1.0

             0.0 0.0 0.5

             0.0 1.0 1.0

             1.0 0.0 1.0

             1.0 1.0 1.0];

    colormap(mymap);

     

    set(gcf, 'Position', [200, 200, 800, 700])

     

 

rc = 'R.10'; TxAntIndex = 0

36.101 v14.4 - Table A.3.3.2.1-1: Fixed Reference Channel two antenna ports   

rc = 'R.10'; TxAntIndex = 1

 

rmc =

 

  struct with fields:

 

                 RC: 'R.10'

              NDLRB: 50

           CellRefP: 2

            NCellID: 0

       CyclicPrefix: 'Normal'

                CFI: 2

        PCFICHPower: 0

                 Ng: 'Sixth'

      PHICHDuration: 'Normal'

              HISet: [112×3 double]

         PHICHPower: 0

             NFrame: 0

          NSubframe: 0

       TotSubframes: 10

          Windowing: 0

         DuplexMode: 'FDD'

              PDSCH: [1×1 struct]

    OCNGPDCCHEnable: 'Off'

     OCNGPDCCHPower: 0

    OCNGPDSCHEnable: 'Off'

     OCNGPDSCHPower: 0

          OCNGPDSCH: [1×1 struct]

 

 

pdsch =

 

  struct with fields:

 

           TxScheme: 'TxDiversity'

         Modulation: {'QPSK'}

            NLayers: 2

                Rho: 0

               RNTI: 1

              RVSeq: [0 1 2 3]

                 RV: 0

     NHARQProcesses: 8

       NTurboDecIts: 5

             PRBSet: [50×1 double]

     TargetCodeRate: 0.3333

     ActualCodeRate: [0.3566 0.3345 0.3345 0.3345 0.3345 0 0.3345 0.3345 0.3345 0.3345]

         TrBlkSizes: [4392 4392 4392 4392 4392 0 4392 4392 4392 4392]

    CodedTrBlkSizes: [12384 13200 13200 13200 13200 0 13200 13200 13200 13200]

          DCIFormat: 'Format1'

        PDCCHFormat: 2

         PDCCHPower: 0

            CSIMode: 'PUSCH 1-2'

            PMIMode: 'Wideband'

 

 

rc = 'R.11'; TxAntIndex = 0

36.101 v14.4 - Table A.3.3.2.1-1: Fixed Reference Channel two antenna ports   

rc = 'R.11'; TxAntIndex = 1

 

rmc =

 

  struct with fields:

 

                 RC: 'R.11'

              NDLRB: 50

           CellRefP: 2

            NCellID: 0

       CyclicPrefix: 'Normal'

                CFI: 2

        PCFICHPower: 0

                 Ng: 'Sixth'

      PHICHDuration: 'Normal'

              HISet: [112×3 double]

         PHICHPower: 0

             NFrame: 0

          NSubframe: 0

       TotSubframes: 10

          Windowing: 0

         DuplexMode: 'FDD'

              PDSCH: [1×1 struct]

    OCNGPDCCHEnable: 'Off'

     OCNGPDCCHPower: 0

    OCNGPDSCHEnable: 'Off'

     OCNGPDSCHPower: 0

          OCNGPDSCH: [1×1 struct]

 

 

pdsch =

 

  struct with fields:

 

           TxScheme: 'TxDiversity'

         Modulation: {'16QAM'}

            NLayers: 2

                Rho: 0

               RNTI: 1

              RVSeq: [0 1 2 3]

                 RV: 0

     NHARQProcesses: 8

       NTurboDecIts: 5

             PRBSet: [50×1 double]

     TargetCodeRate: 0.5000

     ActualCodeRate: [0.5271 0.4945 0.4945 0.4945 0.4945 0 0.4945 0.4945 0.4945 0.4945]

         TrBlkSizes: [12960 12960 12960 12960 12960 0 12960 12960 12960 12960]

    CodedTrBlkSizes: [24768 26400 26400 26400 26400 0 26400 26400 26400 26400]

          DCIFormat: 'Format1'

        PDCCHFormat: 2

         PDCCHPower: 0

            CSIMode: 'PUSCH 3-1'

            PMIMode: 'Wideband'

 

 

 

rc = 'R.12'; TxAntIndex = 0

36.101 v14.4 - Table A.3.3.2.2-1: Fixed Reference Channel four antenna ports   

rc = 'R.12'; TxAntIndex = 1

 

rc = 'R.12'; TxAntIndex = 2

 

rc = 'R.12'; TxAntIndex = 3

 

rmc =

 

  struct with fields:

 

                 RC: 'R.12'

              NDLRB: 6

           CellRefP: 4

            NCellID: 0

       CyclicPrefix: 'Normal'

                CFI: 3

        PCFICHPower: 0

                 Ng: 'Sixth'

      PHICHDuration: 'Normal'

              HISet: [112×3 double]

         PHICHPower: 0

             NFrame: 0

          NSubframe: 0

       TotSubframes: 10

          Windowing: 0

         DuplexMode: 'FDD'

              PDSCH: [1×1 struct]

    OCNGPDCCHEnable: 'Off'

     OCNGPDCCHPower: 0

    OCNGPDSCHEnable: 'Off'

     OCNGPDSCHPower: 0

          OCNGPDSCH: [1×1 struct]

 

 

pdsch =

 

  struct with fields:

 

           TxScheme: 'TxDiversity'

         Modulation: {'QPSK'}

            NLayers: 4

                Rho: 0

               RNTI: 1

              RVSeq: [0 1 2 3]

                 RV: 0

     NHARQProcesses: 8

       NTurboDecIts: 5

             PRBSet: [6×1 double]

     TargetCodeRate: 0.3333

     ActualCodeRate: [0.3667 0.3462 0.3462 0.3462 0.3462 0 0.3462 0.3462 0.3462 0.3462]

         TrBlkSizes: [152 408 408 408 408 0 408 408 408 408]

    CodedTrBlkSizes: [480 1248 1248 1248 1248 0 1248 1248 1248 1248]

          DCIFormat: 'Format1'

        PDCCHFormat: 2

         PDCCHPower: 0

            CSIMode: 'PUCCH 1-1'

            PMIMode: 'Wideband'

 

 

rc = 'R.13'; TxAntIndex = 0

36.101 v14.4 - Table A.3.3.2.2-1: Fixed Reference Channel four antenna ports   

rc = 'R.13'; TxAntIndex = 1

 

rc = 'R.13'; TxAntIndex = 2

 

rc = 'R.13'; TxAntIndex = 3

 

rmc =

 

  struct with fields:

 

                 RC: 'R.13'

              NDLRB: 50

           CellRefP: 4

            NCellID: 0

       CyclicPrefix: 'Normal'

                CFI: 2

        PCFICHPower: 0

                 Ng: 'Sixth'

      PHICHDuration: 'Normal'

              HISet: [112×3 double]

         PHICHPower: 0

             NFrame: 0

          NSubframe: 0

       TotSubframes: 10

          Windowing: 0

         DuplexMode: 'FDD'

              PDSCH: [1×1 struct]

    OCNGPDCCHEnable: 'Off'

     OCNGPDCCHPower: 0

    OCNGPDSCHEnable: 'Off'

     OCNGPDSCHPower: 0

          OCNGPDSCH: [1×1 struct]

 

 

pdsch =

 

  struct with fields:

 

           TxScheme: 'SpatialMux'

         Modulation: {'QPSK'}

            NLayers: 1

                Rho: 0

               RNTI: 1

              RVSeq: [0 1 2 3]

                 RV: 0

     NHARQProcesses: 8

       NTurboDecIts: 5

             PRBSet: [50×1 double]

     TargetCodeRate: 0.3333

     ActualCodeRate: [0.3032 0.3450 0.3450 0.3450 0.3450 0 0.3450 0.3450 0.3450 0.3450]

         TrBlkSizes: [3624 4392 4392 4392 4392 0 4392 4392 4392 4392]

    CodedTrBlkSizes: [12032 12800 12800 12800 12800 0 12800 12800 12800 12800]

          DCIFormat: 'Format2'

        PDCCHFormat: 2

         PDCCHPower: 0

            CSIMode: 'PUSCH 1-2'

            PMIMode: 'Wideband'

             PMISet: 0

 

 

 

rc = 'R.14'; TxAntIndex = 0

36.101 v14.4 - Table A.3.3.2.2-1: Fixed Reference Channel four antenna ports   

rc = 'R.14'; TxAntIndex = 1

 

rc = 'R.14'; TxAntIndex = 2

 

rc = 'R.14'; TxAntIndex = 3

 

rmc =

 

  struct with fields:

 

                 RC: 'R.14'

              NDLRB: 50

           CellRefP: 4

            NCellID: 0

       CyclicPrefix: 'Normal'

                CFI: 2

        PCFICHPower: 0

                 Ng: 'Sixth'

      PHICHDuration: 'Normal'

              HISet: [112×3 double]

         PHICHPower: 0

             NFrame: 0

          NSubframe: 0

       TotSubframes: 10

          Windowing: 0

         DuplexMode: 'FDD'

              PDSCH: [1×1 struct]

    OCNGPDCCHEnable: 'Off'

     OCNGPDCCHPower: 0

    OCNGPDSCHEnable: 'Off'

     OCNGPDSCHPower: 0

          OCNGPDSCH: [1×1 struct]

 

 

pdsch =

 

  struct with fields:

 

           TxScheme: 'SpatialMux'

         Modulation: {'16QAM'  '16QAM'}

            NLayers: 2

                Rho: 0

               RNTI: 1

              RVSeq: [2×4 double]

                 RV: [0 0]

     NHARQProcesses: 8

       NTurboDecIts: 5

             PRBSet: [50×1 double]

     TargetCodeRate: 0.5000

     ActualCodeRate: [2×10 double]

         TrBlkSizes: [2×10 double]

    CodedTrBlkSizes: [2×10 double]

          DCIFormat: 'Format2'

        PDCCHFormat: 2

         PDCCHPower: 0

            CSIMode: 'PUSCH 1-2'

            PMIMode: 'Wideband'

             PMISet: 0

 

 

 

 

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.