主要内容

基于深度学习的调制分类

此示例示出了如何使用调制分类的卷积神经网络(CNN)。你生成合成的,信道障碍的波形。使用产生的波形作为训练数据,你培养了CNN的调制分类。你然后用软件定义无线电(SDR)的硬件和过度的空气信号测试CNN。

使用CNN预测调制类型

在这个例子中,经过训练的CNN可以识别这8种数字调制和3种模拟调制类型:

  • 二相移键控(BPSK)

  • 正交相移键控

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

  • 16进制正交调幅

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

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

  • 高斯频移键控

  • 连续相位频移键控(CPFSK)

  • 广播调频(B-FM)

  • 双边带振幅调制(DSB-AM)

  • 单边带调幅(SSB-AM)

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

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

负载trainedModulationClassificationNetworktrainedNet
trainedNet =具有属性的系列网络:[28×1 nnet.cnn.layer.Layer] InputNames: {'Input Layer'} OutputNames: {'Output'}

训练有素的CNN需要1024个通道障碍的样本,并预测每个帧的调制类型。生成几个PAM4帧,这些帧受到瑞典多路径衰落,中心频率和采样时间漂移和AWGN的损害。使用以下功能生成合成信号以测试CNN。然后使用CNN预测帧的调制类型。

  • 兰迪:生成随机位

  • pammod(通讯工具箱)PAM4-modulate的位

  • rcosdesign(信号处理工具箱):设计平方根升余弦脉冲整形滤波器

  • 筛选:脉冲形状中的符号

  • comm.ricianchannel.(通讯工具箱):申请Rician Multipath频道

  • comm.PhaseFrequencyOffset(通讯工具箱):由于时钟偏移应用相位和/或频率偏移

  • interp1:应用定时漂移由于时钟偏移

  • AWGN(通讯工具箱):添加情况下

%将随机数生成器设置为已知状态,以便能够重新生成每次运行模拟时%相同的帧RNG(123456)%随机位d =兰迪([0 3],1024,1);%PAM4调制syms = 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);rusianyshifter = comm.phasefrequencyOffset(...“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,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个采样长,采样率为200khz。对于数字调制类型,八个样本代表一个符号。该网络基于单个帧而不是多个连续帧(如视频)做出每个决定。假设数字调制和模拟调制的中心频率分别为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 = [902e6 100e6];%的中心频率

创建通道障碍

通过一个通道传递每一帧

  • AWGN

  • 莱斯多径衰落

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

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

AWGN

信道增加了AWGN,信噪比为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,...“信噪比”,snr,...'pathdelays',[0 1.8 3.4] / FS,...“AveragePathGains”, [0 -2 -10],...“KFactor”4...“MaximumDopplerShift”4...“MaximumClockOffset”5,...'中心罚款'902 e6)
信道=helperModClassTestChannel属性:SNR:30 CenterFrequency:9.02亿SAMPLERATE:200000个PathDelays:[0 9.0000e-06 1.7000e-05] AveragePathGains:[0 -2 -10] k-因子:4 MaximumDopplerShift:4 MaximumClockOffset:5

您可以查看有关使用信息的目标函数的通道基本信息。

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:\TEMP\ModClassDataFiles
fileNameRoot =“框架”%检查数据文件是否存在dataFilesExist = FALSE;如果存在(dataDirectory“目录”) files = dir(fullfile(dataDirectory,sprintf(“% s *”,fileNameRoot)));如果长度(文件)== numModulationTypes * numFramesPerModType dataFilesExist = TRUE;结束结束如果~ dataFilesExist disp (“生成数据并保存在数据文件中......”)[成功,msg,msgst] = mkdir(DataDirectory);如果〜成功误差(MSGID,MSG)结束modType = 1:numModulationTypes elapsedTime =秒(TOC);ElapsedTime.Format =“hh: mm: ss”;FPRINTF('%s -生成%s帧\n'...elapsedTime, 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”})%模拟调制类型使用中心频率为100mhz通道。CenterFrequency = 100e6;其他的%数字调制类型使用902 MHz的中心频率通道。CenterFrequency = 902e6;结束P = 1:numFramesPerModType%生成随机数据X = DATASRC();%调制Y =调制器(X);%通过独立通道传递rxSamples =通道(y);从开始移除瞬变,修剪到尺寸,并标准化帧= helperModClassFrameGenerator(rxSamples, spf, spf, transDelay, sps);%保存数据文件filename = fullfile(DataDirectory,...sprintf的(“% s % s % 03 d”,filenameroot,调制类型(modtype),p));保存(filename,“框架”“标签”结束结束其他的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帧生成SSB-AM帧
%绘制示例帧的实部和虚部的幅度针对样品编号%helperModClassPlotTimeDomain (dataDirectory modulationTypes fs)

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

创建一个数据存储

使用一个signalDatastore反对管理包含生成复杂波形的文件。数据存储是在每个单独的文件放进内存里,但整个集合不一定适合特别有用。

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

将复杂信号转换为实数组

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

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

分为培训,验证和测试

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

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

将数据导入内存

神经网络培训是迭代的。在每次迭代时,数据存储读取来自文件的数据并在更新网络系数之前转换数据。如果数据适合计算机的内存,则通过消除文件和变换过程的重复读取,将文件从文件导入存储器,使得能够更快地培训。相反,数据从文件读取并转换一次。使用磁盘上的数据文件培训此网络大约需要110分钟,同时使用内存数据的培训大约需要50分钟。

将文件中的所有数据导入内存。这些文件有两个变量:框架标签和每一个调用数据存储将返回单元格数组,其中第一个元素为框架第二个元素是标签.使用转变功能helperModClassReadFramehelperModClassReadLabel阅读框和标签。用readall“UseParallel”选项设置为真的如果你有的话,可以并行处理转换函数并行计算工具箱执照。自从readall函数的输出默认连接在第一维函数,在单元阵列返回帧和手动串联在所述第四尺寸。

将训练和验证的框架读入记忆pctExists = parallelComputingLicenseExists ();trainFrames = transform(trainDSTrans, @helperModClassReadFrame);rxTrainFrames = readall (trainFrames,“UseParallel”, pctExists);rxtrainframes = cat(4,rxtrainframes {:});validframes = transform(validdstrans,@helpermodclassreadframe);rxvalidframes = readall(有效框架,“UseParallel”, pctExists);rxvalidframes = cat(4,rxvalidframes {:});%阅读训练和验证标签到内存trainLabels = transform(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使用最小批大小为256的SGDM求解器。设置最大纪元数为12,因为更大的纪元数不会提供进一步的训练优势。默认情况下,“ExecutionEnvironment”财产设置为“汽车”,那里的trainNetwork如果有图形处理器,则使用图形处理器;如果没有,则使用CPU。要使用GPU,你必须有一个并行计算工具箱执照。将初始学习率设置为 2 x 10 - 2 .每9个纪元将学习率降低10倍。集“阴谋”到 '培训 - 进展'绘制训练进度。在NVIDIA Titan Xp GPU上,训练网络大约需要25分钟。

maxEpochs = 12;miniBatchSize = 256;选项= helperModClassTrainingOptions(maxEpochs,miniBatchSize,...numel(rxTrainLabels),rxValidFrames,rxValidLabels);

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

如果trainNow == true elapsedTime = seconds(toc);ElapsedTime.Format =“hh: mm: ss”;FPRINTF('%s -训练网络\n'trainedNet = trainNetwork(rxTrainFrames,rxTrainLabels,modClassNet,options);其他的负载trainedModulationClassificationNetwork结束

随着培训进展的剧情,网络将大约12个时期收敛到95%的精度超过95%。

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

ElapsedTime =秒(TOC);ElapsedTime.Format =“hh: mm: ss”;FPRINTF('%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 (“测试精度:“+ testAccuracy * 100 +“%”
测试精度:95.4545%

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

图cm = confusionchart(Rxtestlabels,Rxtestpred);cm.title =“测试数据的混淆矩阵”;厘米。RowSummary =“行标准化”;cm.Parent.Position = [cm.Parent.Position(1:2)740 424]。

测试特别提款权

使用过空中信号测试训练后的网络性能helperModClassSDRTest函数。要执行此测试,必须有专用的特别提款权用于传输和接收。您可以使用两个ADALM-PLUTO无线电,或一个ADALM-PLUTO无线电传输和一个USRP®无线电接收。您必须安装通讯工具箱支持包装adalm-pluto收音机金宝app.如果您使用的是USRP®收音机,还必须安装通讯工具箱支持包的USRP®无线电金宝app.这helperModClassSDRTest函数使用相同的调制功能作为产生训练信号,然后使用ADALM-PLUTO无线电传输它们。不模拟信道,而是使用配置为信号接收(ADALM-PLUTO或USRP®无线电)的SDR捕获信道受损信号。使用训练有素的网络分类功能先前用于预测调制类型。运行的下一个代码段产生一个混淆矩阵,并打印出的检验精确度。

radioplatform =“adalm-pluto”转变radioPlatform案件“adalm-pluto”如果Helperisplutosdrinstalled()== True Radios = FindPlutoradio();如果>= 2 helperModClassSDRTest(收音机);其他的disp (“未找到选定的收音机。”跳过无线测试。”结束结束案件“usrp b2xx”“USRP X3xx”“USRP N2xx”如果(helperIsUSRPInstalled() == true) && (helperIsPlutoSDRInstalled() == true) txRadio = findpluoradio ();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%的整体精度与下列混淆矩阵。根据实验设置的不同,结果会有所不同。

进一步的探索

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

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

helperModClassGetModulator功能提供用于产生调制信号的MATLAB函数。您还可以探索以下功能和系统对象的更多详细信息:

参考文献

  1. O'shea,T.J.,J.Corgan和T. C. Clancy。“卷积无线电调制识别网络。”预印刷品,2016年6月10日提交。https://arxiv.org/abs/1602.04105

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

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

另请参阅

|

相关话题