hdl implementation of digital predistorter -凯发k8网页登录
this example shows the implementation of a digital predistorter (dpd) model that is optimized for hdl code generation and hardware implementation. the predistortion mechanism is executed in two stages. in the first stage, a set of dpd coefficients are estimated based on the input and output data of the power amplifier (pa). in the second stage, the input data of the pa is predistorted based on the estimated dpd coefficients and provided as new input to the pa. this example demonstrates a system-level simulation in which the digital predistorter subsystem generates hdl code, while the dpd coefficient estimation generates c/c code. this example model supports only normal and accelerator simulation modes.
digital predistortion
digital predistortion is a baseband signal processing technique that is used for correcting impairments in radio frequency (rf) power amplifiers. these impairments cause out-of-band emissions or spectral regrowth and in-band distortion, which results in an increased bit error rate (ber) and a decreased throughput of the system. power amplifiers cause unwanted effects in the system due to their nonlinear behavior. communication systems using orthogonal frequency division multiplexing (ofdm), such as a wireless local area network (wlan), worldwide interoperability for microwave access (wimax), long term evolution (lte), and 5g new radio (nr), are vulnerable to these unwanted effects. a precorrection is applied on the signal so that the cascade of the dpd and pa is close to an ideal, linear, and memoryless system. this linearization can improve pa power efficiency and can be more spectrum efficient. this figure shows the top-level structure of the example.
run this command to open the example.
modelname = 'dpdhdlexample';
open_system(modelname);
baseband ofdm transmitter
the baseband ofdm transmitter subsystem generates a baseband signal and provides that signal as input data to the digital predistorter subsystem. the ofdmtx
function in this subsystem generates an ofdm transmitter waveform with synchronization, reference, header, pilots, and data signals and returns txwaveform
, txgrid
, and diagnostics
using the transmitter parameter set txparam. for more information about the ofdmtx
function, see the example. you can also replace the baseband ofdm transmitter subsystem with any custom transmitter to provide data to the digital predistorter subsystem. this figure shows the baseband input signal generation for this example. run this command to open the baseband ofdm transmitter subsystem.
load_system(modelname);
open_system([modelname '/baseband ofdm transmitter']);
coefficients estimation
the rpem coeff estimation subsystem estimates a set of coefficients by collecting data from the input and output of the pa. these coefficients are used to distort the signal before the power amplifier. pa characteristics vary over time and operating conditions, so an adaptive recursive prediction error method (rpem) algorithm is used to estimate the dpd coefficients. the number of coefficients to be estimated depends on the memory depth and polynomial degree of the pa. in this example, because the total number of coefficients that need to be estimated is 25, the memory depth and polynomial degree of the pa are set to 5. for more information about the rpem, see [ 1 ]. to generate c/c code for rpem coeff estimation subsystem, use the slbuild
command. run this command to open the rpem coeff estimation subsystem.
load_system(modelname);
open_system([modelname '/rpem coeff estimation']);
digital predistorter
the digital predistorter subsystem distorts the input data using the coefficients estimated by the rpem coeff estimation subsystem. the dpd design in this example is based on a memory polynomial, which corrects the nonlinearities and memory effects in the pa. the estimated coefficients and the generated input data are provided as input to the dpd for applying predistortion. the input data is first placed in a shift register based on the memory depth. second, this vector is concatenated with the nonlinear products of the data depending on the polynomial degree. this concatenation forms a vector of 25 that means memory depth times degree elements. the dot product of the obtained vector and estimated coefficients provides the predistorted input that is fed as input to pa after upsampling. run this command to open the digital predistorter subsystem.
load_system(modelname);
open_system([modelname '/digital predistorter']);
rf blocks configuration
this example has a control switch to enable or disable predistortion and coefficient estimation. if you enable the switch, the example provides the output data from the digital predistorter subsystem as input to rf blocks. otherwise, the example provides the output data from the baseband ofdm transmitter subsystem as input to rf blocks as in-phase (i), quadrature-phase (q) samples. these i/q samples are upsampled to 2.4 ghz and provided as input to the pa. the coefficient matrix required by the pa is preloaded based on the standard-compliant lte signal with a sample rate of 15.36 mhz. these coefficients are stored in a mat file, and the values are loaded while initializing the example. in the other path, the data is passed through a low noise amplifier (lna) and is down-converted before providing it to the rpem coeff estimation subsystem.
baseband ofdm receiver
the baseband ofdm receiver subsystem collects the down-converted data and provides it as an input to the ofdmrx
function. this function performs carrier frequency offset estimation and correction, frame synchronization, ofdm demodulation, channel estimation, channel equalization, phase offset correction, and decodes the transmitted bits. for more information about the ofdmrx
function, see the example.
verification and results
run the model. by default, the digital predistorter and rpem coeff estimation are enabled. if you disable the dpd, the error vector magnitude (evm) increases, and the spectral regrowth in adjacent channels increases. the constellation and spectrum analyzer diagrams show the results of running the model with the dpd enabled.
sim(modelname);
estimating carrier frequency offset ... first four frames are used for carrier frequency offset estimation. estimated carrier frequency offset is 3.270734e 00 hz. detected and processing frame 5 ------------------------------------------ header crc passed modulation: 16qam, coderate=1/2 and fft length=128 data crc passed data decoding completed ------------------------------------------ detected and processing frame 6 ------------------------------------------ header crc passed modulation: 16qam, coderate=1/2 and fft length=128 data crc passed data decoding completed ------------------------------------------
hdl code generation and implementation results
to check and generate hdl for this example, you must have hdl coder™. use the makehdl
and makehdltb
commands to generate the hdl code and test bench for the digital predistorter subsystem.
the digital predistorter subsystem is synthesized on a xilinx® zynq®-7000 zc706 evaluation board. the frequency obtained after place and route is about 220 mhz. create a table that displays the post place and route resource utilization results for a 16-bit complex input.
f = table(... categorical({'slice lut'; 'slice registers';'dsp'}), ... categorical({'6028'; '8115'; '160'}), ... categorical({'218600'; '437200'; '900'}), ... categorical({'2.75'; '1.85'; '17.78'}), ... 'variablenames', ... {'resources','utilized','available','utilization (%)'}); disp(f);
resources utilized available utilization (%) _______________ ________ _________ _______________ slice lut 6028 218600 2.75 slice registers 8115 437200 1.85 dsp 160 900 17.78
references
1. gan, li, and emad abd-elrady. ''digital predistortion of memory polynomial systems using direct and indirect learning architectures.'' in proceedings of the eleventh iasted international conference on signal and image processing (sip) (f. cruz-roldan and n. b. smith, eds.), no. 654-802. calgary, ab: acta press, 2009.