基于深度学习的调制分类

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

利用CNN预测调制类型

本例中经过训练的CNN识别以下八种数字和三种模拟调制类型:

  • 二进制相移键控(BPSK)

  • 正交相移键控

  • 8进制相移键控(8-PSK)

  • 16进制正交幅度调制(16-QAM)

  • 64进制正交幅度调制(64-QAM)

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

  • 高斯频移键控

  • 连续相移频键控

  • 广播调频(B-FM)

  • 双带调幅

  • 单边带调幅

modulationTypes =分类([“BPSK”,“QPSK”,“8相移键控”,...“16QAM”,“64QAM”,“PAM4”,“GFSK”,“CPFSK”,...“B-FM”,“DSB-AM”,“SSB-AM”]);

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

负载trainedModulationClassificationNetwork训练网
trainedNet = SeriesNetwork with properties: Layers: [28x1 net.cnn. Layer .Layer] InputNames: {'Input Layer'}输出名称:{'Output'}

经过训练的CNN采集1024个信道受损样本,并预测每个帧的调制类型。生成几个受Rician多径衰落、中心频率和采样时间漂移以及AWGN影响的PAM4帧。使用以下功能生成合成信号以测试CNN。然后使用CNN预测帧的调制类型。

%将随机数生成器设置为已知状态,以便能够重新生成%每次运行模拟时都会显示相同的帧rng (123456)%随机位D = randi([0 3], 1024, 1);% PAM4调制syms=pammod(d,4);%平方根升余弦滤波器filterCoeffs = rcosdesign(0.35、4、8);tx =过滤器(filterCoeffs 1 upsample(信谊、8));%的通道信噪比=30;最大偏移量=5;fc=902e6;fs=200e3;多路径信道=comm.RicianChannel(...“SampleRate”,财政司司长,...“PathDelays”,[01.83.4]/200e3,...“AveragePathGains”, [0 -2 -10],...“KFactor”4...“最大换档速度”, 4); 频率移位器=通信相位频率偏移(...“SampleRate”fs);%应用独立多路径通道重置(multipathChannel) outMultipathChan = multipathChannel(tx);确定时钟偏移系数clockOffset = (rand() * 2*maxOffset) - maxOffset;C = 1 + clockOffset / 1e6;%添加频率偏移frequencyShifter。FrequencyOffset = -(颈- 1)*俱乐部;outFreqShifter = frequencyShifter (outMultipathChan);%增加采样时间漂移t=(0:长度(tx)-1)’/fs;newFs=fs*C;tp=(0:长度(tx)-1)’/newFs;outTimeDrift=interp1(t,outrequesthift,tp);%添加噪声rx=awgn(超时漂移,信噪比,0);%用于分类的帧生成未知帧=helperModClassGetNNFrames(rx);%分类[prediction1, score1] = (trainedNet unknownFrames)进行分类;

返回分类器预测,这类似于艰难的决策。网络正确识别出这些帧为PAM4帧。调制信号的产生请参见helperModClassGetModulator函数。

预测1
预测1=7x1分类PAM4 PAM4 PAM4 PAM4 PAM4 PAM4 PAM4 PAM4 PAM4

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

helperModClassPlotScores (score1 modulationTypes)

在使用CNN进行调制分类或任何其他任务之前,我们首先需要使用已知(或标记)数据对网络进行训练。本示例的第一部分展示了如何使用通信工具箱功能(如调制器、滤波器和信道损伤)生成合成训练数据。第二部分着重于定义、培训和测试用于调制分类任务的CNN。第三部分使用软件无线电(SDR)平台测试无线信号的网络性能。

用于训练的波形生成

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

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

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

创建通道障碍

通过一个通道传递每一帧

  • 情况下

  • Rician多路径衰落

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

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

情况下

信道增加了AWGN,信噪比为30 dB。使用以下方法实现通道情况下函数。

Rician多路径

该信道将信号通过一个Rician多径衰落信道里桑查内尔通信公司系统对象。假设时延分布为[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 s

综合频道

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

通道=helperModClassTestChannel(...“SampleRate”,财政司司长,...“信噪比”,信噪比,...“PathDelays”, [0 1.8 3.4] / fs,...“AveragePathGains”, [0 -2 -10],...“KFactor”4...“最大换档速度”4...“最大时钟偏移量”5,...“中心频率”902 e6)
channel = helperModClassTestChannel带有属性:SNR: 30 CenterFrequency: 902000000 SampleRate: 200000 PathDelays: [0 9.0000e-06 1.7000e-05] AveragePathGains: [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)
数据文件目录为“/tmp/Bdoc20b_1465442_200336/ModClassDataFiles”
文件名根=“框架”%检查数据文件是否存在dataFilesExist = false;如果存在(数据目录,“dir”) files = dir(fullfile(dataDirectory,sprintf(%s*, fileNameRoot)));如果length(files) == numModulationTypes*numFramesPerModType dataFilesExist = true;结束结束如果~ dataFilesExist disp (“正在生成数据并保存在数据文件中…”)[success,msg,msgID]=mkdir(数据目录);如果〜成功错误(msgid,msg)结束modType = 1:numModulationTypes fprintf('%s -生成%s帧\n',...datestr (toc / 86400,“HH:MM:SS”), modulationTypes(modType)) label = modulationTypes(modType);numSymbols = (numFramesPerModType / sps);dataSrc = helperModClassGetSource(modationtypes (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的中心频率channel.CenterFrequency=902e6;结束p = 1: numFramesPerModType%生成随机数据x = dataSrc ();%调节y =调制器(x);%通过独立通道传递rxSamples =通道(y);%从一开始就消除瞬变,修剪到合适的尺寸,然后正常化帧= helperModClassFrameGenerator(rxSamples, spf, spf, transDelay, sps);%保存数据文件fileName=fullfile(数据目录,...sprintf (“% s % s % 03 d”,fileNameRoot,modulationTypes(modType),p));保存(文件名,“框架”,“标签”)结束结束其他的disp (“数据文件存在。跳过数据生成。”)结束
正在生成数据并保存在数据文件中。。。
00:00:00 -生成BPSK帧00:00:05 -生成QPSK帧00:00:09 -生成8PSK帧00:00:18 -生成16QAM帧00:00:22 -生成64QAM帧00:00:28 -生成PAM4帧00:00:34 -生成GFSK帧00:00:38 -生成CPFSK帧00:00:44 -生成B-FM帧00:00:04 -生成DSB-AM帧00:01:08 -生成SSB-AM帧
%绘制示例帧实部和虚部的振幅%与样品编号helperModClassPlotTimeDomain (dataDirectory modulationTypes fs)

%绘制示例帧的声谱图helperModClassPlotSpectrogram(数据目录、调制类型、fs、sps)

创建一个数据存储

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

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

将复杂信号转换为实数组

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

FramedTrans=变换(frameDS,@helperModClassIQAsPages);

分为培训、验证和测试

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

分割百分比=[percentTrainingSamples,percentValidationSamples,percentTestSamples];[TraindTrans,ValidTrans,TestdTrans]=helperModClassSplitData(FramedTrans,SplitPercentage);
正在使用“本地”配置文件启动并行池(parpool)。。。已连接到并行池(工作线程数:4)。使用并行池“local”计算tall表达式:-通过第1次(共2次):0%完成计算0%完成
第二关:在20秒内完成评估,耗时41秒

将数据导入内存

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

将文件中的所有数据导入内存。文件有两个变量:框架标签阅读调用数据存储将返回单元格数组,其中第一个元素为框架第二个元素是标签.使用使改变功能helperModClassReadFramehelperModClassReadLabel读取帧和标签。使用高的数组以支持对转换函数进行并行处理并行计算工具箱许可证自从收集默认情况下,函数连接阅读函数在第一个维度上调用,返回单元格数组中的帧并手动连接第四个维度。

%将培训和验证框架收集到内存中trainFramesTall = tall(transform(trainDSTrans, @helperModClassReadFrame));rxTrainFrames =收集(trainFramesTall);
使用Parallel Pool 'local'计算tall表达式:- Pass 1 of 1: Completed in 7.7 sec
rxTrainFrames = cat(4, rxTrainFrames{:});validFramesTall = tall(transform(validDSTrans, @helperModClassReadFrame));rxValidFrames =收集(validFramesTall);
使用Parallel Pool 'local'计算tall表达式
rxValidFrames=cat(4,rxValidFrames{:});%将培训和验证标签收集到内存中trainLabelsTall=tall(转换(TraindTrans,@helperModClassReadLabel));rxTrainLabels=gather(trainLabelsTall);
使用并行池“local”评估tall表达式:-第1次通过,共2次:在5.5秒内完成-第2次通过,共2次:在7.8秒内完成评估,共14秒完成
validLabelsTall = tall(transform(validDSTrans, @helperModClassReadLabel));rxValidLabels =收集(validLabelsTall);
使用并行池“local”计算tall表达式:-第1次通过(共2次):在1.6秒内完成-第2次通过(共2次):在2秒内完成计算在4秒内完成

火车CNN

这个例子使用了一个CNN,它由6个卷积层和一个完全连接层组成。除最后一个卷积层外,每个卷积层后面都有批处理归一化层、整流线性单元(ReLU)激活层和最大池化层。在最后的卷积层中,最大池化层被平均池化层取代。输出层有softmax激活。有关网络设计指导,请参见深入学习技巧(深度学习工具箱)

modClassNet = helperModClassCNN (modulationTypes、sps spf);

下一步配置培训选项SGDM(深度学习工具箱)使用最小批大小为256的SGDM求解器。设置最大纪元数为12,因为更大的纪元数不会提供进一步的训练优势。默认情况下,“执行环境”属性设置为“自动”,而trainNetwork如果有图形处理器,则使用图形处理器;如果没有,则使用CPU。要使用GPU,你必须有一个并行计算工具箱许可证将初始学习速率设置为 2. x 10 - 2. .每9个纪元将学习率降低10倍。集“情节”到 '培训进度'绘制训练进度。在NVIDIA Titan Xp GPU上,网络训练大约需要25分钟。

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

训练网络或使用已经训练过的网络。默认情况下,本示例使用经过训练的网络。

如果printf == true ('%s -训练网络\n',datestr(toc/86400,“HH:MM:SS”)) trainedNet = trainNetwork(rxTrainFrames,rxTrainLabels,modClassNet,options);其他的负载trainedModulationClassificationNetwork结束

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

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

fprintf('%s -对测试帧进行分类\n',datestr(toc/86400,“HH:MM:SS”))
00:03:52 -分类测试帧
%将测试帧收集到内存中testFramesTall = tall(transform(testDSTrans, @helperModClassReadFrame));rxTestFrames =收集(testFramesTall);
使用Parallel Pool 'local'计算tall表达式
rxTestFrames=cat(4,rxTestFrames{:});%收集测试标签到内存中testLabelsTall=tall(transform(testDSTrans,@helperModClassReadLabel));rxTestLabels=gather(testLabelsTall);
使用Parallel Pool 'local'计算tall表达式:-通过第1步:在1.6秒内完成-通过第2步:在2秒内完成
rxTestPred=分类(训练网,rxTestFrames);测试精度=平均值(rxTestPred==rxTestLabels);显示(“测试精度:”+测试精度*100+"%")
测试精度:95.4545%

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

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

测试特别提款权

使用无线信号测试训练网络的性能helperModClassSDRTest函数。要执行此测试,必须有专用的特别提款权用于传输和接收。您可以使用两个ADALM-PLUTO无线电,或一个ADALM-PLUTO无线电传输和一个USRP®无线电接收。您必须安装ADALM-PLUTO无线电通信工具箱支持包万博1manbetx.如果您使用的是USRP®收音机,您还必须安装USRP®无线电通信工具箱支持包万博1manbetx.的helperModClassSDRTest功能使用与生成训练信号相同的调制功能,然后使用ADALM-PLUTO无线电进行传输。不模拟信道,而是使用配置用于信号接收的SDR(ADALM-PLUTO或USRP®无线电)捕获信道受损信号。使用具有相同调制功能的训练网络分类以前用来预测调制类型的函数。运行下一个代码段会产生一个混淆矩阵,并打印出测试的准确性。

无线电平台=“阿达姆-冥王星”转换radioPlatform情况下“阿达姆-冥王星”如果helperisplutosdresinstalled()==true radios=findPlutoRadio();如果>= 2 helperModClassSDRTest(收音机);其他的disp (“未找到选定的收音机。”跳过无线测试。”)结束结束情况下{“USRP B2xx”,“USRP X3xx”,“USRP N2xx”}如果(helperisputsdrinstalled()==true)和&(helperisputsdrinstalled()==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 (“未找到选定的收音机。”跳过无线测试。”)结束结束结束

当使用两个静止的ADALM-PLUTO无线电分离约2英尺,网络达到99%的整体精度与下列混淆矩阵。根据实验设置的不同,结果会有所不同。

进一步探索

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

通信工具箱提供了更多的调制类型和信道损伤。有关更多信息,请参阅调制传播和信道模型部分。您还可以添加标准的特定信号LTE工具箱,无线局域网工具箱5G工具箱。您还可以使用添加雷达信号相控阵系统工具箱

helperModClassGetModulatorfunction提供用于生成调制信号的MATLAB函数。你也可以探索以下函数和System对象以获得更多细节:

参考

  1. 奥谢,T.J.,J.Corgan和T.C.克兰西。“卷积无线电调制识别网络”,预印本,2016年6月10日提交。https://arxiv.org/abs/1602.04105

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

  3. Liu,X.,D.Yang和A.E.Gamal.《调制分类的深层神经网络结构》,预印本,2018年1月5日提交。https://arxiv.org/abs/1712.00443v3