管中窥豹数字预失真(DPD)
数字预失真在通信领域发挥了巨大的作用,对提高功放效率、改善误码率起了不可忽略的作用,广泛运用与通信、雷达等各种领域。但是对于普通用户,它显得及其高深神秘。今天就用这个短文,管中窥豹,权当科普。
一、数字预失真原理
1.1 非线性失真问题
功率放大器(PA)在无线通信系统中存在非线性特性,当输入信号幅度较大时,会产生:
- 带内失真(EVM恶化)
- 带外频谱再生(ACPR指标恶化)
- 谐波分量
y P A ( n ) = ∑ k = 1 K a k x ( n ) ∣ x ( n ) ∣ k − 1 + e ( n ) y_{PA}(n) = \sum_{k=1}^{K} a_k x(n)|x(n)|^{k-1} + e(n) yPA(n)=k=1∑Kakx(n)∣x(n)∣k−1+e(n)
1.2 DPD核心思想
通过在PA前级联预失真器,使得整体系统呈现线性特性:
x
D
P
D
(
n
)
=
f
−
1
(
x
(
n
)
)
x_{DPD}(n) = f^{-1}(x(n))
xDPD(n)=f−1(x(n))
y
P
A
(
n
)
=
f
(
x
D
P
D
(
n
)
)
≈
G
⋅
x
(
n
)
y_{PA}(n) = f(x_{DPD}(n)) \approx G\cdot x(n)
yPA(n)=f(xDPD(n))≈G⋅x(n)
二、Volterra级数
研究预失真就躲不开神奇Volterra级数,其在预失真技术中有着举足轻重的作用。
1. Volterra级数的数学定义
Volterra级数是描述非线性时变系统的泛函级数展开,可视为泰勒级数在时域中的扩展。其核心思想是将系统输出表示为输入信号的多重积分(或离散时间的多重求和),形式为:
y ( n ) = ∑ k = 1 ∞ ∑ m 1 = 0 M ⋯ ∑ m k = 0 M h k ( m 1 , … , m k ) ∏ i = 1 k x ( n − m i ) y(n) = \sum_{k=1}^{\infty} \sum_{m_1=0}^{M} \cdots \sum_{m_k=0}^{M} h_k(m_1, \dots, m_k) \prod_{i=1}^{k} x(n - m_i) y(n)=k=1∑∞m1=0∑M⋯mk=0∑Mhk(m1,…,mk)i=1∏kx(n−mi)
其中:
- h k ( m 1 , … , m k ) h_k(m_1, \dots, m_k) hk(m1,…,mk):第 k k k阶Volterra核(多维系数),描述系统对 k k k阶非线性项的响应。
- M M M:记忆深度,决定系统依赖过去输入的时间范围。
简化形式(离散时间)
实际应用中常截断到有限阶数
K
K
K和记忆深度
M
M
M:
y
(
n
)
=
h
0
+
∑
k
=
1
K
∑
m
1
=
0
M
⋯
∑
m
k
=
0
M
h
k
(
m
1
,
…
,
m
k
)
∏
i
=
1
k
x
(
n
−
m
i
)
y(n) = h_0 + \sum_{k=1}^{K} \sum_{m_1=0}^{M} \cdots \sum_{m_k=0}^{M} h_k(m_1, \dots, m_k) \prod_{i=1}^{k} x(n - m_i)
y(n)=h0+k=1∑Km1=0∑M⋯mk=0∑Mhk(m1,…,mk)i=1∏kx(n−mi)
2. Volterra级数与泰勒级数的关键区别
特性 | 泰勒级数 | Volterra级数 |
---|---|---|
适用范围 | 无记忆非线性系统 | 含记忆效应的非线性系统 |
输入依赖 | 仅当前输入 x ( n ) x(n) x(n) | 当前及历史输入 x ( n − m ) x(n-m) x(n−m) |
数学结构 | 单变量多项式展开 | 多变量多重求和/积分 |
参数复杂度 | O ( K ) O(K) O(K) | O ( K ⋅ M K ) O(K \cdot M^K) O(K⋅MK)(指数增长) |
3.Volterra级数在功放建模中的作用
3.1 功放的非线性与记忆效应
- 非线性失真:输出信号幅度与输入不成正比,产生谐波和交调失真。
- 记忆效应:输出不仅依赖当前输入,还与历史输入相关,主要由以下因素引起:
- 电路中的电抗元件(电容/电感)
- 温度漂移
- 电源调制效应
3.2 Volterra模型的优势
- 联合建模能力:同时捕捉非线性与记忆效应。
- 物理可解释性:各阶核对应不同非线性阶次的动态响应。
- 灵活性:通过调整阶数 K K K和记忆深度 M M M平衡精度与复杂度。
4.Volterra级数在预失真中的应用
4.1 预失真基本原理
构建预失真器
f
−
1
(
⋅
)
f^{-1}(\cdot)
f−1(⋅),使得级联系统满足:
f
−
1
(
x
(
n
)
)
→
[
P
A
]
→
G
⋅
x
(
n
)
f^{-1}(x(n)) \rightarrow [PA] \rightarrow G \cdot x(n)
f−1(x(n))→[PA]→G⋅x(n)
其中
G
G
G为期望的线性增益。
4.2 基于Volterra的预失真实现步骤
- 正向建模:通过测量数据辨识PA的Volterra核 { h k } \{h_k\} {hk}。
- 逆模型求解:求取预失真器的Volterra核
{
w
k
}
\{w_k\}
{wk},使得:
w k ∗ h k ≈ δ ( k ) w_k \ast h_k \approx \delta(k) wk∗hk≈δ(k) - 实时补偿:将输入信号通过预失真器后再送入PA。
4.3 核辨识方法
常用最小二乘法(LS)或递归最小二乘(RLS):
# 伪代码:Volterra核辨识
def identify_volterra(x, y, K, M):
# 构建回归矩阵X(包含所有乘积项x(n-m1)x(n-m2)...)
X = construct_volterra_matrix(x, K, M)
# 求解最小二乘问题
h = np.linalg.lstsq(X, y, rcond=None)[0]
return h
5.Volterra模型的简化形式
5.1 对角记忆多项式(常见简化)
仅保留相同延迟项的乘积:
y
(
n
)
=
∑
k
=
1
K
∑
m
=
0
M
a
k
m
x
(
n
−
m
)
∣
x
(
n
−
m
)
∣
k
−
1
y(n) = \sum_{k=1}^{K} \sum_{m=0}^{M} a_{km} x(n-m) |x(n-m)|^{k-1}
y(n)=k=1∑Km=0∑Makmx(n−m)∣x(n−m)∣k−1
参数复杂度降为
O
(
K
⋅
M
)
O(K \cdot M)
O(K⋅M)。
5.2 广义记忆多项式(GMP)
添加交叉记忆项:
y
(
n
)
=
∑
k
=
1
K
∑
m
=
0
M
a
k
m
x
(
n
−
m
)
∣
x
(
n
−
m
)
∣
k
−
1
+
∑
k
=
2
K
∑
m
=
1
M
∑
l
=
1
L
b
k
m
l
x
(
n
)
∣
x
(
n
−
m
)
∣
k
−
1
y(n) = \sum_{k=1}^{K} \sum_{m=0}^{M} a_{km} x(n-m)|x(n-m)|^{k-1} + \sum_{k=2}^{K} \sum_{m=1}^{M} \sum_{l=1}^{L} b_{kml} x(n)|x(n-m)|^{k-1}
y(n)=k=1∑Km=0∑Makmx(n−m)∣x(n−m)∣k−1+k=2∑Km=1∑Ml=1∑Lbkmlx(n)∣x(n−m)∣k−1
6. Volterra模型的局限性
- 参数爆炸:三阶全Volterra模型需 M 3 M^3 M3个参数( M = 3 M=3 M=3时需27个系数)。
- 辨识难度:高阶核需要大量训练数据且对噪声敏感。
- 实时性挑战:硬件实现时乘加运算量巨大。
7. 应用案例:5G Massive MIMO功放线性化
7.1 场景特点
- 宽带信号(100MHz+)
- 高峰均比(PAPR > 10dB)
- 多通道耦合效应
7.2 Volterra-DPD效果
指标 | 无DPD | 传统MP-DPD | Volterra-DPD |
---|---|---|---|
ACLR (dBc) | -28 | -45 | -52 |
EVM (%) | 8.7 | 2.1 | 1.3 |
计算复杂度 | - | 1× | 3.5× |
三、常用数学模型
预失真工程中常用的都是Volterra级数的简化模型,是Volterra级数的特殊形式,但是他们在性能损失较小的情况下,大幅度缩减了计算量,有着相当的实际工程价值。
3.1 无记忆多项式模型
y ( n ) = ∑ k = 1 K a k x ( n ) ∣ x ( n ) ∣ k − 1 y(n) = \sum_{k=1}^{K} a_k x(n)|x(n)|^{k-1} y(n)=k=1∑Kakx(n)∣x(n)∣k−1
- K K K:非线性阶数
- a k a_k ak:多项式系数
3.2 记忆多项式模型(最常用)
y ( n ) = ∑ m = 0 M ∑ k = 1 K a m k x ( n − m ) ∣ x ( n − m ) ∣ k − 1 y(n) = \sum_{m=0}^{M} \sum_{k=1}^{K} a_{mk} x(n-m)|x(n-m)|^{k-1} y(n)=m=0∑Mk=1∑Kamkx(n−m)∣x(n−m)∣k−1
- M M M:记忆深度
- K K K:非线性阶数
3.3 广义记忆多项式
y ( n ) = ∑ m = 0 M ∑ k = 1 K a m k x ( n − m ) ∣ x ( n − m ) ∣ k − 1 + ∑ m = 1 M ∑ k = 2 K b m k x ( n ) ∣ x ( n − m ) ∣ k − 1 y(n) = \sum_{m=0}^{M} \sum_{k=1}^{K} a_{mk} x(n-m)|x(n-m)|^{k-1} + \sum_{m=1}^{M} \sum_{k=2}^{K} b_{mk} x(n)|x(n-m)|^{k-1} y(n)=m=0∑Mk=1∑Kamkx(n−m)∣x(n−m)∣k−1+m=1∑Mk=2∑Kbmkx(n)∣x(n−m)∣k−1
四、仿真
python 仿真代码如下:
import numpy as np
import matplotlib.pyplot as plt
# 参数设置
Fs = 100e6 # 采样率
N = 8192 # 信号长度
M = 3 # 记忆深度
K = 5 # 非线性阶数
PA_GAIN = 10 # 放大器增益
# 生成输入信号(QPSK调制)
x = np.random.randn(N) + 1j*np.random.randn(N)
x = x/np.max(np.abs(x)) # 归一化
# PA非线性模型(Rapp模型)
def power_amplifier(x_in, p=2):
return x_in / (1 + (np.abs(x_in)**p))**(1/(2*p))
# DPD参数估计(最小二乘法)
def dpd_identification(u, d, M, K):
X = np.zeros((len(u)-M, M*K), dtype=complex)
for m in range(M):
for k in range(K):
X[:, m*K + k] = u[M-m-1:-1-m] * np.abs(u[M-m-1:-1-m])**k
w = np.linalg.lstsq(X, d[M:], rcond=None)[0]
return w
# 应用DPD预失真
def apply_dpd(x_in, w, M, K):
x_out = np.zeros_like(x_in)
for n in range(M, len(x_in)):
for m in range(M):
for k in range(K):
x_out[n] += w[m*K + k] * x_in[n-m] * np.abs(x_in[n-m])**k
return x_out
# 主仿真流程
pa_out = power_amplifier(x * PA_GAIN) # PA输出
dpd_coeff = dpd_identification(pa_out, x, M, K) # DPD系数估计
x_dpd = apply_dpd(x, dpd_coeff, M, K) # 应用预失真
pa_dpd_out = power_amplifier(x_dpd * PA_GAIN) # PA+DPD输出
# 频谱分析
def plot_spectrum(signal, title):
f = np.fft.fftfreq(len(signal), 1/Fs)
idx = np.argsort(f)
plt.plot(f[idx]/1e6, 20*np.log10(np.abs(np.fft.fft(signal))[idx]))
plt.title(title)
plt.xlabel('Frequency (MHz)')
plt.ylabel('Power (dB)')
plt.figure(figsize=(12,6))
plt.subplot(211)
plot_spectrum(pa_out, 'Without DPD')
plt.subplot(212)
plot_spectrum(pa_dpd_out, 'With DPD')
plt.tight_layout()
plt.show()
五、结果分析
- 频谱对比:应用DPD后带外频谱泄露明显降低
- ACPR改善:典型改善可达10-15dB
- EVM提升:误差矢量幅度显著降低
六、工程实践建议
- 模型选择:根据PA特性选择记忆深度和非线性阶数
- 参数辨识:建议使用LS、RLS或神经网络方法
- 实时更新:需设计自适应算法跟踪PA特性变化
扩展阅读方向:
- 神经网络DPD
- 基于Volterra级数的模型
- 混合数字模拟预失真技术