メインコンテンツ

AI ネイティブ完全畳み込み受信機

R2026b
R2025a 以降

この例では、DeepRx [1] として知られる、AI ネイティブの完全畳み込み受信機の学習および評価を行います。DeepRx では、5G New Radio (NR) リンクの受信側で、チャネル推定、イコライゼーション、シンボル復調を深層畳み込みニューラル ネットワーク (DCNN) に置き換えます。DeepRx は、ドップラー シフトが大きく、パイロット信号 (DM-RS) がスパースな構成において、従来の 5G 受信機よりも優れた性能を発揮します。

この例では、学習データ、検証データ、およびテスト データを生成するために、送信機、チャネル、受信機から成るエンドツーエンドの物理アップリンク共有チャネル (PUSCH) リンクを構築します。次に、DeepRx を評価し、その性能を従来の受信機と比較します。

はじめに

AI ネイティブ エアー インターフェイス (AI-AI) は、AI/ML を物理レイヤー (PHY) 処理に統合することで、5G 以降のネットワークにおけるシステム性能の向上とエネルギー消費量の削減を実現します。このアプローチは、AI/ML を PHY の中核コンポーネントとすることにより、従来の設計および製品化の流れとは一線を画すものです [2、3]。

3rd Generation Partnership Project (3GPP) は、チャネル状態情報 (CSI) の圧縮、ビーム管理、および測位のための AI/ML アプリケーションを定義しています。関連するワークフローについては、CSI フィードバック圧縮のための自己符号化器の学習、Neural Network for Beam Selection、およびAI for Positioning Accuracy Enhancementを参照してください。Release 19 において、3GPP はビーム管理と測位に関する検討を継続しており、仕様書でのサポートを提供しています [4、5]。

この例では、5G 受信機のいくつかのブロックを AI/ML 対応のものに置き換える AI-AI 受信機を実装し、符号化ビットエラー レート (BER) とスループットを向上させます。AI ネイティブ受信機を検証する PyTorch™ 共実行テストベンチについては、Verify Performance of 6G AI-Native Receiver Using MATLAB and PyTorch Coexecutionを参照してください。

AI-native, fully convolutional receiver block diagram

システムの説明

この例では、NR PUSCH スループットの例を応用して、オンライン学習ワークフローのための学習データ、検証データ、およびテスト データを生成します。オンライン学習では、ネットワークは連続的なデータ ストリームに基づいて学習と検証を行います。データセットの大部分をメモリに格納するバッチ学習は、メモリやストレージの制限のため現実的ではない場合があります。

この例では、バックグラウンドの CPU ワーカー上でミニバッチを並列生成します。学習アルゴリズムは、一度に 1 つのミニバッチを取得し、GPU 上でニューラル ネットワークに学習させます。ネットワークがフォアグラウンドで GPU 上での学習を行っている間、CPU ワーカーはバックグラウンドでデータの生成を継続します。バックグラウンド生成により、GPU が解放され、学習に専念できるようになります。

並列実行を有効にすると、この例では、学習、検証、テストの各反復処理において、1 つのミニバッチのみをメモリ上に保持します。並列設定とデータ パイプラインの詳細については、DeepRx ネットワークの学習セクションを参照してください。

S/N 比 (SNR) の各点ごとに、PUSCH 送信をシミュレーションし、受信した信号を次のように処理します。

  1. PUSCH 信号および PUSCH 復調基準信号 (DM-RS) を含む OFDM 変調波形を生成します。

  2. 波形をクラスタ遅延線 (CDL) またはタップ遅延線 (TDL) フェージング チャネルに渡し、目標 SNR で加法性ホワイト ガウス ノイズ (AWGN) を付加します。

  3. 受信した波形を同期させ、OFDM 復調してリソース グリッドに変換します。

  4. チャネルを推定します。

    • 完全な推定: チャネル インパルス応答 (CIR) を再構成し、それを周波数領域のチャネル推定値に変換します。

    • 実用的な推定: PUSCH DM-RS からチャネルを推定します。

  5. PUSCH リソース要素とそれに対応するチャネル推定値を抽出します。最小平均二乗誤差 (MMSE) イコライザーを使用して、PUSCH シンボルをイコライズします。

  6. イコライズされたシンボルを復調およびデスクランブルして、コードワードを推定します。

  7. アップリンク共有チャネル (UL-SCH) の復号化: ソフト ビットを処理し、コードワードを復号化し、ブロック巡回冗長検査 (CRC) を計算します。

  8. ソフト ビットとトランスポート ブロックを使用して、スループットと符号化ビット エラー レート (BER) を計算します。

図は、PUSCH 処理の各ステップを対応する 5G Toolbox™ 関数にマッピングしたものです。薄く表示されているブロックは、この例で省略されている演算を示しています。これは、この例が SIMO 構成 (送信アンテナ 1 本、受信アンテナ 2 本) を使用しているためです。

DeepRx は、チャネル推定、チャネル イコライゼーション、およびシンボル復調を置き換えます。したがって、F はサブキャリアの数を表し、S は時間における OFDM シンボルの数を表し、Nrx は受信アンテナの数を表します。学習中、損失はシグモイド出力を使用したバイナリ クロスエントロピー (BCE) となります。これは、予測されたビット対数尤度比 (LLR) L とグラウンド トゥルース ラベル T の間で計算されます。評価において、この例はトランスポート ブロック (Tblk) とブロック エラー数を使用して、符号化 BER とスループットを計算します。ハイブリッド自動再送要求 (HARQ) は、LLR 計算後の処理にのみ影響し、DeepRx で推定された LLR を変化させないため、無効化されています。

System description for the AI-native, fully convolutional receiver structure

システム パラメーターの構成

10 ms のフレームの数 (simParameters.NFrames) と学習サンプルの数 (simParameters.NTrainSamples) を指定して、シミュレーションの長さを設定します。SNR は、リソース エレメント (RE) ごと、およびアンテナ素子ごとに定義されます。この例で使用されている SNR の定義の詳細については、リンク シミュレーションで使用する SNR の定義を参照してください。

キャリア、UL-SCH 構成、PUSCH 構成、および伝播チャネル モデルのパラメーターを指定します。

DeepRx ネットワークの学習には数時間かかる場合があります。これは、汎化性能を向上させるために、学習セットが幅広いシナリオ パラメーターを網羅していることが理由です。既定では学習は無効になっています。この例では、事前学習済みのネットワーク (DeepRx_2M.mat) を読み込みます (Deep Learning Toolbox™ が必要)。このネットワークは、例の既定の設定と simParameters.NTrainSamples = 2e6 を使用して学習させました。学習を有効にするには、simParameters.TrainNow を true に設定します。

Workflow of the AI-native, fully convolutional receiver example

複数の CPU にまたがる複数のワーカー上で、学習用とテスト用のシミュレーション データを同時に生成します。並列実行を有効にするには、simParameters.UseParallel を true に設定します (Parallel Computing Toolbox™ が必要です)。サポートされている GPU が利用可能な場合、DeepRx ネットワークの学習は GPU で実行されます (Parallel Computing Toolbox™ が必要です)。

% Configure UL PUSCH simulation parameters for training, validation, and
% testing
simParameters.TrainNow      = false; % If true, train the network; otherwise, use a pretrained network
simParameters.UseParallel   = false; % If true, enable parallel processing; otherwise, execute serially
simParameters.LearnRate     = 0.001; % Initial learning rate for training
simParameters.NTrainSamples = 30e3; % Number of training iterations
simParameters.NFrames       = 1; % Number of frames used in each training iteration

% Generic UL PUSCH simulation parameters (fixed during training)
simParameters.CarrierFrequency  = 3.5e9;    % Carrier frequency (Hz)
simParameters.NSizeGrid         = 26;       % Bandwidth in resource blocks (26 RBs at 15 kHz SCS)
simParameters.SubcarrierSpacing = 15;       % Subcarrier spacing (kHz)
simParameters.ModulationType    = '16QAM';  % Supported modulation types — pi/2-BPSK, QPSK, 16QAM, 64QAM, 256QAM
simParameters.CodeRate          = 658/1024; % Code rate for transport block size calculation

この例では、SNR、遅延スプレッド、最大ドップラー シフト、DM-RS 設定など、チャネルやシミュレーション条件全体にわたって DeepRx の汎用性を高めるため、指定された範囲内で学習パラメーターをランダム化します。

% Randomized UL PUSCH parameters (selected within range; used only during
% training)
simParameters.SNRInLimits                  = [-4 32];        % SNR limits for uniform distribution [min max] in dB
simParameters.DelaySpreadLimits            = [10e-9 300e-9]; % RMS delay spread range [10 300] ns for uniform distribution
simParameters.MaximumDopplerShiftLimits    = [0 500];        % Maximum Doppler shift range [0 500] Hz for uniform distribution
simParameters.DMRSAdditionalPositionLimits = [0 1];          % DMRS additional position limits (0 or 1)
simParameters.DMRSConfigurationTypeLimits  = [1 2];          % DMRS configuration type limits (1 or 2)
simParameters.ChannelTrain                 = ["CDL-B","CDL-C","CDL-D","TDL-B","TDL-C","TDL-D"]; % Channel delay profiles for training
simParameters.ChannelValidate              = ["CDL-A","CDL-E","TDL-A","TDL-E"];                 % Channel delay profiles for validation

% Additional UL PUSCH simulation parameters
simParameters = hConfigureSimulationParameters(simParameters);

% AI/ML parameters
simParameters = configureAIMLParameters(simParameters);

% Display the simulation parameter summary
displayParameterSummary(simParameters);
________________________________________

Simulation Summary
________________________________________

- Input (X) size:                   [ 312   14   10 ]
- Output (L) size:                  [ 312   14    4 ]

- Number of subcarriers (F):        312  
- Number of symbols (S):            14   
- Number of receive antennas (Nrx): 2    

DeepRx ネットワークの読み込みまたは作成

DeepRx は、ResNet をベースとした深層畳み込みニューラル ネットワーク (DCNN) 受信機です。このセクションでは、OFDM 波形を検出および復調するための ResNet ベースの畳み込み受信機を設計し、学習させる方法について説明します。

simParameters.TrainNow によって、例の動作が異なります。

  • true — 例は学習モードになります。ネットワークをゼロから構築し、学習させます。

  • false — 例はシミュレーション モードになります。事前学習済みのネットワーク (DeepRx_2M.mat) を読み込み、生成されたテスト データで検出性能を評価します。

DCNN はイメージから目立った特徴を学習します。この例では、DCNN は 2 次元畳み込みを使用して、受信した時間-周波数リソース グリッドで演算を行い、送信されたビットを検出します。非常に深いネットワークでは、劣化 (層を追加するにつれて精度が飽和し、学習誤差が増加する) の影響を受ける可能性があります。DeepRx は、前の層への勾配フローを改善するためのスキップ接続が追加された残差ブロックを使用することで、劣化に対処します [6、7]。計算量を削減するために、各残差ブロックは 2 次元の深さ方向に分離可能な畳み込みを使用します [8]。

ネットワーク入力を次のように構築します。

  • 周波数領域受信リソース グリッド (rxGrid) — サイズが F×S×Nrx の複素数値配列。

  • 送信 DM-RS グリッド (dmrsGrid) — サイズが F×S×1 の複素数値配列。

  • 生のチャネル推定グリッド (rawChanEstGrid) — サイズが F×S×Nrx の複素数値配列。

rxGrid、dmrsGrid、および rawChanEstGrid を 3 番目の (チャネル) 次元 (深さ方向) に沿って連結し、サイズが F×S×Nch の複素数値配列 Xc を形成します。ここで、Nch=2Nrx+1 です。

実数部と虚数部をチャネル次元に沿って積み重ねて、Xc をサイズが F×S×(4Nrx+2) の実数値配列 X に変換します。

この例では、trBlk (LDPC 符号化、レート マッチング、およびスクランブリングを行う前のビット) と codedTrBlock (それらの演算を行った後のビット) という、2 つのラベル シーケンスも準備します。

Details of the AI-native, fully convolutional receiver network architecture

if simParameters.TrainNow
    % Create DeepRx architecture for training
    [net,netParam] = hCreateDeepRx(simParameters.InputSize,simParameters.NBits,InputNorm="none");
else 
    % Load pretrained DeepRx network: prefer custom-trained, otherwise use
    % default
    if exist("trained_DeepRx.mat","file")
        data = load("trained_DeepRx.mat"); % Load custom-trained network
    elseif exist("DeepRx_2M.mat","file")
        data = load("DeepRx_2M.mat");      % Load pretrained network
    else
        error("No pretrained network (trained_DeepRx.mat or DeepRx_2M.mat) found in the working folder.");
    end
    net = data.net;
    netParam = data.netParam;
end

% Display the summary of the network
displayNetworkSummary(net,netParam);
________________________________________

Neural Network Summary
________________________________________

- Number of ResNet blocks:    11
- Total number of layers:     46
- Total number of learnables: 1.2325 million

DeepRx ネットワークの学習

この例では、受信側でのビット検出を教師あり学習問題として扱います。ラベルとして機能するビットが送信機によって生成されるため、手動でのラベル付けは不要です。ネットワークの入力は周波数領域のリソース グリッド特徴で構成され、ラベルは送信されたビットです。hGeneratePUSCHTrainingBatch を使用して学習用ミニバッチを生成します。

ネットワークは、ビット検出をビットごとのバイナリ分類として定式化します。その出力は、サイズが F×S×B のソフトビット (LLR) 配列です。ここで、B はシンボルあたりのビット数 (変調次数) です。予測されたビット LLR L をグラウンドトゥルース ラベル T と比較し、バイナリ クロスエントロピー (BCE) とシグモイド出力を使用してモデルに学習させます。

学習時間を短縮するために、利用可能なすべての並列ワーカーに SNR 点を分散します (Accelerate Link-Level Simulations with Parallel Processingを参照)。CPU ワーカー上でミニバッチを並列生成し、DeepRx の学習のためにそれらを GPU にストリーミングします (Parallel Computing Toolbox™ が必要)。サポートされている GPU デバイスが存在しない場合、学習は CPU 上で実行されます。

simParameters.TrainNow が true の場合、例は学習済みのネットワークを trained_DeepRx.mat という名前で現在のフォルダーに保存します。それ以外の場合、DeepRx_2M.mat ファイルから事前学習済みのネットワークを読み込みます。

Details of the hardware acceleration in training

if simParameters.TrainNow
    % Train DeepRx network with the specified simulation parameters
    net = hTrainDeepRx(simParameters,net);
    
    % Save trained network and parameters to current folder
    save("trained_DeepRx.mat","net","netParam");
    
    % Message indicating the trained network was saved successfully
    disp("Your trained network is saved in the current folder as trained_DeepRx.mat...");
end

DeepRx と従来型 5G 受信機の性能比較

このセクションでは、DeepRx と従来の 5G 受信機について、符号化ビットエラー レート (BER) とスループットを計算できます。評価パイプラインは、DeepRx ネットワークの学習セクションで説明したように、受信リソース グリッドを再作成します。

テスト時の変調は、simParameters.ModulationType を使用して、学習時に使用された最高次数までの範囲で設定します。事前学習済みネットワーク DeepRx_2M.mat は 16-QAM で学習させているため、QPSK または 16QAM を評価できます。

従来型受信機におけるチャネル推定とタイミング同期は、simParameters.PerfectChannelEstimator で制御します。完全なチャネル推定およびタイミングにする場合は、このフラグを true に設定します。実用的な推定および同期にする場合は、false に設定します。

学習済みの DeepRx ネットワークはビットの対数尤度比 (LLR) を予測し、シミュレーションは SNR に対する符号化 BER とスループットを計算してプロットします。

  • エンドツーエンドのシミュレーション関数 hCompareReceiverPerformance は、送信されたトランスポート ブロック (Tblk) と復号化された UL-SCH ビット ベクトル (Y) を比較することで、符号化 BER を計算します。

  • エンドツーエンドのシミュレーション関数 hCompareReceiverPerformance は、正常に転送されたブロックの数とそのサイズからスループットも計算します。

総評価時間を短縮するには、parfor ループを使用して利用可能な並列ワーカーに SNR 点を分散します (Parallel Computing Toolbox™ が必要)。この例では、GPU が存在する場合は GPU 上で、存在しない場合は CPU 上で DeepRx 推論を実行します。

% End-to-end simulation parameters for testing DeepRx and conventional 5G receivers
simParameters.ChannelModel            = "TDL-E"; % Channel models for testing: CDL-A, CDL-E, TDL-A, TDL-E
simParameters.DelaySpread             = 100e-9; % Delay spread range [10e-9, 300e-9] seconds
simParameters.MaximumDopplerShift     = 250; % Maximum Doppler shift range [0, 500] Hz
simParameters.SNRInVec                = 0:10; % SNR range vector (dB) for evaluation
simParameters.ModulationType          = "QPSK"; % Supported modulation types — QPSK or 16QAM
simParameters.DMRSAdditionalPosition  = 0; % DMRS additional position — 0 or 1
simParameters.DMRSConfigurationType   = 2; % DMRS configuration type — 1 or 2
simParameters.NFrames                 = 5; % Number of frames in simulation
simParameters.PerfectChannelEstimator = false; % Use perfect channel estimation when true

% Evaluate link performance with the specified simulation parameters and neural network
[resultsRX,resultsAI] = compareReceiverPerformance(simParameters,net);
________________________________________

Simulating DeepRx and 5G receivers
________________________________________

- Test data generation : Serial execution
- Inference environment: CPU 

Simulating DeepRx and conventional receivers for 11 SNR points...

SNRIn: +10.00 dB | Channel: TDL-E | Delay spread: 1.00e-07 | Max Doppler shift: 250.00 | DMRS Add. Pos. / Config. Type: 0 / 2
SNRIn:  +9.00 dB | Channel: TDL-E | Delay spread: 1.00e-07 | Max Doppler shift: 250.00 | DMRS Add. Pos. / Config. Type: 0 / 2
SNRIn:  +8.00 dB | Channel: TDL-E | Delay spread: 1.00e-07 | Max Doppler shift: 250.00 | DMRS Add. Pos. / Config. Type: 0 / 2
SNRIn:  +7.00 dB | Channel: TDL-E | Delay spread: 1.00e-07 | Max Doppler shift: 250.00 | DMRS Add. Pos. / Config. Type: 0 / 2
SNRIn:  +6.00 dB | Channel: TDL-E | Delay spread: 1.00e-07 | Max Doppler shift: 250.00 | DMRS Add. Pos. / Config. Type: 0 / 2
SNRIn:  +5.00 dB | Channel: TDL-E | Delay spread: 1.00e-07 | Max Doppler shift: 250.00 | DMRS Add. Pos. / Config. Type: 0 / 2
SNRIn:  +4.00 dB | Channel: TDL-E | Delay spread: 1.00e-07 | Max Doppler shift: 250.00 | DMRS Add. Pos. / Config. Type: 0 / 2
SNRIn:  +3.00 dB | Channel: TDL-E | Delay spread: 1.00e-07 | Max Doppler shift: 250.00 | DMRS Add. Pos. / Config. Type: 0 / 2
SNRIn:  +2.00 dB | Channel: TDL-E | Delay spread: 1.00e-07 | Max Doppler shift: 250.00 | DMRS Add. Pos. / Config. Type: 0 / 2
SNRIn:  +1.00 dB | Channel: TDL-E | Delay spread: 1.00e-07 | Max Doppler shift: 250.00 | DMRS Add. Pos. / Config. Type: 0 / 2
SNRIn:  +0.00 dB | Channel: TDL-E | Delay spread: 1.00e-07 | Max Doppler shift: 250.00 | DMRS Add. Pos. / Config. Type: 0 / 2

検出性能の評価

最後に、nrPUSCHDecode関数を使用する従来型の受信機と DeepRx を比較します。統計的に有意な結果を得るには、シミュレーションにおけるフレーム数 (simParameters.NFrames) を増やしてください。

% Plot coded BER and throughput (%) versus SNR (dB)
visualizePerformance(simParameters,resultsRX,resultsAI);

Figure contains 2 axes objects. Axes object 1 with xlabel SNR (dB), ylabel Coded BER contains 2 objects of type line. These objects represent DeepRx, Conventional 5G Rx. Axes object 2 with xlabel SNR (dB), ylabel Throughput (%) contains 2 objects of type line. These objects represent DeepRx, Conventional 5G Rx.

参考文献

[1] M. Honkala, D. Korpi, and J. M. J. Huttunen, "DeepRx: Fully Convolutional Deep Learning Receiver," in IEEE Transactions on Wireless Communications, vol. 20, no. 6, pp. 3925—3940, June 2021.

[2] J. Hoydis, F. A. Aoudia, A. Valcarce, and H. Viswanathan, "Toward a 6G AI-Native Air Interface," in IEEE Communications Magazine, vol. 59, no. 5, pp. 76—81, May 2021.

[3] T. O’Shea and J. Hoydis, "An Introduction to Deep Learning for the Physical Layer," in IEEE Transactions on Cognitive Communications and Networking, vol. 3, no. 4, pp. 563—575, Dec. 2017.

[4] 3GPP TR 38.843. "Study on Artificial Intelligence (AI)/Machine Learning (ML) for NR air interface" 3rd Generation Partnership Project; Technical Specification Group Radio Access Network.

[5] 3GPP TSG RAN Meeting #103, Qualcomm, "Revised WID on Artificial Intelligence (AI)/Machine Learning (ML) for NR Air Interface," RP-240774, Maastricht, Netherlands, Mar. 18-21, 2024.

[6] K. He, X. Zhang, S. Ren, and J. Sun, "Deep Residual Learning for Image Recognition," 2016 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), Las Vegas, NV, USA, 2016, pp. 770—778.

[7] He, K., Zhang, X., Ren, S., and Sun, J., "Identity mappings in deep residual networks", in European Conference on Computer Vision, pp. 630—645, Springer, 2016.

[8] F. Chollet, "Xception: Deep Learning with Depthwise Separable Convolutions," in 2017 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), Honolulu, HI, USA, 2017 pp. 1800—1807.

ローカル関数

function visualizePerformance(simParameters,resultsRX,resultsAI)
% Plot coded BER and throughput vs. SNR for MMSE 5G and DeepRx receivers

    % Create figure for plots
    f = figure;
    f.Position(3:4) = [900 400];
    t = tiledlayout(1,2,TileSpacing="compact");
    
    % Plot coded BER against SNR (dB)
    nexttile;
    semilogy([resultsAI.SNRIn],[resultsAI.CodedBER],'-o',LineWidth=1.5);
    hold on
    semilogy([resultsRX.SNRIn],[resultsRX.CodedBER],'-s',LineWidth=1.5,MarkerSize=7);
    hold off
    legend("DeepRx","Conventional 5G Rx",Location="southwest");
    grid on;
    xlabel("SNR (dB)");
    ylabel("Coded BER");
    
    % Plot throughput vs SNR (dB)
    nexttile;
    plot([resultsAI.SNRIn],[resultsAI.PercThroughput],'-o',LineWidth=1.5);
    hold on
    plot([resultsRX.SNRIn],[resultsRX.PercThroughput],'-s',LineWidth=1.5,MarkerSize=7);
    hold off
    legend("DeepRx","Conventional 5G Rx",Location="southeast");
    grid on;
    xlabel("SNR (dB)");
    ylabel("Throughput (%)");
    
    % Add title to tiled layout summarizing system configuration
    titleText = [displayParameters(simParameters),' | Modulation: ',char(simParameters.ModulationType)];
    titleText = split(titleText,'DMRS ');
    titleText{2} = ['DMRS ',titleText{2}];
    title(t,titleText);
end

function [resultsRX, resultsAI] = compareReceiverPerformance(simParameters,net)
% Evaluate PUSCH link over SNR sweep
    simParameters.TrainNow = false;   
    displayResults         = true;

    % Preallocate output struct arrays (one element per SNR point)
    resultsAI(1:length(simParameters.SNRInVec)) = ...
    struct( ...
        'SNRIn',           -1, ...
        'BLER',            -1, ...
        'UncodedBER',      -1, ...
        'CodedBER',        -1, ...
        'SimThroughput',   -1, ...
        'MaxThroughput',   -1, ...
        'PercThroughput',  -1 ...
     );

    resultsRX(1:length(simParameters.SNRInVec)) = ...
    struct( ...
        'SNRIn',           -1, ...
        'BLER',            -1, ...
        'UncodedBER',      -1, ...
        'CodedBER',        -1, ...
        'SimThroughput',   -1, ...
        'MaxThroughput',   -1, ...
        'PercThroughput',  -1 ...
    );

    % Simulation status
    border = repmat('_',1,40);
    fprintf('\n%s\n',border);
    fprintf('\nSimulating DeepRx and 5G receivers\n');
    fprintf('%s\n',border);
    fprintf('\n');

    % -----------------------------------------------------------------
    % Evaluate AI/DeepRx and conventional receivers over all SNR points
    % -----------------------------------------------------------------
    if canUseParallelPool && simParameters.UseParallel
        pool = gcp;
        maxWorkers = numel(simParameters.SNRInVec); % simulate SNR points on each worker
        fprintf('- Test data generation : CPU acceleration on (%d) workers\n',pool.NumWorkers);
    else
        maxWorkers = 0; % serial execution
        fprintf('- Test data generation : Serial execution\n');
    end

    % Determine the neural receiver inference environment
    if canUseGPU
        device = "GPU";
    else
        device = "CPU";
    end
    fprintf('- Inference environment: %s \n', device);
    % -----------------------------------------------------------------
    % Each worker evaluates one SNR point (if enabled), otherwise serial
    % execution
    % -----------------------------------------------------------------
    fprintf('\nSimulating DeepRx and conventional receivers for %d SNR points...\n\n',...
        numel(simParameters.SNRInVec));
    parfor(i = 1:numel(simParameters.SNRInVec),maxWorkers)
        % Temporary parameter definitions for parfor
        simLocal = simParameters;
        simLocal.SNRIn = simParameters.SNRInVec(i);

        % End-to-end PUSCH simulation for each SNR point
        resultsRX(i) = hEvaluatePUSCHAtSNR(simLocal,Iteration=simLocal.NTrainSamples+i+1);
        resultsAI(i) = hEvaluatePUSCHAtSNR(simLocal,Net=net,Iteration=simLocal.NTrainSamples+i+1);

        % Update progress status
        if displayResults
            fprintf(['SNRIn: %+6.2f dB | ',displayParameters(simLocal),'\n'],simLocal.SNRIn);
        end
    end
end

function dispText = displayParameters(simParameters)
% Display random/selected simulation parameters
    dispText = sprintf( ...
        ['Channel: %s | Delay spread: %-7.2e | Max Doppler shift: %-6.2f | ' ...
            'DMRS Add. Pos. / Config. Type: %d / %d'], ...
        simParameters.ChannelModel, ...
        simParameters.DelaySpread,simParameters.MaximumDopplerShift, ...
        simParameters.DMRSAdditionalPosition, simParameters.DMRSConfigurationType ...
        );
end

function displayNetworkSummary(net,details)
% Display network summary including layers and learnable parameters

    % Count layers using the LeNet-5 convention:
    % Convolution, pooling, and fully connected layers are counted.
    % Activation layers are not counted.
    numLayers = details.conv + details.conv_sep + details.fc;
    
    % Print the network summary
    border = repmat('_',1,40);
    fprintf('\n%s\n',border);
    fprintf('\nNeural Network Summary\n');
    fprintf('%s\n\n',border);
    fprintf('- %-27s %i\n','Number of ResNet blocks:',details.resblock);
    fprintf('- %-27s %i\n','Total number of layers:',numLayers);
    
    % Initialize the network if uninitialized
    if ~net.Initialized
        net = init(net);
    end
    
    % Get learnable parameter count by analyzing the network
    netInfo = analyzeNetwork(net,Plots="none");
    numLearnables = sum(netInfo.LayerInfo.NumLearnables)/1e6; % millions
    fprintf('- %-27s %.4f million\n','Total number of learnables:',numLearnables);
end

function displayParameterSummary(simParameters)
% Display the simulation parameter set
    border = repmat('_',1,40);
    fprintf('\n%s\n',border);
    fprintf('\nSimulation Summary\n');
    fprintf('%s\n\n',border);
    fprintf('- %-33s [ %s ]\n', 'Input (X) size:',num2str(simParameters.InputSize));
    fprintf('- %-33s [ %s ]\n\n', 'Output (L) size:',num2str(simParameters.OutputSize));
    fprintf('- %-33s %-5d\n', 'Number of subcarriers (F):',simParameters.Carrier.NSizeGrid*12);
    fprintf('- %-33s %-5d\n','Number of symbols (S):',simParameters.Carrier.SymbolsPerSlot);
    fprintf('- %-33s %-5d\n','Number of receive antennas (Nrx):',simParameters.NRxAnts);
end

function simParameters = configureAIMLParameters(simParameters)
% Configure AI/ML parameters
    [~, info, ~] = nrPUSCHIndices(simParameters.Carrier,simParameters.PUSCH);
    simParameters.NBits = info.G/info.Gd; % Number of bits

    simParameters.InputSize  = [
        simParameters.Carrier.NSizeGrid*12, ...
        simParameters.Carrier.SymbolsPerSlot, ...
        4*simParameters.NRxAnts+2 ...
        ]; % DeepRx network input size [F S 4*Nr+2]

    simParameters.OutputSize = [
        simParameters.Carrier.NSizeGrid*12, ...
        simParameters.Carrier.SymbolsPerSlot, ...
        simParameters.NBits ...
        ]; % DeepRx network output size
end

参考

トピック