主要内容

基于深度学习的调制分类

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

利用CNN预测调制类型

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

  • 二相移键控(BPSK)

  • 正交移相键控(QPSK)

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

  • 16 ary正交振幅调制

  • 64元正交振幅调制(64-QAM)

  • 四ary脉冲幅度调制(PAM4)

  • 高斯频移键控

  • 连续相位移频键控

  • 广播调频(B-FM)

  • 双带幅度调制(DSB-AM)

  • 单边带调幅

modulationTypes =分类([“BPSK”“正交相移编码”“8相移键控”...“16 qam”“64 qam”“PAM4”“GFSK”“CPFSK”...“B-FM”“DSB-AM”“SSB-AM”]);

首先,加载经过训练的网络。关于网络培训的详细信息,请参见训练一个CNN部分。

负载trainedModulationClassificationNetworktrainedNet
trainedNet = SeriesNetwork属性:Layers: [28×1 nnet.cnn.layer.Layer] InputNames:{'输入层'}OutputNames:{'输出'}

经过训练的CNN获取1024个信道受损样本,并预测每一帧的调制类型。生成几个PAM4帧,这些帧受到了专家级多径衰落、中心频率和采样时间漂移以及AWGN的损害。使用下面的函数生成合成信号来测试CNN。然后利用CNN预测帧的调制类型。

将随机数生成器设置为能够重新生成的已知状态%每次运行模拟时相同的帧rng (123456)%随机比特D = randi([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] / 200e3,...“AveragePathGains”, [0 -2 -10],...“KFactor”4...“MaximumDopplerShift”4);frequencyShifter = comm.PhaseFrequencyOffset (...“SampleRate”fs);应用独立的多路径通道reset(multipathChannel) outMultipathChan = multipathChannel(tx);确定时钟偏移因子clockOffset = (rand() * 2*maxOffset) - maxOffset;C = 1 + clockOffset / 1e6;%添加频率偏移frequencyShifter。FrequencyOffset = -(颈- 1)*俱乐部;outFreqShifter = frequencyShifter (outMultipathChan);%增加采样时间漂移T = (0:length(tx)-1)' / fs;newFs = fs * C;tp = (0:length(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进行调制分类或执行任何其他任务之前,我们首先需要用已知(或标记)的数据训练网络。本示例的第一部分展示了如何使用Communications Toolbox™特性(如调制器、滤波器和信道缺陷)来生成综合训练数据。第二部分主要对调制分类任务的CNN进行了定义、训练和测试。第三部分使用软件定义无线电(SDR)平台对无线信号进行网络性能测试。

训练波形生成

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

要快速运行此示例,请使用经过训练的网络并生成少量训练帧。要在您的计算机上训练网络,选择“训练网络现在”选项(即设置trainNow为true)。

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

创建通道障碍

使每个帧通过带有的通道

  • 情况下

  • Rician多路径衰落

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

因为这个例子中的网络基于单个帧做出决策,所以每个帧必须通过一个独立的通道。

情况下

该频道添加了信噪比为30 dB的AWGN。使用以下命令实现通道情况下(通信工具箱)函数。

Rician多路径

该信道通过一个专家级多径衰落信道传递信号comm.RicianChannel(通信工具箱)系统对象™。假设[0 1.8 3.4]样本的延迟分布,对应的平均路径增益为[0 -2 -10]dB。k因子为4,最大多普勒频移为4hz,相当于902 MHz的行走速度。使用以下设置实现通道。

时钟偏移量

时钟偏移是由于发射器和接收器的内部时钟源不准确造成的。时钟偏移导致中心频率(用于向下转换信号到基带)和数模转换器采样率与理想值不一致。信道模拟器使用时钟偏移因子 C ,表示为 C 1 + Δ 时钟 10 6 ,在那里 Δ 时钟 是时钟偏移量。对于每一帧,通道产生一个随机 Δ 时钟 从范围[的均匀分布的值集合中选取[ - 马克斯 Δ 时钟 马克斯 Δ 时钟 ), 马克斯 Δ 时钟 最大时钟偏移量。时钟偏差是用百万分之一(ppm)来测量的。对于本例,假设最大时钟偏移量为5ppm。

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

频率偏移

根据时钟偏移因子对每帧进行频率偏移 C 中心频率。使用以下命令实现通道comm.PhaseFrequencyOffset(通信工具箱)

采样率抵消

根据时钟偏移因子对每个帧进行采样率偏移 C .方法实现通道interp1函数以新的速率重采样帧 C × f 年代

综合频道

使用helperModClassTestChannel对象将所有三个通道损伤应用于帧。

频道= helperModClassTestChannel (...“SampleRate”fs,...“信噪比”信噪比,...“PathDelays”, [0 1.8 3.4] / fs,...“AveragePathGains”, [0 -2 -10],...“KFactor”4...“MaximumDopplerShift”4...“MaximumClockOffset”5,...“CenterFrequency”902 e6)
channel = helperModClassTestChannel with properties: SNR: 30 CenterFrequency: 902000000 SampleRate: 200000 pathdelay: [0 9.0000e-06 17000e -05] averagepath增益:[0 -2 -10]KFactor: 4 MaximumDopplerShift: 4 MaximumClockOffset: 5

通过info对象函数可以查看通道的基本信息。

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

波形的一代

创建一个循环,为每种调制类型生成信道受损帧,并将帧及其对应标签存储在MAT文件中。通过将数据保存到文件中,您不必在每次运行此示例时都生成数据。您还可以更有效地共享数据。

从每一帧的开始删除随机数的样本,以去除瞬态,并确保帧具有相对于符号边界的随机起点。

将随机数生成器设置为能够重新生成的已知状态%每次运行模拟时相同的帧rng(1235) tic numModulationTypes = length(modulationTypes);channelInfo =信息(渠道);transDelay = 50;dataDirectory = fullfile (tempdir,“ModClassDataFiles”);disp ("数据文件目录为"+ dataDirectory)
数据文件目录为C:\Users\kkearney\AppData\Local\Temp\ModClassDataFiles
fileNameRoot =“帧”检查数据文件是否存在dataFilesExist = false;如果存在(dataDirectory“dir”)文件= 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;其他的数字调制类型使用中心频率902mhz通道。CenterFrequency = 902e6;结束p = 1: numFramesPerModType%生成随机数据x = dataSrc ();%调节y =调制器(x);通过独立的渠道rxSamples =通道(y);从开始删除瞬态,修剪到大小,并规范化。frame = helperModClassFrameGenerator(rxSamples, spf, spf, transDelay, sps);%保存数据文件文件名= fullfile (dataDirectory,...sprintf (“% s % s % 03 d”、fileNameRoot modulationTypes (modType)、p));保存(文件名,“帧”“标签”结束结束其他的disp (“数据文件存在。跳过数据生成。”结束
生成数据并保存在数据文件中…
00:00:00—生成BPSK帧00:00:01—生成QPSK帧00:00:03—生成8PSK帧00:00:04—生成16QAM帧00:00:06—生成64QAM帧00:00:07—生成PAM4帧00:00:09—生成GFSK帧00:00:10—生成CPFSK帧00:00:11—生成B-FM帧00:00:26—生成DSB-AM帧00:00:27—生成SSB-AM帧
绘制示例帧的实部和虚部的振幅。%对比样本数量helperModClassPlotTimeDomain (dataDirectory modulationTypes fs)

图中包含11个轴对象。标题为BPSK的axis对象1包含两个类型为line的对象。标题为QPSK的Axes对象2包含两个类型为line的对象。标题为8PSK的Axes对象3包含两个类型为line的对象。标题为16QAM的Axes对象4包含两个类型为line的对象。标题为64QAM的Axes对象5包含两个类型为line的对象。标题为PAM4的Axes对象6包含两个类型为line的对象。标题为GFSK的Axes对象7包含2个类型为line的对象。标题为CPFSK的Axes对象8包含两个类型为line的对象。标题为B-FM的Axes对象9包含两个类型为line的对象。 Axes object 10 with title DSB-AM contains 2 objects of type line. Axes object 11 with title SSB-AM contains 2 objects of type line.

绘制示例帧的光谱图helperModClassPlotSpectrogram (dataDirectory modulationTypes fs, sps)

图中包含11个轴对象。标题为BPSK的axis对象1包含一个类型为image的对象。标题为QPSK的Axes对象2包含一个类型为image的对象。标题为8PSK的Axes对象3包含一个image类型的对象。标题为16QAM的Axes对象4包含一个image类型的对象。标题为64QAM的Axes对象5包含一个image类型的对象。标题为PAM4的Axes对象6包含一个image类型的对象。标题为GFSK的Axes对象7包含一个类型为image的对象。标题为CPFSK的Axes对象8包含一个类型为image的对象。标题为B-FM的Axes对象9包含一个类型为image的对象。 Axes object 10 with title DSB-AM contains an object of type image. Axes object 11 with title SSB-AM contains an object of type image.

创建一个数据存储

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

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

将复杂信号转换为实数组

本例中的深度学习网络期望真实的输入,而接收到的信号具有复杂的基带样本。将复杂信号转换为实值4-D数组。输出帧的大小为1-by-spf-by-2-by-N,其中第一页(第三维)是同相样本,第二页是正交样本。当卷积滤波器的大小为1 × spf时,这种方法确保了I和Q中的信息即使在卷积层中也会混合,并更好地利用相位信息。看到helperModClassIQAsPages获取详细信息。

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

分为培训、验证和测试

接下来,将框架划分为训练、验证和测试数据。看到helperModClassSplitData获取详细信息。

splitPercentages = [percentTrainingSamples、percentValidationSamples percentTestSamples];[trainDSTrans, validDSTrans testDSTrans] = helperModClassSplitData (frameDSTrans splitPercentages);
使用“本地”配置文件启动并行池(parpool)…连接到并行池(工作人员数量:6)。

将数据导入内存

神经网络训练是迭代的。在每次迭代中,数据存储从文件中读取数据,并在更新网络系数之前对数据进行转换。如果数据适合放入计算机的内存中,则将数据从文件导入到内存中,通过消除从文件中重复读取和转换过程,可以实现更快的训练。相反,从文件中读取数据并转换一次。使用磁盘上的数据文件训练这个网络大约需要110分钟,而使用内存中的数据训练大约需要50分钟。

将文件中的所有数据导入内存中。这些文件有两个变量:框架而且标签和每个调用数据存储返回一个单元格数组,其中第一个元素是框架第二个元素是标签.使用变换功能helperModClassReadFrame而且helperModClassReadLabel读取框架和标签。使用readall“UseParallel”选项设置为真正的以启用转换函数的并行处理,如果您有并行计算工具箱™许可证。自readall函数的输出,默认情况下连接函数在第一个维度上,返回单元格数组中的帧,并在第四个维度上手动连接。

将训练和验证帧读入内存。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 (trainLabels,“UseParallel”, pctExists);validLabels = transform(validDSTrans, @helperModClassReadLabel);rxValidLabels = readall (validLabels,“UseParallel”, pctExists);

火车CNN

本例使用的CNN由六个卷积层和一个完全连接层组成。除最后一个卷积层外,每个卷积层后面依次是批处理归一化层、整流线性单元(ReLU)激活层和最大池化层。在最后一个卷积层中,用平均池化层代替最大池化层。输出层具有softmax激活功能。有关网络设计指导,请参见深度学习技巧

modClassNet = helperModClassCNN (modulationTypes、sps spf);

下一个配置TrainingOptionsSGDM使用小型批处理大小为256的SGDM求解器。将最大时间数设置为12,因为更大的时间数不能提供进一步的训练优势。默认情况下,“ExecutionEnvironment”属性设置为“汽车”,那里的trainNetwork函数如果有GPU,则使用GPU;如果没有,则使用CPU。要使用GPU,你必须有一个并行计算工具箱许可证。设置初始学习率为 2 x 10 - 2 .每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'trainedNet = trainNetwork(rxTrainFrames,rxTrainLabels,modClassNet,options);其他的负载trainedModulationClassificationNetwork结束

如训练进度图所示,该网络在大约12个周期内收敛到95%以上的准确率。

通过获得测试帧的分类精度来评估训练的网络。结果表明,该网络对这组波形的准确率达到94%左右。

elapsedTime =秒(toc);elapsedTime。格式=“hh: mm: ss”;流('%s -对测试帧进行分类\n'elapsedTime)
00:02:22 -分类测试帧
将测试帧读入内存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 =平均值(rxTestPred == rxTestLabels);disp (“测试精度:“+ testAccuracy * 100 +“%”
测试精度:94.5455%

绘制测试帧的混淆矩阵。如矩阵所示,网络混淆了16-QAM帧和64-QAM帧。这个问题是意料之中的,因为每帧只携带128个符号,而16-QAM是64-QAM的子集。该网络还混淆了QPSK和8-PSK帧,因为由于衰落信道和频率偏移,这些调制类型的星座在相位旋转后看起来类似。

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

图包含一个类型为confusimatrixchart的对象。类型为ConfusionMatrixChart的图表标题为测试数据的混淆矩阵。

测试特别提款权

使用无线信号测试训练过的网络的性能helperModClassSDRTest函数。要执行此测试,必须有用于传输和接收的专用sdr。您可以使用两个ADALM-PLUTO无线电,或一个ADALM-PLUTO无线电进行传输,一个USRP®无线电进行接收。你必须安装模拟设备支持包ADALM-PLUTO无线电模拟设备通信工具箱支持包ADALM-Pluto无线电.如果你正在使用USRP®收音机,你也必须安装USRP无线电通信工具箱支持包(USRP无线电通信工具箱支持包).的helperModClassSDRTest函数使用与生成训练信号相同的调制函数,然后使用ADALM-PLUTO无线电传输它们。不模拟信道,而是使用为信号接收(ADALM-PLUTO或USRP®无线电)配置的SDR捕获信道受损信号。使用训练过的网络分类以前用来预测调制类型的函数。运行下一个代码段产生一个混淆矩阵并打印出测试精度。

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”包含({rxRadio idx =。平台},{“B200”“B210”});情况下“USRP X3xx”包含({rxRadio idx =。平台},{“×”“X310”});情况下“USRP N2xx”包含({rxRadio idx =。平台},“N200 / N210 / USRP2”);结束rxRadio = rxRadio (idx);如果(length(txRadio) >= 1) && (length(rxRadio) >= 1) helperModClassSDRTest(rxRadio);其他的disp (“未找到选定的无线电。”跳过无线测试。”结束结束结束

当使用两个间隔约2英尺的固定ADALM-PLUTO无线电时,网络使用以下混淆矩阵达到99%的总体精度。实验设置不同,结果也不同。

进一步的探索

可以对超参数参数进行优化,如过滤器数量、过滤器大小等,也可以优化网络结构,如增加更多的层数、使用不同的激活层等,以提高精度。

“通信工具箱”提供了更多的调制类型和信道缺陷。有关更多信息,请参见调制(通信工具箱)而且传播和通道模型(通信工具箱)部分。还可以添加标准的特定信号LTE工具箱WLAN的工具箱,5 g的工具箱.还可以添加雷达信号相控阵系统工具箱

helperModClassGetModulator函数提供用于生成调制信号的MATLAB®函数。您还可以探索以下函数和System对象以获得更多详细信息:

参考文献

  1. 奥谢,t。J。科根,t。c。克兰西。"卷积无线电调制识别网络"预印本,2016年6月10日提交。https://arxiv.org/abs/1602.04105

  2. 奥谢,t。J。t。罗伊和t。c。克兰西。"基于空中深度学习的无线电信号分类"IEEE信号处理专题选刊。2018年第1期,第12卷,第168-179页。

  3. 刘旭东,杨东,贾迈勒。调制分类的深度神经网络体系结构。预印本,2018年1月5日提交。https://arxiv.org/abs/1712.00443v3

另请参阅

|

相关的话题

Baidu
map