Devices#

class RappAmplifier(a_sat: float, *, l: int = 2, g_ss: float = 1, name: str = 'Rapp Amplifier')[source]#

Rapp model of a memoryless solid-state power amplifier (SSPA).

Signal Model#

The Rapp model is a purely AM/AM memoryless nonlinearity: the amplitude is compressed, the phase is left untouched.

\[y[n] = g \left( 1 + \left( \frac{|x[n]|}{a_\mathrm{sat}} \right)^{2l} \right)^{-\frac{1}{2l}} x[n]\]

Equivalently, the AM/AM characteristic on the envelope \(r = |x[n]|\) is

\[|y[n]| = \frac{g \, r} {\left( 1 + \left( r / a_\mathrm{sat} \right)^{2l} \right)^{1/(2l)}}, \qquad \arg y[n] = \arg x[n]\]

which is linear with slope \(g\) for \(r \ll a_\mathrm{sat}\) and saturates at \(g \, a_\mathrm{sat}\) for \(r \gg a_\mathrm{sat}\). The smoothness factor \(l\) controls how abruptly the transition happens: \(l \to \infty\) tends to a hard clipper at \(a_\mathrm{sat}\), while small \(l\) gives a soft, early compression.

Axes: element-wise – applied pointwise, shape-agnostic.

param a_sat:

Input saturation amplitude \(a_\mathrm{sat}\), in the same unit as \(|x[n]|\).

type a_sat:

float

param l:

Magnitude smoothness factor \(l\). Default is 2.

type l:

int, optional, keyword-only

param g_ss:

Small-signal (linear-region) gain \(g\). Default is 1.

type g_ss:

float, optional, keyword-only

param name:

Name of the amplifier instance. Default is "Rapp Amplifier".

type name:

str, optional, keyword-only

References

C. Rapp, “Effects of HPA-nonlinearity on a 4-DPSK/OFDM-signal for a digital sound broadcasting system,” in Proc. Second European Conference on Satellite Communications (ECSC-2), Liege, Belgium, Oct. 1991, pp. 179-184.

F. M. Ghannouchi, O. Hammi, M. Helaoui, Behavioral Modeling and Predistortion of Wideband Wireless Transmitters, John Wiley & Sons, 2015, Eq. (4.45).

Examples

>>> amp = RappAmplifier(1.0, l=2)
>>> print(np.round(amp(np.array([0.5, 1.0, 4.0])), 4))
[0.4925 0.8409 0.999 ]
class SalehAmplifier(a_sat: float = 1, *, alpha_am: float = 1.9638, beta_am: float = 0.9945, alpha_pm: float = 2.5293, beta_pm: float = 2.8168, name: str = 'Saleh Amplifier')[source]#

Saleh model of a memoryless travelling-wave tube amplifier (TWTA).

Signal Model#

Unlike the Rapp model, the Saleh model carries an AM/PM conversion: the amplifier turns an amplitude variation into a phase rotation, which is the dominant impairment of a TWTA. Writing the normalized input envelope \(r[n] = |x[n]| / a_\mathrm{sat}\),

\[y[n] = x[n] \, G\left(r[n]\right) \, e^{j \Phi\left(r[n]\right)}\]

with the AM/AM conversion

\[G(r) = \frac{\alpha_a}{1 + \beta_a r^2} \qquad \Longrightarrow \qquad |y[n]| = a_\mathrm{sat} \, \frac{\alpha_a \, r[n]} {1 + \beta_a \, r^2[n]}\]

and the AM/PM conversion

\[\Phi(r) = \frac{\alpha_\phi \, r^2}{1 + \beta_\phi \, r^2}\]

The output amplitude peaks at \(r = 1 / \sqrt{\beta_a}\), where it reaches \(a_\mathrm{sat} \alpha_a / (2 \sqrt{\beta_a})\), and then decreases – a TWTA is driven back past saturation, unlike the monotone Rapp SSPA. The phase shift grows monotonically and saturates at \(\alpha_\phi / \beta_\phi\) radians. The default coefficients are those fitted by Saleh to a measured TWTA.

Axes: element-wise – applied pointwise, shape-agnostic. The output is always complex, because of the AM/PM term.

param a_sat:

Input saturation amplitude \(a_\mathrm{sat}\) used to normalize the envelope, \(r[n] = |x[n]| / a_\mathrm{sat}\). Default is 1.

type a_sat:

float, optional

param alpha_am:

AM/AM small-signal gain \(\alpha_a\). Default is 1.9638.

type alpha_am:

float, optional, keyword-only

param beta_am:

AM/AM compression coefficient \(\beta_a\). Default is 0.9945.

type beta_am:

float, optional, keyword-only

param alpha_pm:

AM/PM conversion coefficient \(\alpha_\phi\) in rad. Default is 2.5293.

type alpha_pm:

float, optional, keyword-only

param beta_pm:

AM/PM saturation coefficient \(\beta_\phi\). Default is 2.8168.

type beta_pm:

float, optional, keyword-only

param name:

Name of the amplifier instance. Default is "Saleh Amplifier".

type name:

str, optional, keyword-only

References

A. A. M. Saleh, “Frequency-independent and frequency-dependent nonlinear models of TWT amplifiers,” IEEE Transactions on Communications, vol. 29, no. 11, pp. 1715-1720, Nov. 1981.

Examples

>>> y = SalehAmplifier()(np.array([0.5, 1.0, 2.0], dtype=complex))
>>> print(np.round(np.abs(y), 4))     # AM/AM: peaks near r = 1, then falls
[0.7864 0.9846 0.789 ]
>>> print(np.round(np.angle(y), 4))   # AM/PM: growing phase rotation (rad)
[0.371  0.6627 0.8247]