このペ,ジの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。
深層学習による変調の分類
この例では,畳み込みニュ,ラルネットワ,ク(cnn)を変調分類に使用する方法を説明します。チャネルで劣化した合成波形を生成します。生成された波形を学習デ,タとして使用して,変調分類用のCNNを学習させます。その後,ソフトウェア無線(sdr)ハ,ドウェアと無線信号を使用してCNNをテストします。
CNNを使用した変調タ@ @プの予測
この例の学習済みCNNは,以下の8つのデジタル変調タイプと3つのアナログ変調タイプを認識します。
2位相シフトキ,econeconpング(bpsk)
直交位相シフトキング(qpsk)
8-ary位相シフトキング(8-PSK)
16-ary直交振幅変調(16-QAM)
64-ary直交振幅変調(64-QAM)
4-aryパルス振幅変調(PAM4)
ガウス周波数シフトキ. e . e . e .ング(gfsk)
連続位相周波数シフトキ,etc, etc,ング(cpfsk)
ブロ,ドキャストFM (b-fm)
両側波帯振幅変調(dsb-am)
単側波帯振幅変調(ssb-am)
调制类型=分类的([“BPSK”,“正交相移编码”,“8相移键控”,...“16 qam”,“64 qam”,“PAM4”,“GFSK”,“CPFSK”,...“B-FM”,“DSB-AM”,“SSB-AM”]);
まず,学習済みネットワ,クを読み込みます。ネットワ,ク学習の詳細は,CNNの学習の節を参照してください。
负载trainedModulationClassificationNetworktrainedNet
trainedNet =带有属性的SeriesNetwork:层:[28×1 nnet.cnn.layer.Layer] InputNames:{'输入层'}OutputNames:{'输出'}
この学習済みCNNはチャネルで劣化した1024個のサンプルを取得し,各フレームの変調タイプを予測します。ラ▪▪スマルチパスフェ▪▪ジング、中心周波数とサンプリング時間のドリフト、および AWGN で劣化したいくつかの PAM4 フレームを生成します。以下の関数を使用して、CNN をテストするための合成信号を生成します。その後、CNN を使用してフレームの変調タイプを予測します。
兰迪
:ランダムなビットの生成pammod
(通信工具箱):ビットのpam4変調rcosdesign
(信号处理工具箱):ルトレズドコサンパルス整形フィルタの設計过滤器
:シンボルのパルス整形comm.RicianChannel
(通信工具箱):ラ化学键スマルチパスチャネルの適用comm.PhaseFrequencyOffset
(通信工具箱):クロックオフセットによる位相シフト/周波数シフトの適用interp1
:クロックオフセットによるタ化学键ミングのずれの適用情况下
(通信工具箱): awgnの追加
将随机数生成器设置为已知状态,以便能够重新生成%相同的帧,每次模拟运行rng (123456)%随机比特D = randi([0 3], 1024,1);% PAM4调制Syms = pammod(d,4);%平方根凸起余弦滤波器filterCoeffs = rcosdesign(0.35,4,8);tx = filter(filterCoeffs,1,upsample(syms,8));%的通道信噪比= 30;maxOffset = 5;Fc = 902e6;Fs = 200e3;multipathChannel = com . ricianchannel (...“SampleRate”fs,...“PathDelays”, [0 1.8 3.4] / 200e3,...“AveragePathGains”, [0 -2 -10],...“KFactor”4...“MaximumDopplerShift”4);frequencyShifter = com . phasefrequencyoffset (...“SampleRate”fs);应用独立的多路径通道reset(multipathChannel) outMultipathChan = multipathChannel(tx);确定时钟偏移因子clockOffset = (rand() * 2*maxOffset) - maxOffset;C = 1 + clockOffset / 1e6;添加频率偏移frequencyShifter。FrequencyOffset = -(C-1)*fc;outFreqShifter = frequencyShifter(outMultipathChan);增加采样时间漂移T =(0:长度(tx)-1)' / fs;newFs = fs * C;tp = (0:length(tx)-1)' / newFs;outTimeDrift = interp1(t, outFreqShifter, tp);%添加噪音rx = awgn(outTimeDrift,SNR,0);用于分类的帧生成unknownFrames = helpermodclassgetnframes (rx);%的分类[prediction1,score1] = category (trainedNet,unknownFrames);
硬判定に似た分類器の予測を返します。このネットワ、クはフレ、ムをpam4フレ、ムとして正しく識別します。変調信号の生成の詳細にいては,関数helperModClassGetModulatorを参照してください。
prediction1
prediction1 =7×1分类Pam4 Pam4 Pam4 Pam4 Pam4 Pam4 Pam4 Pam4
分類器は各フレ,ムのスコアのベクトルも返します。スコアは,各フレ,ムが予測された変調タ,プである確率に相当します。スコアをプロットします。
helperModClassPlotScores (score1 modulationTypes)
変調分類やその他のタスクにCNNを使用する前に,まず,既知の(ラベル付きの)データを使用してネットワークを学習させる必要があります。この例の最初の部分は,変調器,フィルター,およびチャネル障害などの通信工具箱の機能を使用して,合成学習データを生成する方法を示しています。2番目の部分では,変調分類のタスクのためにCNNを定義し,学習させて,テストすることに焦点を当てています。3番目の部分では,ソフトウェア無線(SDR)プラットフォームを使用して,無線信号でネットワーク性能をテストします。
学習のための波形生成
各変調タ@ @プに対して@ @ 1万フレ@ @ムを生成します。このう80%は学習に使用され,10%は検証に使用され,10%はテストに使用されます。ネットワ,ク学習フェ,ズでは,学習フレ,ムと検証フレ,ムを使用します。最終的な分類精度は,テストフレ,ムを使用して得ます。各フレ,ムの長さは1024サンプルで,サンプルレ,トは200 kHzです。デジタル変調タイプでは,8つのサンプルがシンボルを表します。ネットワークでは,(ビデオのように)複数の連続したフレームではなく,単一のフレームに基づいて各判定が行われます。デジタル変調タイプとアナログ変調タイプの中心周波数を,それぞれ902 MHzと100 MHzと仮定します。
この例を迅速に実行するには,学習済みネットワ,クを使用して少数の学習フレ,ムを生成します。コンピューターでネットワークに学習させるには,“现在的列车网络”オプションを選択します(つまり,trainNowを真正に設定します)。
trainNow =假;如果numFramesPerModType = 10000;其他的numFramesPerModType = 200;结束percentTrainingSamples = 80;percentValidationSamples = 10;percentTestSamples = 10;SPS = 8;每个符号的样本百分比SPF = 1024;每帧样本百分比symbolsPerFrame = spf / sps;Fs = 200e3;%抽样率Fc = [902e6 100e6];%中心频率
チャネル障害の作成
以下の障害があるチャネルを通して各フレ,ムを渡します。
情况下
ラ▪▪スマルチパスフェ▪▪ジング
中心周波数オフセットとサンプリング時間のドリフトをもたらすクロックオフセット
この例のネットワークは単一のフレームに基づいて判定を行うため,各フレームは独立したチャネルを通過しなければなりません。
情况下
チャネルは30 dBの信噪比でAWGNを追加します。関数情况下
(通信工具箱)を使用してチャネルを実装します。
ラ@ @スマルチパス
チャネルは,comm.RicianChannel
(通信工具箱)系统对象を使用して,ライスマルチパスフェージングチャネル経由で信号を渡します。対応する平均パスゲインが[0 2 -10]dBの[0 1.8 - 3.4]サンプルの遅延プロファイルを仮定します。Kファクタは4,最大ドップラシフトは4 Hzです。これは,902 MHzでの歩行速度に相当します。以下の設定を使用してチャネルを実装します。
クロックオフセット
クロックオフセットは,送信機と受信機の内部クロックソ,スが不正確なことが原因で発生します。クロックオフセットは、信号をベースバンドにダウンコンバートするために使用される中心周波数と、デジタルからアナログへの変換器のサンプリング レートが理想値とは異なる値になる原因となります。このチャネル シミュレーターは、 として表されるクロックオフセット係数 を使用します。ここで, はクロックオフセットです。各フレ,ムで,チャネルは範囲[ ]内の一様分布の値のセットから,乱数の 値を生成します。ここで, は最大クロックオフセットです。クロックオフセットは 100 万分の 1 (ppm) 単位で測定されます。この例では、最大クロック オフセットを 5 ppm と仮定します。
maxDeltaOff = 5;deltaOff = (rand()*2*maxDeltaOff) - maxDeltaOff;C = 1 + (deltaOff/1e6);
周波数オフセット
クロックオフセット係数
と中心周波数に基づいて,各フレ,ムに周波数オフセットを適用します。comm.PhaseFrequencyOffset
(通信工具箱)を使用してチャネルを実装します。
サンプリングレ,トオフセット
クロックオフセット係数
に基づいて,各フレ,ムにサンプリングレ,トオフセットを適用します。関数interp1
を使用してチャネルを実装し,新しいレ,トの
でフレ,ムをリサンプリングします。
結合されたチャネル
helperModClassTestChannelオブジェクトを使用して,3すべてのチャネル障害をフレムに適用します。
channel = helperModClassTestChannel(...“SampleRate”fs,...“信噪比”信噪比,...“PathDelays”, [0 1.8 3.4] / fs,...“AveragePathGains”, [0 -2 -10],...“KFactor”4...“MaximumDopplerShift”4...“MaximumClockOffset”5,...“CenterFrequency”902 e6)
频道=带有属性的helperModClassTestChannel:SNR: 30 CenterFrequency: 902000000 SampleRate: 200000 pathlatency: [0 9.0000 -06 1.7000e-05] averagepathgain: [0 -2 -10] KFactor: 4 MaximumDopplerShift: 4 MaximumClockOffset: 5
オブジェクト関数infoを使用して,チャネルに関する基本情報を表示できます。
chInfo =信息(频道)
chInfo =带字段的结构:ChannelDelay: 6 MaximumFrequencyOffset: 4510 MaximumSampleRateOffset: 1
波形生成
各変調タイプのチャネルで劣化したフレームを生成し,そのフレームに対応するラベルを付けて垫ファイルに格納するループを作成します。デタをファルに保存しておけば,この例を実行するたびにデタを生成する必要がなくなります。デ,タをより効率的に共有することもできます。
各フレームの先頭からランダムな数のサンプルを削除して,過渡状態を削除し,フレームがシンボルの境界に対してランダムな開始点をもつようにします。
将随机数生成器设置为已知状态,以便能够重新生成%相同的帧,每次模拟运行rng(1235) tic numModulationTypes = length(modulationTypes);channelInfo =信息(通道);transDelay = 50;dataDirectory = fullfile(tempdir,“ModClassDataFiles”);disp ("数据文件目录为"+ dataDirectory)
数据文件目录为C:\TEMP\ModClassDataFiles
fileNameRoot =“帧”;检查数据文件是否存在dataFilesExist = false;如果存在(dataDirectory“dir”) files = dir(fullfile(dataDirectory,sprintf(“% s *”, fileNameRoot)));如果length(files) == numModulationTypes*numFramesPerModType dataFilesExist = true;结束结束如果~ dataFilesExist disp (“生成数据并保存在数据文件中……”) [success,msg,msgID] = mkdir(dataDirectory);如果味精~成功错误(是否)结束为modType = 1:numModulationTypes elapsedTime = seconds(toc);elapsedTime。格式=“hh: mm: ss”;流('%s -生成%s帧\n',...elapsedTime, modulationTypes(modType)) label = modulationTypes(modType);numSymbols = (numFramesPerModType / sps);dataSrc = helperModClassGetSource(modulationTypes(modType), sps, 2*spf, fs);modulator = helperModClassGetModulator(modulationTypes(modType), sps, fs);如果包含(char (modulationTypes (modType)) {“B-FM”,“DSB-AM”,“SSB-AM”})模拟调制类型使用100 MHz的中心频率通道。CenterFrequency = 100e6;其他的数字调制类型使用902 MHz的中心频率通道。CenterFrequency = 902e6;结束为p = 1: numFramesPerModType生成随机数据x = dataSrc();%调节Y =调制器(x);通过独立渠道rxSamples =通道(y);从开始删除瞬变,修剪到大小,并归一化。frame = helperModClassFrameGenerator(rxSamples, spf, spf, transDelay, sps);保存数据文件文件名= fullfile(数据目录,...sprintf (“% s % s % 03 d”、fileNameRoot modulationTypes (modType)、p));保存(文件名,“帧”,“标签”)结束结束其他的disp (“数据文件存在。跳过数据生成。”)结束
生成数据并保存在数据文件中…
00:00:00 -生成BPSK帧00:00:01 -生成QPSK帧00:00:02 -生成8PSK帧00:00:04 -生成16QAM帧00:00:05 -生成64QAM帧00:00:06 -生成PAM4帧00:00:08 -生成GFSK帧00:00:09 -生成CPFSK帧00:00:11 -生成B-FM帧00:00:12 -生成DSB-AM帧00:00:13 -生成SSB-AM帧
绘制示例帧的实部和虚部的振幅%相对于样品数量helperModClassPlotTimeDomain (dataDirectory modulationTypes fs)
绘制示例帧的光谱图helperModClassPlotSpectrogram (dataDirectory modulationTypes fs, sps)
デ,タストアの作成
生成された複素数波形を含むファ@ @ルをsignalDatastore
オブジェクトを使用して管理します。デタストアは,個々のファルはメモリに収まっても全体が収まるとは限らない場合に特に便利です。
frameDS = signalDatastore“SignalVariableNames”, (“帧”,“标签”]);
実数配列への複素信号の変換
この例の深層学習ネットワークでは実数入力を想定していますが,受信信号には複素数のベースバンドサンプルが含まれています。複素信号を実数値の4次元配列に変換します。出力フレムのサズは[1 × spf × 2 × N]です。ここで,最初のページ (3 番目の次元) は同相サンプル、2 番目のページは直交サンプルです。畳み込みフィルターのサイズを 1 x spf にすると、この方法により畳み込み層でも I と Q の情報が結合され、位相情報が使いやすくなります。詳細については、helperModClassIQAsPagesを参照してください。
frameDSTrans = transform(frameDS,@helperModClassIQAsPages);
学習,検証,およびテストへの分割
次に,フレ,ムを学習デ,タ,検証デ,タ,およびテストデ,タに分割します。詳細にいては,helperModClassSplitDataを参照してください。
splitpercentage = [percentTrainingSamples,percentValidationSamples,percentTestSamples];[trainDSTrans,validDSTrans,testDSTrans] = helperModClassSplitData(frameDSTrans, splitpercentage);
使用“本地”配置文件启动并行池(parpool)…连接到并行池(工人数:6)。
メモリへのデタのンポト
ニュ,ラルネットワ,クの学習は反復的です。データストアでは,反復のたびにファイルからデータを読み取り,そのデータを変換してからネットワークの係数を更新します。データがコンピューターのメモリに収まる場合,データをファイルからメモリにインポートしておけば,繰り返し実行されるこのファイルからの読み取りと変換の処理が不要になり,学習が高速になります。この場合,デタのファルからの読み取りと変換が1回で済みます。このネットワークの場合,ディスク上のデータファイルを使用すると学習に約110分かかるのに対し,インメモリデータを使用すれば約50分で完了します。
ファル内のすべてのデタをメモリにンポトします。ファ@ @ルには框架
と标签
の2の変数があり,デタストアに対するそれぞれの读
の呼び出しはcell配列を返します。ここで,最初の要素が框架
で,2番目の要素が标签
です。变换
の関数helperModClassReadFrameとhelperModClassReadLabelを使用してフレ,ムとラベルを読み取ります。并行计算工具箱ラ电子邮箱センスがある場合は,“UseParallel”
オプションを真正的
にしてreadall
を使用し,変換関数の並列処理を有効にします。関数readall
は関数读
の出力を既定では最初の次元で連結するため,フレームを细胞配列で返し,手動で4番目の次元で連結します。
将训练和验证帧读入内存pctExists = parallelComputingLicenseExists();trainFrames = transform(trainDSTrans, @helperModClassReadFrame);rxTrainFrames = readall(trainFrames,“UseParallel”, pctExists);rxTrainFrames = cat(4, rxTrainFrames{:});validFrames = transform(validDSTrans, @helperModClassReadFrame);rxValidFrames = readall(validFrames,“UseParallel”, pctExists);rxValidFrames = cat(4, rxValidFrames{:});将训练和验证标签读入内存trainLabels = transform(trainDSTrans, @helperModClassReadLabel);rxTrainLabels = readall(训练标签,“UseParallel”, pctExists);validLabels = transform(validDSTrans, @helperModClassReadLabel);rxValidLabels = readall(validLabels,“UseParallel”, pctExists);
CNNの学習
この例では,6の畳み込み層と1の全結合層で構成されるCNNを使用します。最後を除く各畳み込み層の後には,バッチ正規化層,正規化線形ユニット(ReLU)活性化層,および最大プーリング層が続きます。最後の畳み込み層では,最大プ,リング層が平均プ,リング層に置き換えられます。出力層にはソフトマックス活性化があります。ネットワク設計ガドにいては,深層学習のヒントとコを参照してください。
modClassNet = helperModClassCNN(modulationTypes,sps,spf);
次に,ミニバッチサズが256のSGDMソルバを使用するようにTrainingOptionsSGDM
を構成します。エポックの数を大きくしても学習の利点は大きくならないため,エポックの最大数は12に設定します。既定では,“ExecutionEnvironment”
プロパティは“汽车”
に設定されており,関数trainNetwork
はgpuを使用できる場合はそれを使用し,使用できない場合はCPUを使用します。Gpuを使用するには,并行计算工具箱のラ@ @センスが必要です。初期学習率を
に設定します。9エポックごとに10ず学習率を下げます。学習の進行状況をプロットするため,“阴谋”
を”训练进步”
に設定します。NVIDIA Titan Xp GPUでは,ネットワ,クの学習に約25分かかります。
maxEpochs = 12;miniBatchSize = 256;选项= helperModClassTrainingOptions(maxEpochs,miniBatchSize,...元素个数(rxTrainLabels)、rxValidFrames rxValidLabels);
ネットワ,クを学習させるか,既に学習済みのネットワ,クを使用します。既定では,この例は学習済みネットワ,クを使用します。
如果trainNow = true elapsedTime = seconds(toc);elapsedTime。格式=“hh: mm: ss”;流('%s -训练网络\n', elapsedTime) trainedNet = trainNetwork(rxTrainFrames,rxTrainLabels,modClassNet,options);其他的负载trainedModulationClassificationNetwork结束
学習の進行状況のプロットで示されているように,このネットワークは約12エポックで95%を超える精度に収束します。
テストフレ,ムの分類精度を取得して,学習済みネットワ,クを評価します。結果は,このネットワークがこの波形グループに対して約94%の精度を達成していることを示しています。
elapsedTime = seconds(toc);elapsedTime。格式=“hh: mm: ss”;流('%s -分类测试帧\n'elapsedTime)
00:01:25 -分类测试帧
将测试帧读入内存testFrames = transform(testDSTrans, @helperModClassReadFrame);rxTestFrames = readall(testFrames,“UseParallel”, pctExists);rxTestFrames = cat(4, rxTestFrames{:});将测试标签读入内存testLabels = transform(testDSTrans, @helperModClassReadLabel);rxTestLabels = readall(testLabels,“UseParallel”, pctExists);rxTestPred =分类(trainedNet,rxTestFrames);testAccuracy = mean(rxTestPred == rxTestLabels);disp (“测试精度:”+测试精度*100 +“%”)
试验准确度:95.4545%
テストフレ,ムの混同行列をプロットします。この行列で示されているように,このネットワークは16-QAMフレームと64 - qamフレームを混同します。この問題は,各フレームが128シンボルのみを伝送し,16-QAMは64 - qamのサブセットであるために想定されています。このネットワクはQPSKフレムと8-pskフレムも混同します。これらの変調タイプのコンスタレーションは,フェージングチャネルと周波数オフセットにより位相が回転するように見えるためです。
figure cm = confusionchart(rxTestLabels, rxTestPred);厘米。Title =“测试数据的混淆矩阵”;厘米。RowSummary =“row-normalized”;cm.Parent.Position = [cm.Parent.Position(1:2) 740 424];
SDRによるテスト
関数helperModClassSDRTestを使用して,無線信号によって学習済みネットワ,クのパフォ,マンスをテストします。このテストを実行するには,送信および受信専用のSDRが必要です。2台の ADALM-PLUTO 無線機を使用するか、送信用の 1 台の ADALM-PLUTO 無線機と受信用の 1 台の USRP® 無線機を使用できます。ADALM-PLUTO无线电通信工具箱支持包金宝appを▪▪ンスト▪▪ルしなければなりません。Usrp®無線機を使用する場合,USRP®无线电通信工具箱支持包金宝appも▪▪ンスト▪▪ルしなければなりません。関数helperModClassSDRTest
は学習信号の生成で使用されたものと同じ変調関数を使用し,ADALM-PLUTO無線機を使用して送信します。チャネルをシミュレートする代わりに,信号の受信用に構成された特别提款权(ADALM-PLUTO無線機またはUSRP®無線機)を使用してチャネルで劣化した信号を取得します。前に使用したものと同じ関数分类
で学習済みネットワクを使用して変調タプを予測します。次のコ,ドセグメントを実行すると,混同行列が生成され,テスト精度が出力されます。
radioPlatform =“ADALM-PLUTO”;开关radioPlatform情况下“ADALM-PLUTO”如果helperIsPlutoSDRInstalled() == true收音机= findPlutoRadio();如果length(收音机)>= 2 helperModClassSDRTest(收音机);其他的disp (“选定的收音机未找到。跳过空中测试。”)结束结束情况下{“USRP B2xx”,“USRP X3xx”,“USRP N2xx”}如果(helperIsUSRPInstalled() == true) && (helperIsPlutoSDRInstalled() == true) txRadio = findPlutoRadio();rxRadio = findsdru();开关radioPlatform情况下“USRP B2xx”idx = contains({rxRadio。平台},{“B200”,“B210”});情况下“USRP X3xx”idx = contains({rxRadio。平台},{“×”,“X310”});情况下“USRP N2xx”idx = contains({rxRadio。平台},“N200 / N210 / USRP2”);结束rxRadio = rxRadio(idx);如果(length(txRadio) >= 1) && (length(rxRadio) >= 1) helperModClassSDRTest(rxRadio);其他的disp (“选定的收音机未找到。跳过空中测试。”)结束结束结束
2台の静止したADALM-PLUTO無線機を約2フィート離して使用している場合,次の混同行列でのネットワークの全体の精度は99%を達成します。結果は実験の設定によって異なります。
その他の調査
フィルター数やフィルターサイズなどのハイパーパラメーターパラメーターの最適化や,層の追加やさまざまな活性化層の使用などのネットワーク構造の最適化により,精度を向上させることができます。
通信工具箱には,多くの追加の変調タイプとチャネル障害が用意されています。詳細は,変調(通信工具箱)と伝播とチャネルモデル(通信工具箱)の節を参照してください。LTE工具箱、WLAN的工具箱,および5 g的工具箱を使用して,標準固有の信号を追加することもできます。相控阵系统工具箱を使用してレ,ダ,信号を追加することもできます。
関数helperModClassGetModulatorでは,変調信号の生成に使用されるmatlab関数が示されています。詳細にいては,次の関数と System object も参照してください。
参考文献
奥谢,t。J。柯根,t。c。克兰西。卷积无线电调制识别网络。预印本,2016年6月10日提交。https://arxiv.org/abs/1602.04105
奥谢,t。J。t。罗伊和t。c。克兰西。基于空中深度学习的无线电信号分类IEEE信号处理专题选刊。卷。12, 2018年第1期,第168-179页。
刘旭,杨德华,贾迈勒。调制分类的深度神经网络体系结构预印本,2018年1月5日提交。https://arxiv.org/abs/1712.00443v3