文档

基于深度学习的调制分类

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

利用CNN预测调制类型

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

  • 二相移键控(BPSK)

  • 正交移相键控(QPSK)

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

  • 16 ary正交振幅调制

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

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

  • 高斯频移键控

  • 连续相位移频键控

  • 广播调频(B-FM)

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

  • 单边带调幅

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

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

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

经过训练的CNN获取1024个信道受损样本,并预测每一帧的调制类型。生成几个BPSK帧,这些帧被瓦尔德多径衰落、中心频率和采样时间漂移和AWGN削弱。使用兰迪函数生成随机位pskmod对比特进行bpsk调制的功能rcosdesign函数设计了一个平方根凸起余弦脉冲整形滤波器过滤器函数脉冲形状的符号。然后利用CNN预测帧的调制类型。

将随机数生成器设置为能够重新生成的已知状态%每次运行模拟时相同的帧rng (123456)%随机位D = randi([0 1],1024,1);% BPSK调制Syms = pskmod(d,2);%平方根提升余弦过滤器filterCoeffs = rcosdesign(0.35,4,8);tx = filter(filterCoeffs,1,upsample(syms,8));%的通道channel = helperModClassTestChannel(...“SampleRate”200年e3,...“信噪比”30岁的...“PathDelays”,[0 1.8 3.4] / 200e3,...“AveragePathGains”,[0 -2 -10],...“KFactor”4...“MaximumDopplerShift”4...“MaximumClockOffset”5,...“CenterFrequency”902 e6);Rx =通道(tx);绘制发送和接收的信号Scope = dsp。TimeScope(2200年e3,“YLimits”[1],“ShowGrid”,真的,...“LayoutDimensions”(2 - 1),“时间间隔”45岁的e - 3);范围(tx, rx)

用于分类的帧生成unknownFrames = getnframes (rx,“未知”);%的分类[prediction1,score1] = classification (trainedNet,unknownFrames);

返回分类器预测,这类似于困难决策。网络正确识别出该帧为BPSK帧。调制信号的产生方法请参见附录:调节器

prediction1
prediction1 =7x1分类数组BPSK BPSK BPSK

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

plotScores (score1 modulationTypes)

接下来,使用CNN对PAM4帧进行分类。

%随机位D = randi([0 3], 1024, 1);% PAM4调制Syms = pammod(d,4);%平方根提升余弦过滤器filterCoeffs = rcosdesign(0.35, 4,8);tx = filter(filterCoeffs, 1, upsample(syms,8));%的通道Rx =通道(tx);绘制发送和接收的信号Scope = dsp。TimeScope(2200年e3,“YLimits”(2 - 2),“ShowGrid”,真的,...“LayoutDimensions”(2 - 1),“时间间隔”45岁的e - 3);范围(tx, rx)

用于分类的帧生成unknownFrames = getnframes (rx,“未知”);%的分类[estimate2,score2] = classification (trainedNet,unknownFrames);estimate2
estimate2 =7x1分类数组Pam4 Pam4 Pam4 Pam4 Pam4 Pam4 Pam4
plotScores (score2 modulationTypes)

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

训练波形生成

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

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

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

创造渠道障碍

使每个帧通过带有的通道

  • 情况下

  • 瑞德多径衰落

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

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

情况下

该频道添加了信噪比为30 dB的AWGN。由于帧是归一化的,噪声标准差,可以计算为

信噪比= 30;std =√(10.^(-SNR/10))
STD = 0.0316

使用以下命令实现通道comm.AWGNChannel

awgnChannel = com . awgnChannel (...“NoiseMethod”信噪比(SNR)...“SignalPower”, 1,...“信噪比”信噪比)
NoiseMethod: '信噪比(SNR)' SNR: 30 SignalPower: 1 RandomStream: '全局流'

Rician多路径

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

multipathChannel = comm. ricicianchannel (...“SampleRate”fs,...“PathDelays”, [0 1.8 3.4]/fs,...“AveragePathGains”, [0 -2 -10],...“KFactor”4...“MaximumDopplerShift”4)
multipathChannel = comm.RicianChannel with properties: SampleRate: 200000 pathdelay: [0 9.0000e-06 1.7000e-05] averagepath增益:[0 -2 -10]normalizepath增益:true KFactor: 4 DirectPathDopplerShift: 0 DirectPathInitialPhase: 0 MaximumDopplerShift: 4 DopplerSpectrum: [1x1 struct]显示所有属性

时钟偏移量

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

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

频率偏移

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

offset = -(C-1)*fc(1);frequencyShifter = com . phasefrequencyoffset (...“SampleRate”fs,...“FrequencyOffset”抵消)
frequencyShifter = com . phasefrequencyoffset with properties: PhaseOffset: 0 FrequencyOffsetSource: 'Property' FrequencyOffset: -2.4386e+03 SampleRate: 200000

采样率偏移

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

综合频道

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

channel = 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 = info(channel)
chInfo =带有字段的结构:ChannelDelay: 6 MaximumFrequencyOffset: 4510 MaximumSampleRateOffset: 1

波形的一代

创建一个循环,为每种调制类型生成信道受损帧,并将包含相应标签的帧存储在其中frameStore。从每一帧的开始删除随机数的样本,以去除瞬态,并确保帧具有相对于符号边界的随机起点。

将随机数生成器设置为能够重新生成的已知状态%每次运行模拟时相同的帧rng(1235) tic numModulationTypes = length(modulationTypes);channelInfo = info(channel);frameStore = helperModClassFrameStore(...numFramesPerModType * numModulationTypes,防晒指数,modulationTypes);transDelay = 50;modType = 1:numModulationTypes'%s ' -生成%s帧\n'...datestr (toc / 86400,“HH: MM: SS”), modulationTypes(modType)) numSymbols = (numFramesPerModType / sps);dataSrc = getSource(modulationTypes(modType), sps, 2*spf, fs);modulator = getModulator(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 = channel(y);从开始删除瞬态,修剪到大小,并规范化。frame = helperModClassFrameGenerator(rxSamples, spf, spf, transDelay, sps);%添加到帧存储add(frameStore, frame, modulationTypes);结束结束
00:00:00—生成BPSK帧00:00:03—生成QPSK帧00:00:06—生成8PSK帧00:00:11—生成16QAM帧00:00:14—生成64QAM帧00:00:18—生成PAM4帧00:00:20—生成GFSK帧00:00:23—生成CPFSK帧00:00:26—生成B-FM帧00:00:44—生成DSB-AM帧00:00:46—生成SSB-AM帧

接下来,将框架划分为训练、验证和测试数据。默认情况下,frameStore在输出帧中按行放置I/Q基带样本。输出帧的大小为[2xspfx1xN],其中第一行是同相样本,第二行是正交样本。

[mcfstrain,mcfsValidation,mcfsTest] = splitData(frameStore,...[percentTrainingSamples, percentValidationSamples percentTestSamples]);[rxTraining,rxTrainingLabel] = get(mcfstrain);[rxValidation,rxValidationLabel] = get(mcfsValidation);[rxTest,rxTestLabel] = get(mcfsTest);
绘制示例帧的实部和虚部的振幅。%对比样本数量plotTimeDomain (rxte做rxTestLabel modulationTypes, fs)

绘制示例帧的光谱图。plotSpectrogram (rxte做rxTestLabel modulationTypes, fs, sps)

通过确保标签(调制类型)的均匀分布,避免训练数据中的类不平衡。绘制标签分布图,检查生成的标签是否分布均匀。

绘制标签分布图subplot(3,1,1)直方图(rxTrainingLabel)“培训标签发放”subplot(3,1,2)直方图(rxValidationLabel)“验证标签分发”子图(3,1,3)直方图(rxTestLabel)“测试标签分发”

训练CNN

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

dropoutate = 0.5;numModTypes = numel(modulationTypes);netWidth = 1;filterSize = [1 sps];poolSize = [1 2];modClassNet = [imageInputLayer([2 spf 1],“归一化”“没有”“名字”输入层的) (filterSize, 16*netWidth,“填充”“相同”“名字”“CNN1”) batchNormalizationLayer (“名字”“BN1”) reluLayer (“名字”“ReLU1”) maxPooling2dLayer (poolSize“步”, [1 2],“名字”“MaxPool1”) (filterSize, 24*netWidth,“填充”“相同”“名字”“CNN2”) batchNormalizationLayer (“名字”“BN2”) reluLayer (“名字”“ReLU2”) maxPooling2dLayer (poolSize“步”, [1 2],“名字”“MaxPool2”) (filterSize, 32*netWidth,“填充”“相同”“名字”“CNN3”) batchNormalizationLayer (“名字”“BN3”) reluLayer (“名字”“ReLU3”) maxPooling2dLayer (poolSize“步”, [1 2],“名字”“MaxPool3”) (filterSize, 48*netWidth,“填充”“相同”“名字”“CNN4”) batchNormalizationLayer (“名字”“BN4”) reluLayer (“名字”“ReLU4”) maxPooling2dLayer (poolSize“步”, [1 2],“名字”“MaxPool4”) (filterSize, 64*netWidth,“填充”“相同”“名字”“CNN5”) batchNormalizationLayer (“名字”“BN5”) reluLayer (“名字”“ReLU5”) maxPooling2dLayer (poolSize“步”, [1 2],“名字”“MaxPool5”) (filterSize, 96*netWidth,“填充”“相同”“名字”“CNN6”) batchNormalizationLayer (“名字”“BN6”) reluLayer (“名字”“ReLU6”(1个防晒系数/32);“名字”“AP1”) fullyConnectedLayer (numModTypes“名字”“FC1”) softmaxLayer (“名字”“SoftMax”) classificationLayer (“名字”“输出”)]
modClassNet = 28x1带有图层的图层数组:1输入层的图像输入2 x1024x1图片2的CNN1卷积16 1×8旋转步[1]和填充“相同”3“BN1”批量标准化批量标准化4的ReLU1 ReLU ReLU 5“MaxPool1”马克斯池1 x2马克斯池步(1 2)和填充[0 0 0 0]6‘CNN2卷积24 1×8旋转步[1]和填充“相同”7”BN2“批量标准化批量标准化8 ' ReLU2 ReLU ReLU 9“MaxPool2”马克斯池1 x2马克斯池步(1 2)和填充[0 0 0 0]10“CNN3”C在volution 32 1x8 convolutions with stride [1 1] and padding 'same' 11 'BN3' Batch Normalization Batch normalization 12 'ReLU3' ReLU ReLU 13 'MaxPool3' Max Pooling 1x2 max pooling with stride [1 2] and padding [0 0 0 0] 14 'CNN4' Convolution 48 1x8 convolutions with stride [1 1] and padding 'same' 15 'BN4' Batch Normalization Batch normalization 16 'ReLU4' ReLU ReLU 17 'MaxPool4' Max Pooling 1x2 max pooling with stride [1 2] and padding [0 0 0 0] 18 'CNN5' Convolution 64 1x8 convolutions with stride [1 1] and padding 'same' 19 'BN5' Batch Normalization Batch normalization 20 'ReLU5' ReLU ReLU 21 'MaxPool5' Max Pooling 1x2 max pooling with stride [1 2] and padding [0 0 0 0] 22 'CNN6' Convolution 96 1x8 convolutions with stride [1 1] and padding 'same' 23 'BN6' Batch Normalization Batch normalization 24 'ReLU6' ReLU ReLU 25 'AP1' Average Pooling 1x32 average pooling with stride [1 1] and padding [0 0 0 0] 26 'FC1' Fully Connected 11 fully connected layer 27 'SoftMax' Softmax softmax 28 'Output' Classification Output crossentropyex

使用analyzeNetwork函数显示网络体系结构的交互式可视化,检测网络的错误和问题,并获取关于网络层的详细信息。这个网络有98,323个学习对象。

analyzeNetwork (modClassNet)

下一个配置TrainingOptionsSGDM使用小型批处理大小为256的SGDM求解器。将最大时间数设置为12,因为更大的时间数不能提供进一步的训练优势。通过设置执行环境在GPU上训练网络“图形”。设置初始学习率为 2 x 10 - 2 。每9个课时将学习率降低10倍。集“阴谋”训练进步”绘制训练进度图。在NVIDIA Titan Xp GPU上,网络训练大约需要25分钟。

maxEpochs = 12;miniBatchSize = 256;validationFrequency = floor(numl (rxTrainingLabel)/miniBatchSize);options = trainingOptions(“个”...“InitialLearnRate”2依照...“MaxEpochs”maxEpochs,...“MiniBatchSize”miniBatchSize,...“洗牌”“every-epoch”...“阴谋”“训练进步”...“详细”假的,...“ValidationData”{rxValidation, rxValidationLabel},...“ValidationFrequency”validationFrequency,...“LearnRateSchedule”“分段”...“LearnRateDropPeriod”9...“LearnRateDropFactor”, 0.1,...“ExecutionEnvironment”“图形”);

要么训练网络,要么使用已经训练过的网络。默认情况下,这个示例使用经过训练的网络。

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

正如训练进度图所示,网络在大约12个周期内收敛到接近90%的准确率。

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

流('%s -对测试帧进行分类\n'datestr (toc / 86400“HH: MM: SS”))
00:01:19 -分类测试帧
rxTestPred =分类(trainedNet,rxTest);testAccuracy =平均值(rxTestPred == rxTestLabel);disp (“测试准确度:”+ testAccuracy*100 +“%”
测试准确度:90.455%

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

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

I/Q作为页面

默认情况下,frameStore将I/Q基带样本放在2-D数组中的行中。由于卷积滤波器的大小为[1xsps],卷积层独立处理同相分量和正交分量。只有在全连通层中,来自同相分量和正交分量的信息才会组合在一起。

另一种方法是将I/Q示例表示为大小为[1xSPFx2]的3-D数组,将同相和正交组件放在3维(页面)中。这种方法混合了I和Q中的信息,甚至在卷积层中,更好地利用了相位信息。设置“OutputFormat”属性的帧存储到“IQAsPages”,输入层的大小为[1xSPFx2]。

%将数据设置为[1xspfx2]格式mcfsTraining。OutputFormat =“IQAsPages”;[rxTraining,rxTrainingLabel] = get(mcfstrain);mcfsValidation。OutputFormat =“IQAsPages”;[rxValidation,rxValidationLabel] = get(mcfsValidation);mcfsTest。OutputFormat =“IQAsPages”;[rxTest,rxTestLabel] = get(mcfsTest);%设置选项options = trainingOptions(“个”...“InitialLearnRate”2依照...“MaxEpochs”maxEpochs,...“MiniBatchSize”miniBatchSize,...“洗牌”“every-epoch”...“阴谋”“训练进步”...“详细”假的,...“ValidationData”{rxValidation, rxValidationLabel},...“ValidationFrequency”validationFrequency,...“LearnRateSchedule”“分段”...“LearnRateDropPeriod”9...“LearnRateDropFactor”, 0.1,...“ExecutionEnvironment”“图形”);设置输入层的输入大小为[1xspfx2]modClassNet (1) =...imageInputLayer([1 spf 2],“归一化”“没有”“名字”输入层的);

下面对网络的分析表明,每个卷积滤波器的维数为1x8x2,这使得卷积层在计算一个滤波器输出时可以同时使用I和Q数据。

analyzeNetwork (modClassNet)

训练或加载预训练的修改网络。如果trainNow == true'%s -训练网络\n'datestr (toc / 86400“HH: MM: SS”)) trainedNet = trainNetwork(rxTraining,rxTrainingLabel,modClassNet,options);其他的负载trainedModulationClassificationNetwork2结束

如训练进度图所示,该网络在大约12个周期内收敛到95%以上的准确率。将I/Q组件表示为页面而不是行,可以提高约5%的网络精度。

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

流('%s -对测试帧进行分类\n'datestr (toc / 86400“HH: MM: SS”))
00:01:29 -分类测试帧
rxTestPred =分类(trainedNet,rxTest);testAccuracy =平均值(rxTestPred == rxTestLabel);disp (“测试准确度:”+ testAccuracy*100 +“%”
测试准确度:95.2727%

绘制测试帧的混淆矩阵。如矩阵所示,将I/Q组件表示为页面而不是行,极大地提高了网络准确区分16-QAM和64-QAM帧以及QPSK和8-PSK帧的能力。

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

SDR测试

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

radioPlatform =“ADALM-PLUTO”开关radioPlatform情况下“ADALM-PLUTO”如果isPlutoSDRInstalled() == true收音机= findPlutoRadio();如果长度(收音机)>= 2 sdrTest(收音机);其他的disp (“未找到选定的无线电。”跳过空中测试。”结束结束情况下“USRP B2xx”“USRP X3xx”“USRP N2xx”如果(isUSRPInstalled() == true) && (isPlutoSDRInstalled() == true) txRadio = findPlutoRadio();rxRadio = findsdru();开关radioPlatform情况下“USRP B2xx”idx = contains({rxRadio.)平台},{“B200”“B210”});情况下“USRP X3xx”idx = contains({rxRadio.)平台},{“×”“X310”});情况下“USRP N2xx”idx = contains({rxRadio.)平台},“N200 / N210 / USRP2”);结束rxRadio = rxRadio(idx);如果(length(txRadio) >= 1) && (length(rxRadio) >= 1) sdrTest(rxRadio);其他的disp (“未找到选定的无线电。”跳过空中测试。”结束结束结束

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

进一步的探索

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

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

附录:调节器部分提供了用于生成调制信号的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

附录:辅助函数

函数testAccuracy = sdrTest(无线电)使用无线信号测试CNN性能% A = sdrTest从ADALM-PLUTO无线电发送测试帧,接收使用一个ADALM-PLUTO或USRP无线电,与受训人员一起执行分类%网络,并返回整体分类精度。传输% radio使用发射-重复功能重复发送相同的波形%,而不加载主循环。modulationTypes = categorical([“BPSK”“正交相移编码”“8相移键控”...“16 qam”“64 qam”“PAM4”“GFSK”“CPFSK”“B-FM”]);负载trainedModulationClassificationNetwork2trainedNetnumFramesPerModType = 100;SPS = 8;每个符号的样本百分比SPF = 1024;每帧样本百分比Fs = 200e3;抽样率%txRadio = sdrtx(“冥王星”);txRadio。RadioID =“usb: 0”;txRadio。CenterFrequency = 902e6; txRadio.BasebandSampleRate = fs;如果isfield(收音机、“平台”无线电平台=“USRP”配置USRP无线电作为接收端。rxRadio = comm.SDRuReceiver(“平台”、收音机(1).Platform);开关收音机(1)。平台情况下“B200”“B210”} masterClockRate = 5e6;rxRadio。SerialNum = radio (1).SerialNum;情况下“N200灯/ N210 / USRP2”} masterClockRate = 100e6;rxRadio。IPAddress =无线电(1).IPAddress;情况下“×”“X310”} masterClockRate = 120e6;rxRadio。IPAddress =无线电(1).IPAddress;结束rxRadio。MasterClockRate = MasterClockRate;rxRadio。DecimationFactor = masterClockRate/fs;radioInfo = info(rxRadio);maximumGain = radioInfo.MaximumGain;minimumGain = radioInfo.MinimumGain;其他的radioPlatform =“PlutoSDR”;rxRadio = sdrrx(“冥王星”);rxRadio。RadioID =“usb: 1”;rxRadio。BasebandSampleRate = fs;rxRadio。ShowAdvancedProperties = true;rxRadio。enablequadraturecrection = false;rxRadio。GainSource =“手动”;maximumGain = 73;minimumGain = -10;结束rxRadio。SamplesPerFrame = spf;使用burst模式,numFramesInBurst设置为1,这样每次捕获%(对接收者的调用)将返回一个独立的新帧虽然收音机过载了。rxRadio。EnableBurstMode = true;rxRadio。NumFramesInBurst = 1;rxRadio。OutputDataType =“单一”显示Tx和Rx无线电txRadio rxRadio将随机数生成器设置为已知状态,以便能够重新生成%每次运行模拟时相同的帧rng(1235) tic numModulationTypes = length(modulationTypes);txModType = repmat(modulationTypes(1),numModulationTypes*numFramesPerModType,1);estimatedModType = repmat(modulationTypes(1),numModulationTypes*numFramesPerModType,1);frameCnt = 1;modType = 1:numModulationTypes'%s ' -正在测试%s帧\n'...datestr (toc / 86400,“HH: MM: SS”), modulationTypes(modType)) dataSrc = getSource(modulationTypes(modType), sps, 2*spf, fs);modulator = getModulator(modulationTypes(modType), sps, fs);如果包含(char (modulationTypes (modType)) {“B-FM”})...&& (radioPlatform ==“PlutoSDR”模拟调制类型使用100 MHz的中心频率。txRadio。CenterFrequency = 100e6; rxRadio.CenterFrequency = 100e6;其他的数字调制类型使用中心频率902mhztxRadio。CenterFrequency = 902e6; rxRadio.CenterFrequency = 902e6;结束disp (“从发射机”) x = dataSrc();Y =调制器(x);删除过滤器瞬态Y = Y (4*sps+1:end,1);maxVal = max (max (abs(真实(y)))、马克斯(abs(图像放大(y))));y = y *0.8/maxVal;下载波形信号到无线电,并在空中反复传送。transmitRepeat (txRadio、复杂(y));disp (“调节接收机增益”) rxRadio。增益= maximumGain;gainAdjusted = false;~ gainAdjustedp=1:20 rx = rxRadio();结束max振幅= max([abs(real(rx));abs(图像放大(rx))));如果(maxAmplitude < 0.8) || (rxRadio.)增益<= minimumGain)增益调整为true;其他的rxRadio。增益= rxRadio。增益- 3;结束结束disp (“启动接收器和测试”p=1:numFramesPerModType rx = rxRadio();frameEnergy = sum(abs(rx).^2);rx = rx / sqrt(frameEnergy);reshapedRx(1,:,1,1) = real(rx);reshapedRx(1,:,2,1) = imag(rx);%的分类txModType(frameCnt) = modulationTypes(modType);estimatedModType(frameCnt) = classid (trainedNet, repedrx);frameCnt = frameCnt + 1;暂停一段时间以获得一个独立的频道。。暂停时间%加上单个循环的处理时间必须更大%为信道相干时间。假设信道相干时间较小%比0.1秒。暂停(0.1)结束disp (“释放Tx无线电”)发布(txRadio);testAccuracy = mean(txModType(1:frameCnt-1) == estimatedModType(1:frameCnt-1));disp (“测试准确度:”+ testAccuracy*100 +“%”结束disp (“释放Rx收音机”)发布(rxRadio);testAccuracy =平均值(txModType == estimatedModType);disp (“最终测试精度:”+ testAccuracy*100 +“%”figure cm = confusichart (txModType, estimatedModType);厘米。Title =“测试数据混淆矩阵”;厘米。RowSummary =“row-normalized”;cm.Parent.Position = [cm.Parent.Position(1:2) 740 424];结束函数modulator = getModulator(modType, sps, fs)调制函数选择器% MOD = getModulator(TYPE,SPS,FS)返回调节器函数句柄% MOD基于类型。SPS为每个符号的样本数,FS为%的抽样率。开关modType情况下“BPSK”modulator = @(x)bpskModulator(x,sps);情况下“正交相移编码”modulator = @(x)qpskModulator(x,sps);情况下“8相移键控”modulator = @(x)psk8Modulator(x,sps);情况下“16 qam”modulator = @(x)qam16Modulator(x,sps);情况下“64 qam”modulator = @(x)qam64Modulator(x,sps);情况下“GFSK”modulator = @(x)gfskModulator(x,sps);情况下“CPFSK”modulator = @(x)cpfskModulator(x,sps);情况下“PAM4”modulator = @(x)pam4Modulator(x,sps);情况下“B-FM”modulator = @(x)bfmModulator(x, fs);情况下“DSB-AM”modulator = @(x)dsbamModulator(x, fs);情况下“SSB-AM”modulator = @(x)ssbamModulator(x, fs);结束结束函数src = getSource(modType, sps, spf, fs)调制类型的源选择器% SRC = getSource(TYPE,SPS,SPF,FS)返回数据源%为调制类型type,用采样数表示%每个符号SPS,每帧采样数SPF,和%采样频率FS。开关modType情况下“BPSK”“GFSK”“CPFSK”} m = 2;src = @()randi([0 M-1],spf/sps,1);情况下“正交相移编码”“PAM4”} m = 4;src = @()randi([0 M-1],spf/sps,1);情况下“8相移键控”M = 8;src = @()randi([0 M-1],spf/sps,1);情况下“16 qam”M = 16;src = @()randi([0 M-1],spf/sps,1);情况下“64 qam”M = 64;src = @()randi([0 M-1],spf/sps,1);情况下“B-FM”“DSB-AM”“SSB-AM”} src = @()getAudio(spf,fs);结束结束函数x = getAudio(spf,fs)模拟调制类型的音频源% A = getAudio(SPF,FS)返回音频源A每帧采样数的百分比SPF,采样率FS。持续的audioSrc audioRC如果isempty(audioSrc) audioSrc = dsp。AudioFileReader (“audio_mix_441.wav”...“SamplesPerFrame”防晒指数,“PlayCount”、正);audioRC = dsp。SampleRateConverter (“带宽”, 30 e3,...“InputSampleRate”, audioSrc。SampleRate,...“OutputSampleRate”fs);[~,decimFactor] = getRateChangeFactors(audioRC);audioSrc。SamplesPerFrame = ceil(spf / fs * audioSrc.)SampleRate / decimFactor) *结束x = audioRC(audioSrc());X = X (1:spf,1);结束函数帧= getnframes (rx,modType)为神经网络生成格式化的帧% F = getnframes (X,MODTYPE)将输入X格式化为帧%,可以与本设计的神经网络一起使用% example,并返回输出F中的帧。frames = helperModClassFrameGenerator(rx,1024,1024,32,8);frameStore = helperModClassFrameStore(10,1024,categorical({modType}));添加(frameStore、框架modType);frames = get(frameStore);结束函数plotScores(得分、标签)%plotScores帧的Plot分类分数% plotScores(SCR,LABELS)将分类评分SCR绘制为堆叠的% bar为每帧。SCR是一个矩阵,其中每一行都是a的分数%框架。Co = [0.08 0.9 0.49;0.52 0.95 0.70;0.36 0.53 0.96;0.09 0.54 0.67;0.48 0.99 0.26;0.95 0.31 0.17;0.52 0.85 0.95;0.08 0.72 0.88;0.12 0.45 0.69;0.22 0.11 0.49; 0.65 0.54 0.71]; figure; ax = axes(“ColorOrder”有限公司,“NextPlot”“replacechildren”);栏(ax,分数;南(11)】,“堆叠”);传奇(类别(标签),“位置”“最佳”);包含(的帧数);ylabel (“分数”);标题(“分类分数”结束函数plotTimeDomain (rxte做rxTestLabel modulationTypes, fs)%plotTimeDomain帧的时域图numRows = ceil(length(modulationTypes) / 4);spf = size(rxTest,2);T = 1000*(0:spf-1)/fs;如果size(rxTest,1) == 2 IQAsRows = true;其他的IQAsRows = false;结束modType=1:length(modulationTypes) subplot(numRows, 4, modType);idxOut = find(rxTestLabel == modulationTypes(modType), 1);如果IQAsRows rxI = rxTest(1,:,1,idxOut);rxQ = rxTest(2,:,1,idxOut);其他的rxI = rxTest(1,:,1,idxOut);rxQ = rxTest(1,:,2,idxOut);结束情节(t,挤压(rxI),“- - -”);网格;轴平等的;轴广场持有情节(t,挤压(rxQ),“- - -”);网格;轴平等的;轴广场持有标题(string (modulationTypes (modType)));包含(“时间(ms)”);ylabel (“振幅”结束结束函数plotSpectrogram (rxte做rxTestLabel modulationTypes, fs, sps)帧的光谱图如果size(rxTest,1) == 2 IQAsRows = true;其他的IQAsRows = false;结束numRows = ceil(length(modulationTypes) / 4);modType=1:length(modulationTypes) subplot(numRows, 4, modType);idxOut = find(rxTestLabel == modulationTypes(modType), 1);如果IQAsRows rxI = rxTest(1,:,1,idxOut);rxQ = rxTest(2,:,1,idxOut);其他的rxI = rxTest(1,:,1,idxOut);rxQ = rxTest(1,:,2,idxOut);结束rx =挤压(rxI) + 1i*挤压(rxQ);光谱图(rx kaiser (sps), 0, 1024 fs,“中心”);标题(string (modulationTypes (modType)));结束H = gcf;删除(findall (h。孩子,“类型”“ColorBar”))结束函数flag = isPlutoSDRInstalled检查是否安装了ADALM-PLUTO Radio HSPspkg = matlabshared.金宝app supportkg . getinstalled;标志= ~isempty(spkg) && any(包含({spkg.)名称},“ADALM-PLUTO”“IgnoreCase”,真的));结束函数isUSRPInstalled . flag = isUSRPInstalled%isUSRPInstalled检查是否安装了USRP Radio HSPspkg = matlabshared.金宝app supportkg . getinstalled;标志= ~isempty(spkg) && any(包含({spkg.)名称},“USRP”“IgnoreCase”,真的));结束

附录:调节器

函数y = bpskModulator(x,sps)bpskModulator带有脉冲整形的BPSK调制器BPSK调制输入X,并返回%根号提升余弦脉冲形信号y X一定是列向量集合[0 1]中值的%。根号提升余弦滤波器有一个%滚离因子为0.35,跨越四个符号。输出信号% Y是单位功率。持续的filterCoeffs如果isempty(filterCoeffs) filterCoeffs = rcosdesign(0.35, 4, sps);结束%调节Syms = pskmod(x,2);%脉冲形状y = filter(filterCoeffs, 1, upsample(syms,sps));结束函数y = qpskModulator(x,sps)qpskModulator带有脉冲整形的QPSK调制器QPSK调制输入X,并返回%根号提升余弦脉冲形信号y X一定是列向量集合[0 3]中值的%。根号提升余弦滤波器有一个%滚离因子为0.35,跨越四个符号。输出信号% Y是单位功率。持续的filterCoeffs如果isempty(filterCoeffs) filterCoeffs = rcosdesign(0.35, 4, sps);结束%调节Syms = pskmod(x,4,pi/4);%脉冲形状y = filter(filterCoeffs, 1, upsample(syms,sps));结束函数y = psk8Modulator(x,sps)8-PSK调制器与脉冲整形% Y = psk8Modulator(X,SPS) 8-PSK调制输入X,并返回%根号提升余弦脉冲形信号y X一定是列向量集合[0 7]中值的%。根号提升余弦滤波器有一个%滚离因子为0.35,跨越四个符号。输出信号% Y是单位功率。持续的filterCoeffs如果isempty(filterCoeffs) filterCoeffs = rcosdesign(0.35, 4, sps);结束%调节Syms = pskmod(x,8);%脉冲形状y = filter(filterCoeffs, 1, upsample(syms,sps));结束函数y = qam16Modulator(x,sps)16-QAM调制器与脉冲整形% Y = qam16Modulator(X,SPS) 16-QAM调制输入X,并返回%根号提升余弦脉冲形信号y X一定是列向量集合[0 15]中值的%。根号提升余弦滤波器有一个%滚离因子为0.35,跨越四个符号。输出信号% Y是单位功率。持续的filterCoeffs如果isempty(filterCoeffs) filterCoeffs = rcosdesign(0.35, 4, sps);结束%调制和脉冲形状Syms = qammod(x,16,“UnitAveragePower”,真正的);%脉冲形状y = filter(filterCoeffs, 1, upsample(syms,sps));结束函数y = qam64Modulator(x,sps)qam64Modulator带有脉冲整形的64-QAM调制器% Y = qam64Modulator(X,SPS) 64-QAM调制输入X,并返回%根号提升余弦脉冲形信号y X一定是列向量集合中值的%[0 63]。根号提升余弦滤波器有一个%滚离因子为0.35,跨越四个符号。输出信号% Y是单位功率。持续的filterCoeffs如果isempty(filterCoeffs) filterCoeffs = rcosdesign(0.35, 4, sps);结束%调节Syms = qammod(x,64,“UnitAveragePower”,真正的);%脉冲形状y = filter(filterCoeffs, 1, upsample(syms,sps));结束函数y = pam4Modulator(x,sps)pam4Modulator PAM4调制器与脉冲整形PAM4调制输入X,并返回%根号提升余弦脉冲形信号y X一定是列向量集合[0 3]中值的%。根号提升余弦滤波器有一个%滚离因子为0.35,跨越四个符号。输出信号% Y是单位功率。持续的filterCoeffs amp如果isempty(filterCoeffs) filterCoeffs = rcosdesign(0.35, 4, sps);Amp = 1 /√(均值(abs(0:3, 4)).^2));结束%调节Syms = amp * pammod(x,4);%脉冲形状y = filter(filterCoeffs, 1, upsample(syms,sps));结束函数y = gfskModulator(x,sps)%gfskModulator GFSK调节器% Y = gfskModulator(X,SPS%信号y X必须是集合[0 1]中的值的列向量。的% BT积为0.35,调制指数为1。输出信号% Y是单位功率。持续的国防部meanM如果isempty(mod) M = 2;mod = comm.CPMModulator(...“ModulationOrder”米,...“FrequencyPulse”“高斯”...“BandwidthTimeProduct”, 0.35,...“ModulationIndex”, 1,...“SamplesPerSymbol”, sps);均值(0:M-1);结束%调节y = mod(2*(x-meanM));结束函数y = cpfskModulator(x,sps)cpfskModulator CPFSK调制器% Y = cpfskModulator(X,SPS) CPFSK调制输入X并返回%,信号y X必须是集合[0 1]中的值的列向量。%调制指数为0.5。输出信号Y具有单位功率。持续的国防部meanM如果isempty(mod) M = 2;mod = comm.CPFSKModulator(...“ModulationOrder”米,...“ModulationIndex”, 0.5,...“SamplesPerSymbol”, sps);均值(0:M-1);结束%调节y = mod(2*(x-meanM));结束函数y = bfmModulator(x,fs)bfmModulator广播调制器% Y = bfmModulator(X,FS) broadcast FM调制输入X和返回%在采样率FS下的信号Y。X一定是的列向量%的音频采样率FS。频率偏差为75 kHz%,预强调滤波器时间常数为75微秒。持续的国防部如果isempty(mod) mod = com . fmbroadcastmodulator...“AudioSampleRate”fs,...“SampleRate”fs);结束Y = mod(x);结束函数y = dsbamModulator(x,fs)%dsbamModulator双面调制器% Y = dsbamModulator(X,FS)双面带AM调制输入X和%以采样速率FS返回信号Y。X一定是的列向量%的音频采样率FS。中频是50khz。Y = ammod(x,50e3,fs);结束函数y = ssbamModulator(x,fs)ssbamModulator单边带调制器% Y = ssbamModulator(X,FS)单边带AM调制输入X和%以采样速率FS返回信号Y。X一定是的列向量%的音频采样率FS。中频是50khz。Y = ssbmod(x,50e3,fs);结束