此示例显示如何使用卷积神经网络(CNN)进行调制分类。您生成综合,通道障碍波形。使用生成的波形作为培训数据,您可以培训CNN以进行调制分类。然后,您将CNN与软件定义的无线电(SDR)硬件和空气过度信号进行测试。
在这个例子中,经过训练的CNN可以识别这8种数字调制和3种模拟调制类型:
二相移键控(BPSK)
正交相移键控
8元相移键控(8-PSK)
16进制正交调幅
64位正交振幅调制(64-QAM)
四元脉幅调制(PAM4)
高斯频移键控
连续相移频键控
广播FM(B-FM)
双边带幅度调制(DSB-AM)
单边带幅度调制(SSB-AM)
modulationTypes =分类([“BPSK”,“正交相移编码”,“8相移键控”,...“16 qam”,“64 qam”,“pam4”,“GFSK”,“CPFSK”,...“B-FM”,“DSB-AM”,“ssb-am”]);
首先,加载经过训练的网络。关于网络培训的详细信息请参见训练一个CNN部分。
负载训练有素的uldularificationnetwork.trainedNet
trainedNet = SeriesNetwork with properties: Layers: [28×1 net.cnn. Layer .Layer] InputNames: {'Input Layer'} OutputNames: {'Output'}
训练后的CNN取1024个信道受损样本,预测每帧的调制类型。生成几帧具有Rician多径衰落、中心频率和采样时间漂移的PAM4帧和AWGN。使用下面的函数生成合成信号来测试CNN。然后利用CNN预测帧的调制类型。
兰迪
:生成随机位
pammod
(通讯工具箱)PAM4-modulate的位
rcosdesign
(信号处理工具箱):设计一个方形根凸起余弦脉冲整形过滤器
筛选
:脉冲形状符号
comm.RicianChannel
(通讯工具箱):采用Rician多径信道
comm.PhaseFrequencyOffset
(通讯工具箱):由于时钟偏移应用相位和/或频率偏移
interp1
:由于时钟偏移,将定时漂移应用
AWGN.
(通讯工具箱):添加情况下
%将随机数生成器设置为已知状态,以便能够重新生成%每次模拟运行时相同的帧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);%应用独立多路径通道重置(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
分类器还为每一帧返回一个分数向量。分数对应于每一帧具有预测调制类型的概率。画出成绩。
HelperModclassplotscores(得分1,调制型)
在我们可以使用CNN进行调制分类或任何其他任务之前,我们首先需要用已知(或标记)数据训练网络。本示例的第一部分展示了如何使用“通信工具箱”特性(如调制器、滤波器和信道损害)来生成合成训练数据。第二部分重点介绍了调制分类任务中CNN的定义、训练和测试。第三部分使用软件定义无线电(SDR)平台测试无线信号的网络性能。
为每种调制类型生成10,000帧,其中80%用于训练,10%用于验证,10%用于测试。我们在网络训练阶段使用训练和验证框架。使用测试框架获得最终的分类精度。每帧1024个采样长,采样率为200khz。对于数字调制类型,八个样本代表一个符号。该网络基于单个帧而不是多个连续帧(如视频)做出每个决定。假设数字调制和模拟调制的中心频率分别为902 MHz和100 MHz。
要快速运行此示例,请使用经过训练的网络并生成少量的训练帧。要在你的电脑上训练网络,选择“现在训练网络”选项(即将trainNow设置为true)。
trainNow =假;如果trainNow == true numFramesPerModType = 10000;其他的numframespermodtype = 500;结束percentTrainingSamples = 80;percentValidationSamples = 10;percentTestSamples = 10;sps = 8;每符号样本%防晒系数= 1024;每帧样本%symbolsPerFrame = spf / sps;fs = 200年e3;%采样率fc = [902e6 100e6];%的中心频率
通过一个通道传递每一帧
AWGN.
riician multipath褪色
时钟偏移,导致中心频率偏移和采样时间漂移
因为这个例子中的网络是基于单个帧做出决策的,所以每一帧都必须通过一个独立的通道。
信道增加了AWGN,信噪比为30 dB。使用以下方法实现通道AWGN.
(通讯工具箱)函数。
该信道将信号通过一个Rician多径衰落信道comm.RicianChannel
(通讯工具箱)系统对象。假设时延分布为[0 1.8 3.4]样本,相应的平均路径增益为[0 -2 -10]dB。k因子为4,最大多普勒频移为4hz,相当于902 MHz的行走速度。使用以下设置实现通道。
由于发射器和接收器的内部时钟源不准确而产生时钟偏差。时钟偏移导致中心频率(用于将信号向下转换到基带)和数模转换器采样率与理想值不一致。信道模拟器使用时钟偏移因子 ,表示为 ,在那里 为时钟偏移量。对于每一帧,信道生成一个随机的 范围内均匀分布的一组值的值[ ), 是最大时钟偏移量。时钟偏移量在百万(PPM)部分中测量。对于此示例,假设最大时钟偏移为5ppm。
maxDeltaOff = 5;deltaOff = (rand()*2*maxDeltaOff) - maxDeltaOff;(C = 1 + (deltaOff/1e6));
频率偏移
基于时钟偏移因子对每个帧进行频率偏移
和中心频率。使用以下方法实现通道comm.PhaseFrequencyOffset
(通讯工具箱).
采样率抵消
基于时钟偏移因子对每帧进行采样速率偏移
.的实现通道interp1
以新的速率重新采样帧的功能
.
使用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具有属性:SNR:30中心频率:902000000 Samplere:200000 Pathdelays:[0 9.0000E-06 1.7000-05]普通航展:[0 -2 -10] Kfactor:4 MaximumDopplershift:4 MinimumLclockOffset: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\esozer\AppData\Local\Temp\ModClassDataFiles
fileNameRoot =“帧”;%检查数据文件是否存在datafilesexist = false;如果存在(dataDirectory'dir') files = dir(fullfile(dataDirectory,sprintf(“% s *”,filenameroot)))));如果长度(文件)== nummodulationtypes * numframespermodtype datafilesexist = true;结束结束如果~ dataFilesExist disp ("生成数据并保存在数据文件中…") [success,msg,msgID] = mkdir(dataDirectory);如果〜成功错误(msgs,msg)结束为modtype = 1:nummodulateypes fprintf('%s -生成%s帧\n',...datestr(toc / 86400,“HH: MM: SS”),调制型(ModType))标签=调制型(ModType);numsymbols =(numframespermodtype / sps);datasrc = helpermodclassgetsource(调制类型(modtype),sps,2 * spf,fs);调制器= HelperModclAssgetModulator(调制型(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);%保存数据文件文件名= fullfile (dataDirectory,...Sprintf(“% s % s % 03 d”、fileNameRoot modulationTypes (modType)、p));保存(文件名,“帧”,“标签”)结束结束其他的disp (“数据文件存在。跳过数据生成。”)结束
数据文件存在。跳过数据生成。
%绘制示例框架的实部和虚部的振幅百分比对样本号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)。
使用Parallel Pool 'local'计算tall表达式:-通过1 / 2:在11秒内完成-通过2 / 2:在11秒内完成
神经网络训练是迭代的。在每次迭代中,数据存储从文件中读取数据,并在更新网络系数之前转换数据。如果数据适合你的计算机的记忆,导入数据从文件到记忆通过消除重复读取文件和转换过程,使更快的训练。相反,从文件中读取数据并转换一次。使用磁盘上的数据文件训练这个网络大约需要110分钟,而使用内存中的数据训练大约需要50分钟。
将文件中的所有数据导入内存。这些文件有两个变量:框架
和标签
和每个读
调用数据存储将返回单元格数组,其中第一个元素为框架
第二个元素是标签
.使用变换
功能helperModClassReadFrame和helperModClassReadLabel读取框架和标签。用高
阵列以启用变换功能的并行处理,以防您拥有并行计算工具箱许可证。自收集
函数的输出默认连接读
函数在第一个维度上调用,返回单元格数组中的帧并手动连接第四个维度。
将训练和验证的框架整合到记忆中Trainframestall = tall(Transform(TrainDstrans,@helpermodclassReadframe));rxtrainframes =聚集(培训赛);
使用并行池“本地”评估高表达: - 通过1:在4.3秒评估中完成的4.3秒
rxtrainframes = cat(4,rxtrainframes {:});validframestall = tall(transform(validdstrans,@helpermodclassreadframe));rxvalidframes =收集(validframestall);
使用Parallel Pool 'local'计算tall表达式:- Pass 1 of 1: Completed in 0.76 sec
rxValidFrames = cat(4, rxValidFrames{:});%将训练和验证标签收集到记忆中trainLabelsTall = tall(transform(trainDSTrans, @helperModClassReadLabel));rxTrainLabels =收集(trainLabelsTall);
使用并行池“本地”评估高表达: - 通过第1条:第2条:在4.6秒内完成 - 通过2:在7秒评估中完成,在12秒内完成
validLabelsTall = tall(transform(validDSTrans, @helperModClassReadLabel));rxValidLabels =收集(validLabelsTall);
使用Parallel Pool 'local'计算tall表达式:-第1步:在0.7秒内完成-第2步:在0.85秒内完成
此示例使用由六个卷积图层和一个完全连接的图层组成的CNN。除了上一层之后的每个卷积层之后是批量归一化层,整流的线性单元(Relu)激活层和最大池层。在最后一个卷积层中,最大池层被替换为平均池层。输出层具有SoftMax激活。对于网络设计指导,请参阅深度学习技巧.
modclassnet = helpermodclasscnn(调制型,sps,spf);
下一个配置TrainingOptionsSGDM
使用最小批大小为256的SGDM求解器。设置最大纪元数为12,因为更大的纪元数不会提供进一步的训练优势。默认情况下,“ExecutionEnvironment”
属性设置为“汽车”
,那里的trainNetwork
如果有图形处理器,则使用图形处理器;如果没有,则使用CPU。要使用GPU,你必须有一个并行计算工具箱许可证。初始学习率设置为
.每9个纪元将学习率降低10倍。集“阴谋”
“训练进步”
绘制训练进度。在NVIDIA Titan Xp GPU上,训练网络大约需要25分钟。
Maxepochs = 12;minibatchsize = 256;选项= helpermodclasstratingOptions(maxepochs,minibatchsize,...numel(rxtrainlabels),rxvalidframes,rxvalidlabels);
训练网络或使用已经训练过的网络。默认情况下,本示例使用经过训练的网络。
如果TrainNow == True Fprintf('%s -训练网络\n'datestr (toc / 86400“HH: MM: SS”)) trainedNet = trainNetwork(rxTrainFrames,rxTrainLabels,modClassNet,options);其他的负载训练有素的uldularificationnetwork.结束
正如训练进度图所示,该网络在大约12个时期内收敛到95%以上的准确率。
通过获取测试框架的分类准确率来评估训练网络。结果表明,该网络对这组波形的准确率约为94%。
流('%s - 分类测试框架\ n'datestr (toc / 86400“HH: MM: SS”))
00:02:18 -对测试帧进行分类
%将测试帧收集到内存中testFramesTall = tall(transform(testDSTrans, @helperModClassReadFrame));rxTestFrames =收集(testFramesTall);
使用并行池“本地”评估高表达: - PASS 1为1:在0.68秒的评估中完成0.69秒
rxTestFrames = cat(4, rxTestFrames{:});%收集测试标签到内存中testLabelsTall = tall(transform(testDSTrans, @helperModClassReadLabel));rxTestLabels =收集(testLabelsTall);
使用Parallel Pool 'local'计算tall表达式:-第1步:在0.7秒内完成-第2步:在0.86秒内完成
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);厘米。Title =“测试数据的混淆矩阵”;厘米。RowSummary ='行标准化';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无线电传输它们。不模拟信道,而是使用配置为信号接收(ADALM-PLUTO或USRP®无线电)的SDR捕获信道受损信号。使用训练有素的网络分类
先前使用的功能预测调制类型。运行下一个代码段产生混淆矩阵并打印出测试精度。
radioPlatform =“ADALM-PLUTO”;开关radioPlatform情况下“ADALM-PLUTO”如果helperIsPlutoSDRInstalled() == true broadcasts = findpluoradio ();如果>= 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”包含({rxRadio idx =。平台},“N200 / N210 / USRP2”);结束rxradio = rxradio(Idx);如果(长度(txradio)> = 1)&&(长度(rxradio)> = 1)Helpermodclasssdrtest(rxradio);其他的disp (“未找到选定的收音机。”跳过无线测试。”)结束结束结束
当使用两个静止的ADALM-PLUTO无线电分离约2英尺,网络达到99%的整体精度与下列混淆矩阵。根据实验设置的不同,结果会有所不同。
可以通过优化超参数参数,如滤波器的数量、滤波器的大小,或优化网络结构,如增加更多的层,使用不同的激活层等来提高精度。
通信工具箱提供了更多的调制类型和信道损耗。有关更多信息,请参见调制(通讯工具箱)和传播和渠道模型(通讯工具箱)部分。您还可以添加标准的特定信号LTE工具箱,WLAN的工具箱,5 g的工具箱.您还可以添加雷达信号与相控阵系统工具箱.
helperModClassGetModulatorfunction提供用于生成调制信号的MATLAB函数。你也可以探索以下函数和System对象以获得更多细节:
奥谢,t。J。科尔根,t。c。克兰西。“卷积无线电调制识别网络”。预印本,2016年6月10日提交。https://arxiv.org/abs/1602.04105
奥谢,t。J。t。罗伊和t。c。克兰西。“基于无线深度学习的无线电信号分类”。IEEE信号处理选题期刊。第12卷,第1期,2018年,168-179页。
刘旭东,杨东,贾迈勒。调制分类的深度神经网络结构。预印本,2018年1月5日提交。https://arxiv.org/abs/1712.00443v3