主要内容

用于数字预失真设计的神经网络-离线训练

这个例子展示了如何使用神经网络应用数字预失真(DPD)来抵消功率放大器(PA)中的非线性影响。本例重点介绍了基于神经网络的DPD (NN-DPD)的离线训练。在这个例子中,你

  • 生成OFDM信号。

  • 发送这些信号通过一个实际的PA和测量输出。

  • 火车一个NN-DPD。

  • 利用NN-DPD对OFDM信号进行预失真,将失真的信号通过实际的PA发送,并测量输出,以评估NN-DPD的有效性。

  • 将结果与内存多项式DPD进行比较。

简介

PAs中的非线性行为会导致严重的信号失真,并对5G NR中通常传输的高频和高带宽信号的无错误接收造成挑战[1].传输信号的DPD是一种用于补偿信号失真的PA非线性的技术。通常情况下,PA的非线性行为是预先描述的,DPD使用某种形式的记忆多项式应用逆预失真[2].例如,参见用于功率放大器非线性补偿的数字预失真的例子。基于神经网络的DPD技术的实验显示,其性能优于传统的记忆多项式DPD [1] [3.] [4].

此图表显示了离线培训工作流。首先,利用PA的输入输出信号训练NN-DPD。然后,使用训练过的NN-DPD。

上面的路径为神经网络训练工作流。在训练过程中,测量PA的输入, u , PA的输出, x .训练神经网络作为PA的逆函数并将其用于DPD,使用 x 作为输入信号和 u 作为目标信号。这种架构也被称为间接学习[7].

下面的路径显示已部署的工作流,在PA之前插入经过训练的NN-DPD。在这种配置中,NN-DPD输入过采样信号 u 和输出, y ,作为PA的输入。巴勒斯坦权力机构的输出 z 是线性化的信号。

NNDPD-Offline.drawio.png

NN-DPD结构

设计一个增广实值时滞神经网络(ARVTDNN),如[4].ARVTDNN有多个完全连接的层和一个增强的输入。

记忆多项式模型已广泛应用于具有记忆效应的行为建模和预失真中。这个方程显示了PA记忆多项式。

x n ) f u n ) ) 0 - 1 k 0 K - 1 c u n - ) | u n - ) | k

输出是输入信号的延时函数, u n ) 的振幅的幂 u n ) 以及它的延迟版本。

因为神经网络可以近似任何函数,只要它每层有足够的层和神经元,你就可以输入 u n ) 对神经网络进行近似 f u n ) ) .神经网络可以输入 u n - ) 而且 | u n - ) | k 降低所需的复杂性。

NN-DPD具有多个全连接层。输入层输入同相分量和正交分量( / )的复基带样本。的 / 样品和 延迟版本被用作输入的一部分,以占用PA模型中的内存。还有,振幅 / 样本至 k t h 功率馈电作为输入,以考虑PA的非线性。

neural_network_dpd.png

在培训期间,

n n ) x n ) ) n n ) x n ) ) o u t n ) u n ) ) o u t n ) u n ) )

在部署(推断)期间,

n n ) u n ) ) n n ) u n ) ) o u t n ) y n ) ) o u t n ) y n ) )

在哪里 而且 分别是实部算子和虚部算子。

生成的训练数据

生成培训、验证和测试数据。利用训练和验证数据对NN-DPD进行训练。使用测试数据评估NN-DPD性能。

选择数据源和带宽

为系统选择数据源。本例使用NXP Airfast LDMOS Doherty PA,该PA连接到本地NI VST,如功率放大器特性的例子。如果您没有访问PA的权限,请运行具有保存数据的示例。

数据源=“保存数据”

生成过采样的OFDM信号

生成基于ofdm的信号来激发PA。这个例子使用了一个类似5g的OFDM波形。选择信号的带宽。选择较大的带宽信号会导致PA引入更多的非线性失真,并从DPD的添加中获得更大的收益。生成六个OFDM符号,其中每个子载波携带一个16-QAM符号,使用ofdmmod而且qammod函数。保存16-QAM符号作为计算EVM性能的参考。为了捕捉高阶非线性的影响,该示例对PA输入进行了7倍的过采样。

如果比较字符串(数据源,“倪威仕特”) bw =100年e6%赫兹numOFDMSym = 6;每帧% 6 OFDM符号M = 16;每个OFDM子载波包含一个16-QAM符号ofdmParams = helperOFDMParameters (bw);ofdmParams。osr = 7;PA输入的%过采样率(paInputTrain qamRefSymTrain, sr) =...helperNNDPDGenerateOFDM (ofdmParams numOFDMSym, M);

将信号通过PA,测量输出信号。较低的目标输入功率值可以减少失真。对于这种设置,当信号预失真时,5 dBm是NI PXIe-4139 SMU中描述的最大值功率放大器特性示例可支持无饱和。

targetInputPower =5% dBmpaOutputTrain = helperNNDPDPAMeasure (paInputTrain targetInputPower, sr);

重复相同的过程以生成验证和测试数据。

%生成验证数据[paInputVal, qamRefSymVal] =...helperNNDPDGenerateOFDM (ofdmParams numOFDMSym, M);paOutputVal = helperNNDPDPAMeasure (paInputVal targetInputPower, sr);生成测试数据[paInputTest, qamRefSymTest] =...helperNNDPDGenerateOFDM (ofdmParams numOFDMSym, M);paOutputTest = helperNNDPDPAMeasure (paInputTest targetInputPower, sr);如果%选择true保存数据工作流保存savedDatabwnumOFDMSymofdmParamstargetInputPower...qamRefSymTrainpaInputTrainpaOutputTrainqamRefSymVal...paInputValpaOutputValqamRefSymTestpaInputTestpaOutputTest% #好< UNRCH >结束elseif比较字符串(数据源,“保存数据”) helperNNDPDDownloadData()加载(“savedDataNIVST100MHz”);结束
开始下载数据文件://www.ru-cchi.com/supportfiles/spc/NNDPD/NNDPD_deeplearning_uploads.zip下载完成。提取文件。提取完成。

5]和[6]描述了归一化输入信号的好处,以避免梯度爆炸问题,并确保神经网络收敛到更好的解决方案。归一化需要得到一个单位标准差和零平均值。对于本例,通信信号的均值已经为零,因此仅对标准差进行归一化。之后,您需要使用相同的比例因子来反规范化NN-DPD输出值。

scalingFactor = 1 /性病(paInputTrain);paInputTrainNorm = paInputTrain * scalingFactor;paOutputTrainNorm = paOutputTrain * scalingFactor;paInputValNorm = paInputVal * scalingFactor;paOutputValNorm = paOutputVal * scalingFactor;paInputTestNorm = paInputTest * scalingFactor;paOutputTestNorm = paOutputTest * scalingFactor;

实施和培训NN-DPD

在训练神经网络DPD之前,选择记忆深度和非线性程度。为便于比较,指定记忆深度为5,非线性多项式度为5,如功率放大器特性示例,并将用于比较性能。然后实现中描述的网络神经网络DPD结构部分。

memDepth = 5;DPD(或PA型号)的内存深度%nonlinearDegree = 5;%非线性多项式度inputLayerDim = 2 * memDepth + (nonlinearDegree-1) * memDepth;numNeuronsPerLayer = 40;lgraph = [...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 (“名字”“输出”));

准备输入数据向量

创建输入向量。在训练和验证过程中,使用PA输出作为NN-DPD输入,使用PA输入作为NN-DPD输出。

为每个时间步创建输入层数组作为训练矩阵,%验证和测试信号。inputProc = helperNNDPDInputLayer (memDepth nonlinearDegree);inputTrainMtx =过程(inputProc paOutputTrainNorm);inputTrainMtx = inputTrainMtx (memDepth + 1:最终,);reset(inputProc) inputValMtx = process(inputProc,paOutputValNorm);inputValMtx = inputValMtx (memDepth + 1:最终,);reset(inputProc) inputTestMtx = process(inputProc,paInputTestNorm);inputTestMtx = inputTestMtx (memDepth + 1:最终,);为每个时间步创建两个元素[I Q]向量的输出真正outputTrainMtx = [(paInputTrainNorm (memDepth + 1:,:)),...图像放大(paInputTrainNorm (memDepth + 1:最终,)));真正outputValMtx = [(paInputValNorm (memDepth + 1:,:)),...图像放大(paInputValNorm (memDepth + 1:最终,)));真正outputTestMtx = [(paOutputTestNorm (memDepth + 1:,:)),...图像放大(paOutputTestNorm (memDepth + 1:最终,)));

训练神经网络

离线训练神经网络使用trainNetwork(深度学习工具箱)函数。方法定义训练选项trainingOptions(深度学习工具箱)命令和设置超参数。使用小型批处理大小为256的Adam优化器。初始学习率为1e-4,每两个周期下降0.95倍。每1000次迭代使用验证来评估训练性能。如果验证精度在五次验证后没有增加,则停止训练。使用实验管理器(深度学习工具箱)优化hyperparameters。

maxEpochs = 200;miniBatchSize = 256;选择= trainingOptions (“亚当”...MaxEpochs = MaxEpochs,...MiniBatchSize = MiniBatchSize,...InitialLearnRate = 1的军医,...LearnRateDropFactor = 0.95,...LearnRateDropPeriod = 2,...LearnRateSchedule =“分段”...洗牌=“every-epoch”...OutputNetwork =“best-validation-loss”...ValidationData = {inputValMtx, outputValMtx},...ValidationFrequency = 1000,...ValidationPatience = 5,...情节=“训练进步”...Verbose = false);

在运行示例时,可以通过设置预先训练的网络trainNow变量来.为了使网络与您的模拟配置相匹配,需要进行培训。如果使用不同的PA、信号带宽或目标输入功率水平,请重新训练网络。在Nvidia®Titan V GPU上训练神经网络大约需要40分钟。

trainNow =如果trainNow netDPD = trainNetwork(inputTrainMtx,outputTrainMtx,lgraph,options);% #好< UNRCH >如果%选择true保存数据工作流保存savedNetnetDPD结束其他的负载(“savedNetNIVST100MHz”);结束

下面展示了使用给定选项的训练过程。由于均方根误差(RMSE)在大约40个周期后不会发生太大变化,您可以将最大周期设置为40,从而将训练时间减少到15分钟以下,而不会损失太多性能。

nndpd_training.PNG

测试NN-DPD

查看NN-DPD的性能。为了测试NN-DPD,将测试信号通过NN-DPD和PA,并检查这些性能指标:

  • 归一化均方误差(NMSE),测量NN-DPD的输入和PA的输出之间的误差

  • 相邻通道功率比(ACPR),在PA的输出处用comm.ACPR系统对象

  • 百分比RMS误差矢量量级(EVM),通过将OFDM解调输出与16-QAM调制符号进行比较来测量comm.EVM系统对象

为NN-DPD和中描述的内存多项式DPD执行这些测试用于功率放大器非线性补偿的数字预失真的例子。

NNDPD-Offline-test.drawio.png

如果比较字符串(数据源,“倪威仕特”)%通过NN-DPD传递信号dpdOutNN =预测(netDPD inputTestMtx);(memDepth dpdOutNN = [0, 1);...双(复杂(dpdOutNN (: 1), dpdOutNN (:, 2))));dpdOutNN = dpdOutNN / scalingFactor;paOutputNN = helperNNDPDPAMeasure (dpdOutNN targetInputPower, sr);通过内存多项式DPD传递信号dpdOutMP = helperNNDPDMemoryPolynomial (paInputTest paInputTrain,...paOutputTrain、nonlinearDegree memDepth);paOutputMP = helperNNDPDPAMeasure (dpdOutMP targetInputPower, sr);如果%选择true保存数据工作流保存savedTestResultspaOutputNNdpdOutNNdpdOutMPpaOutputMP% #好< UNRCH >结束elseif比较字符串(数据源,“保存数据”)负载(“savedTestResultsNIVST100MHz”);结束使用NN-DPD评估性能acprNNDPD = localACPR (paOutputNN、sr、bw);nmseNNDPD = localNMSE (paInputTest paOutputNN);evmNNDPD = localEVM (paOutputNN qamRefSymTest ofdmParams);%在没有DPD的情况下评估性能acprNoDPD = localACPR (paOutputTest、sr、bw);nmseNoDPD = localNMSE (paInputTest paOutputTest);evmNoDPD = localEVM (paOutputTest qamRefSymTest ofdmParams);使用内存多项式DPD评估性能acprMPDPD = localACPR (paOutputMP、sr、bw);nmseMPDPD = localNMSE (paInputTest paOutputMP);evmMPDPD = localEVM (paOutputMP qamRefSymTest ofdmParams);创建一个表来显示结果维生素与= [evmNoDPD; evmMPDPD evmNNDPD];acpr = [acprNoDPD; acprMPDPD acprNNDPD];nmse = [nmseNoDPD; nmseMPDPD nmseNNDPD];disp(表(acpr nmse,维生素,...“VariableNames”...“ACPR_dB”“NMSE_dB”“EVM_percent”},...“RowNames”...“没有DPD”“记忆多项式DPD”神经网络DPD的}))
ACPR_dB NMSE_dB EVM_percent _______ _______ ___________ No DPD -28.837 -22.063 5.859内存多项式DPD -35.547 -29.401 2.3126神经网络DPD -38.79 -31.877 1.8642
sa = helperPACharPlotSpectrum (...[paOutputTest paOutputMP paOutputNN),...“没有DPD”“记忆多项式DPD”...神经网络DPD的},...老,“调制”-50年[-130]);

随着PA的加热,性能特性发生变化。通过PA反复发送突发信号,并绘制系统性能作为时间的函数。每次测量大约需要6秒。每600秒,停止300秒,让PA冷却。从图中可以看出,系统性能随着重复使用而下降,经过冷却期后恢复。这种行为表明,经过一段时间后,PA特性可能发生变化,DPD可能不能提供所需的系统性能,例如最大EVM值。如果EVM值超过允许的最大值,则需要对神经网络进行重新训练,以适应PA特性的变化。

runRepeatedBurstTest =如果比较字符串(数据源,“倪威仕特”) && runRepeatedBurstTest numMeas = 500;measTime = 6;acprNNDPD = 0 (numMeas, 1);nmseNNDPD = 0 (numMeas, 1);evmNNDPD = 0 (numMeas, 1);[acprLine, nmseLine evmLine] = initFigure ();tStart =抽搐;问= 1;p = 1: numMeas%通过NN-DPD传递信号dpdOutNN =预测(netDPD inputTestMtx);(memDepth dpdOutNN = [0, 1);...双(复杂(dpdOutNN (: 1), dpdOutNN (:, 2))));paInput = dpdOutNN / scalingFactor;通过PA传递信号paOutputNN = helperNNDPDPAMeasure(paInput, targetInputPower, sr);使用NN-DPD评估性能acprNNDPD(问)= localACPR (paOutputNN、sr、bw);nmseNNDPD(问)= localNMSE (paInputTest paOutputNN);evmNNDPD(问)= localEVM (paOutputNN, qamRefSymTest ofdmParams);updateFigure (acprLine nmseLine evmLine,...acprNNDPD(问),nmseNNDPD(问),evmNNDPD(问),tStart);CNT = CNT +1;如果国防部(p 100) = = 0q=1:50 pause(measTime) acprNNDPD(cnt) = NaN;nmseNNDPD(问)=南;evmNNDPD(问)=南;updateFigure (acprLine nmseLine evmLine,...acprNNDPD(问),nmseNNDPD(问),evmNNDPD(问),tStart);CNT = CNT +1;结束结束结束其他的负载(“savedRepeatTestResultsNIVST100MHz”);figure numMeas = length(acprNNDPD);t = (0: numMeas-1) * 6;次要情节(1,1)情节(t, acprNNDPD)网格标题(多脉冲NN-DPD性能) ylabel (“ACPR”) subplot(3,1,2) plot(t,nmseNNDPD)网格ylabel (“NMSE”) subplot(3,1,3) plot(t,evmNNDPD)网格ylabel (“维生素”)包含(“t (s)”)结束

图中包含3个轴对象。标题为NN-DPD Performance over Many burst的Axes对象1包含一个类型为line的对象。Axes对象2包含一个类型为line的对象。Axes对象3包含一个类型为line的对象。

进一步的探索

这个例子演示了如何使用PA的测量数据来训练NN-DPD。对于给定的PA、目标输入功率和驱动信号,NN-DPD能够提供比记忆多项式DPD更好的性能。

你可以尝试改变每层神经元的数量,隐藏层的数量和目标输入功率水平,看看这些参数对NN-DPD性能的影响。您也可以尝试不同的输入信号,例如具有不同带宽的OFDM信号。方法还可以生成特定于标准的信号无线波形发生器应用程序。

辅助函数

OFDM信号的一代

信号测量与输入处理“,

绩效评价与比较

本地函数

函数acpr = localACPR (paOutput、sr、bw)相邻信道功率比(ACPR)% A = localACPR(X,R,BW)计算输入信号X的ACPR值,%,假设信号带宽为BW。X的采样率是R。acprModel = comm.ACPR (...“SampleRate”老,...“MainChannelFrequency”0,...“MainMeasurementBandwidth”bw,...“AdjacentChannelOffset”(bw bw),...“AdjacentMeasurementBandwidth”bw);acpr = acprModel (paOutput);acpr =意味着(acpr);结束
函数nmseIndB = localNMSE(输入、输出)规范化均方误差(NMSE)% E = localNMSE(X,Y)计算X和Y之间的NMSE。Nmse = sum(abs(input-output).^2) / sum(abs(input).^2);nmseIndB = 10 * log10 (nmse);结束
函数[rmsEVM, rxQAMSym] = localEVM (paOutput、qamRefSym ofdmParams)误差矢量大小(EVM)% [E,Y] = localEVM(X,REF,PARAMS)计算信号X的EVM,给定参考信号,REF. X是基于PARAMS的OFDM调制。下采样和解调波形= ofdmdemod (paOutput ofdmParams.fftLength ofdmParams.cpLength,...ofdmParams.cpLength [1: ofdmParams.NumGuardBandCarrier / 2 + 1...ofdmParams.fftLength-ofdmParams.NumGuardBandCarrier / 2 + 1: ofdmParams.fftLength]”,...OversamplingFactor = ofdmParams.osr);rxQAMSym =波形(:)* ofdmParams.osr;%计算维生素维生素与= comm.EVM;rmsEVM =维生素(qamRefSym rxQAMSym);结束函数[acprLine, nmseLine evmLine] = initFigure ()初始化重复运行图图subplot(3,1,1) acprLine = animatedline;网格ylabel (“ACPR (dB)”)标题(多脉冲NN-DPD性能) subplot(3,1,2) nmseLine = animatedline;网格ylabel (“NMSE (dB)”) subplot(3,1,3) evmLine =动画线;网格ylabel (“维生素(%)”)包含(“t”)结束函数updateFigure (acprLine、nmseLine evmLine、acprNNDPD nmseNNDPD, evmNNDPD, tStart)%updateFigure更新重复运行图addpoints(acprLine,toc(tStart),acprNNDPD) addpoints(nmseLine,toc(tStart),nmseNNDPD) addpoints(evmLine,toc(tStart),evmNNDPD) drawnowlimitrate结束

参考文献

[1]塔弗、钱斯、江丽文、雅利安·塞菲迪和约瑟夫·r·卡瓦拉罗。神经网络DPD通过反向传播的神经网络模型的PA。2019年第53届信号、系统和计算机Asilomar会议,358-62。美国加利福尼亚州太平洋格罗夫:IEEE, 2019。https://doi.org/10.1109/IEEECONF44664.2019.9048910。

[2]摩根,丹尼斯R.,马正祥,金在亨,迈克尔G.齐尔特,约翰帕斯特兰。射频功率放大器数字预失真的广义记忆多项式模型。《IEEE信号处理汇刊》第54期,no。10(2006年10月):3852-60。https://doi.org/10.1109/TSP.2006.879264。

[3] Wu, Yibo, Ulf Gustavsson, Alexandre Graell i Amat,和Henk Wymeersch。数字预失真残差神经网络在2020年全球通信大会上,01-06。台北,台湾:IEEE, 2020。https://doi.org/10.1109/GLOBECOM42002.2020.9322327。

王东明,Mohsin Aziz, Mohamed Helaoui, Fadhel M. Ghannouchi。用于补偿无线发射机畸变和缺陷的增强实值时滞神经网络。《IEEE神经网络与学习系统汇刊》第30期。1(2019年1月):242-54。https://doi.org/10.1109/TNNLS.2018.2838039。

孙金龙,王娟,郭亮,杨洁,关贵。考虑动态包络的自适应深度学习辅助数字预失真器。《IEEE车辆技术汇刊》第69期。4(2020年4月):4487-91。https://doi.org/10.1109/TVT.2020.2974506。

孙金龙,史文娟,杨祝田,杨洁,关贵。5G无线系统中使用BiLSTM网络的宽带射频功率放大器的行为建模和线性化《IEEE车辆技术汇刊》第68期。11(2019年11月):10348-56。https://doi.org/10.1109/TVT.2019.2925562。

Paaso, Henna,和Aarne Mammela。直接学习和间接学习预失真架构的比较。2008年IEEE无线通信系统国际研讨会,309-13。雷克雅未克:IEEE 2008。https://doi.org/10.1109/ISWCS.2008.4726067。

另请参阅

功能

对象

相关的话题

Baidu
map