Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

5G 信号および LTE 信号を識別するための深層学習によるスペクトル センシング

この例では、スペクトル監視のために、深層学習を使用してセマンティック セグメンテーション ネットワークに学習させる方法を示します。スペクトル監視の用途の 1 つは、スペクトル占有率を特徴付けることです。この例のニューラル ネットワークは、広帯域スペクトログラムに含まれる 5G NR および LTE の信号を識別するように学習させます。

はじめに

コンピューター ビジョンでは、セマンティック セグメンテーション手法を使用して、イメージまたはビデオ内のオブジェクトとその位置を識別します。無線信号処理において、対象オブジェクトは無線信号であり、オブジェクトの位置は信号が占める周波数と時間です。この例では、セマンティック セグメンテーション手法を無線信号に適用して、広帯域スペクトログラムに含まれるスペクトル コンテンツを識別します。

これ以降では、次を行います。

  1. 学習信号を生成します。

  2. セマンティック セグメンテーション ネットワークを使用して、5G NR および LTE の信号を時間と周波数で識別します。ネットワークにゼロから学習させるか、事前学習済みのネットワークに転移学習を適用するかを選択できます。

  3. 合成信号を使用して学習済みネットワークをテストします。

  4. SDR を使用し、無線 (OTA) 信号でネットワークをテストします。

関連する無線用 AI の例

この例は、次の完全な深層学習ワークフローの一部として使用します。

  1. Capture and Label NR and LTE Signals for AI Training (Wireless Testbench)の例では、SDR を使用して 5G NR および LTE の信号の帯域幅をスキャン、キャプチャ、およびラベル付けする方法を示します。

  2. この例では、広帯域スペクトログラムで 5G NR および LTE の信号を識別するためにセマンティック セグメンテーション ネットワークに学習させる方法を示します。

  3. Identify LTE and NR Signals from Captured Data Using SDR and Deep Learning (Wireless Testbench)の例では、深層学習で学習させたセマンティック セグメンテーション ネットワークを使用して、SDR でキャプチャした無線データから NR および LTE の信号を識別する方法を示します。

上記の例の目的とするワークフローを図に示します。

学習データの生成

深層学習ドメインにおける無線信号の利点の 1 つは、信号が合成されるという事実です。また、信頼性の高いチャネルや RF 劣化モデルも用意されています。その結果、信号を収集して手動でラベル付けする代わりに、5G Toolbox™ を使用して 5G NR 信号を生成したり、LTE Toolbox™ の関数を使用して LTE 信号を生成したりできます。これらの信号を標準仕様のチャネル モデルに渡して、学習データを作成できます。

5G NR または LTE の信号のみを含むフレームをネットワークに学習させ、対象の帯域内でこれらの信号の周波数をランダムにシフトします。各フレームの長さは 40 ms で、持続時間は 40 サブフレームです。ネットワークは、5G NR または LTE の信号がフレーム時間全体で同じ帯域を占有することを前提としています。ネットワーク性能をテストするには、対象の帯域内のランダムな個別の帯域で 5G NR 信号と LTE 信号の両方を含むフレームを作成します。

61.44 MHz のサンプル レートを使用します。このレートは、最新の標準信号のほとんどを処理するのに十分であり、低コストのソフトウェア無線 (SDR) システムには、このレートでサンプリングして、約 50 MHz の有用な帯域幅を提供するものがあります。より広い帯域を監視するには、サンプル レートを上げ、学習フレームを再生成して、ネットワークに再学習させます。

関数 helperSpecSenseTrainingData を使用して学習フレームを生成します。この関数は、関数 helperSpecSenseNRSignal を使用して 5G NR 信号を生成し、関数 helperSpecSenseLTESignal を使用して LTE 信号を生成します。次の表に、5G NR の可変信号パラメーターを示します。

5G_NR_Parameters.PNG

次の表に、LTE の可変信号パラメーターを示します。

lte_parameters.PNG

関数nrCDLChannel (5G Toolbox)lteFadingChannel (LTE Toolbox)を使用して、チャネル劣化要因を追加します。チャネル構成の詳細については、関数 helperSpecSenseTrainingData を参照してください。次の表に、チャネル パラメーターを示します。

関数 helperSpecSenseTrainingData は、関数 helperSpecSenseSpectrogramImage を使用して、複素ベースバンド信号からスペクトログラム イメージを作成します。4096 の FFT 長を使用してスペクトログラムを計算します。128×128 の RGB イメージを生成します。このイメージ サイズを使用することで、学習時に十分な大きさのイメージのバッチをメモリに収めながら、時間と周波数で十分な解像度を提供できます。GPU に十分なメモリがない場合は、イメージのサイズを小さくするか、学習バッチのサイズを小さくすることができます。

変数 generateTrainData は、学習データをダウンロードするか生成するかを決定します。[Use downloaded data] を選択すると、変数 generateTrainDatafalse に設定されます。[Generate training data] を選択すると、変数 generateTrainDatatrue に設定され、学習データが最初から生成されます。コンピューターの構成によっては、データの生成に数時間かかる場合があります。Intel® Xeon® W-2133 CPU @ 3.60GHz を搭載した PC を使用し、Parallel Computing Toolbox™ を使用して 6 つのワーカーで並列プールを作成する場合、学習データの生成に約 1 時間かかります。ネットワークに学習させるには、[Train network now] を選択します。このプロセスは、同じ PC と NVIDIA® Titan V GPU で約 8 分かかります。ネットワークの学習をスキップするには、[Use trained network] を選択します。代わりに、この例では学習済みネットワークをダウンロードします。

信号の各セットから 900 フレームを使用します。(5G NR のみ、LTE のみ、5G NR と LTE の両方)。システム パラメーターが取りうる値の数を増やす場合は、学習フレームの数を増やします。

imageSize をイメージ サイズの cell 配列に設定します。指定したサイズごとに学習イメージのセットを生成します。この例では、128×128 の RGB イメージを使用して、セマンティック セグメンテーション ネットワークにゼロから学習させます。256×256 のイメージを使用して、事前学習済みのセマンティック セグメンテーション ネットワークに転移学習を適用します。

ダウンロードされる学習データには、LTE、5G、および 250 MHz 帯域にまたがる未知の信号のキャプチャ データ、前処理データ、ラベル付きデータも含まれます。詳細については、Capture and Label NR and LTE Signals for AI Training (Wireless Testbench)の例を参照してください。

imageSize = {[256 256], [128 128]};    % pixels
sampleRate = 61.44e6;     % Hz
numSubFrames = 40;        % corresponds to 40 ms
frameDuration = numSubFrames*1e-3;    % seconds
trainDir = fullfile(pwd,"TrainingData");
classNames = ["Noise" "NR" "LTE" "Unknown"];

generateTrainData = false;
trainNow = false;
if generateTrainData
  numFramesPerStandard = 900;
  saveChannelInfo = false;
  helperSpecSenseTrainingData(numFramesPerStandard,classNames,imageSize,trainDir,numSubFrames,sampleRate,saveChannelInfo);
end

深層ニューラル ネットワークの選択

セマンティック セグメンテーション ネットワークにゼロから学習させるか、事前学習済みのセマンティック セグメンテーション ネットワークに転移学習を適用するかを選択できます。

  • カスタム ネットワークにゼロから学習させるには、baseNetwork を "custom" に設定します。カスタム ネットワークには、128×128 の RGB イメージを学習させます。

  • 転移学習を適用するには、baseNetwork を目的の事前学習済みのネットワーク アーキテクチャに設定します。事前学習済みのネットワークには、256×256 の RGB イメージを学習させます。

baseNetwork = 'custom';
if strcmp(baseNetwork,"custom")
    trainDir = fullfile(trainDir,'128x128');
    imageSize = [128 128];
else
    trainDir = fullfile(trainDir,'256x256'); %#ok
    imageSize = [256 256];
end

選択に基づいて、学習データと学習済みネットワークのいずれかまたはその両方をダウンロードします。

if ~generateTrainData || ~trainNow
  helperSpecSenseDownloadData(generateTrainData,trainNow,baseNetwork,imageSize)
end
Starting download of data files from:
	https://www.mathworks.com/supportfiles/spc/SpectrumSensing/SpectrumSensingTrainingData128x128.tgz
Extracting files.
Extract complete.
Starting download of data files from:
	https://www.mathworks.com/supportfiles/spc/SpectrumSensing/SpectrumSensingTrainedCustom.zip
Extracting files.
Extract complete.

学習データの読み込み

関数imageDatastoreを使用して、5G NR と LTE の信号のスペクトログラムを含む学習イメージを読み込みます。関数 imageDatastore では、大規模なイメージ コレクションをディスクから効率的に読み込むことができます。スペクトログラム イメージは .png ファイルに保存されます。

folders = [trainDir,fullfile(trainDir,"captured")];
imds = imageDatastore(folders,FileExtensions=".png");

関数pixelLabelDatastore (Computer Vision Toolbox)を使用して、スペクトログラムのピクセル ラベル イメージ データを読み込みます。各ピクセルは、"NR"、"LTE"、"Noise"、または "Unknown" のいずれかとしてラベル付けされます。ピクセル ラベル データストアは、ピクセル ラベル データとラベル ID をクラス名マッピングにカプセル化します。ピクセル ラベルは .hdf ファイルに保存されます。

numClasses = length(classNames);
pixelLabelID = floor((0:numClasses-1)/(numClasses-1)*255);
pxdsTruthLTENR = pixelLabelDatastore(folders,classNames,pixelLabelID,...
                                  FileExtensions=".hdf");

データセット統計の解析

学習データセット内のクラス ラベルの分布を確認するには、関数countEachLabel (Computer Vision Toolbox)を使用してクラス ラベルごとにピクセル数をカウントし、クラスごとにピクセル カウントをプロットします。

tbl = countEachLabel(pxdsTruthLTENR);
frequency = tbl.PixelCount/sum(tbl.PixelCount);
figure
bar(1:numel(classNames),frequency)
grid on
xticks(1:numel(classNames)) 
xticklabels(tbl.Name)
xtickangle(45)
ylabel("Frequency")

観測値の数がすべてのクラスで等しいことが理想的です。ただし、無線信号では、学習セット内のクラスが不平衡になるのが一般的です。5G NR 信号は、LTE 信号よりも帯域幅が広く、背景がノイズで埋め尽くされる可能性があります。優勢なクラスに学習が偏るため、クラスごとの観測数の不平衡が学習プロセスに悪影響を及ぼす可能性があります。クラスの重み付けを使用したクラスのバランス調整のセクションでは、クラスの重み付けを使用して、クラスごとの観測数の不平衡によって生じる偏りを緩和します。

学習セット、検証セット、およびテスト セットの準備

深層ニューラル ネットワークは、データセットの信号イメージの 80% を学習に使用し、イメージの 10% を検証に使用し、イメージの 10% をテストに使用します。関数 helperSpecSensePartitionData は、イメージとピクセル ラベルのデータを学習セット、検証セット、およびテスト セットにランダムに分割します。

[imdsTrain,pxdsTrain,imdsVal,pxdsVal,imdsTest,pxdsTest] = ...
  helperSpecSensePartitionData(imds,pxdsTruthLTENR,[80 10 10]);
cdsTrain = combine(imdsTrain,pxdsTrain);
cdsVal = combine(imdsVal,pxdsVal);
cdsTest = combine(imdsTest,pxdsTest);

変換を適用して、イメージとピクセル ラベル データを目的のサイズに変更します。

cdsTrain = transform(cdsTrain, @(data)preprocessTrainingData(data,imageSize));
cdsVal = transform(cdsVal, @(data)preprocessTrainingData(data,imageSize));
cdsTest = transform(cdsTest, @(data)preprocessTrainingData(data,imageSize));

深層ニューラル ネットワークの学習

ネットワークにゼロから学習させるか、転移学習を適用するかを選択できます。

シンプルなセマンティック セグメンテーション ネットワークの設計

このセクションでは、シンプルなセマンティック セグメンテーション ネットワークを設計します。代わりに事前学習済みネットワークで転移学習を使用する場合は、このセクションをスキップして、転移学習に事前学習済みのネットワークを使用に進むことができます。

セマンティック セグメンテーション ネットワークの共通パターンでは、畳み込み層と ReLU 層の間でイメージをダウンサンプリングした後、入力サイズを一致させるために出力をアップサンプリングする必要があります。このプロセス中、ネットワークはセグメント化するクラスの特定のセットに対して最適化されている非線形フィルターを使用して演算を実行します。

まず、入力イメージ層を定義します。

inputSize = [imageSize(1) imageSize(2) 3];
imgLayer = imageInputLayer(inputSize);

次に、畳み込み層と ReLU 層で構成されるダウンサンプリング ネットワークを定義します。畳み込み層の出力サイズが入力サイズと同じになるように、畳み込み層のパディングが選択されています。これによって、ネットワークで処理を進める間、ほとんどの層間の入力サイズと出力サイズが変わらないため、ネットワークが作成しやすくなります。

ダウンサンプリングは、最大プーリング層を使用して実行されます。'Stride' パラメーターを 2 に設定することで、入力を 2 の係数でダウンサンプリングする最大プーリング層を作成します。

filterSize = 3;
numFilters = 128;
conv = convolution2dLayer(filterSize,numFilters,'Padding',1);
relu = reluLayer();

poolSize = 2;
maxPoolDownsample2x = maxPooling2dLayer(poolSize,'Stride',2);

畳み込み層、ReLU 層および最大プール層を積み重ねて、その入力を 16 分の 1 にダウンサンプリングするネットワークを作成します。

downsamplingLayers = [
    conv
    relu
    maxPoolDownsample2x
    conv
    relu
    maxPoolDownsample2x
    conv
    relu
    maxPoolDownsample2x
    conv
    relu
    maxPoolDownsample2x
    ];

次に、アップサンプリング ネットワークを作成します。アップサンプリングは、転置畳み込み層 (一般的には "deconv" または "逆畳み込み" 層とも呼ばれる) を使用して実行されます。転置畳み込みがアップサンプリングに使用されている場合、アップサンプリングとフィルター処理が同時に実行されます。

2 でアップサンプリングする転置畳み込み層を作成します。

filterSize = 4;
transposedConvUpsample2x = transposedConv2dLayer(filterSize,numFilters,'Stride',2,'Cropping',1);

出力サイズが入力サイズの 2 倍になるよう 'Cropping' パラメーターが 1 に設定されています。

転置畳み込み層と ReLU 層を積み重ねます。この層のセットへの入力は 16 倍にアップサンプリングされます。

upsamplingLayers = [
    transposedConvUpsample2x
    relu
    transposedConvUpsample2x
    relu
    transposedConvUpsample2x
    relu
    transposedConvUpsample2x
    relu
    ];

最終的な層のセットは、ピクセル分類の作成を行います。これらの最終層は、入力イメージと同じ空間次元 (高さと幅) を持つ入力を処理します。ただし、チャネル数 (3 番目の次元) は大きく、最後の転置畳み込み層フィルター数と同じになります。この 3 つ目の次元を、セグメント化するクラス数まで絞り込む必要があります。これを実行するには、フィルターの数がクラス数 (ここでは 3) と一致する 1 行 1 列の畳み込み層を使用します。

入力特徴マップの 3 番目の次元をクラス数まで結合する畳み込み層を作成します。

conv1x1 = convolution2dLayer(1,numClasses);

この 1 行 1 列の畳み込み層の後に、ソフトマックス層と分類層が続きます。これらの 2 つの層が結合されて、各イメージ ピクセルのカテゴリカル ラベルが予測されます。

finalLayers = [
    conv1x1
    softmaxLayer()
    classificationLayer("Name","classification")
    ];

すべての層を積み重ねて、セマンティック セグメンテーション ネットワークを完成させます。

layers = [
    imgLayer    
    downsamplingLayers
    upsamplingLayers
    finalLayers
    ];
lgraph = layerGraph(layers);

転移学習に事前学習済みのネットワークを使用

ネットワークにゼロから学習させる代わりに、一般的なセマンティック セグメンテーション ネットワークに転移学習を適用できます。

転移学習を適用するには、関数deeplabv3plusLayers (Computer Vision Toolbox)を使用してセマンティック セグメンテーション ニューラル ネットワークを作成します。ベース ネットワークとしてresnet50 (Deep Learning Toolbox)を選択し (baseNetwork の値を設定)、入力イメージ サイズ (時間軸と周波数軸を表すために使用されるピクセル数) とクラス数を指定します。Deep Learning Toolbox™ Model for ResNet-50 Network サポート パッケージがインストールされていない場合、関数によってアドオン エクスプローラーに必要なサポート パッケージへのリンクが表示されます。サポート パッケージをインストールするには、リンクをクリックして、[インストール] をクリックします。コマンド ラインで resnet50 と入力して、インストールが正常に終了していることを確認します。必要なサポート パッケージがインストールされている場合、関数によってDAGNetwork (Deep Learning Toolbox)オブジェクトが返されます。

if ~strcmp(baseNetwork,"custom")
    lgraph = deeplabv3plusLayers([256 256],numel(classNames),baseNetwork);%#ok
end

クラスの重み付けを使用したクラスのバランス調整

学習セット内のクラスのバランスがとれていない場合、学習を改善するために、クラスの重み付けを使用してクラスのバランスを調整することができます。前に関数 countEachLabel で計算したピクセル ラベルのカウントを使用して、中央頻度クラスの重みを計算します。

imageFreq = tbl.PixelCount ./ tbl.ImagePixelCount;
classWeights = median(imageFreq) ./ imageFreq;

pixelClassificationLayer (Computer Vision Toolbox) を使用してクラスの重みを指定します。

pxLayer = pixelClassificationLayer(Name="labels",Classes=tbl.Name,ClassWeights=classWeights);
lgraph = replaceLayer(lgraph,"classification",pxLayer);

学習オプションの選択

関数trainingOptions (Deep Learning Toolbox)を使用して学習を構成し、モーメンタム項付き確率的勾配降下 (SGDM) 最適化アルゴリズムおよび SGDM に使用されるハイパーパラメーターを指定します。ネットワークから最高のパフォーマンスを得るために、実験マネージャー (Deep Learning Toolbox)を使用して学習オプションを最適化できます。

mbs = 40;
opts = trainingOptions("sgdm",...
  MiniBatchSize = mbs,...
  MaxEpochs = 20, ...
  LearnRateSchedule = "piecewise",...
  InitialLearnRate = 0.02,...
  LearnRateDropPeriod = 10,...
  LearnRateDropFactor = 0.1,...
  ValidationData = cdsVal,...
  ValidationPatience = 5,...
  Shuffle="every-epoch",...
  OutputNetwork = "best-validation-loss",...
  Plots = 'training-progress');

結合された学習データ ストア cdsTrain を使用してネットワークに学習させます。結合された学習データ ストアには、単一の信号フレームと真のピクセル ラベルが含まれます。

if trainNow
  [net,trainInfo] = trainNetwork(cdsTrain,lgraph,opts); 
  save(sprintf('myNet_%s_%s',baseNetwork, ...
    datetime('now',format='yyyy_MM_dd_HH_mm')), 'net')
else
  net = loadNetworkFromMATFile(baseNetwork); %#ok
end

深層ニューラル ネットワークのテスト

5G NR 信号と LTE 信号の両方を含む信号を使用して、ネットワーク信号の識別性能をテストします。関数semanticseg (Computer Vision Toolbox)を使用して、テスト データ セット内のスペクトログラム イメージのピクセル推定値を取得します。関数evaluateSemanticSegmentation (Computer Vision Toolbox)を使用してさまざまなメトリクスを計算し、セマンティック セグメンテーションの結果の品質を評価します。

dataDir = fullfile(trainDir,"LTE_NR");
imdsLTENR = imageDatastore(dataDir,FileExtensions=".png");
pxdsResultsLTENR = semanticseg(imdsLTENR,net,MinibatchSize=mbs,WriteLocation=tempdir);
Running semantic segmentation network
-------------------------------------
* Processed 897 images.
pxdsTruthLTENR = pixelLabelDatastore(dataDir,classNames,pixelLabelID,...
  FileExtensions=".hdf");
metrics = evaluateSemanticSegmentation(pxdsResultsLTENR,pxdsTruthLTENR);
Evaluating semantic segmentation results
----------------------------------------
* Selected metrics: global accuracy, class accuracy, IoU, weighted IoU, BF score.
* Processed 897 images.
* Finalizing... Done.
* Data set metrics:

    GlobalAccuracy    MeanAccuracy    MeanIoU    WeightedIoU    MeanBFScore
    ______________    ____________    _______    ___________    ___________

       0.91802            NaN         0.63619      0.84845        0.73257  

すべてのテスト フレームの正規化混同行列をプロットします。

cm = confusionchart(metrics.ConfusionMatrix.Variables, ...
  classNames, Normalization='row-normalized');
cm.Title = 'Confusion Matrix - Synthetic';

テスト データを、キャプチャ セットと生成セットに分離します。

capturedIdx = contains(imdsTest.Files,'captured');
imdsTestCaptured = subset(imdsTest,capturedIdx);
pxdsTestCaptured = subset(pxdsTest,capturedIdx);
imdsTestGenerated = subset(imdsTest,~capturedIdx);
pxdsTestGenerated = subset(pxdsTest,~capturedIdx);

テスト セット内のキャプチャ データを含むフレームのみを考慮して、同じプロセスを繰り返します。

pxdsResultsCaptured = semanticseg(imdsTestCaptured,net,MinibatchSize=mbs,WriteLocation=tempdir);
Running semantic segmentation network
-------------------------------------
* Processed 54 images.
metrics = evaluateSemanticSegmentation(pxdsResultsCaptured,pxdsTestCaptured);
Evaluating semantic segmentation results
----------------------------------------
* Selected metrics: global accuracy, class accuracy, IoU, weighted IoU, BF score.
* Processed 54 images.
* Finalizing... Done.
* Data set metrics:

    GlobalAccuracy    MeanAccuracy    MeanIoU    WeightedIoU    MeanBFScore
    ______________    ____________    _______    ___________    ___________

       0.97702          0.96717       0.90162      0.95796        0.88535  

正規化混同行列を再プロットします。

cm = confusionchart(metrics.ConfusionMatrix.Variables, ...
  classNames, Normalization="row-normalized");
cm.Title = "Normalized Confusion Matrix";

混同行列は、ネットワークが NR 信号をノイズまたは未知の信号と混同していることを示しています。キャプチャ信号を調べると、ファイル プレフィックス CF3550 のキャプチャ信号の SNR が非常に低く、ネットワークが信号をうまく識別できていないことがわかります。

CF3550Indices = contains(imdsTestCaptured.Files,'CF3550');
idx = find(CF3550Indices,1);
rcvdSpectrogram = readimage(imdsTestCaptured,idx);
trueLabels = readimage(pxdsTestCaptured,idx);
predictedLabels = readimage(pxdsResultsCaptured,idx);
figure
helperSpecSenseDisplayResults(rcvdSpectrogram,trueLabels,predictedLabels, ...
  classNames,250e6,0,frameDuration)

キャプチャ データを使用 (ただし、CF3550 フレームは除外) してテストします。

imdsTestCaptured2 = subset(imdsTestCaptured,~CF3550Indices);
pxdsTestCaptured2 = subset(pxdsTestCaptured,~CF3550Indices);
pxdsResultsCaptured2 = semanticseg(imdsTestCaptured2,net,MinibatchSize=mbs,WriteLocation=tempdir);
Running semantic segmentation network
-------------------------------------
* Processed 41 images.
metrics = evaluateSemanticSegmentation(pxdsResultsCaptured2,pxdsTestCaptured2);
Evaluating semantic segmentation results
----------------------------------------
* Selected metrics: global accuracy, class accuracy, IoU, weighted IoU, BF score.
* Processed 41 images.
* Finalizing... Done.
* Data set metrics:

    GlobalAccuracy    MeanAccuracy    MeanIoU    WeightedIoU    MeanBFScore
    ______________    ____________    _______    ___________    ___________

       0.99924           0.9983       0.9956       0.99849        0.99792  

正規化混同行列を再プロットします。

figure
cm = confusionchart(metrics.ConfusionMatrix.Variables, ...
  classNames, Normalization="row-normalized");
cm.Title = "Normalized Confusion Matrix";

NR 検出率が 99% を超えるようになりました。

スペクトログラムに含まれる 5G NR 信号および LTE 信号の識別

キャプチャ信号の受信スペクトル、真のラベル、および予測ラベルを可視化します。

signals = find(~CF3550Indices);
numSignals = length(signals);
idx = 13;
rcvdSpectrogram = readimage(imdsTestCaptured,signals(idx));
trueLabels = readimage(pxdsTestCaptured,signals(idx));
predictedLabels = readimage(pxdsResultsCaptured,signals(idx));
figure
helperSpecSenseDisplayResults(rcvdSpectrogram,trueLabels,predictedLabels, ...
  classNames,250e6,0,frameDuration)

figure
helperSpecSenseDisplayIdentifiedSignals(rcvdSpectrogram,predictedLabels, ...
  classNames,250e6,0,frameDuration)

SDR を使用してキャプチャしたデータのテスト

SDR を使用した無線信号キャプチャを使用して、学習済みネットワークの性能をテストします。近くの基地局を見つけて、識別したい信号の帯域をカバーするようにラジオの中心周波数を調整します。この例では、中心周波数を 2.35 GHz に設定します。少なくとも 1 つの ADALM-PLUTO 無線機があり、Communication Toolbox Support Package for ADALM-PLUTO Radio がインストールされている場合は、コードの以下のセクションを実行できます。ADALM-PLUTO 無線機にアクセスできない場合のために、この例では、キャプチャ信号と学習済みネットワークを使用して実施したテストの結果を示しています。

Wireless Testbench の例Identify LTE and NR Signals from Captured Data Using SDR and Deep Learning (Wireless Testbench)を使用して、広帯域信号でテストします。

runSDRSection = false;
if helperIsPlutoSDRInstalled()  
  radios = findPlutoRadio();
  if length(radios) >= 1
    runSDRSection = true;
  else
    disp("At least one ADALM-PLUTO radios is needed. Skipping SDR test.")
  end
else
    disp("Communications Toolbox Support Package for Analog Devices ADALM-PLUTO Radio not found.")
    disp("Click Add-Ons in the Home tab of the MATLAB toolstrip to install the support package.")
    disp("Skipping SDR test.")
end
Communications Toolbox Support Package for Analog Devices ADALM-PLUTO Radio not found.
Click Add-Ons in the Home tab of the MATLAB toolstrip to install the support package.
Skipping SDR test.
if runSDRSection
  % Set up PlutoSDR receiver
  rx = sdrrx('Pluto');
  rx.CenterFrequency = 2.35e9;
  rx.BasebandSampleRate = sampleRate;
  rx.SamplesPerFrame = frameDuration*rx.BasebandSampleRate;
  rx.OutputDataType = 'single';
  rx.EnableBurstMode = true;
  rx.NumFramesInBurst = 1;
  Nfft = 4096;
  overlap = 10;

  meanAllScores = zeros([imageSize numel(classNames)]);
  segResults = zeros([imageSize 10]);
  for frameCnt=1:10
    rxWave = rx();
    rxSpectrogram = helperSpecSenseSpectrogramImage(rxWave,Nfft,sampleRate,imageSize);

    [segResults(:,:,frameCnt),scores,allScores] = semanticseg(rxSpectrogram,net);
    meanAllScores = (meanAllScores*(frameCnt-1) + allScores) / frameCnt;
  end
  release(rx)

  [~,predictedLabels] = max(meanAllScores,[],3);
  figure
  helperSpecSenseDisplayResults(rxSpectrogram,[],predictedLabels,classNames,...
    sampleRate,rx.CenterFrequency,frameDuration)
  figure
  freqBand = helperSpecSenseDisplayIdentifiedSignals(rxSpectrogram,predictedLabels,...
    classNames,sampleRate,rx.CenterFrequency,frameDuration)
else
  figure
  imshow('lte_capture_result1.png')
  figure
  imshow('lte_capture_result2.png')
  figure
  imshow('nr_capture_result1.png')
  figure
  imshow('nr_capture_result2.png')
end

まとめとその他の調査

学習済みネットワークは、実際の基地局からの 2 つの取得例を含む 5G NR と LTE の信号を区別できます。ネットワークは、取得されたすべての信号を正しく識別できない場合があります。このような場合、より典型的な合成信号を生成するか無線信号を取得し、それらを学習セットに含めて、学習データを強化します。

ネットワーク構造が異なると、検出の精度も異なります。次の表は、カスタム、ResNet-18、MobileNetv2、および ResNet-50 (それぞれ 140 万、2060 万、4390 万、および 4690 万の学習可能パラメーターをもつ) の検出精度の結果を示しています。検出精度の結果は、テスト セット全体に対するもの、合成信号のみに対するもの、およびキャプチャ信号のみに対するものです。全体テストとキャプチャのみのテストには、テスト セットからの信号が含まれます。合成テストには、学習には使用されない、LTE_NR ディレクトリ内の生成信号が含まれます。ネットワークの複雑度が増すと精度は向上します。しかし、学習可能なパラメーターが 1/20 未満であるこのカスタム ネットワークでは、MobileNetv2 と比較して、キャプチャした NR 信号の検出精度が約 10% しか低下していません。

Identify LTE and NR Signals from Captured Data Using SDR and Deep Learning (Wireless Testbench)の例を使用し、学習済みネットワークを使用して LTE および 5G NR の信号を識別することができます。

スペクトルのより広い帯域を監視する必要がある場合は、sampleRate を増やし、学習データを再生成し、Capture and Label NR and LTE Signals for AI Training (Wireless Testbench)の例を使用して信号をキャプチャし、ネットワークに再学習させます。

サポート関数

function data = preprocessTrainingData(data, imageSize)
% Resize the training image and associated pixel label image.
data{1} = imresize(data{1},imageSize);
data{2} = imresize(data{2},imageSize);
end

function net = loadNetworkFromMATFile(baselineNetwork)
    switch baselineNetwork
      case "custom"
        net = load("specSenseTrainedNetCustom.mat",'net');
      case "resnet18"
        net = load("specSenseTrainedNetResnet18.mat",'net');
      case "resnet50"
        net = load("specSenseTrainedNetResnet50.mat",'net');
      case "mobilenetv2"
        net = load("specSenseTrainedNetMobileNetv2.mat",'net');
      otherwise
        error("Unknown baseline network: " + baselineNetwork)
    end
    net = net.net;
end

参考

(Deep Learning Toolbox) | (Deep Learning Toolbox) | (Deep Learning Toolbox) | (Deep Learning Toolbox) | (Deep Learning Toolbox) | (Computer Vision Toolbox) | (Computer Vision Toolbox) | (Computer Vision Toolbox)

関連するトピック