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.

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.

Creation

Syntax

``estimator = comm.DPDCoefficientEstimator``
``estimator = comm.DPDCoefficientEstimator(Name,Value)``

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.```

example

````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.```

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.

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

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

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.

Dependencies

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

Data Types: `double`
Complex Number Support: Yes

Usage

Syntax

``coef = estimator(paIn,paOut)``

Description

example

````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.```

Input Arguments

expand all

Power amplifier baseband equivalent input, specified as a column vector.

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

 `step` Run System object algorithm `release` Release resources and allow changes to System object property values and input characteristics `reset` Reset 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 examples shows the format of the coefficient matrix for the DPD memory polynomial by using a randomly generated coefficient matrix. The example:

• Creates a digital predistortion 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.

• Predistorts a signal using the memory-polynomial coefficient matrix.

• Compares 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 examples shows the format of the coefficient matrix for the DPD memory polynomial by using a randomly generated coefficient matrix. The example:

• Creates 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.

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

• Compares 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 ```

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

Blocks

Introduced in R2019a