神经网络对数字预失真设计——在线培训
这个例子展示了如何创建一个在线训练神经网络数字预失真(DPD)系统来抵消效应的非线性功率放大器(PA)使用自定义训练循环。自定义训练循环包含
OFDM信号生成,
NN-DPD处理,
使用威仕特PA测量,
性能指标的计算
重量更新控制逻辑。
介绍
非线性行为不是导致严重的信号失真,造成挑战错误接收的高频和高带宽信号通常在5 g NR传播[1]。DPD信号传输的一种技术用于弥补PA非线性扭曲的信号。的数字预失真设计——离线训练神经网络(通信工具箱)例侧重于离线训练的神经网络公司。在离线训练系统中,一旦训练完成,NN-DPD重量保持不变。如果巴勒斯坦权力机构特征变化,系统性能会受到影响。
在一个在线培训系统,NN-DPD权重可以更新基于预定的性能指标。这个图表显示了在线培训系统。这个系统有两个NN-DPDs。NN-DPD-Forward用于信号路径应用数字预失真信号。这个NN-DPD采样过量通信信号的输入和输出连接到。NN-DPD-Train用于更新NN-DPD重量和偏见。它的输入信号是巴勒斯坦权力机构和培训目标是巴勒斯坦权力机构输入输出。因此,NN-DPD训练是巴勒斯坦权力机构的倒数。
下面是在线培训系统的流程图。当系统启动运行,NN-DPD权重随机初始化。结果,NN-DPD不是一个有效的输出信号。绕过NN-DPD-Forward直到NN-DPD-Train列车初始有效状态。初始化完成后,通过NN-DPD-Forward传递信号。计算归一化均方误差(NMSE) NN-DPD-Forward使用的信号输入和输出的。如果NMSE大于一个阈值,那么更新NN-DPD-Train重量和偏见使用当前帧的I / Q样本。一旦更新完成,复制NN-DPD-Forward重量和偏见。如果NMSE低于阈值,则不更新NN-DPD-Train。异步NN-DPD更新完成。
生成采样过量OFDM信号
生成OFDM-based信号激发PA。这个例子使用一个5 g-like OFDM波形。信号的带宽设置为100 MHz。选择一个更大带宽信号导致PA引入更多的非线性失真和DPD的受益。生成六个OFDM符号,每个副载波16-QAM符号,使用ofdmmod
(通信工具箱)和qammod
(通信工具箱)函数。保存16-QAM符号作为参考来计算维生素与性能。捕捉高阶非线性的影响,这个例子oversamples巴勒斯坦权力机构输入的5倍。
bw = 100 e6;%赫兹symPerFrame = 6;% OFDM符号每帧M = 16;%每个OFDM副载波包含一个16-QAM象征osf = 5;%的过采样因素PA输入% OFDM参数ofdmParams = helperOFDMParameters (bw (osf);numDataCarriers = (ofdmParams。fftLength——ofdmParams。NumGuardBandCarrier - 1);nullIdx = [1: ofdmParams.NumGuardBandCarrier / 2 + 1…ofdmParams.fftLength-ofdmParams.NumGuardBandCarrier / 2 + 1: ofdmParams.fftLength];Fs = ofdmParams.SampleRate;%随机数据x =兰迪([0 m - 1], numDataCarriers symPerFrame);%副载波OFDM与16-QAM数据qamRefSym = qammod (x, M);dpdInput =单(ofdmmod (qamRefSym / osf、ofdmParams.fftLength ofdmParams.cpLength,…nullIdx OversamplingFactor = osf));
NN-DPD
NN-DPD有三个完全连接隐藏层,后跟一个完全连接输出层。记忆长度和非线性度确定输入长度,所描述的功率放大器特性(通信工具箱)的例子。将记忆深度设置为5和非线性度5。自定义训练循环需要dlnetwork
对象。创建一个dlnetwork NN-DPD-Train NN-DPD-Forward和另一个。
memDepth = 5;%记忆深度的DPD(或PA模型)nonlinearDegree = 5;%非线性多项式程度inputLayerDim = 2 * memDepth + (nonlinearDegree-1) * memDepth;numNeuronsPerLayer = 40;层= […featureInputLayer (inputLayerDim“名字”,“输入”)fullyConnectedLayer (numNeuronsPerLayer“名字”,“linear1”)leakyReluLayer (0.01,“名字”,“leakyRelu1”)fullyConnectedLayer (numNeuronsPerLayer“名字”,“linear2”)leakyReluLayer (0.01,“名字”,“leakyRelu2”)fullyConnectedLayer (numNeuronsPerLayer“名字”,“linear3”)leakyReluLayer (0.01,“名字”,“leakyRelu3”)fullyConnectedLayer (2“名字”,“linearOutput”));netTrain = dlnetwork(层);netForward = dlnetwork(层);
的输入NN-DPD是预处理中描述数字预失真设计——离线训练神经网络(通信工具箱)的例子。创建输入预处理NN-DPDs对象。
inputProcTrain = helperNNDPDInputLayer (memDepth nonlinearDegree);inputProcForward = helperNNDPDInputLayer (memDepth nonlinearDegree);
自从dlnetTrain dlnetForward还没有训练,绕过NN-DPD。
dpdOutput = dpdInput;
功率放大器
选择系统的数据源。这个例子使用一个NXP Airfast LDMOS Doherty PA,这是连接到一个当地倪威仕特描述的功率放大器特性(通信工具箱)的例子。如果您没有访问一个PA,运行示例与保存的数据或模拟。模拟PA使用神经网络PA模型,这是训练用数据捕获从巴勒斯坦权力机构使用NI威仕特。
数据源=
“啪”模拟;
信号通过巴勒斯坦权力机构和测量输出信号使用倪威仕特。降低目标输入功率值可能会导致减少失真。
如果比较字符串(数据源,“倪威仕特”)targetInputPower =5;% dBm威仕特= helperVSTDriver (“VST_01”);威仕特。DUTExpectedGain = 29;% dB威仕特。ExternalAttenuation = 30;% dB威仕特。DUTTargetInputPower = targetInputPower;% dBm威仕特。CenterFrequency = 3.7 e9;%赫兹%将信号发送到PA和收集输出paOutput = helperNNDPDPAMeasure (dpdOutput Fs,威仕特);elseif比较字符串(数据源,“啪”模拟)加载paModelNN.matnetPAmemDepthPAnonlinearDegreePAscalingFactorPAinputProcPA = helperNNDPDInputLayer (memDepthPA nonlinearDegreePA);inputProcPAMP = helperNNDPDInputLayer (memDepthPA nonlinearDegreePA);X =过程(inputProcPA dpdOutput * scalingFactorPA);Y =预测(netPA X);paOutput =复杂(Y (: 1), Y (:, 2));paOutput = paOutput / scalingFactorPA;其他的负载nndpdInitTrainingDatapaOutputdpdInputdpdOutput = dpdInput;结束
自定义训练循环
创建一个自定义训练循环训练NN-DPD-Train初始有效状态。自定义训练循环有这些部分:
for循环在时代
mini-batch队列处理mini-batch选择
while循环在mini-batches
模型梯度、州和损失评估
网络参数更新
学习速率控制
培训信息日志
的时代循环运行maxNumEpochs
。minibatch大小设置为miniBatchSize
。mini-batch规模收益率值的增大速度训练,但可能需要更大的学习速率。设置初始学习速率initLearnRate和更新学习速率每learnRateDropPeriod时代learnRateDropFactor倍的数量。同时,设置一个最小学习速率值,避免训练几乎停止。
%培训选项maxNumEpochs = 40;miniBatchSize = 4096;% I / Q样本initLearnRate = 2依照;minLearnRate = 1 e-5;learnRateDropPeriod = 20;%时代learnRateDropFactor = 0.2;iterationsPerBatch =地板(长度(dpdOutput) / miniBatchSize);
引用[2]和[3]描述规范的好处避免梯度爆炸问题的输入信号,并确保神经网络收敛于一个更好的解决方案。规范化需要获得一个统一的标准偏差和零均值。对于这个示例,通信信号已经零均值,所以只规范化标准偏差。之后,你应该需要正规化NN-DPD输出值通过使用相同的比例因子。
scalingFactor = 1 /性病(dpdOutput);
预处理输入和输出信号。
trainInputMtx =过程(inputProcTrain,…paOutput * scalingFactor);trainOutputBatchC = dpdOutput * scalingFactor;trainOutputBatchR =[真实(trainOutputBatchC)图像放大(trainOutputBatchC)];
创建两个arrayDatastore
对象
年代和把它们代表输入和目标的关系。的dsInput
商店的输入信号,X
,dsOutput
存储目标信号,NN-DPD-Train T。
dsInput = arrayDatastore (trainInputMtx,…IterationDimension = 1, ReadSize = miniBatchSize);dsOutput = arrayDatastore (trainOutputBatchR,…IterationDimension = 1, ReadSize = miniBatchSize);cd =结合(dsInput dsOutput);
创建一个minibatchqueue
对象自动化小批量抓取。第一个维度是时间维度,贴上批处理,B,指导网络解释每个步伐作为一个独立的观察。第二维度特征维度,并贴上c .由于数据规模很小,训练循环更快的CPU上运行。集OutputEnvironment
输入和目标数据“cpu”
。
兆贝可= minibatchqueue (cd,…MiniBatchSize = MiniBatchSize,…PartialMiniBatch =“丢弃”,…MiniBatchFormat = [“公元前”,“公元前”),…OutputEnvironment = {“cpu”,“cpu”});
对于每一个迭代,获取输入和目标数据从mini-batch队列。评估模型的梯度、州和损失dlfeval
使用自定义函数modelLoss
函数。然后使用亚当更新网络参数优化功能,adamupdate
。自定义训练循环的更多信息,见自定义训练循环,损失函数和网络。
当运行这个示例中,您可以选择使用一个pretrained网络通过设置trainNow
变量来假
。培训是可取的匹配网络仿真配置。如果使用不同的PA,信号带宽,或目标输入功率水平,重新培训网络。训练神经网络在基于Intel®CPU @ 3.60 ghz Xeon®w - 2133只需要不到3分钟。
trainNow =真正的;如果trainNow%初始化培训进度监控监控= trainingProgressMonitor;班长。信息= [“LearningRate”,“时代”,“迭代”];班长。指标=“TrainingLoss”;班长。包含=“迭代”;groupSubPlot(监控,“损失”,“TrainingLoss”);班长。状态=“运行”;plotUpdateFrequency = 10;%初始化训练循环averageGrad = [];averageSqGrad = [];learnRate = initLearnRate;迭代= 1;为时代= 1:maxNumEpochs shuffle(兆贝可)%更新学习速率如果国防部(时代,learnRateDropPeriod) = = 0 learnRate = learnRate * learnRateDropFactor;结束%循环mini-batches而hasdata(兆贝可)& & ~ monitor.Stop%的过程数据mini-batch之一[X, T] =下一个(兆贝可);%梯度和损失评估模型[lossTrain,梯度]= dlfeval (@modelLoss netTrain X T);%更新网络参数[netTrain, averageGrad averageSqGrad] =…adamupdate (netTrain、渐变averageGrad averageSqGrad,…迭代,learnRate);如果国防部(迭代,plotUpdateFrequency) = = 0 updateInfo(监视器,…LearningRate = learnRate,…时代(时代)+ =字符串“的”+字符串(maxNumEpochs),…迭代=字符串(迭代));recordMetrics(监控、迭代…TrainingLoss = 10 * log10 (lossTrain));结束迭代=迭代+ 1;结束如果monitor.Stop打破结束班长。进步= 100 *时代/ maxNumEpochs;结束如果monitor.Stop班长。状态=“用户终止”;其他的班长。状态=“完成”;结束其他的负载offlineTrainedNNDPDR2023anetTrainlearnRatelearnRateDropFactor…learnRateDropPeriodmaxNumEpochsminiBatchSizescalingFactor…symPerFrame监控averageGradaverageSqGrad结束
在线培训与边境
前面的定制培训循环转换成一个在线培训循环半处理,硬件是巴勒斯坦权力机构。进行以下修改:
添加OFDM信号生成,
复制NN-DPD-Train可学的NN-DPD-Forward和应用预失真使用转发功能,
把对PA和测量输出信号,
计算性能指标,NMSE,
如果性能指标的规范,那么更新NN-DPD-Train可学的和定制的循环中所示自定义训练循环部分没有时代处理,
添加内存基于多项式的DPD比较使用
comm.DPDCoefficientEstimator
(通信工具箱)和comm.DPD
(通信工具箱)系统对象。
在线培训循环运行maxNumFrames
帧。设置目标NMSEtargetNMSE
dB的保证金targetNMSEMargin
dB。保证金创建一个滞后的培训在哪里停止如果NMSE小于targetNMSE-targetNMSEMargin
并开始如果NMSE大于targetNMSE + targetNMSEMargin
。
maxNumFrames = 200;%的框架如果比较字符串(数据源,“倪威仕特”)| | strcmp(数据源,“保存数据”)targetNMSE = -33.5;% dB其他的targetNMSE = -30.0;% dB结束targetNMSEMargin = 0.5;% dB
初始化NN-DPD-Forward。
netForward。可学的= netTrain.Learnables;
配置学习速率的时间表。开始learnRate
和下降的一个因素learnRateDropFactor
每一个learnRateDropPeriod
帧。
learnRateDropPeriod = 100;learnRateDropFactor = 0.5;learnRate = 0.0001;
基于多项式的DPD初始化内存。
polynomialType =“记忆多项式”;估计量= comm.DPDCoefficientEstimator (…DesiredAmplitudeGaindB = 0,…PolynomialType = PolynomialType,…度= nonlinearDegree,…MemoryDepth = memDepth,…算法=“最小二乘法”);系数=估计量(dpdOutput paOutput);
警告:等级不足,排名= 9,tol = 1.112654 e 03。
dpdMem = comm.DPD (PolynomialType = PolynomialType,…系数=系数);
如果trainNow
是真正的
和数据源
不是“保存数据”
,运行在线培训循环。
trainNow =假;如果trainNow & & ~ strcmp(数据源,“保存数据”)%关闭警告的循环warnState =警告(“关闭”,“MATLAB: rankDeficientMatrix”);俱乐部= onCleanup(@()警告(warnState));%初始化培训进度监控监控= trainingProgressMonitor;班长。信息= [“LearningRate”,“帧”,“迭代”];班长。指标= [“TrainingLoss”,“NMSE”,“NMSE_MP”];班长。包含=“迭代”;groupSubPlot(监控,“损失”,“TrainingLoss”);groupSubPlot(监控,“系统指标”,{“NMSE”,“NMSE_MP”});班长。状态=“运行”;plotUpdateFrequency = 10;%复位输入预处理对象重置(inputProcTrain);重置(inputProcForward);numFrames = 1;迭代= 1;maxNumIterations = maxNumFrames * iterationsPerBatch;updateFrameCounter = 1;而numFrames < maxNumFrames & & ~ monitor.Stop%生成OFDM I / Q样本x =兰迪([0 m - 1], numDataCarriers symPerFrame);qamRefSym = qammod (x, M);dpdInput =单(ofdmmod (qamRefSym / osf、ofdmParams.fftLength ofdmParams.cpLength,…nullIdx OversamplingFactor = osf));dpdInputMtx =过程(inputProcForward, dpdInput * scalingFactor);% NN-DPD发送一帧数据X = dlarray (dpdInputMtx“公元前”);% B:批处理大小;C:数量的特性(尺寸在神经网络的输入层)[Y ~] =前进(netForward X);dpdOutput = (extractdata (Y))”;dpdOutput =复杂(dpdOutput (: 1), dpdOutput (:, 2));%规范化输出信号dpdOutput = dpdOutput / scalingFactor;%记忆多项式DPD发送一帧数据dpdOutputMP = dpdMem (dpdInput);%通过PA发送DPD输出如果比较字符串(数据源,“倪威仕特”Fs) paOutput = helperNNDPDPAMeasure (dpdOutput,威仕特);paOutputMP = helperNNDPDPAMeasure (dpdOutputMP Fs,威仕特);其他的%”模拟啪”paInputMtx =过程(inputProcPA, dpdOutput * scalingFactorPA);paOutput =预测(netPA paInputMtx);paOutput =复杂(paOutput (: 1), paOutput (:, 2));paOutput = paOutput / scalingFactorPA;paInputMtxMP =过程(inputProcPAMP, dpdOutputMP * scalingFactorPA);paOutputMP =预测(netPA paInputMtxMP);paOutputMP =复杂(paOutputMP (: 1), paOutputMP (:, 2));paOutputMP = paOutputMP / scalingFactorPA;结束%计算NMSEnmseNN = localNMSE (dpdInput paOutput);nmseMP = localNMSE (dpdInput paOutputMP);%检查NMSE是否太大如果updateNNDPDWeights (nmseNN targetNMSE targetNMSEMargin)%需要更新权重/神经网络DPD的偏见%预处理神经网络的输入和输出trainInputMtx =过程(inputProcForward,…paOutput * scalingFactor);trainOutputBatchC = dpdOutput * scalingFactor;trainOutputBatchR =[真实(trainOutputBatchC)图像放大(trainOutputBatchC)];%创建数据存储相结合dsInput = arrayDatastore (trainInputMtx,…IterationDimension = 1, ReadSize = miniBatchSize);dsOutput = arrayDatastore (trainOutputBatchR,…IterationDimension = 1, ReadSize = miniBatchSize);cd =结合(dsInput dsOutput);%为合并后的数据存储创建mini-batch队列兆贝可= minibatchqueue (cd,…MiniBatchSize = MiniBatchSize,…PartialMiniBatch =“丢弃”,…MiniBatchFormat = [“公元前”,“公元前”),…OutputEnvironment = {“cpu”,“cpu”});%根据时间表更新学习速率如果国防部(updateFrameCounter learnRateDropPeriod) = = 0…& & learnRate > minLearnRate learnRate = learnRate * learnRateDropFactor;结束%循环mini-batches而hasdata(兆贝可)& & ~ monitor.Stop%的过程数据mini-batch之一[X, T] =下一个(兆贝可);%评估模型梯度、州和损失[lossTrain,梯度]= dlfeval (@modelLoss netTrain X T);%更新网络参数[netTrain, averageGrad averageSqGrad] =…adamupdate (netTrain、渐变averageGrad averageSqGrad,…迭代,learnRate);迭代=迭代+ 1;如果国防部(迭代,plotUpdateFrequency) = = 0 & & hasdata(兆贝可)%每个plotUpdateFrequency迭代,更新训练监控updateInfo(监控,…LearningRate = learnRate,…帧(numFrames) + =字符串“的”+字符串(maxNumFrames),…迭代字符串(迭代)+ =“的”+字符串(maxNumIterations));recordMetrics(监控、迭代…TrainingLoss = 10 * log10 (lossTrain));班长。进步= 100 *迭代/ maxNumIterations;结束结束netForward。可学的= netTrain.Learnables;%更新记忆多项式DPD系数=估计量(dpdOutputMP paOutputMP);dpdMem。系数=系数;updateFrameCounter = updateFrameCounter + 1;其他的迭代= + iterationsPerBatch迭代;结束updateInfo(监控,…LearningRate = learnRate,…帧(numFrames) + =字符串“的”+字符串(maxNumFrames),…迭代字符串(迭代)+ =“的”+字符串(maxNumIterations));recordMetrics(监控、迭代…TrainingLoss = 10 * log10 (lossTrain),…NMSE = nmseNN,…NMSE_MP = nmseMP);班长。进步= 100 * numFrames / maxNumFrames;numFrames = numFrames + 1;结束如果monitor.Stop班长。状态=“用户终止”;其他的班长。状态=“完成”;结束如果比较字符串(数据源,“倪威仕特”)发布(威仕特)结束清晰的俱乐部其他的%加载保存结果负载onlineTrainedNNDPDR2023anetTrainlearnRatelearnRateDropFactor…learnRateDropPeriodmaxNumEpochsminiBatchSizescalingFactor…symPerFrame监控averageGradaverageSqGrad负载onlineStartNNDPDPADatadpdOutputdpdOutputMPpaOutputpaOutputMPqamRefSymnmseNNnmseMP结束
在线培训的进展表明,NN-DPD可以达到7 dB更好的平均NMSE记忆多项式DPD相比。水平地区损失情节显示地区NN-DPD重量保持不变。
比较神经网络和记忆多项式dpd
比较PA NN-DPD和记忆多项式DPD的输出光谱。情节的功率谱PA NN-DPD和记忆多项式DPD输出。NN-DPD达到更多的边带抑制记忆多项式DPD相比。
pspectrum (paOutput Fs,“MinThreshold”,-120)在pspectrum (paOutputMP Fs,“MinThreshold”,-120)从传奇(“NN-DPD”,“记忆多项式”)标题(“爸爸输出的功率谱”)
计算ACPR和维生素值并显示结果。NN-DPD达到6 dB更好的ACPR和NMSE记忆多项式DPD相比。NN-DPD挣值管理的百分比都是多项式DPD大约一半的内存。
acprNNDPD = localACPR (Fs, paOutput bw);acprMPDPD = localACPR (Fs, paOutputMP bw);evmNNDPD = localEVM (paOutput qamRefSym (:), ofdmParams);evmMPDPD = localEVM (paOutputMP qamRefSym (:), ofdmParams);%创建一个表格来显示结果维生素与= [evmMPDPD; evmNNDPD];acpr = [acprMPDPD; acprNNDPD];nmse = [nmseMP;nmseNN];disp(表(acpr nmse,维生素,…“VariableNames”,…{“ACPR_dB”,“NMSE_dB”,“EVM_percent”},…“RowNames”,…{“记忆多项式DPD”,神经网络DPD的}))
ACPR_dB NMSE_dB EVM_percent ____ ____ ___________记忆多项式DPD DPD -39.237 -33.276 1.5996 -33.695 -27.373 3.07神经网络
附录:PA的神经网络模型
训练一个神经网络PA模型(NN-PA)用于在线模拟。NN-PA有三个完全连接隐藏层,后跟一个完全连接输出层。将记忆深度设置为5和非线性度5。
memDepthPA = 5;%记忆深度的DPD(或PA模型)nonlinearDegreePA = 5;%非线性多项式程度inputLayerDim = 2 * memDepthPA + (nonlinearDegreePA-1) * memDepthPA;numNeuronsPerLayer = 40;层= […featureInputLayer (inputLayerDim“名字”,“输入”)fullyConnectedLayer (numNeuronsPerLayer“名字”,“linear1”)leakyReluLayer (0.01,“名字”,“leakyRelu1”)fullyConnectedLayer (numNeuronsPerLayer“名字”,“linear2”)leakyReluLayer (0.01,“名字”,“leakyRelu2”)fullyConnectedLayer (numNeuronsPerLayer“名字”,“linear3”)leakyReluLayer (0.01,“名字”,“leakyRelu3”)fullyConnectedLayer (2“名字”,“linearOutput”)regressionLayer (“名称”,“regressionoutput”));
创建输入预处理NN-DPDs对象。
inputProcPA = helperNNDPDInputLayer (memDepthPA nonlinearDegreePA);
负荷训练数据的输入和输出。
负载nndpdInitTrainingDatapaOutputdpdInputFspaInput = dpdInput;
预处理输入和输出信号。
scalingFactorPA = 1 /性病(paInput);trainInputMtx =过程(inputProcPA,…paInput * scalingFactorPA);trainOutputBatchC = paOutput * scalingFactorPA;trainOutputBatchR =[真实(trainOutputBatchC)图像放大(trainOutputBatchC)];
训练NN-PA
选择= trainingOptions (“亚当”,…MaxEpochs = 1000,…MiniBatchSize = 4096 * 2,…InitialLearnRate = 2飞行,…LearnRateDropFactor = 0.5,…LearnRateDropPeriod = 50,…LearnRateSchedule =“分段”,…洗牌=“every-epoch”,…ExecutionEnvironment =“cpu”,…情节=“训练进步”,…Verbose = false);
当运行这个示例中,您可以选择使用一个pretrained网络通过设置trainNow
变量来假
。培训是可取的匹配网络仿真配置。如果使用不同的PA,信号带宽,或目标输入功率水平,重新培训网络。训练神经网络在基于Intel®CPU @ 3.60 ghz Xeon®w - 2133大约需要30分钟。
trainNow =假;如果trainNow [netPA trainInfo] = trainNetwork (trainInputMtx、trainOutputBatchR层,选择);% #好< UNRCH >lg = layerGraph (netPA);lg = lg.removeLayers (“regressionoutput”);dlnetPA = dlnetwork (lg);其他的负载paModelNNnetPAdlnetPAmemDepthPAnonlinearDegreePA结束
比较神经网络和记忆多项式不是
比较的PA输出光谱NN-PA和记忆多项式。由于DPD试图模型的逆PA,使用comm.DPD
和comm.DPDCoefficientEstimator
记忆多项式模型通过逆转paOutput
和paInput
的输入估计量
。
估计量= comm.DPDCoefficientEstimator (…DesiredAmplitudeGaindB = 0,…PolynomialType = PolynomialType,…度= nonlinearDegreePA,…MemoryDepth = memDepthPA,…算法=“最小二乘法”);系数=估计量(paOutput paInput);
警告:等级不足,排名= 9,tol = 1.107856 e 03。
paMem = comm.DPD (PolynomialType = PolynomialType,…系数=系数);paOutputMP = paMem (paInput);paInputMtx =过程(inputProcPA, dpdInput * scalingFactorPA);X = dlarray (paInputMtx“公元前”);[Y ~] =前进(dlnetPA X);paOutputNN = (extractdata (Y))”;paOutputNN =双(复杂(paOutputNN (: 1), paOutputNN (:, 2)));%规范化输出信号paOutputNN = paOutputNN / scalingFactorPA;pspectrum (paOutput Fs,“MinThreshold”,-120)在pspectrum (paOutputMP Fs,“MinThreshold”,-120)pspectrum (paOutputNN Fs,“MinThreshold”,-120)从传奇(“原始”,“记忆多项式”,“NN-PA”)标题(“爸爸输出的功率谱”)
计算ACPR, NMSE和维生素值并显示结果。NN-PA模型更接近PA与记忆多项式模型。
acprPA = localACPR (Fs, paOutput bw);acprMPPA = localACPR (Fs, paOutputMP bw);acprNNPA = localACPR (Fs, paOutputNN bw);[evmPA, rxQAMSymPA] = localEVM ([], paOutput ofdmParams);[evmMPPA, rxQAMSymMP] = localEVM ([], paOutputMP ofdmParams);[evmNNPA, rxQAMSymNN] = localEVM ([], paOutputNN ofdmParams);nmsePA = localNMSE (paOutput paOutput);nmseMPPA = localNMSE (paOutputMP paOutput);nmseNNPA = localNMSE (paOutputNN paOutput);%创建一个表格来显示结果维生素与= [evmPA; evmMPPA evmNNPA];acpr = [acprPA; acprMPPA acprNNPA];nmse = [nmsePA; nmseMPPA nmseNNPA];disp(表(acpr nmse,维生素,…“VariableNames”,…{“ACPR_dB”,“NMSE_dB”,“EVM_percent”},…“RowNames”,…{“原始”,“记忆多项式PA”,“神经网络PA”}))
ACPR_dB NMSE_dB EVM_percent ____ ____ ___________原始-28.736负6.7036记忆多项式神经网络PA -30.254 -27.166 5.9301 -28.874 -34.643 6.5409
引用
[1]c·塔沃l .江Sefidi和j . r . Cavallaro“神经网络公司通过反向传播神经网络模型的PA,“2019年第53艾斯洛玛尔会议信号,系统,和电脑,太平洋格罗夫,CA,美国,2019年,页358 - 362,doi: 10.1109 / IEEECONF44664.2019.9048910。
[2]j .太阳,j . Wang l .郭j·杨和g Gui,“自适应深度学习辅助数字预失真考虑动态包络线,“IEEE车辆技术,69卷,没有。4,页4487 - 4491,2020年4月,doi: 10.1109 / TVT.2020.2974506。
[3]j .太阳,w·史,z, j·g . Gui和杨”行为建模和宽带射频功率放大器的线性化使用BiLSTM网络5 g无线系统,“在IEEE车辆技术,68卷,没有。11日,第10356 - 10348页,2019年11月,doi: 10.1109 / TVT.2019.2925562。
附录:辅助函数
输入信号测量和处理
绩效评估和比较
本地函数
归一化均方误差(NMSE)
函数nmseIndB = localNMSE(输入、输出)% localNMSE归一化均方误差(NMSE)% E = localNMSE (X, Y)计算之间的NMSE X和Y。nmse =总和(abs(输入输出)^ 2)/笔(abs(输入)^ 2);nmseIndB = 10 * log10 (nmse);结束
误差矢量幅度(维生素)
函数[rmsEVM, rxQAMSym] = localEVM (paOutput、qamRefSym ofdmParams)% localEVM误差向量幅度(维生素)% (E, Y) = localEVM (X,裁判,PARAMS)计算维生素与信号,X,考虑到%参考信号,REF。基于参数X是OFDM调制。% Downsample和解调波形= ofdmdemod (paOutput ofdmParams.fftLength ofdmParams.cpLength,…ofdmParams.cpLength [1: ofdmParams.NumGuardBandCarrier / 2 + 1…ofdmParams.fftLength-ofdmParams.NumGuardBandCarrier / 2 + 1: ofdmParams.fftLength]”,…OversamplingFactor = ofdmParams.OversamplingFactor);rxQAMSym =波形(:)* ofdmParams.OversamplingFactor;如果isempty (qamRefSym) M = 16;qamRefSym = qammod (qamdemod (rxQAMSym, M), M);结束%计算维生素维生素与= comm.EVM;rmsEVM =维生素(qamRefSym rxQAMSym);结束
相邻信道功率比(ACPR)
函数acpr = localACPR (paOutput、sr、bw)% localACPR相邻信道功率比(ACPR)% = localACPR (X, R, BW)输入信号计算ACPR值X,% BW的假定信号带宽。X的采样率是R。acprModel = comm.ACPR (…“SampleRate”老,…“MainChannelFrequency”0,…“MainMeasurementBandwidth”bw,…“AdjacentChannelOffset”(bw bw),…“AdjacentMeasurementBandwidth”bw);acpr = acprModel(双(paOutput));acpr =意味着(acpr);结束
梯度模型和损失
函数(损失、渐变、状态)= modelLoss(净,X, T)% modelLoss均方误差(MSE)的损失% (L, S, G) = modelLoss(净,X, Y)计算损失,L,状态,,%梯度,G, dlnetwork净输入X和目标输出T。% dlnet使用的输出函数[Y,状态]=前进(净,X);损失= mse (Y, T);梯度= dlgradient(损失、net.Learnables);= extractdata损失(损失);结束
检查是否NN-DPD重量需要更新
函数国旗= updateNNDPDWeights (nmse targetNMSE targetNMSEMargin)% updateNNDPDWeights检查是否需要更新权重% U = updateNNDPDWeights (NMSE,目标,边缘)检查NN-DPD权重%根据测量需要更新NMSE值使用目标% NMSE,目标,和目标NMSE保证金,保证金。保证金保证%更新标志不会改变由于测量噪声。持续的updateFlag如果isempty (updateFlag) updateFlag = true;结束如果updateFlag & & (nmse < targetNMSE - targetNMSEMargin) updateFlag = false;elseif~ updateFlag & & (nmse > targetNMSE + targetNMSEMargin) updateFlag = true;结束国旗= updateFlag;结束
另请参阅
功能
adamupdate
|dlfeval
|featureInputLayer
|fullyConnectedLayer
|reluLayer
|trainNetwork
|trainingOptions
|ofdmmod
(通信工具箱)|ofdmdemod
(通信工具箱)|qammod
(通信工具箱)|qamdemod
(通信工具箱)
对象
arrayDatastore
|dlnetwork
|minibatchqueue
|comm.DPD
(通信工具箱)|comm.DPDCoefficientEstimator
(通信工具箱)|comm.EVM
(通信工具箱)|comm.ACPR
(通信工具箱)