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

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.

## Creation

### Syntax

``dpd = comm.DPD``
``dpd = comm.DPD(Name,Value)``

### Description

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

example

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

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

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.

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.

Data Types: `double`
Complex Number Support: Yes

## Usage

### Syntax

``out = dpd(in)``

### Description

example

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

### Input Arguments

expand all

Input baseband signal, specified as a column vector.

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

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

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.

## Version History

Introduced in R2019a