主要内容

调制分类与深度学习

这个例子展示了如何使用一个卷积神经网络(CNN)的调制分类。你生成合成,channel-impaired波形。使用生成的波形作为训练数据,你训练的CNN调制分类。然后用软件定义无线电(SDR)硬件测试CNN和无线信号。

预测使用CNN调制类型

训练有素的CNN在这个例子中认识到这些八个数字和三个模拟调制类型:

  • 二进制相移键控(BPSK)

  • 正交相移键控(QPSK)

  • 8-ary相移键控(8-PSK)

  • 16-ary正交调幅(16-QAM)

  • 64 - ary正交调幅(64 - qam)

  • 4-ary脉冲幅度调制(PAM4)

  • 高斯频移键控(GFSK)

  • 连续相频移键控(CPFSK)

  • 广播调频(B-FM)

  • 双边带调幅(DSB-AM)

  • 单边带调幅(SSB-AM)

modulationTypes =分类([“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 channel-impaired训练样本和预测每一帧的调制类型。生成几个PAM4帧与Rician削弱多路径衰落,中心频率和采样时间漂移和情况。使用以下函数来生成合成信号测试CNN。然后使用CNN预测帧的调制类型。

%将随机数发生器设置为一个已知状态能够再生%每次仿真运行相同的帧rng (123456)%随机比特d =兰迪([0 3],1024 1);% PAM4调制信谊= pammod (d, 4);%成余弦滤波器filterCoeffs = rcosdesign (0.35、4、8);tx =过滤器(filterCoeffs 1 upsample(信谊、8));%的通道信噪比= 30;maxOffset = 5;fc = 902 e6;fs = 200年e3;multipathChannel = comm.RicianChannel (“SampleRate”fs,“PathDelays”[0,1.8 - 3.4)/ 200 e3,“AveragePathGains”(0 -10),“KFactor”4“MaximumDopplerShift”4);frequencyShifter = comm.PhaseFrequencyOffset (“SampleRate”fs);%申请一个独立多路径通道重置(multipathChannel) outMultipathChan = multipathChannel (tx);%确定时钟偏移的因素clockOffset = (rand () * 2 * maxOffset) - maxOffset;C = 1 + clockOffset / 1 e6;%添加频率偏移frequencyShifter。FrequencyOffset = -(颈- 1)*俱乐部;outFreqShifter = frequencyShifter (outMultipathChan);%添加采样时间漂移t =(0:长度(tx) 1) / fs;newFs = C fs *;tp =(0:长度(tx) 1) / newFs;outTimeDrift = interp1 (t, outFreqShifter, tp);%添加噪声rx = awgn (outTimeDrift、信噪比、0);%的帧生成分类unknownFrames = helperModClassGetNNFrames (rx);%的分类[prediction1, score1] = (trainedNet unknownFrames)进行分类;

返回分类器的预测,这是类似于艰难的决定。网络的正确识别PAM4帧的帧。有关调制信号的生成,明白了helperModClassGetModulator函数。

prediction1
prediction1 =7×1分类PAM4 PAM4 PAM4 PAM4 PAM4 PAM4 PAM4

分类器还返回一个向量的分数为每个框架。分数对应每一帧的概率预测的调制类型。画出成绩。

helperModClassPlotScores (score1 modulationTypes)

之前,我们可以使用一个CNN的调制分类,或任何其他的任务,我们首先需要训练与已知(或标记)数据网络。这个例子展示了如何使用的第一部分通信工具箱™特性,如调节器,过滤器,和渠道障碍,生成合成训练数据。第二部分集中在定义、培训和测试任务的CNN的调制分类。第三部分测试网络性能的无线信号使用软件定义无线电(SDR)平台。

波形生成培训

为每个调制类型生成10000帧,80%用于培训,10%用于验证和10%是用于测试。我们使用的培训和验证帧在网络训练阶段。最终的分类精度获得使用测试框架。每一帧长1024样品,采样率为200千赫。对于数字调制类型,8个样本代表一个符号。网络使每个决策基于单帧而不是在多个连续帧(如视频)。假设一个中心频率902 MHz和100 MHz的数字和模拟调制类型,分别。

快速运行这个例子,使用训练网络,生成少量的培训框架。培训网络在你的电脑,选择“现在列车网络”选项(即trainNow设置为true)。

trainNow =;如果trainNow = = true numFramesPerModType = 10000;其他的numFramesPerModType = 200;结束percentTrainingSamples = 80;percentValidationSamples = 10;percentTestSamples = 10;sps = 8;每个符号%样本防晒系数= 1024;%样本每帧symbolsPerFrame = spf / sps;fs = 200年e3;%采样率fc = (902 e6 100 e6);%的中心频率

创建通道障碍

每一帧通过一个通道

  • 情况下

  • Rician多路径衰落

  • 时钟偏移,导致中心频率偏移和采样时间漂移

因为网络在这个例子使决策基于单帧,每一帧必须通过一个独立的通道。

情况下

一个信噪比的信道增加了AWGN 30 dB。实现通道使用情况下(通信工具箱)函数。

Rician多路径

通过Rician通道传递的信号多径衰落信道使用comm.RicianChannel(通信工具箱)系统对象™。假设一个延迟的[0 1.8 - 3.4]样本对应的平均路径获得0 2 -10 dB。增殖系数是4和最大的多普勒频移是4赫兹,相当于步行速度在902 MHz。实现信道使用以下设置。

时钟偏移量

时钟偏移是因为错误的发射器和接收器的内部时钟源。时钟偏移导致中心频率,用于降频转换器基带信号,和数模转换器的采样率不同于理想值。信道模拟器使用时钟偏移的因素 C ,表示为 C = 1 + Δ 时钟 10 6 ,在那里 Δ 时钟 是时钟偏移。对于每一帧,通道产生一个随机的 Δ 时钟 值均匀分布的一组值的范围( - - - - - - 马克斯 Δ 时钟 马克斯 Δ 时钟 ), 马克斯 Δ 时钟 是最大的时钟偏移。时钟偏移以ppm (ppm)。对于这个示例,假设5 ppm的最大时钟偏移。

maxDeltaOff = 5;deltaOff = (rand () * 2 * maxDeltaOff) - maxDeltaOff;C = 1 + 1 (deltaOff / e6);

频率偏移

主题的每一帧基于时钟的频率偏移抵消因素 C 和中心频率。实现通道使用comm.PhaseFrequencyOffset(通信工具箱)

采样率抵消

主题的每一帧根据时钟采样率抵消抵消因素 C 。实现信道使用interp1功能框架的新汇率重新取样 C × f 年代

综合频道

使用helperModClassTestChannel对象三个通道障碍应用于帧。

频道= helperModClassTestChannel (“SampleRate”fs,“信噪比”信噪比,“PathDelays”[0,1.8 - 3.4)/ fs,“AveragePathGains”(0 -10),“KFactor”4“MaximumDopplerShift”4“MaximumClockOffset”5,“CenterFrequency”902 e6)
频道= helperModClassTestChannel属性:信噪比:30 CenterFrequency: 902000000 SampleRate: 200000 PathDelays: [0 9.0000 1.7000 e-06 e-05] AveragePathGains: [0 2 -10] KFactor: 4 MaximumDopplerShift: 4 MaximumClockOffset: 5

您可以查看基本信息通道使用info对象的功能。

chInfo =信息(渠道)
chInfo =结构体字段:ChannelDelay: 6 MaximumFrequencyOffset: 4510 MaximumSampleRateOffset: 1

波形的一代

创建一个循环,每个调制生成channel-impaired帧类型和存储帧与垫文件中相应的标签。通过将数据保存到文件,您消除需要生成数据每次你运行这个例子。你还可以更有效地共享数据。

删除一个随机数样本的每一帧的开始消除瞬态和确保帧边界随机起点的象征。

%将随机数发生器设置为一个已知状态能够再生%每次仿真运行相同的帧rng(1235)抽搐numModulationTypes =长度(modulationTypes);channelInfo =信息(渠道);transDelay = 50;dataDirectory = fullfile (tempdir,“ModClassDataFiles”);disp (“数据文件目录”+ dataDirectory)
数据文件目录是C:\Users\ktripp\AppData\Local\Temp\ ModClassDataFiles
fileNameRoot =“帧”;%检查数据文件是否存在dataFilesExist = false;如果存在(dataDirectory“dir”)文件= dir (fullfile (dataDirectory sprintf (“% s *”,fileNameRoot)));如果长度(文件)= = numModulationTypes * numFramesPerModType dataFilesExist = true;结束结束如果~ dataFilesExist disp (“生成并保存在数据文件…”)(成功、味精、是否)= mkdir (dataDirectory);如果味精~成功错误(是否)结束modType = 1: numModulationTypes elapsedTime =秒(toc);elapsedTime。格式=“hh: mm: ss”;流(% s -生成%年代框架\ n”,elapsedTime modulationTypes (modType)标签= modulationTypes (modType);numSymbols = (numFramesPerModType / sps);dataSrc = helperModClassGetSource (modulationTypes (modType), sps, 2 *防晒指数,fs);调制器= 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);%去除瞬变从一开始,削减规模,规范化帧= helperModClassFrameGenerator (rxSamples、spf防晒指数,transDelay, sps);%保存数据文件文件名= fullfile (dataDirectory,sprintf (“% s % s % 03 d”、fileNameRoot modulationTypes (modType)、p));保存(文件名,“帧”,“标签”)结束结束其他的disp (“数据文件存在。跳过数据生成。”)结束
生成数据和保存在数据文件…
就是——生成00:00:01 BPSK帧生成正交相移编码帧00:00:03 -生成8 psk进行帧00:00:04 -生成00:00:05 16 qam帧生成64 qam帧00:00:07 -生成00:00:09 PAM4帧生成GFSK帧00:00:10 -生成00:00:11 CPFSK帧生成B-FM帧00:00:21 -生成00:00:23 DSB-AM帧生成SSB-AM帧
%的阴谋的振幅的实部和虚部框架示例%对样本数量helperModClassPlotTimeDomain (dataDirectory modulationTypes fs)

%绘制光谱图框架的例子helperModClassPlotSpectrogram (dataDirectory modulationTypes fs, sps)

创建一个数据存储

使用一个signalDatastore对象管理文件,包含生成的复杂的波形。数据存储在内存中每个文件符合时尤其有用,但整个集合不一定合适。

镜框= signalDatastore (dataDirectory,“SignalVariableNames”,(“帧”,“标签”]);

真正的数组变换复杂的信号

深度学习网络在这个例子中预计实际输入而接收信号复杂基带样本。将复杂的信号转换为实值4 d数组。输出帧有大小1-by-spf-by-2-by-N,第一页(三维)是同相的样品,第二页是交样品。当1-by-spf卷积过滤器的大小,这种方法可以确保我和Q中的信息甚至在卷积混合层,使更好地利用相位信息。看到helperModClassIQAsPages获取详细信息。

frameDSTrans =变换(镜框,@helperModClassIQAsPages);

分成训练、验证和测试

下一个帧划分为训练、验证和测试数据。看到helperModClassSplitData获取详细信息。

splitPercentages = [percentTrainingSamples、percentValidationSamples percentTestSamples];[trainDSTrans, validDSTrans testDSTrans] = helperModClassSplitData (frameDSTrans splitPercentages);
开始平行池(parpool)使用“本地”概要文件…连接到平行池(工人数量:6)。

导入数据到内存

神经网络训练是迭代。在每次迭代中,数据存储从文件中读取数据,并将数据在更新网络系数。如果数据符合你的计算机的内存,将数据从文件导入到内存允许更快的训练通过消除重复读取文件和变换过程。相反,数据从文件读取和转换一次。培训这个网络使用数据文件在磁盘上大约需要110分钟,而培训使用内存数据大约需要50分钟。

导入所有文件中的数据到内存中。文件有两个变量:框架标签和每个调用数据存储返回一个单元阵列,其中第一个元素是框架和第二个元素标签。使用变换功能helperModClassReadFramehelperModClassReadLabel阅读框和标签。使用readall“UseParallel”选项设置为真正的支持并行处理的变换函数,以防你有并行计算工具箱™许可证。自readall函数,默认情况下,连接的输出函数第一个维度,返回帧单元阵列和手动连接在第四维度。

%训练和验证帧读入内存pctExists = parallelComputingLicenseExists ();trainFrames =变换(trainDSTrans @helperModClassReadFrame);rxTrainFrames = readall (trainFrames,“UseParallel”,pctExists);rxTrainFrames =猫(4,rxTrainFrames {:});validFrames =变换(validDSTrans @helperModClassReadFrame);rxValidFrames = readall (validFrames,“UseParallel”,pctExists);rxValidFrames =猫(4,rxValidFrames {:});%阅读训练和验证标签到内存中trainLabels =变换(trainDSTrans @helperModClassReadLabel);rxTrainLabels = readall (trainLabels,“UseParallel”,pctExists);validLabels =变换(validDSTrans @helperModClassReadLabel);rxValidLabels = readall (validLabels,“UseParallel”,pctExists);

火车CNN

这个例子使用一个CNN,由六个卷积层和一层完全连接。每个卷积层除了最后一个是紧随其后的是一批标准化层,解决线性单元(ReLU)激活层,和最大池层。在过去的卷积层,最大池层代替平均池层。输出层softmax激活。网络设计的指导,请参阅深度学习技巧和窍门

modClassNet = helperModClassCNN (modulationTypes、sps spf);

下一个配置TrainingOptionsSGDM使用一个mini-batch大小为256个解算器。12组时期的最大数量,因为更多的时代没有提供进一步的培训优势。默认情况下,“ExecutionEnvironment”属性设置为“汽车”,那里的trainNetwork函数使用一个GPU如果一个是可用的或使用的CPU,如果不是。使用GPU,你必须有一个并行计算工具箱许可证。设置初始学习速率 2 x 10 - - - - - - 2 。减少10倍的学习速率每9时代。集“阴谋”训练进步”策划培训的进展。在NVIDIA®泰坦Xp GPU,网络需要大约25分钟的火车。

maxEpochs = 12;miniBatchSize = 256;选择= helperModClassTrainingOptions (maxEpochs miniBatchSize,元素个数(rxTrainLabels)、rxValidFrames rxValidLabels);

列车网络或使用已经训练网络。默认情况下,这个示例使用训练网络。

如果trainNow = = true elapsedTime =秒(toc);elapsedTime。格式=“hh: mm: ss”;流(“% s -培训网络\ n”elapsedTime) trainedNet = trainNetwork (rxTrainFrames、rxTrainLabels modClassNet,选项);其他的负载trainedModulationClassificationNetwork结束

培训的情节进展显示,网络收敛在大约12世纪准确率超过95%。

评估培训网络得到的分类精度测试框架。结果表明,该网络对这组波形精度达到约94%。

elapsedTime =秒(toc);elapsedTime。格式=“hh: mm: ss”;流(“\ n % s -分类测试帧”elapsedTime)
00:01:35 -分类测试框架
%测试帧读入内存testFrames =变换(testDSTrans @helperModClassReadFrame);rxTestFrames = readall (testFrames,“UseParallel”,pctExists);rxTestFrames =猫(4,rxTestFrames {:});%测试标签读入内存testLabels =变换(testDSTrans @helperModClassReadLabel);rxTestLabels = readall (testLabels,“UseParallel”,pctExists);rxTestPred =分类(trainedNet rxTestFrames);testAccuracy =意味着(rxTestPred = = rxTestLabels);disp (“测试精度:“+ testAccuracy * 100 +“%”)
测试精度:94.5455%

情节的混淆矩阵测试框架。网络矩阵所示,混淆16-QAM和64 - qam帧。这个问题预计将从每一帧携带只有128符号和16-QAM是64 - qam的一个子集。网络也混淆了QPSK和8-PSK框架,因为这些调制类型类似的星座一旦phase-rotated由于衰落信道和频率偏移量。

图厘米= confusionchart (rxTestLabels rxTestPred);厘米。Title =测试数据的混淆矩阵的;厘米。RowSummary =“row-normalized”;cm.Parent。位置= [cm.Parent.Position (1:2) 740 424];

测试特别提款权

测试训练网络的性能与使用无线信号helperModClassSDRTest函数。要执行这个测试,您必须有专用的发射和接受特别提款权。您可以使用两个ADALM-PLUTO收音机,或一个ADALM-PLUTO无线电传输和一个USRP®无线电接收。您必须安装为模拟设备通信工具箱™支持包®ADALM-Plu金宝appto收音机。如果您使用的是USRP®广播,您还必须安装通信工具箱支持包USRP®收音机金宝app。的helperModClassSDRTest函数使用相同的调制函数用于生成训练信号,然后传送他们使用一个ADALM-PLUTO收音机。而不是模拟通道,使用特别提款权channel-impaired信号捕获配置信号接收(ADALM-PLUTO或USRP®广播)。使用相同的训练网络分类之前使用函数来预测调制类型。运行下一个代码段产生混淆矩阵并打印出测试精度。

radioPlatform =“ADALM-PLUTO”;开关radioPlatform情况下“ADALM-PLUTO”如果helperIsPlutoSDRInstalled () = = true收音机= findPlutoRadio ();如果长度(收音机)> = 2 helperModClassSDRTest(收音机);其他的disp (“选定的收音机没有找到。跳过无线测试。”)结束结束情况下{“USRP B2xx”,“USRP X3xx”,“USRP N2xx”}如果(helperIsUSRPInstalled () = = true) & & (helperIsPlutoSDRInstalled () = = true) txRadio = findPlutoRadio ();rxRadio = findsdru ();开关radioPlatform情况下“USRP B2xx”idx =包含({rxRadio.Platform},{“B200”,“B210”});情况下“USRP X3xx”idx =包含({rxRadio.Platform},{“×”,“X310”});情况下“USRP N2xx”idx =包含({rxRadio.Platform},“N200 / N210 / USRP2”);结束rxRadio = rxRadio (idx);如果(长度(txRadio) > = 1) & &(长度(rxRadio) > = 1) helperModClassSDRTest (rxRadio);其他的disp (“选定的收音机没有找到。跳过无线测试。”)结束结束结束

当使用两个固定ADALM-PLUTO收音机相隔约2英尺,网络整体精度达到99%以下混淆矩阵。基于实验装置的结果会有所不同。

进一步的探索

可以优化hyperparameters参数,如数量的过滤器,过滤器的大小,或优化网络结构,如添加更多的层,使用不同的活化层等,提高准确性。

通信工具箱提供了更多的调制类型和通道障碍。更多信息见调制(通信工具箱)传播和信道模型(通信工具箱)部分。您还可以添加标准与特定的信号LTE工具箱,WLAN的工具箱,5 g的工具箱。你也可以加入雷达信号相控阵系统工具箱

helperModClassGetModulator函数提供了MATLAB®函数用于生成调制信号。你也可以探索以下函数和系统对象更多细节:

引用

  1. 奥谢,t·J。,J. Corgan, and T. C. Clancy. "Convolutional Radio Modulation Recognition Networks." Preprint, submitted June 10, 2016.https://arxiv.org/abs/1602.04105

  2. 奥谢,t·J。,T. Roy, and T. C. Clancy. "Over-the-Air Deep Learning Based Radio Signal Classification." IEEE Journal of Selected Topics in Signal Processing. Vol. 12, Number 1, 2018, pp. 168–179.

  3. 刘,X。,D. Yang, and A. E. Gamal. "Deep Neural Network Architectures for Modulation Classification." Preprint, submitted January 5, 2018.https://arxiv.org/abs/1712.00443v3

另请参阅

|

相关的话题