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

Posted fpga&matlab

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DPD数字预失真射频功放的Volterra级数数字预失真系统开发相关的知识,希望对你有一定的参考价值。

1.软件版本

MATLAB2013b

2.本算法理论知识

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

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

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

 

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

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

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

 

 

 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.操作步骤与仿真结论

 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

以上是关于DPD数字预失真射频功放的Volterra级数数字预失真系统开发的主要内容,如果未能解决你的问题,请参考以下文章

基于GRNN神经网络的数字预失真系统的FPGA实现

数字预失真技术基本原理

数字功放和模拟功放差异介绍

音频功放基础知识

无记忆多项式数字预失真技术

音频功放的失真的原因分析及测量