0
点赞
收藏
分享

微信扫一扫

【DPD数字预失真】射频功放的Volterra级数数字预失真系统开发


1.软件版本

MATLAB2013b

2.本算法理论知识

Volterra级数即含记忆的泰勒级数,其数学公式与泰勒级数及其相似,Volterra 级数模型的输出信号,其计算公式是通过输入信号的幂次方来表达的。Volterra级数与泰勒级数不同之处在于Volterra级数具有延迟功能,因此Volterra级数更适合应用在具有记忆效应的功率放大器线性化处理过程中。因此其数学表达式如下:

【DPD数字预失真】射频功放的Volterra级数数字预失真系统开发_sed

变量yk(*)的表达式为:

【DPD数字预失真】射频功放的Volterra级数数字预失真系统开发_参考文献_02

         当输入的信号是复数信号的时候,yk公式可以改写为如下表达式:

 

【DPD数字预失真】射频功放的Volterra级数数字预失真系统开发_sed_03

        由于信号的带宽随着非线性阶数的增加而不断增加,当输入的信号通过Volterra模型时,信号的带宽将随着非线性器件阶数的增加而不断增加。以三阶系统为例,其信号带宽将扩大三倍,其最终的输出信号带宽取决于非线性系统的最高阶数。这就导致了一个宽带系统的输出信号在被捕获之前会被滤波器滤除,在这种情况下,单纯的使用Volterra级数模型,系统的输出信号带宽和输入信号带宽将会产生较大的差异性,并最终影响模型的精度。

       整个带限Volterra级数的数字预失真模型可以通过如下表达式表示:

【DPD数字预失真】射频功放的Volterra级数数字预失真系统开发_sed_04

输出信号y(n)可以表示为:

【DPD数字预失真】射频功放的Volterra级数数字预失真系统开发_sed_05

 

【DPD数字预失真】射频功放的Volterra级数数字预失真系统开发_参考文献_06

 

【DPD数字预失真】射频功放的Volterra级数数字预失真系统开发_数字预失真_07

 3.核心代码

clc;
clear;
close all;
warning off;
addpath 'func\'

%%
%信号产生高旁瓣频谱的信号
load Rs.mat
L = 2^13;%根据电脑速度选择信号长度
fs = 1.8432*10^8;
fc = 7*10^7;%载波70MHZ
ts = 1/fs;
Scal= 8;
Ns = 1;
%original input
Xn = signal(1:L)/max(abs(signal(1:L)))/2;
Xn0 = Xn;
m = length(Xn);

figure;
[psdx,freq] = func_psd(Xn,m,ts,Scal);
plot(freq/1e6,psdx,'g','linewidth',2);
grid on
hold on
axis([-fc/1e6,fc/1e6,-110,0]);

%%
%论文DPD
K = 127;
Wn = [0.01,0.5];%修改0.1的值,获得不同情况下的band limit效果,0.0001~0.1
w = fir1(K,Wn,'bandpass');

K2 = 0;
w2 = [1,1];

%计算C_Lx1,Volterra kernel of the system
G_BL=[ 1.0513+j*0.0904,-0.0542-j*0.2900,-0.9657-j*0.7028,...
-0.0680-j*0.0023, 0.2234+j*0.2317,-0.2451-j*0.3735,...
0.0289-j*0.0054,-0.0621-j*0.0932, 0.1229+j*0.1508];

G_MP=[1.0513+j*0.0904,-0.0542-j*0.2900,-0.9657-j*0.7028,...
-0.0680-j*0.0023, 0.2234+j*0.2317,-0.2451-j*0.3735,...
0.0289-j*0.0054,-0.0621-j*0.0932, 0.1229+j*0.1508];
%计算U_Nx1 = X_NxL * C_Lx1
U_Nx1 = func_volterra0(Xn,w,G_BL,K,Ns);

[psdu,freq] = func_psd(U_Nx1,m,ts,Scal);
plot(freq/1e6,psdu,'b','linewidth',2);
grid on
hold on
axis([-fc/1e6,fc/1e6,-110,0]);


%is the expected inverse output matrix generated from the PA input (the output of the predistorter) u~,
%u~根据公式22计算得到。
%1st:LS
U = func_volterra_Matrix(Xn,w2,G_BL,G_MP,K2,Ns);
%构造Y,LS estimate
Out = func_volterra1(U,w2,G_BL,K2,Ns);
%公式26
ya = (abs(Out.^0)).*Out;
yb = (abs(Out.^2)).*Out;
yc = (abs(Out.^4)).*Out;
Y1 = [ya(3:m);yb(3:m);yc(3:m);ya(2:m-1);yb(2:m-1);yc(2:m-1);ya(1:m-2);yb(1:m-2);yc(1:m-2)];
Y2 = conj(Y1');
Cest0= pinv(Y2)*U(3:m).';
Cest = Cest0;

%LMS算法的参数
step = 0.002;
Xn2 = Xn;
for ii = 1:5
%变步长LMS estimate
U = func_volterra_Matrix(Xn2,w2,G_BL,G_MP,K2,Ns);
Out = func_volterra1(U,w2,G_BL,K2,Ns);

ya = (abs(Out.^0)).*Out;
yb = (abs(Out.^2)).*Out;
yc = (abs(Out.^4)).*Out;
Y1 = [ya(3:m);yb(3:m);yc(3:m);ya(2:m-1);yb(2:m-1);yc(2:m-1);ya(1:m-2);yb(1:m-2);yc(1:m-2)];
Y2 = conj(Y1');

err = (Xn2(3:end) - [Y2*Cest].')/25;
Cest = Cest - [step*err*Y2].';

Xn2 = func_volterra1(U_Nx1,w2,Cest,K2,Ns);
end

Yn2 = func_volterra1(U_Nx1,w2,Cest0,K2,Ns);
%通过功放
U_Nx2 = func_volterra0(Yn2,w,G_BL,K,Ns);

[psdy,freq] = func_psd(U_Nx2,m,ts,Scal);
plot(freq/1e6,psdy,'r','linewidth',2);
grid on
hold on
axis([-fc/1e6,fc/1e6,-110,0]);
legend('标准信号','无预失真时功放频谱','有预失真时功放频谱');
xlabel('Frequency Offset(MHz)');
ylabel('Normalized power Spectral Density (dB)');


save R2.mat freq psdy



 4.操作步骤与仿真结论

【DPD数字预失真】射频功放的Volterra级数数字预失真系统开发_git_08

 5.参考文献

[01]P. Singerl, H. Koeppl. A low-rate  identification  method  for  digital  pre distorters based on Volterra kernel interpolation. The 48th Midwest Symposium on Circuits and Systems. 2005, 2: 1533~1536. 

[02]管鲍. 基于FPGA的DPD设计与实现[D]. 武汉: 武汉邮电科学研究院, 2014.

[03]Hao Lin, Taijun Liu, Yan Ye. Optimization Design of FPGA-Based Look-up-Tables or Linearizing RF Power Amplifiers[J]. 2011, 03(21): 8-11.

A01-145

举报

相关推荐

0 条评论