Main Content

comm.DPD

Digital predistorter

Description

The comm.DPD System object™ applies digital predistortion (DPD) to a complex baseband signal by using a memory polynomial to compensate for nonlinearities in a power amplifier. For more information, see Digital Predistortion and Optimizing Estimator Polynomial Degree and Memory Depth.

To predistort signals:

  1. Create the comm.DPD object and set its properties.

  2. Call the object with arguments, as if it were a function.

To learn more about how System objects work, see What Are System Objects?

Creation

Description

dpd = comm.DPD creates a digital predistorter System object to predistort a signal.

dpd = comm.DPD(Name,Value) sets properties using one or more name-value pairs. For example, comm.DPD('PolynomialType','Cross-term memory polynomial') configures the predistorter System object to predistort the input signal by using a memory polynomial with cross terms. Enclose each property name in quotes.

example

Properties

expand all

Unless otherwise indicated, properties are nontunable, which means you cannot change their values after calling the object. Objects lock when you call them, and the release function unlocks them.

If a property is tunable, you can change its value at any time.

For more information on changing property values, see System Design in MATLAB Using System Objects.

Polynomial type used for predistortion, specified as one of these values:

  • 'Memory polynomial' — Predistorts the input signal by using a memory polynomial without cross terms.

  • 'Cross-term memory polynomial' — Predistorts the input signal by using a memory polynomial with cross terms.

For more information, see Digital Predistortion.

Memory-polynomial coefficients, specified as a matrix. The number of rows in the matrix must equal the memory depth of the memory polynomial.

  • If PolynomialType is 'Memory polynomial', the number of columns in the matrix is the degree of the memory polynomial.

  • If PolynomialType is 'Cross-term memory polynomial', the number of columns in the matrix must equal m(n-1)+1. m is the memory depth of the polynomial, and n is the degree of the memory polynomial.

For more information, see Digital Predistortion.

Data Types: double
Complex Number Support: Yes

Usage

Description

out = dpd(in) predistorts a complex baseband signal by using a memory polynomial to compensate for nonlinearities in a power amplifier.

example

Input Arguments

expand all

Input baseband signal, specified as a column vector.

This object accepts variable-size inputs. After the object is locked, you can change the size of each input channel, but you cannot change the number of channels. For more information, see Variable-Size Signal Support with System Objects.

Data Types: double
Complex Number Support: Yes

Output Arguments

expand all

Predistorted baseband signal, returned as a column vector of the same length as the input signal.

Object Functions

To use an object function, specify the System object as the first input argument. For example, to release system resources of a System object named obj, use this syntax:

release(obj)

expand all

stepRun System object algorithm
releaseRelease resources and allow changes to System object property values and input characteristics
resetReset internal states of System object

Examples

collapse all

Apply digital predistortion (DPD) to a power amplifier input signal. The DPD coefficient estimator System object uses a captured signal containing power amplifier input and output signals to determine the predistortion coefficient matrix.

Load a file containing the input and output signals for the power amplifier.

load('commpowamp_dpd_data.mat','PA_input','PA_output')

Generate a DPD coefficient estimator System object and a raised cosine transmit filter System object.

estimator = comm.DPDCoefficientEstimator( ...
    'DesiredAmplitudeGaindB',10, ...
    'PolynomialType','Memory polynomial', ...
    'Degree',5,'MemoryDepth',3,'Algorithm','Least squares');

rctFilt = comm.RaisedCosineTransmitFilter('OutputSamplesPerSymbol',2);

Estimate the digital predistortion memory-polynomial coefficients.

coef = estimator(PA_input,PA_output);

Generate a DPD System object using coef, the estimated coefficients output from the DPD coefficient estimator, as for the coefficient matrix.

dpd = comm.DPD('PolynomialType','Memory polynomial', ...
    'Coefficients',coef);

Generate 2000 random symbols and apply 16-QAM modulation to the signal. Apply raised cosine transmit filtering to the modulated signal.

s = randi([0,15],2000,1);
u = qammod(s,16);
x = rctFilt(u);

Apply digital predistortion to the data. The DPD System object returns a predistorted signal to provide as input to the power amplifier.

y = dpd(x);

This example shows the format of the coefficient matrix for the DPD memory polynomial by using a randomly generated coefficient matrix. Steps in the example include:

  • Creation of a digital predistorter System object configured using a memory polynomial coefficient matrix with the memory depth set to 3 and the polynomial degree set to 5 consisting of random values.

  • Predistortion of a signal using the memory-polynomial coefficient matrix.

  • Comparison of one predistorted output element to the corresponding input element that has been manually computed using the memory-polynomial coefficient matrix.

Create a coefficient matrix representing a predistorter with the output equal to the input by generating a 3-by-5 coefficient matrix of zeros and setting the coef(1,1) element to 1. Add small random complex nonlinear terms to the coefficient matrix.

coef = zeros(3,5);
coef(1,1) = 1;
coef = coef + 0.01*(randn(3,5)+1j*randn(3,5));

Create a DPD System object using the memory polynomial coefficient matrix, coef.

dpd = comm.DPD( ...
    'PolynomialType','Memory polynomial', ...
    'Coefficients',coef);

Generate an input signal and predistort it using the dpd System object.

x = randn(20,1) + 1j*randn(20,1);
y = dpd(x);

Compare the manually distorted output for an input corresponding output element y(18) to show how the coefficient matrix is used to calculate that particular output value.

u = x(18:-1:(18-3+1));
isequal(y(18),sum(sum(coef .* ...
    [u u.*abs(u) u.*(abs(u).^2) u .* (abs(u).^3) u .* (abs(u).^4)])))
ans = logical
   1

This example shows the format of the coefficient matrix for the DPD memory polynomial by using a randomly generated coefficient matrix. Steps in the example include:

  • Creation of a digital predistorter System object configured using a cross-term memory polynomial coefficient matrix with the memory depth set to 3 and the polynomial degree set to 5 consisting of random values.

  • Predistortion of a signal using the cross-term memory polynomial coefficient matrix.

  • Comparison of one predistorted output element to the corresponding input element that has been manually computed using the cross-term memory polynomial coefficient matrix.

Create a coefficient matrix representing a predistorter with the output equal to the input by generating a 3-by-5 coefficient matrix of zeros and setting the coef(1,1) element to 1. Add small random complex nonlinear terms to the coefficient matrix.

coef = zeros(3,3*(5-1)+1);
coef(1,1) = 1;
coef = coef + 0.01*(randn(3,13) + 1j*randn(3,13));

Create a DPD System object using the cross-term memory polynomial coefficient matrix, coef.

dpd = comm.DPD( ...
    'PolynomialType','Cross-term memory polynomial', ...
    'Coefficients',coef);

Generate an input signal and predistort it using the dpd System object.

x = randn(20,1) + 1j*randn(20,1);
y = dpd(x);

Compare the manually distorted output for an input corresponding output element y(18) to show how the coefficient matrix is used to calculate that particular output value.

u = x(18:-1:(18-3+1));
isequal(y(18),sum(sum(coef .* ...
    [u u*abs(u.') u*(abs(u.').^2) u*(abs(u.').^3) u*(abs(u.').^4)])))
ans = logical
   1

Algorithms

expand all

References

[1] Morgan, Dennis R., Zhengxiang Ma, Jaehyeong Kim, Michael G. Zierdt, and John Pastalan. "A Generalized Memory Polynomial Model for Digital Predistortion of Power Amplifiers." IEEE® Transactions on Signal Processing. Vol. 54, Number 10, October 2006, pp. 3852–3860.

[2] M. Schetzen. The Volterra and Wiener Theories of Nonlinear Systems. New York: Wiley, 1980.

Extended Capabilities

Version History

Introduced in R2019a