Main Content

5G 物理チャネルと信号のリソース グリッドへのマッピング

この例では、5G Toolbox™ の機能を使用して、5G New Radio (NR) の物理チャネルと信号を生成し、リソース グリッドにマッピングする方法を示します。

はじめに

次の図は、5G ダウンリンク リンクのコンテキストのうち、この例においてモデル化されるリンク要素を示しています。その要素は以下のとおりです。

  • 物理ダウンリンク共有チャネル (PDSCH) とその復調基準信号 (DM-RS) の生成

  • PDSCH および PDSCH DM-RS の MIMO プリコーディングおよびリソース グリッドへのマッピング

  • OFDM 変調

MappingToGridProcChain.png

キャリア構成

送信アンテナの数を指定し、キャリア構成オブジェクトを作成します。このオブジェクトは、リソース グリッドのサイズを制御します。簡略化のため、既定のキャリア構成オブジェクトを使用します。

nTxAnts = 4;
carrier = nrCarrierConfig
carrier = 
  nrCarrierConfig with properties:

                NCellID: 1
      SubcarrierSpacing: 15
           CyclicPrefix: 'normal'
              NSizeGrid: 52
             NStartGrid: 0
                  NSlot: 0
                 NFrame: 0
    IntraCellGuardBands: [0x2 double]

   Read-only properties:
         SymbolsPerSlot: 14
       SlotsPerSubframe: 1
          SlotsPerFrame: 10

PDSCH 構成と PDSCH DM-RS 構成

PDSCH 構成オブジェクトを作成します。このオブジェクトは、PDSCH 関連のパラメーターを指定します。16-QAM 変調、2 つのレイヤー、および全帯域割り当てを指定します。この構成は、PDSCH をキャリアと同じサイズの bandwidth part (BWP) にマッピングします。このオブジェクトを使用して、他の時間割り当てパラメーターと DM-RS 設定を指定することもできます。

pdsch = nrPDSCHConfig;
pdsch.Modulation = "16QAM";
pdsch.NumLayers = 2;
pdsch.PRBSet = 0:carrier.NSizeGrid-1; % Full band allocation

PDSCH および PDSCH DM-RS のパラメーターを表示します。

pdsch
pdsch = 
  nrPDSCHConfig with properties:

                NSizeBWP: []
               NStartBWP: []
             ReservedPRB: {[1x1 nrPDSCHReservedConfig]}
              ReservedRE: []
              Modulation: '16QAM'
               NumLayers: 2
             MappingType: 'A'
        SymbolAllocation: [0 14]
                  PRBSet: [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]
              PRBSetType: 'VRB'
    VRBToPRBInterleaving: 0
           VRBBundleSize: 2
                     NID: []
                    RNTI: 1
                    DMRS: [1x1 nrPDSCHDMRSConfig]
              EnablePTRS: 0
                    PTRS: [1x1 nrPDSCHPTRSConfig]

   Read-only properties:
            NumCodewords: 1

pdsch.DMRS
ans = 
  nrPDSCHDMRSConfig with properties:

      DMRSConfigurationType: 1
         DMRSReferencePoint: 'CRB0'
          DMRSTypeAPosition: 2
     DMRSAdditionalPosition: 0
                 DMRSLength: 1
            CustomSymbolSet: []
                DMRSPortSet: []
                   NIDNSCID: []
                      NSCID: 0
    NumCDMGroupsWithoutData: 2
            DMRSDownlinkR16: 0
            DMRSEnhancedR18: 0

   Read-only properties:
                  CDMGroups: [0 0]
                DeltaShifts: [0 0]
           FrequencyWeights: [2x2 double]
                TimeWeights: [2x2 double]
    DMRSSubcarrierLocations: [6x2 double]
                 CDMLengths: [2 1]

PDSCH の生成

PDSCH をグリッドにマッピングするためのインデックスを生成します。

[pdschIndices,pdschInfo] = nrPDSCHIndices(carrier,pdsch);

ランダムな PDSCH ビットを生成し、PDSCH シンボルにマッピングします。入力引数 pdschInfo.G は、PDSCH のビット容量を指定します。これは、チャネル符号化の段階から渡されるコードワードの長さです。pdschInfo.G は、PDSCH 送信に使用できるリソース エレメント (RE) を考慮します。簡略化のため、この例にはダウンリンク共有チャネル (DL-SCH) モデリングを含めていません。

pdschBits = randi([0 1],pdschInfo.G,1);

PDSCH シンボルを生成します。PDSCH シンボルは、サイズ Nsν 列の行列に保存されます。ここで、Ns はシンボルの数、ν はレイヤーの数です。

pdschSymbols = nrPDSCH(carrier,pdsch,pdschBits);
size(pdschSymbols)
ans = 1×2

        8112           2

PDSCH DM-RS の生成

DM-RS シンボルとインデックスを生成します。

dmrsSymbols = nrPDSCHDMRS(carrier,pdsch);
dmrsIndices = nrPDSCHDMRSIndices(carrier,pdsch);

PDSCH および PDSCH DM-RS のシンボルを含むコンスタレーション プロットを表示します。

plot(pdschSymbols(:),"o");hold on
plot(dmrsSymbols(:),"xr");hold off
title("PDSCH and PDSCH DM-RS Symbols");xlabel("In-Phase Amplitude");ylabel("Quadrature Amplitude")
legend("PDSCH","PDSCH DM-RS")

MIMO プリコーディングとリソース グリッドへのマッピング

プリコーディングを適用します。チャネル測定は、プリコーディングの重み ("ビームフォーミングの重み" とも呼ばれる) を決定します。ただし、この例では伝播チャネルをモデル化しません。この例では、プリコーディングの重みが既知であると仮定しています。

% Precoding weights
W = fft(eye(nTxAnts))/sqrt(nTxAnts);              % Unitary precoding matrix
w = W(1:pdsch.NumLayers,:)/sqrt(pdsch.NumLayers); % Normalize by number of layers

プリコーディング行列 w は、サイズ νNtx 列の行列でなければなりません。ここで、ν はレイヤーの数、Ntx は送信アンテナの数です。

MappingToGridArraySizes.png

size(pdschSymbols)
ans = 1×2

        8112           2

size(w)
ans = 1×2

     2     4

PDSCH シンボルをプリコーディングします。

pdschSymbolsPrecoded = pdschSymbols*w;

pdschSymbolsPrecoded 行列の行の数は PDSCH シンボルの数に対応し、列の数はアンテナの数に対応します。

size(pdschSymbolsPrecoded)
ans = 1×2

        8112           4

空のリソース グリッドを生成します。このグリッドは 1 つのスロットにまたがります。

pdschGrid = nrResourceGrid(carrier,nTxAnts);

PDSCH シンボルをリソース グリッドにマッピングするときは、関数 nrPDSCHIndices によって生成された PDSCH インデックスがアンテナではなくレイヤーを参照することを考慮します。このフォーマットは、PDSCH シンボルをレイヤーに直接マッピングする場合に役立ちます。この場合、結果のリソース グリッドはプリコーディングされません。

MappingToGridLayers.png

この例ではリソース グリッドにマッピングする前に PDSCH シンボルにプリコーディングを適用するため、プリコーディングされた PDSCH シンボルは、レイヤーにではなくアンテナにマッピングされます。レイヤー インデックスをアンテナ インデックスに変換するには、関数 nrExtractResources を使用します。

MappingToGridAntennas.png

[~,pdschAntIndices] = nrExtractResources(pdschIndices,pdschGrid);
pdschGrid(pdschAntIndices) = pdschSymbolsPrecoded;

最初のアンテナのリソース グリッドを表示します。青のギャップが DM-RS 用に残されています。

imagesc([0 carrier.SymbolsPerSlot-1],[0 carrier.NSizeGrid*12-1],abs(pdschGrid(:,:,1)));
axis xy;title("Resource Grid (First Antenna) - PDSCH");xlabel("OFDM Symbol");ylabel("Subcarrier")

DM-RS シンボルをプリコーディングしてグリッドにマッピングします。PDSCH インデックスと同様に、DM-RS インデックスはレイヤーを参照します。これらのレイヤーをマルチアンテナ インデックスに変換するには、関数 nrExtractResources を再度使用します。

% PDSCH DM-RS precoding and mapping
for p = 1:size(dmrsSymbols,2)
    [~,dmrsAntIndices] = nrExtractResources(dmrsIndices(:,p),pdschGrid);
    pdschGrid(dmrsAntIndices) = pdschGrid(dmrsAntIndices) + dmrsSymbols(:,p)*w(p,:);
end

最初のアンテナのリソース グリッドを表示します。

imagesc([0 carrier.SymbolsPerSlot-1],[0 carrier.NSizeGrid*12-1],abs(pdschGrid(:,:,1)));
axis xy;title("Resource Grid (First Antenna) - PDSCH and PDSCH DM-RS");
    xlabel("OFDM Symbol");ylabel("Subcarrier")

リソース グリッドから単一のリソース ブロック (RB) を表示します。このビューは単一の RB にズームインし、RE コンテンツの詳細ビューを表示します。

imagesc(abs(pdschGrid(1:12,:,1)));view(2)
axis xy;title("Resource Block - PDSCH and PDSCH DM-RS");ylabel("Subcarrier");xlabel("OFDM Symbol")

OFDM 変調

リソース グリッドを OFDM 変調し、最初のアンテナについて時間領域の波形を表示します。

[txWaveform,waveformInfo] = nrOFDMModulate(carrier,pdschGrid);
plot(abs(txWaveform(:,1)));title("Time Domain Waveform (First Antenna)");xlabel("Sample Number");ylabel("Magnitude")

waveformInfo 出力には、サンプル レートなどの時間領域の波形に関する情報が含まれています。

waveformInfo
waveformInfo = struct with fields:
                   Nfft: 1024
             SampleRate: 15360000
    CyclicPrefixLengths: [80 72 72 72 72 72 72 80 72 72 72 72 72 72]
          SymbolLengths: [1104 1096 1096 1096 1096 1096 1096 1104 1096 1096 1096 1096 1096 1096]
              Windowing: 36
           SymbolPhases: [0 0 0 0 0 0 0 0 0 0 0 0 0 0]
         SymbolsPerSlot: 14
       SlotsPerSubframe: 1
          SlotsPerFrame: 10

関連するトピック