# comm_MemorylessNonlinearity
将无记忆非线性应用于复基带信号
函数库: TyCommunication
# 描述
comm_MemorylessNonlinearity 系统对象对基带信号施加无记忆非线性损伤。使用此系统对象可以对射频 (RF) 发射机或接收机中信号放大引起的无记忆非线性损伤进行建模。
要将无记忆非线性损伤应用于复基带信号:
创建 comm_MemorylessNonlinearity 对象并设置其属性;
使用 step 调用对象。
# 构造
# 语法
mnl = comm_MemorylessNonlinearity()
mnl = comm_MemorylessNonlinearity(; Name = Value)
# 说明
mnl = comm_MemorylessNonlinearity( ) 创建对 RF 非线性损伤进行建模的无记忆非线性系统对象。
mnl = comm_MemorylessNonlinearity(; Name = Value) 使用一个或多个名称值对参数指定属性。例如,Method= "Saleh model" 将建模方法设置为 Saleh 方法。示例
# 属性
除非另有说明,否则属性是不可更改的,这意味着在调用对象后不能更改其值。对象在调用时锁定,可以使用 release 函数将其解锁。
如果属性是可调的,则可以随时更改其值。
Method - 非线性建模方法
"Cubic polynomial"(默认)| "Hyperbolic tangent" | "Saleh model" | "Ghorbani model" | "Modified Rapp model" | "Lookup table"
数据类型: String
InputScaling - 输入信号缩放因子
0(默认)| 标量
可调谐: Yes
依赖
若要启用此属性,请将 Method 属性设置为 "Saleh model" 或 "Ghorbani model"。
数据类型: Float64
LinearGain - 线性增益
0(默认)| 标量
可调谐: Yes
依赖
若要启用此属性,请将 Method 属性设置为 "Cubic polynomial"、"Hyperbolic tangent" 或 "Modified Rapp model"。
数据类型: Float64
TOISpecification - 三次多项式的三阶非线性规范
"IIP3"(默认) | "OIP3" | "IP1dB" | "OP1dB" | "IPsat" | "OPsat"
依赖
若要启用此属性,请将 Method 属性设置为 "Cubic polynomial"。
数据类型: String
IIP3 - 三阶输入截距点
30(默认值)| 标量
可调谐: Yes
依赖
若要启用此属性,请将 Method 属性设置为 "Cubic polynomial" 或 "Hyperbolic tangent"。
数据类型: Float64
OIP3 - 三阶输出截距点
30(默认值)| 标量
可调谐: Yes
依赖
若要启用此属性,请将 Method 属性设置为 "Cubic polynomial",并将 TOISpecification 属性设置为 "OIP3"。
数据类型: Float64
IP1dB - 一个 dB 输入压缩点
30(默认值)| 标量
可调谐: Yes
依赖
若要启用此属性,请将 Method 属性设置为 "Cubic polynomial",并将 TOISpecification 属性设置为 "IP1dB"。
数据类型: Float64
OP1dB - 一个 dB 输出压缩点
30(默认值)| 标量
可调谐: Yes
依赖
若要启用此属性,请将 Method 属性设置为 "Cubic polynomial",并将 TOISpecification 属性设置为 "OP1dB"。
数据类型: Float64
IPsat - 输入饱和点
30(默认值)| 标量
可调谐: Yes
依赖
若要启用此属性,请将 Method 属性设置为 "Cubic polynomial",并将 TOISpecification 属性设置为 "IPsat"。
数据类型: Float64
OPsat - 输出饱和点
30(默认值)| 标量
可调谐: Yes
依赖
若要启用此属性,请将 Method 属性设置为 "Cubic polynomial",并将 TOISpecification 属性设置为 "OPsat"。
数据类型: Float64
AMPMConversion - 线性 AM/PM 转换因子
10(默认值)| 标量
可调谐: Yes
依赖
若要启用此属性,请将 Method 属性设置为 "Cubic polynomial" 或 "Hyperbolic tangent"。
数据类型: Float64
AMAMParameters - AM/AM 参数
[2.1587 1.1517] | [8.1081 1.5413 6.5202 -0.0718] | 向量
当将 Method 属性设置为 "Saleh model" 时,此属性必须是指定 alpha 和 beta 值的双元素向量。在这种情况下,默认值为 [2.1587 1.1517];
当将 Method 属性设置为 "Ghorbani model" 时,该属性必须是指定
、 、 和 值的四元素向量。在这种情况下,默认值为 [8.1081 1.5413 6.5202 -0.0718]。
可调谐: Yes
依赖
若要启用此属性,请将 Method 属性设置为 "Saleh model" 或 "Ghorbani model"。
数据类型: Float64
AMPMParameters - AM/PM 参数
[4.0033 9.1040] | [4.6645 2.0965 10.88 -0.003] | 向量
当将 Method 属性设置为 "Saleh model" 时,此属性必须是指定 alpha 和 beta 值的双元素向量。在这种情况下,默认值为[4.0033 9.1040];
当将 Method 属性设置为 "Ghorbani model" 时,此属性必须是指定
、 、 和 值的四元素向量。在这种情况下,默认值为[4.6645 2.0965 10.88 -0.003]。
可调谐: Yes
依赖
若要启用此属性,请将 Method 属性设置为 "Saleh model" 或 "Ghorbani model"。
数据类型: Float64
PowerLowerLimit - 输入功率下限
10(默认)| 标量
以 dBm 为单位的输入功率下限,指定为小于 PowerUpperLimit 属性值的标量。AM/PM 转换对 [PowerLowerLimit,PowerUpperLimit] 范围内的输入功率值进行线性缩放。如果输入信号功率低于输入功率下限,则由 AM/PM 转换产生的相移为零。
可调谐: Yes
依赖
若要启用此属性,请将 Method 属性设置为 "Cubic polynomiall" 或 "Hyperbolic tangent"。
数据类型: Float64
PowerUpperLimit - 输入功率上限
Inf (默认) | 标量
以 dBm 为单位的输入功率上限,指定为大于 PowerLowerLimit 属性值的标量。AM/PM 转换对 [PowerLowerLimit,PowerUpperLimit] 范围内的输入功率值进行线性缩放。如果输入信号功率高于输入功率上限,则由 AM/PM 转换产生的相移是恒定的。
可调谐: Yes
依赖
若要启用此属性,请将 Method 属性设置为 "Cubic polynomiall" 或 "Hyperbolic tangent"。
数据类型: Float64
OutputScaling - 输出信号缩放因子
0(默认值)| 标量
可调谐: Yes
依赖
若要启用此属性,请将 Method 属性设置为 "Saleh model" 或 "Ghorbani model"。
数据类型: Float64
Smoothness - 振幅平滑因子
0.5(默认值)| 标量
PhaseGainRadian - 修正 Rapp 模型的相位增益
0(默认值)| 标量
可调谐: Yes
依赖
若要启用此属性,请将 Method 属性设置为 "Modified Rapp model"。
数据类型: Float64
PhaseSaturation - 修正 Rapp 模型的相位饱和
0.88(默认)| 正标量
可调谐: Yes
依赖
若要启用此属性,请将 Method 属性设置为 "Modified Rapp model"。
数据类型: Float64
PhaseSmoothness - 修正 Rapp 模型的相位平滑度
3.43(默认值)| 正标量
可调谐: Yes
依赖
若要启用此属性,请将 Method 属性设置为 "Modified Rapp model"。
数据类型: Float64
OutputSaturationLevel - 输出饱和电平
1(默认值)| 正标量
Table - 放大器特性查找表 × 矩阵
放大器特性查找表,指定为实测功率放大器 (PA) 特性的
由该特性定义的测量 PA 特性用于计算 AM/AM(单位 dBm/dBm)和 AM/PM(单位 deg/dBm)非线性损伤特性。
提示
为了确定表属性中指定值范围之外的任何
可调谐: Yes
依赖
若要启用此属性,请将 Method 属性设置为 "Lookup table"。
数据类型: Float64
ReferenceImpedance - 参考阻抗
1(默认值)| 正标量
可调谐: Yes
数据类型: Float64
# 用法
# 语法
outsig = step(mnl, insig)
# 说明
outsig = step(mnl, insig) 对输入 RF 基带信号施加无记忆非线性损伤。示例
# 输入参数
insig - 输入 RF 基带信号
标量 | 向量 | 矩阵
数据类型: Float64
# 输出参数
outsig - 输出 RF 基带信号
标量 | 向量 | 矩阵
数据类型: ComplexF64
# 对象函数
要使用对象函数,请将系统对象指定为第一个输入参数。例如,要释放名为 obj 的 System 对象的系统资源,请使用以下语法:
release(obj)
comm_MemorylessNonlinearity 专用
| 函数 | 说明 |
|---|---|
| release | 释放资源并允许更改系统对象属性值和输入特性 |
| MemorylessNonlinearity_plot | 绘制非线性 AM/AM 和 AM/PM 特性 |
对系统对象通用的操作
| 函数 | 说明 |
|---|---|
| step | 运行系统对象算法 |
| release | 释放资源并允许更改系统对象属性值和输入特性 |
| reset | 重置系统对象的内部状态 |
# 示例
显示线性和非线性输入功率电平下的放大信号
初始化仿真
初始化仿真变量,创建无记忆非线性放大器损伤和星座图的系统对象。为了使星座图仅显示功率压缩(而不显示相位旋转),请将无记忆非线性放大器损伤配置为 AM-PM 失真设置为零。
using TyCommunication
using TyMath
rng = MT19937ar(1234)
M = 16
sps = 4
pindBm = [12 25]
gain1 = 10.0
amplifier = comm_MemorylessNonlinearity(;
Method="Cubic polynomial", LinearGain=gain1, AMPMConversion=0.0, ReferenceImpedance=50
)
refConst = qammod((0:(M - 1)), M)
axisLimits = [-gain1 gain1]
constdiag = comm_ConstellationDiagram(;
NumInputPorts=2,
ChannelNames=["Linear", "Nonlinear"],
ShowLegend=true,
ReferenceConstellation=refConst,
XLimits=axisLimits,
YLimits=axisLimits,
)
放大并绘制信号
将 16-QAM 应用于随机数据的输入信号。放大信号并使用 comm_MemorylessNonlinearity 系统对象的函数 plot 来显示输出功率和相位响应曲线。第一输入信号功率电平为 12dBm,并且处于放大器功率特性曲线的线性区域中;第二输入信号功率电平为 25dBm,并且处于放大器功率特性曲线的非线性区域中。
pin = 10 .^ ((pindBm .- 30) ./ 10)
data = randi(rng, [0 M - 1], 1000, 1)
modOut = qammod(data, M; UnitAveragePower=true) * sqrt.(pin * amplifier.ReferenceImpedance)
ampOut = step(amplifier, modOut)
MemorylessNonlinearity_plot(amplifier)
将 AWGN 添加到两个放大的信号中,并显示信号的星座图。
snr1 = 25
noisyLinOut = awgn(rng, ampOut[:, 1], snr1, "measured")
noisyNonLinOut = awgn(rng, ampOut[:, 2], snr1, "measured")
constDiagram = step(constdiag, noisyLinOut, noisyNonLinOut)

非线性放大器增益压缩
绘制非线性放大器对 16QAM 信号的增益压缩图。
指定调制阶数和每个符号的采样参数。
using TyCommunication
using TyMath
using TyDSPSystem
rng = MT19937ar(5489)
M = 16
sps = 4
创建一个具有 30 dB 三阶输入截取点的无记忆非线性系统对象,为非线性放大器建模。创建一个升余弦发射滤波器系统对象。
amplifier = comm_MemorylessNonlinearity(; TOISpecification="IIP3", IIP3=30.0)
txfilter = comm_RaisedCosineTransmitFilter(;
RolloffFactor=0.3, FilterSpanInSymbols=6, OutputSamplesPerSymbol=sps, Gain=sqrt(sps)
)
以 dBm 为单位指定输入功率。将输入功率转换为 W 并初始化增益矢量。
pindBm = -5:25
pin = 10 .^ ((pindBm .- 30) / 10)
gain = zeros(length(pindBm), 1)
执行主处理循环,其中包括以下步骤。
生成随机数据符号;
对数据符号进行调制,并调整信号的平均功率;
对调制信号进行滤波;
放大信号;
测量增益。
for k in 1:length(pin)
data = randi(rng, [0 (M - 1)], 1000, 1)
modSig = qammod(data, M; UnitAveragePower=true) * sqrt(pin[k])
filtSig = step(txfilter, modSig)
ampSig = step(amplifier, filtSig)
gain[k] = 10 * log10(var(ampSig) / var(filtSig))
end
绘制放大器增益与输入信号功率的函数关系图。输入功率为 18.5 dBm 时出现 1 dB 增益压缩点。要提高 1 dB 压缩点,可增加三阶截取点 amplifier.IIP3。
arrayplot = dsp_ArrayPlot(;
PlotType="Line", XLabel="Power In (dBm)", XOffset=-5, YLimits=[-5 5]
)
step(arrayplot, gain)

将功率放大器非线性的 Saleh 模型应用于 16-QAM 信号
输入信号的平均功率归一化。
using TyCommunication
using TyMath
rng = MT19937ar(1234)
function avgPow2MinD(avgPow, M)
nBits = log2(M)
if (mod(nBits, 2) == 0)
sf = (M - 1) / 6
else
if (nBits > 4)
sf = ((31 * M / 32) - 1) / 6
else
sf = ((5 * M / 4) - 1) / 6
end
end
minD = sqrt(avgPow / sf)
return minD
end
生成平均功率为 10mW,参考阻抗为 1Ω 的 16-QAM 数据,并通过非线性功率放大器 (PA) 传输数据。
M1 = 16
data = randi(rng, [0, (M1 - 1)]', 1000, 1)
avgPow1 = 1e-2
minD = avgPow2MinD(avgPow1, M1)
gain1 = 10.0
创建无记忆非线性系统对象,并指定 Saleh model 方法。
amplifier = comm_MemorylessNonlinearity(; Method="Saleh model")
生成调制符号并通过 PA 非线性模型。
modData = (minD / 2) .* qammod(data, M1)
y = step(amplifier, modData)
生成结果的散点图。
scatterplot(y)

利用自定义功率放大器的非线性特性对 16QAM 信号进行失真处理
通过将 Method 属性设置为 "Lookup table",对 16QAM 信号应用非线性功率放大器 (PA) 特性。
定义调制阶数、每符号采样和输入功率的参数。创建随机数据。
using TyCommunication
using TyMath
using TyPlot
rng = MT19937ar(5489)
# 调制阶数
M = 16
# 每符号样本数
sps = 4
# 输入功率
pindBm = -2
# 用瓦特表示功率
pin = 10^((pindBm - 30) / 10)
data = randi(rng, [0 (M - 1)], 1000, 1)
refdata = 0:(M - 1)
refconst = qammod(refdata, M; UnitAveragePower=true)
创建无记忆非线性系统对象、发送滤波器系统对象和星座图系统对象。无内存非线性系统对象使用默认查找表值。
amplifier = comm_MemorylessNonlinearity(; Method="Lookup table")
txfilter = comm_RaisedCosineTransmitFilter(;
RolloffFactor=0.3, FilterSpanInSymbols=6, OutputSamplesPerSymbol=sps, Gain=sqrt(sps)
)
constellation = comm_ConstellationDiagram(;
SamplesPerSymbol=4, ReferenceConstellation=refconst, Title="Amplified/Distorted Signal"
)
调制随机数据。对调制符号进行滤波并应用非线性放大器特性。
modSig = qammod(data, M; UnitAveragePower=true) * sqrt(pin)
filtSig = step(txfilter, modSig)
ampSig = step(amplifier, filtSig)
计算输入和输出信号电平以及相移。
poutdBm = (20 * log10.(abs.(ampSig))) .+ 30
simulated_pindBm = (20 * log10.(abs.(filtSig))) .+ 30
phase = angle.(ampSig .* conj(filtSig)) * 180 / pi
绘制 AM/AM 特性、AM/PM 特性和星座结果图。
figure()
subplot(1, 2, 1)
plot(simulated_pindBm, poutdBm, ".")
hold("on")
plot(amplifier.Table[:, 1], amplifier.Table[:, 2], "."; markersize=15)
xlabel("Input Power (dBm)")
ylabel("Output Power (dBm)")
grid("on")
title("AM/AM Characteristics")
leglabels = ["Simulated results", "Measurement"]
legend(leglabels...; loc="north")
subplot(1, 2, 2)
plot(simulated_pindBm, phase, ".")
hold("on")
plot(amplifier.Table[:, 1], amplifier.Table[:, 3], "."; markersize=15)
legend(leglabels...; loc="north")
xlabel("Input Power (dBm)");
ylabel("Output Phase Shift (degrees)")
grid("on")
title("AM/PM Characteristics")
tightlayout()
生成放大信号和参考星座的星座图。与参考星座图相比,非线性放大器的特性会导致放大信号星座图被压缩。
step(constellation, ampSig)

利用实测的功率放大器非线性特性对 16QAM 信号进行失真处理
通过将 Method 属性设置为 "Lookup table",对 16QAM 信号应用非线性功率放大器 (PA) 特性。
定义调制阶数、每符号采样和输入功率的参数。创建随机数据。
using TyCommunication
using TyMath
using TyPlot
function pa_performance_characteristics()
HAV08_Table = [
-35 60.53 0.01
-34 60.53 0.01
-33 60.53 0.08
-32 60.54 0.08
-31 60.55 0.1
-30 60.56 0.08
-29 60.57 0.14
-28 60.59 0.19
-27 60.6 0.23
-26 60.64 0.21
-25 60.69 0.28
-24 60.76 0.21
-23 60.85 0.12
-22 60.97 0.08
-21 61.12 -0.13
-20 61.31 -0.44
-19 61.52 -0.94
-18 61.76 -1.59
-17 62.01 -2.73
-16 62.25 -4.31
-15 62.47 -6.85
-14 62.56 -9.82
-13 62.47 -12.29
-12 62.31 -13.82
-11 62.2 -15.03
-10 62.15 -16.27
-9 62 -18.05
-8 61.53 -20.21
-7 60.93 -23.38
-6 60.2 -26.64
-5 59.38 -28.75
]
paChar = HAV08_Table
paChar[:, 2] = paChar[:, 1] + paChar[:, 2]
return paChar
end
rng = MT19937ar(5489)
# 调制阶数
M = 16
# 每符号样本数
sps = 4
# 输入功率
pindBm = -8
# 用瓦特表示功率
pin = 10^((pindBm - 30) / 10)
data = randi(rng, [0 (M - 1)], 1000, 1)
refdata = 0:(M - 1)
refconst = qammod(refdata, M; UnitAveragePower=true)
paChar = pa_performance_characteristics()
创建无记忆非线性系统对象、发送滤波器系统对象和星座图系统对象。无内存非线性系统对象使用默认查找表值。
amplifier = comm_MemorylessNonlinearity(; Method="Lookup table", Table=paChar)
txfilter = comm_RaisedCosineTransmitFilter(;
RolloffFactor=0.3, FilterSpanInSymbols=6, OutputSamplesPerSymbol=sps, Gain=sqrt(sps)
)
constellation = comm_ConstellationDiagram(;
SamplesPerSymbol=4,
Title="Amplified/Distorted Signal",
NumInputPorts=2,
ReferenceConstellation=refconst,
ShowLegend=true,
ChannelNames=["Filtered signal", "Amplified signal"],
)
调制随机数据。对调制符号进行滤波并应用非线性放大器特性。
modSig = qammod(data, M; UnitAveragePower=true) * sqrt(pin)
filtSig = step(txfilter, modSig)
ampSig = step(amplifier, filtSig)
计算输入和输出信号电平以及相移。
poutdBm = (20 * log10.(abs.(ampSig))) .+ 30
simulated_pindBm = (20 * log10.(abs.(filtSig))) .+ 30
phase = angle.(ampSig .* conj(filtSig)) * 180 / pi
绘制 AM/AM 特性、AM/PM 特性和星座结果图。
figure()
subplot(1, 2, 1)
plot(simulated_pindBm, poutdBm, ".")
hold("on")
plot(amplifier.Table[:, 1], amplifier.Table[:, 2], "."; markersize=15)
xlabel("Input Power (dBm)")
ylabel("Output Power (dBm)")
grid("on")
title("AM/AM Characteristics")
leglabel = ["Simulated results", "Measurement"]
legend(leglabel...; loc="south")
subplot(1, 2, 2)
plot(simulated_pindBm, phase, ".")
hold("on")
plot(amplifier.Table[:, 1], amplifier.Table[:, 3], "."; markersize=15)
legend(leglabel...; loc="south")
xlabel("Input Power (dBm)")
ylabel("Output Phase Shift (degrees)")
grid("on")
title("AM/PM Characteristics")
tightlayout()
为了进行星座比较,对放大信号和滤波信号进行归一化处理。生成滤波信号和放大信号的星座图。与滤波信号星座图相比,非线性放大器的特性会压缩放大信号星座图。
# 归一化滤波信号
filtSig = filtSig / mean(abs.(filtSig))
# 归一化放大信号
ampSig = ampSig / mean(abs.(ampSig))
step(constellation, filtSig, ampSig)

# 参考文献
[1] Saleh, A.A.M. “Frequency-Independent and Frequency-Dependent Nonlinear Models of TWT Amplifiers.” IEEE Transactions on Communications 29, no. 11 (November 1981): 1715–20.
[2] Ghorbani, A., and M. Sheikhan. "The Effect of Solid State Power Amplifiers (SSPAs) Nonlinearities on MPSK and M-QAM Signal Transmission." In 1991 Sixth International Conference on Digital Processing of Signals in Communications, 193–97, 1991.
[3] Rapp, Ch. "Effects of HPA-Nonlinearity on a 4-DPSK/OFDM-Signal for a Digital Sound Broadcasting System." In Proceedings Second European Conf. on Sat. Comm. (ESA SP-332), 179–84. Liege, Belgium, 1991.
[4] Choi, C., et.al. "RF impairment models for 60 GHz-band SYS/PHY simulation." IEEE 802.15-06-0477-01-003c. November 2006.
[5] Perahia, E. "TGad Evaluation Methodology." IEEE 802.11-09/0296r16. January 20, 2010.
[6] Kundert, Ken. "Accurate and Rapid Measurement of IP2 and IP3." The Designer Guide Community. May 22, 2002.