Table of contents
1. Algorithm description
DPD is an acronym for digital predistortion, a term familiar to many radio frequency (RF) engineers, signal processing enthusiasts, and embedded software developers. DPD is ubiquitous in cellular communication systems, enabling power amplifiers (PA s) to efficiently deliver maximum power to antennas. As 5G increases the number of antennas in base stations and the spectrum becomes more crowded, DPD is starting to emerge as a key technology enabling the development of cost-effective and spec-compliant cellular systems.
Many of us have our own unique perspective on DPD, whether from a purely mathematical standpoint or a more constrained implementation on a microprocessor. You may be an engineer responsible for evaluating DPD performance in RF base station products, or an algorithm developer curious to see how mathematical modeling techniques are implemented in real systems.
When the base station radio frequency device outputs an RF signal (see Figure 1), it needs to be amplified first, and then transmitted through the antenna. We use an RF PA to do this (amplification). Ideally, a PA takes an input signal and outputs a higher power signal proportional to its input. During this operation, the PA remains as energy efficient as possible, converting most of the DC power supplied to the amplifier into signal output power.
Volterra series is a functional series, which was first proposed by Italian mathematician Volterra in 1880 as an extension of Taylor series. Volterra used this functional series to study the solutions of certain integral equations and integral-differential equations. It was not until 1942 that N.Wiene, a famous American scientist and the founder of cybernetics, used the Volterra functional series for the analysis of nonlinear systems for the first time. Later others continued the work of N.Wiene: using Volterra functional series for the development of nonlinear operator theory and nonlinear equation and system analysis. After the seventies of the 20th century, the Volterra functional series began to receive people's attention.
The Volterra series is the Taylor series with memory, and its mathematical formula is similar to the Taylor series. The output signal of the Volterra series model is expressed by the power of the input signal. The difference between the Volterra series and the Taylor series is that the Volterra series has a delay function, so the Volterra series is more suitable for use in the linearization process of power amplifiers with memory effects.
2. Simulation effect preview
The matlab2022a simulation results are as follows:
3.MATLAB core program
................ load PA_OUT_-3dbm.txt Xn =[PA_OUT__3dbm(1:2^13,1) + sqrt(-1)*PA_OUT__3dbm(1:2^13,2)]'; %original input % Xn = 0.4*signal(1:L)/max(abs(signal(1:L))); Xn0 = Xn; m = length(Xn); figure; %% %paper DPD %w(.)This band-limiting function can be a linear filter K = 127; Wn = [0.36,0.7];%Modify 0.1 value, to obtain different situations band limit Effect w = fir1(K,Wn,'stop'); K2 = 0; w2 = [1,1]; %calculate 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]; U_Nx1 = Xn; [psdu,freq] = func_psd(U_Nx1,m,ts,Scal); plot(freq/1e6,psdu,'b','linewidth',2); grid on hold on %is the expected inverse output matrix generated from the PA input (the output of the predistorter) u~, %u~Calculated according to Equation 22. for ii = 1:3 if ii == 1 U = func_volterra_Matrix(Xn,w,G_BL,K,Ns); Out = func_volterra1(U,w2,G_BL,K2,Ns); else U = func_volterra_Matrix(Xn,w,Cest,K,Ns); Out = func_volterra1(U,w2,Cest,K2,Ns);%structure Y,LS estimate end %Formula 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'); Cest = inv(Y2.'*Y2)*Y2.'*U(3:m).'; Xn = func_volterra1(U_Nx1,w,Cest,K,Ns); end %predistortion Yn2 = func_volterra1(Xn0,w,Cest,K,Ns); %through amplifier U_Nx2 = func_volterra0(Yn2,w,G_BL,K,Ns); .......................... 01_144m
4. Complete MATLAB