让数字预失真的故障排除和微调不再难 必备攻略请查收

【导读】本文介绍ADI ADRV9002的数字预失真(DPD)功能。所用的一些调试技术也可应用于一般DPD系统。首先,概述关于DPD的背景信息,以及用户试验其系统时可能会遇到的一些典型问题。最后,文章介绍在DPD软件工具帮助下可应用于DPD算法以分析性能的调优策略。

简介

数字预失真(通常称为DPD)是无线通信系统中广泛使用的一个算法。DPD旨在抑制通过射频功率放大器(PA)传递宽带信号上的频谱再生,从而提高PA的整体效率。一般而言,在处理高功率输入信号时,PA会出现非线性效应和效率不高的问题。由于频谱再生,相邻频带出现非线性效应和频谱干扰。图1显示在ADRV9002平台上使用TETRA1标准进行DPD校正之前和之后的频谱再生。

dpc算法python dpd算法_dpc算法python

图1.使用ADRV9002的TETRA1 DPD

ADRV9002提供经过功率优化的内部可编程DPD算法,该算法可自定义,以校正PA的非线性效应,从而提高整体邻道功率比(ACPR)。尽管DPD能够为通信系统带来预期的优势,但缺乏经验的人员开始使用DPD时往往困难重重,更别提正确设置了。这主要因为数字预失真涉及多个因素,可能会导致误差,而降低DPD性能。实际上,即使在正确设置硬件后,要确定正确的参数以微调DPD并获得最优解决方案,仍可能具有挑战性。本文旨在帮助在ADRV9002中使用DPD选项的工程师,以及提供一些使用可用参数微调DPD模式以获得最优DPD性能的一般策略。此外,还使用MATLAB®工具帮助用户分析DPD,并消除常见错误,同时提供有关内部DPD操作的一些见解。

启用DPD选项时,ADRV9002可提供高达20MHz的信号带宽。这是因为接收带宽限制在100MHz。DPD通常将以发射带宽5倍的接收带宽工作,因此可以看到和校正三阶和五阶交调信号。ADRV9002支持的最高PA峰值功率信号约为1dB(通常称为P1dB)压缩区。该指标表示PA压缩的程度。如果PA压缩超过P1dB点,则无法保证DPD正常工作。但是,这个要求并不严格;在许多情况下,DPD在超过P1dB点时依旧能够工作,并且仍然提供非常出色的ACPR。但这要具体问题具体分析。一般而言,如果压缩得太严重,DPD可能会出现不稳定和崩溃的问题。在后面,将详细讨论压缩区,包括如何使用MATLAB工具观察当前PA压缩状态。

有关DPD的更多详细信息,请参见UG-1828的“数字预失真”章节。

架构

执行DPD功能有两种基本方法。第一种方法称为间接DPD,即在PA前后捕捉信号。与之不同的是直接DPD方法,即在DPD模块前和PA后捕捉信号。每种方法的优势和劣势不在本文章的讨论范围内。间接DPD通过分析PA前后的信号了解其非线性特性,并在DPD模块上执行反转。直接DPD分析DPD前和PA后的信号,并通过在DPD模块上应用预失真,消除二者之间的误差。用户应该了解,ADRV9002使用的是间接方法以及与之相关的影响。另外,请务必了解,在使用MATLAB工具时,捕捉数据也是采用间接方法。

图2显示了ADRV9002的简化DPD操作方框图。输入信号u(n)进入DPD模块。DPD将对信号进行预失真处理,并生成x(n)。在这里,称之为发射捕捉,不过这实际上是发射信号的预失真版本。然后,信号经过PA,成为y(n),信号最终发送到空中。这里将y(n)称为接收捕捉,不过这实际上是PA后的发射信号。然后,y(n)反馈到接收器端口,用作观察接收器。本质上,DPD引擎将使用捕捉的x(n)和y(n),然后生成系数,在DPD的下一次迭代中将应用这些系数。

dpc算法python dpd算法_开发语言_02

图2.间接DPD的简化方框图

工作模式

ADRV9002在DPD上支持TDD和FDD操作。在TDD模式下,每个发射帧都会更新DPD。这意味着,在发射帧期间,接收器将充当观察路径。在FDD中,由于发射器和接收器同时运行,因此需要专用接收器通道。ADRV9002中的2T2R能够在2T2R/1T1R TDD和1T1R FDD模式下支持DPD。

DPD模式

结构

以下等式显示在发射路径中实现的DPD模式。

dpc算法python dpd算法_数据_03

其中:

u(n)是DPD的输入信号,x(n)是DPD的输出信号

T是DPD模式的总分支数

ψt是用于实现分支t查找表(LUT)的多项式函数,lt是幅度延迟

kt是数据延迟

at,lt,i是DPD引擎计算的系数

bt,lt,i是启用或禁用项的开关

i是多项式项的指数和幂

用户可为每个分支配置多项式的项数量。ADRV9002提供3个记忆项分支和1个交叉项分支,每个分支的阶从0到7。

模式选择

用户可选择ADRV9002提供的默认模式选项(如图3所示),该模式应该适合大多数常见应用。或者,用户可通过启用和禁用项,选择自己的模式。前3个分支(0到2)表示记忆项,其中分支1是中心分支。分支3是交叉项分支。

注意,为了与记忆项分支区分,分支3(或交叉项分支)不应启用零阶项。

dpc算法python dpd算法_扩展器_04

图3.DPD模式多项式的项

LUT大小:用户可设置LUT大小。ADRV9002提供两个选项,256和512。选择512大小,用户将获得更好的量化噪声电平,从而获得更好的ACPR,因为一般而言,较大的尺寸将提供更好的信号分辨率。对于窄带应用,ADI建议使用512作为默认选项。256可用于宽带,因为噪声电平不那么严格,并且可以改进计算和功率。

预LUT缩放:用户可设置预LUT缩放模块,以便对输入数据进行缩放,使其更适合压缩扩展器。压缩扩展器选择来自发射器的信号,对其进行压缩,以适合8位LUT地址。根据输入信号电平,用户可调整该值,以优化LUT利用率。其值可以在(0,4)的范围内设置,步长为0.25。在本文的最后一个部分,提供了更多有关压缩扩展器的内容。

配置

dpc算法python dpd算法_dpc算法python_05

图4.启用DPD的基本配置

为了执行DPD,用户将必须在PA上启用外部环回路径,然后设置反馈功率,以确保其未超出范围。注意,这是峰值功率,不是平均功率。功率太强或者太弱都会影响DPD性能。用户还需要设置外部路径延迟,可使用External_Delay_Measurement.py获取。用户可在IronPython文件夹下的ADRV9002评估软件安装路径中找到该脚本。

注意,只需为高采样速率曲线设置外部延迟(例如,LTE 10MHz)。对于低采样速率曲线(TETRA1 25kHz),用户可将其设置为0。在本文的后面部分,将使用该软件工具来观察捕捉数据,以了解外部延迟的影响。

其他配置

dpc算法python dpd算法_dpc算法python_06

图5.DPD上的其他配置

用户可配置样本数量。默认情况下,用户可设置4096个样本。建议使用默认值。在大多数情况下,默认的4096个样本将为DPD提供最优解决方案。

其他功率缩放是更高级的参数。在大多数情况下,建议对ADRV9002使用默认值4。该参数与内部相关矩阵有关。根据实验,默认值为ADI测试的现有波形和PA提供最佳性能。在少数情况下,如果输入信号幅度极小或极大,用户可尝试将该值调整成较小和较大的值,以使相关矩阵维持适当的条件数,从而获得更稳定的解决方案。

Rx/Tx规范化:用户应将接收器/发射器规范化设置为数据呈线性的区域。在图6中,线性区域用红色显示。在该区域,数据的幂没有到达压缩区,并且足够高,可用于计算增益。选择该区域后,DPD可估算发射器和接收器的增益,然后继续对算法进行进一步处理。在大多数情况下,-25dBFS至-15dBFS应适合大多数标准PA。但是,用户仍然应该留意,因为特殊PA可能具有截然不同的AM/AM曲线形状,在这种情况下,将需要进行适当的修改。本文后面部分将对此进行详细说明。

dpc算法python dpd算法_开发语言_07

图6.典型AM/AM曲线。线性区域用红色显示

设置

硬件设置

dpc算法python dpd算法_扩展器_08

图7.典型DPD硬件方框图

典型设置如图7所示。在信号进入PA之前,需要低通滤波器,以防止出现LO信号谐波。在某些情况下,如果内部LO相位噪声性能无法满足应用需求,则可能需要外部LO。在这种情况下,外部LO源需要与DEV_ CLK同步。近带噪声要求更严格的窄带DPD通常需要外部LO。通常建议在PA前提供一个可变衰减器,用于防止对PA造成损害。反馈信号应具有适当的衰减,以便按照上一部分中讨论的方式设置峰值功率。

软件设置

IronPython

下载IronPython库,以便在GUI上执行IronPython代码。

dpc算法python dpd算法_matlab_09

图8.IronPython GUI窗口

在这里,用户可以在GUI的IronPython窗口中运行dpd_capture.py,如图8所示,它与MATLAB工具一起提供,以获取发射器和接收器的捕捉数据。DPD采样速率也包含在捕捉的文件中。

注意,该脚本应在启动或校准状态下运行。

MATLAB工具

MATLAB工具分析从dpd_capture.py中捕捉的数据。该工具将帮助检查信号完整性、信号对齐、PA压缩水平,最后是DPD的微调。

MATLAB工具需要MATLAB Runtime。首次安装需要一些时间下载。安装完成后,用户可加载IronPython脚本捕捉的数据,然后观察图形,如图9所示。

dpc算法python dpd算法_matlab_10

图9.MATLAB DPD分析仪

此外,用户还可设置数据规范化的高/低阈值,然后按“重新加载”以查看变化。

首先,在时域中绘制规范化的发射器和接收器数据。用户可以放大图形来观察发射器和接收器的对齐状态。这里只显示了数据的实部,但用户也可轻松绘制虚部。实部和虚部通常应该对齐或不对齐。

然后是发射器和接收器频谱——蓝色是发射器,红色是接收器。注意,这是间接DPD——发射器数据将是预失真数据,而不是SSI端口上的发射器数据路径。

接下来,有两条AM/AM曲线,这两条曲线均在线性和dB坐标系中。这些是有关DPD性能和PA压缩状态的重要指标。

买电子元器件现货上唯样商城

AM/PM曲线和接收器/发射器相位差也会被提供。

此外,还有高阈值和低阈值数字。这些数字应该与ADRV9002 TES评估软件中的设置相匹配。

注意,由于提供了API来捕捉数据,因此如果需要,用户可以开发自己的图形和分析模型。该工具提供用于分析DPD的一些常见检查。API包括:

adi_ADRV9002_dpd_CaptureData_Read,这是读取DPD捕捉数据,必须在校准或启动状态下运行。

adi_ADRV9002_DpdCfg_t → dpdSamplingRate_Hz,这是DPD采样速率,是只读参数。

典型问题

DPD可能受许多不同因素的影响。因此,请务必确保用户考虑并检查了列出的所有潜在问题。在考虑所有问题之前,用户应确保硬件正确连接。

发送数据过载

dpc算法python dpd算法_dpc算法python_11

图10.DPD的简化硬件方框图

图10显示了ADRV9002实现DPD的简化示意框图。来自接口的发射器数据可能会使DAC过载。如果DAC过载,发射器的RF信号在PA介入之前就已失真。因此,请务必确保发射器数据不会使DAC过载。

用户可通过GUI观察发射器DAC是否过载。图11显示TETRA1 25kHz波形。峰值与数字满量程仍相距甚远。对于ADRV9002,建议与满量程至少保持几dB,避免导致DAC过载。很难量化用户应该回退多少——这是因为DPD将尝试执行预失真,预失真信号将为“峰值扩展”,因而可能会导致DAC过载。这取决于DPD如何应对特定PA——一般而言,PA压缩得越厉害,所需的峰值扩展空间就越大。

dpc算法python dpd算法_数据_12

图11.时域中的一部分TETRA1标准波形

接收器数据过载

另一个常见错误是接收器数据导致反馈DAC过载。造成该错误的原因是,没有足够的衰减返回到接收器端口。这可以从调试工具中观察到,造成的影响是接收器数据被裁剪,因此,发射器和接收器无法有效对齐,导致DPD出现计算错误。DPD通常会表现得非常糟糕,从而使整个频谱中的噪声增加。

dpc算法python dpd算法_扩展器_13

图12.接收器数据过驱

接收器数据欠载

与接收器过载相比,这个问题常常被忽视。造成该问题的原因是,没有正确设置反馈衰减。用户可能给反馈路径提供过多的衰减,这导致接收器数据太小。默认情况下,建议对ADRV9002使用-18dBm峰值,因为它能够将数据从模拟转换为数字,达到已知良好的DPD功率电平。但用户可以根据需求调整该数字。用户应该了解,DPD反馈接收器使用的衰减器与常规接收器不同,其步长更高。衰减水平通过用户设置的峰值功率电平进行调整。-23dBm是最低功率电平(0衰减)——如果超出该范围,将得到低功率电平,这会影响DPD性能。根据经验,用户应确保始终正确测量和设置反馈功率。很多时候,用户往往会尝试不同的功率电平,但忘记正确设置反馈功率,从而导致该问题。

TDD与FDD

TDD模式下的DPD必须在自动状态机中运行。使用TES进行评估时,在手动TDD模式下,用户仍可启用DPD,但性能会很差。这是因为DPD只能基于帧工作。在手动TDD模式下,帧的长度将由发射/接收启用信号切换来确定。换言之,每次播放和停止就是一个帧。但是,在人工切换的时间内,PA已转变为不同的温度状态。因此,如果不使用可以频繁切换发射启用信号的自动TDD模式,将无法维持DPD状态。然而,在FDD模式下,DPD应正常进行。

例如,用户可能希望使用TETRA1,它遵循类似TDD的帧方案(实际上是TDM-FDD)。因此,不应该直接选择TDD模式并手动检查DPD,并且DPD往往表现糟糕。相反,用户可以使用“定制FDD”配置文件,选择与TETRA1相同的采样速率和带宽,或者用户可以设置TETRA1 TDD帧定时,并使用自动TDD模式。这两种方法都可以提供比手动TDD更好的性能。

发射器/接收器未对齐

ADRV9002将尝试对齐发射器和接收器数据的时间。当用户捕捉到数据时,用户期望数据是对齐的。延迟测量在初始校准时完成。但是,对于高采样速率曲线,需要单独完成更精确的子样本对齐。

dpc算法python dpd算法_开发语言_14

图13.未对齐的DPD捕捉

dpc算法python dpd算法_matlab_15

图14.放大LTE10的发射器和接收器实部数据(未对齐)

DPD是自适应算法,需要计算两个实体(即发射器和接收器)的误差。在计算发射器和接收器的误差之前,需要正确对齐这两个信号——尤其是在使用高采样速率曲线(例如,LTE10)的情况下。对齐至关重要,因为样本之间的间隔非常小。因此,用户需要运行脚本External_Delay_Measurement.py来提取外部路径延迟。可在“板配置”→“路径延迟”下方输入该数字。

dpc算法python dpd算法_开发语言_16

图15.IronPython外部延迟测量

如果未对齐发射器和接收器数据,造成的影响是用户将观察到噪声更大的AM/AM曲线。

dpc算法python dpd算法_扩展器_17

图16.对齐的DPD捕捉

设置了路径延迟数字后,可以观察到,AM/AM和AM/PM曲线更干净,噪声更小。相位差也明显减小。

dpc算法python dpd算法_开发语言_18

图17.放大的LTE10发射器和接收器实部数据(对齐)

PA过载

每个PA对于能够处理的压缩程度都有自己的规范。虽然数据手册中通常提供P-1dB数据,但实际上,仍建议对DPD进行准确测量,以确保压缩点位于P-1dB。通过DPD软件,用户能够查看基于捕捉数据的AM/AM曲线,从而观察压缩点与P-1dB的接近程度。

dpc算法python dpd算法_开发语言_19

图18.PA过载数据

dpc算法python dpd算法_dpc算法python_20

图19.以dB为单位呈现的AM/AM曲线(已放大)

但是,如果信号超出P-1dB,这可能会导致DPD不稳定,或者甚至中断,频谱跳转到非常高的电平,再也不会降下来。在图19中,峰值时的压缩远超出1dB区域,曲线的形状也开始变得更平坦。这表示PA被过驱,为了增加输出功率,将提供更多输入,以支持输出功率电平。此时,如果用户决定继续增加输入功率,DPD性能将下降。

一般策略模式选择与调整

间接DPD就是在PA前后捕捉数据,而DPD引擎将尝试模拟PA的相反效应。LUT用于使用系数应用该效应,该模式基于多项式。这意味着,DPD更像是曲线拟合问题,用户将尝试使用各项来“曲线拟合”非线性效应。区别在于,曲线拟合问题拟合的是单个曲线,而DPD还必须考虑记忆效应。ADRV9002有3个记忆分支,和1个用于对DPD LUT进行建模的交叉分支。

dpc算法python dpd算法_扩展器_21

图20.记忆项和交叉项映射

图20显示ADRV9002提供的3个记忆分支和1个交叉分支。一般策略与曲线拟合问题类似。用户可从基线着手,然后添加和移除项。一般而言,中心分支必须存在(分支1)。用户可以逐个添加和移除项,以测试DPD的效应。然后,用户可以继续添加两个记忆分支(分支0和2),以添加记忆效应校正的效果。注意,由于ADRV9002有两个侧分支,因此这些分支应该相同——也就是,应该对称。此外,添加和移除项时,必须逐个操作。最后,用户可以试验交叉项。交叉项从数学的角度完成曲线拟合问题,因而提供更好的DPD性能。

注意,用户不得通过将项留空来跳过项,因为这将导致DPD出现不良行为。另请注意,用户不得在交叉项分支上设置第0项,因为从数学的角度来看,这也是无效的。

dpc算法python dpd算法_dpc算法python_22

图21.无效的模式项设置

高级调整

压缩扩展器和预LUT缩放模块

在上一部分中,已提到了压缩扩展器。首次阅读用户指南时,这一概念可能会令人困惑,不知道它是什么意思或者该选择什么(256还是512)。压缩扩展器的目的是压缩输入数据,并将其放入LUT。

dpc算法python dpd算法_扩展器_23

图22.压缩扩展器——估算平方根的形状

压缩扩展器的一般形状是平方根,在这里,I/Q数据传入。在将这些数据放入LUT之前,等式√(i(n)2+q(n)2)将用于从之前的等式中获得信号幅度。然而,由于平方根运算对速度的要求很高,并且还需要将其映射到LUT(8位或9位),因此需使用压缩扩展器。图22是理想的平方根曲线。此处将不显示实际实现方案,但简言之,这将是对平方根曲线的估算。

了解数据如何放入LUT后,可以更加明智地开始调整数据。ADRV9002可选择8位(256)或9位(512)作为LUT大小。更大的LUT意味着数据的地址位置加倍。这意味着,数据的分辨率更高,并且一般而言,量化噪声电平更好。对于窄带应用,由于噪声非常重要,因此建议始终选择512。对于宽带应用,由于噪声电平没那么重要,因此可使用任一选项。但是,如果选择512,消耗的功率会略高,计算速度会比较慢。

直方图和CFR

在DPD配置部分,曾简要提及预缩放。该参数用于为LUT提供大量输入数据。需要大量输入数据的原因是,在某些情况下,DPD未正确使用数据。对于此类PA压缩问题,真正被压缩并导致问题的是高幅度样本。因此,不能平等对待所有样本;相反,要重点关注高幅度样本。

看一下TETRA1标准波形直方图(参见图23和图24)。可以看到,大多数值出现在中高幅度区域。这是因为TETRA1标准使用D-QPSK调制方案,结果是信号将获得恒定包络。峰值功率与平均功率之间没有太大的区别。

这正是DPD所需要的。如前所述,DPD将捕捉更高幅度的样本,因此将更好地表征PA的行为。

dpc算法python dpd算法_dpc算法python_24

图23.TETRA1幅度直方图

dpc算法python dpd算法_dpc算法python_25

图24.TETRA1功率直方图

现在,以类似方式来看LTE10标准。LTE使用OFDM调制方案,将成百上千的子载波组合在一起。这里可再次看到LTE10的幅度和功率。可以轻松观察到与TETRA1的区别,即峰值离主平均值非常远。

dpc算法python dpd算法_数据_26

图25.LTE10幅度直方图,没有CFR

dpc算法python dpd算法_dpc算法python_27

图26.LTE功率直方图,没有CFR

在功率直方图中(参见图26),如果放大远端,可以看到,仍有非常高的峰值出现,但概率非常低。对于DPD,这是非常不利的。原因有二。

首先,高峰值(高幅度信号)的低概率计数将使PA的效率极其低下。例如,LTE PAPR约为11dB。这是很大的不同。为了避免损坏PA,输入电平将需要大幅回退。因此,PA没有用其大部分增益能力来提高功率。

其次,高峰值也是在浪费LUT的利用率。由于这些高峰值,LUT将为它们分配大量资源,并为大部分数据仅分配一小部分LUT。这会降低DPD性能。

dpc算法python dpd算法_dpc算法python_28

图27.放大高幅度样本

削峰(CFR)技术将信号峰值向下移动到更能接受的水平。这通常用于OFDM类型的信号。ADRV9002不包含片内CFR,因此需要在外部实现该功能。为此,在ADRV9002 TES评估软件中,还包含CFR版本的LTE波形。CFR_sample_ rate_15p36M_bw_10M.csv如图28所示。可以看到,由于CFR,在高功率时,信号的峰值被限制在特定水平(在末端倾斜)。这将PAPR有效地推动到6.7dB,差值约为5dB。CFR的操作将对数据造成“损害”,因为EVM将降级。但是,与整个波形相比,高电平幅度峰值出现的概率非常小,将带来巨大的优势。

dpc算法python dpd算法_matlab_29

图28.LTE10幅度直方图,有CFR

dpc算法python dpd算法_dpc算法python_30

图29.LTE10功率直方图,有CFR

结论

DPD是一种复杂的算法,许多人都觉得很难用。为了获得最优结果,需要花费大量精力设置硬件和软件,并且要小心谨慎。ADI的ADRV9002提供集成式片内DPD,将显著降低复杂性。ADRV9002还配备有DPD软件工具,可以帮助用户分析其DPD性能。

关于ADI公司

ADI是全球领先的高性能模拟技术公司,致力于解决最艰巨的工程设计挑战。凭借杰出的检测、测量、电源、连接和解译技术,搭建连接现实世界和数字世界的智能化桥梁,从而帮助客户重新认识周围的世界。详情请浏览ADI官网www.analog.com/cn。

作者简介

Wangning Ge是一名产品应用工程师,工作地点在新泽西州萨默塞特。他于2019年加入ADI公司。在此之前,他在诺基亚(以前的阿尔卡特朗讯)担任软件工程师。在DPD算法设计和基站射频应用领域,Wangning拥有丰富的经验。他负责ADRV9001系列收发器产品。

作者:ADI产品应用工程师Wangning Ge