Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

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

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

はじめに

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

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

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

  2. 転移学習をセマンティック セグメンテーション ネットワークに適用して、5G NR と LTE の信号を時間と周波数で識別します。

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

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

学習データの生成

深層学習ドメインにおける無線信号の利点の 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 を参照してください。次の表に、チャネル パラメーターを示します。

channel_parameters.PNG

関数 helperSpecSenseTrainingData は、関数 helperSpecSenseSpectrogramImage を使用して、複素ベースバンド信号からスペクトログラム イメージを作成します。4096 の FFT 長を使用してスペクトログラムを計算します。256×256 の 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 で約 20 分かかります。ネットワークの学習をスキップするには、[Use trained network] を選択します。代わりに、この例では学習済みネットワークをダウンロードします。

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

imageSize = [256 256];    % pixels
sampleRate = 61.44e6;     % Hz
numSubFrames = 40;        % corresponds to 40 ms
frameDuration = numSubFrames*1e-3;    % seconds
trainDir = fullfile(pwd,'TrainingData');

generateTrainData = false;
trainNow = false;
if ~generateTrainData || ~trainNow
  helperSpecSenseDownloadData()
end
Starting download of data files from:
	https://www.mathworks.com/supportfiles/spc/SpectrumSensing/SpectrumSenseTrainingDataNetwork.tar.gz
Download complete. Extracting files.
Extract complete.
if generateTrainData
  numFramesPerStandard = 900;
  helperSpecSenseTrainingData(numFramesPerStandard,imageSize,trainDir,numSubFrames,sampleRate);
end

学習データの読み込み

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

imds = imageDatastore(trainDir,'IncludeSubfolders',false,'FileExtensions','.png');

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

classNames = ["NR" "LTE" "Noise"];
pixelLabelID = [127 255 0];
pxdsTruth = pixelLabelDatastore(trainDir,classNames,pixelLabelID,...
  'IncludeSubfolders',false,'FileExtensions','.hdf');

データセット統計の解析

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

tbl = countEachLabel(pxdsTruth);
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% を学習に使用し、イメージの 20% を検証に使用します。関数 helperSpecSensePartitionData は、イメージとピクセル ラベル データを学習セットと検証セットにランダムに分割します。

[imdsTrain,pxdsTrain,imdsVal,pxdsVal] = helperSpecSensePartitionData(imds,pxdsTruth,[80 20]);
cdsTrain = combine(imdsTrain,pxdsTrain);
cdsVal = combine(imdsVal,pxdsVal);

% Apply a transform to resize the image and pixel label data to the desired
% size.
cdsTrain = transform(cdsTrain, @(data)preprocessTrainingData(data,imageSize));
cdsVal = transform(cdsVal, @(data)preprocessTrainingData(data,imageSize));

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

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

baseNetwork = 'resnet50';
lgraph = deeplabv3plusLayers(imageSize,numel(classNames),baseNetwork);

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

学習セット内のクラスのバランスがとれていない場合、学習を改善するために、クラスの重み付けを使用してクラスのバランスを調整することができます。前に関数 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)を使用して学習オプションを最適化できます。

opts = trainingOptions("sgdm",...
  MiniBatchSize = 40,...
  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')
opts = 
  TrainingOptionsSGDM with properties:

                        Momentum: 0.9000
                InitialLearnRate: 0.0200
               LearnRateSchedule: 'piecewise'
             LearnRateDropFactor: 0.1000
             LearnRateDropPeriod: 10
                L2Regularization: 1.0000e-04
         GradientThresholdMethod: 'l2norm'
               GradientThreshold: Inf
                       MaxEpochs: 20
                   MiniBatchSize: 40
                         Verbose: 1
                VerboseFrequency: 50
                  ValidationData: [1×1 matlab.io.datastore.TransformedDatastore]
             ValidationFrequency: 50
              ValidationPatience: 5
                         Shuffle: 'every-epoch'
                  CheckpointPath: ''
             CheckpointFrequency: 1
         CheckpointFrequencyUnit: 'epoch'
            ExecutionEnvironment: 'auto'
                      WorkerLoad: []
                       OutputFcn: []
                           Plots: 'training-progress'
                  SequenceLength: 'longest'
            SequencePaddingValue: 0
        SequencePaddingDirection: 'right'
            DispatchInBackground: 0
         ResetInputNormalization: 1
    BatchNormalizationStatistics: 'population'
                   OutputNetwork: 'best-validation-loss'

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

if trainNow
  [net,trainInfo] = trainNetwork(cdsTrain,lgraph,opts); %#ok<UNRCH> 
else
  load specSenseTrainedNet net
end

合成信号によるテスト

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

dataDir = fullfile(trainDir,'LTE_NR');
imds = imageDatastore(dataDir,'IncludeSubfolders',false,'FileExtensions','.png');
pxdsResults = semanticseg(imds,net,"WriteLocation",tempdir);
Running semantic segmentation network
-------------------------------------
* Processed 900 images.
pxdsTruth = pixelLabelDatastore(dataDir,classNames,pixelLabelID,...
  'IncludeSubfolders',false,'FileExtensions','.hdf');
metrics = evaluateSemanticSegmentation(pxdsResults,pxdsTruth);
Evaluating semantic segmentation results
----------------------------------------
* Selected metrics: global accuracy, class accuracy, IoU, weighted IoU, BF score.
* Processed 900 images.
* Finalizing... Done.
* Data set metrics:

    GlobalAccuracy    MeanAccuracy    MeanIoU    WeightedIoU    MeanBFScore
    ______________    ____________    _______    ___________    ___________

       0.88609          0.87117       0.79066      0.79601        0.65623  

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

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

イメージごとの Intersection over Union (IoU) のヒストグラムをプロットします。各クラスの IoU は、そのクラスのグラウンド トゥルースと予測されたピクセルの総数に対する、正しく分類されたピクセルの比率です。

imageIoU = metrics.ImageMetrics.MeanIoU;
figure
histogram(imageIoU)
grid on
xlabel('IoU')
ylabel('Number of Frames')
title('Frame Mean IoU')

低 SNR フレームを検査すると、スペクトログラム イメージには、ネットワークが低 SNR フレームを正しく識別するのに役立つ視覚的特徴が含まれていないことがわかります。平均 SNR が 50 dB または 100 dB のフレームのみを考慮し、平均 SNR が 40 dB のフレームを無視して、同じプロセスを繰り返します。

files = dir(fullfile(dataDir,'*.mat'));
dataFiles = {};
labelFiles = {};
for p=1:numel(files)
  load(fullfile(files(p).folder,files(p).name),'params');
  if params.SNRdB > 40
    [~,name] = fileparts(files(p).name);
    dataFiles = [dataFiles; fullfile(files(p).folder,[name '.png'])]; %#ok<AGROW>
    labelFiles = [labelFiles; fullfile(files(p).folder,[name '.hdf'])]; %#ok<AGROW>
  end
end
imds = imageDatastore(dataFiles);
pxdsResults = semanticseg(imds,net,"WriteLocation",tempdir);
Running semantic segmentation network
-------------------------------------
* Processed 608 images.
pxdsTruth = pixelLabelDatastore(labelFiles,classNames,pixelLabelID);
metrics = evaluateSemanticSegmentation(pxdsResults,pxdsTruth);
Evaluating semantic segmentation results
----------------------------------------
* Selected metrics: global accuracy, class accuracy, IoU, weighted IoU, BF score.
* Processed 608 images.
* Finalizing... Done.
* Data set metrics:

    GlobalAccuracy    MeanAccuracy    MeanIoU    WeightedIoU    MeanBFScore
    ______________    ____________    _______    ___________    ___________

       0.94487          0.94503       0.89799      0.89582        0.74699  

SNR がより高いフレームのセットのみを考慮し、正規化された混同行列を再プロットして、改善されたネットワーク精度を観察します。

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

SNR がより高いフレームのセットのみを考慮し、イメージごとの IoU ヒストグラムを再プロットして、改善された分布を観察します。

imageIoU = metrics.ImageMetrics.MeanIoU;
figure
histogram(imageIoU)
grid on
xlabel('IoU')
ylabel('Number of Frames')
title('Frame Mean IoU')

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

インデックス 602 のイメージについて、受信スペクトル、真のラベル、および予測ラベルを可視化します。

imgIdx = 602;
rcvdSpectrogram = readimage(imds,imgIdx);
trueLabels = readimage(pxdsTruth,imgIdx);
predictedLabels = readimage(pxdsResults,imgIdx);
figure
helperSpecSenseDisplayResults(rcvdSpectrogram,trueLabels,predictedLabels, ...
  classNames,sampleRate,0,frameDuration)

figure
helperSpecSenseDisplayIdentifiedSignals(rcvdSpectrogram,predictedLabels, ...
  classNames,sampleRate,0,frameDuration)

無線信号によるテスト

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

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 の信号を区別できます。ネットワークは、取得されたすべての信号を正しく識別できない場合があります。このような場合、より典型的な合成信号を生成するか無線信号を取得し、それらを学習セットに含めて、学習データを強化します。

学習データを取得して LTE および 5G NR の基地局を手動で識別するには、LTE のCell Search, MIB and SIB1 Recovery (LTE Toolbox)の例およびNR セル サーチおよび MIB と SIB1 の復元 (5G Toolbox)の例をそれぞれ使用できます。

スペクトルのより広い帯域を監視する必要がある場合は、sampleRate を増やし、学習データを再生成して、ネットワークに再学習させます。

サポート関数

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

参考

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

関連するトピック