Main Content

comm.DPDCoefficientEstimator

Estimate memory-polynomial coefficients for digital predistortion

Description

The comm.DPDCoefficientEstimator System object™ estimates the coefficients of a memory polynomial for digital pre-distortion (DPD) of a nonlinear power amplifier, given the baseband equivalent input and baseband equivalent output of the power amplifier. For more information, see Digital Predistortion and Optimizing Estimator Polynomial Degree and Memory Depth.

To compute predistortion coefficients:

  1. Create the comm.DPDCoefficientEstimator 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

estimator = comm.DPDCoefficientEstimator creates a digital predistortion coefficient estimator System object to estimate the coefficients of a memory polynomial for digital predistortion (DPD) of a nonlinear power amplifier.

estimator = comm.DPDCoefficientEstimator(Name,Value) sets properties using one or more name-value pairs. For example, comm.DPDCoefficientEstimator('PolynomialType','Cross-term memory polynomial') configures the predistortion coefficient estimator System object to estimate the coefficients for 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.

Desired amplitude gain in dB, specified as a scalar. This property value expresses the desired signal gain at the compensated amplifier output.

In addition to linearization, the DPD should make the combined gain between the DPD input and the power amplifier output as close as possible to the expected gain. Therefore, set this property based on the expected gain of the power amplifier that you obtain during PA characterization.

Tunable: Yes

Data Types: double

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

  • 'Memory polynomial' — Computes predistortion coefficients by using a memory polynomial without cross terms

  • 'Cross-term memory polynomial' — Computes predistortion coefficients by using a memory polynomial with cross terms

For more information, see Digital Predistortion.

Memory-polynomial degree, specified as a positive integer.

Data Types: double

Memory-polynomial depth in samples, specified as a positive integer.

Data Types: double

Adaptive algorithm used for equalization, specified as one of these values:

  • 'Least squares' — Estimate the memory polynomial coefficients by using a least squares algorithm

  • 'Recursive least squares' — Estimate the memory polynomial coefficients by using a recursive least squares algorithm

For algorithm reference material, see the works listed in [1] and [2].

Data Types: char | string

Forgetting factor used by the recursive least squares algorithm, specified as a scalar in the range (0, 1]. Decreasing the forgetting factor reduces the convergence time but causes the output estimates to be less stable.

Tunable: Yes

Dependencies

To enable this property, set Algorithm to 'Recursive least squares'.

Data Types: double

Initial coefficient estimate for the recursive least squares algorithm, specified as a matrix.

  • If InitialCoefficientEstimate is an empty matrix, the initial coefficient estimate for the recursive least squares algorithm is chosen automatically to correspond to a memory polynomial that is an identity function, so that the output is equal to input.

  • If InitialCoefficientEstimate is a nonempty matrix, the number of rows must be equal to MemoryDepth.

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

    • If PolynomialType is 'Cross-term memory polynomial', the number of columns 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.

Dependencies

To enable this property, set Algorithm to 'Recursive least squares'.

Data Types: double
Complex Number Support: Yes

Usage

Description

coef = estimator(paIn,paOut) estimates the coefficients of a memory polynomial for use by the comm.DPD System object to predistort a complex baseband signal by using a memory-polynomial to compensate for nonlinearities in a power amplifier.

example

Input Arguments

expand all

Power amplifier baseband equivalent input, 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

Power amplifier baseband equivalent output, specified as a column vector of the same length as paIn.

Data Types: double
Complex Number Support: Yes

Output Arguments

expand all

Memory-polynomial coefficients, returned as a matrix. For more information, see Digital Predistortion.

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