KlopfensteinProfile

class pmrf.models.components.lines.profiles.KlopfensteinProfile(start: Any, end: Any, ripple: Any = 0.05, *, name: str | None = None, metadata: Any = None)

Bases: AbstractProfile

Klopfenstein’s taper: the shape with the smallest passband reflection for a given length.

Warning

This is a design solution, not a validation reference. Klopfenstein derived it from the linearised Riccati equation for a non-uniform line, which assumes small local reflections and neglects multiple scattering. It defines a shape worth simulating; it is emphatically not a reference the simulator is checked against. A ParamRF result that disagrees with the design’s predicted response is not by itself evidence that ParamRF is wrong.

Endpoints step

Unlike LinearProfile and ExponentialProfile, this shape does not reach start and end. It steps by \(\Gamma_m\) at each end: \(p(0) = p_0 e^{\Gamma_m}\) and \(p(1) = p_1 e^{-\Gamma_m}\). Those discontinuities are the classic signature of the design, not an implementation artefact, and start and end are the terminating values the taper is designed to match, not the values it takes.

Mathematical Formulation

With \(p_0\) = start, \(p_1\) = end, \(\rho\) = ripple and

$$Gamma_0 = tfrac{1}{2}lnfrac{p_1}{p_0}, qquad

Gamma_m = rho,Gamma_0, qquad A = operatorname{arccosh}frac{Gamma_0}{Gamma_m} = operatorname{arccosh}frac{1}{rho}$$

the profile over the body of the taper is

$$ln p(t) = tfrac{1}{2}ln(p_0 p_1)
  • frac{Gamma_0}{cosh A}, A^2 phi(2t - 1, A), qquad 0 leq t leq 1$$

where \(\phi\) is Klopfenstein’s odd function

$$phi(x, A) = int_0^{x} frac{I_1!left(Asqrt{1 - y^2}right)}{Asqrt{1 - y^2}}

, mathrm{d}y, qquad |x| leq 1$$

and \(I_1\) is the modified Bessel function of the first kind. \(\phi\) has no closed form and is evaluated here by fixed-order Gauss-Legendre quadrature; the integrand is analytic in \(y\) on the closed interval, including at \(y = \pm 1\) where the ratio tends to \(\tfrac{1}{2}\), so the rule converges geometrically. The endpoint identity \(A^2\phi(1, A) = \cosh A - 1\) is what produces the steps described above.

\(\phi\) is odd, so \(\ln p\) is antisymmetric about \(\tfrac{1}{2}\ln(p_0 p_1)\) and \(p(t)\,p(1-t) = p_0 p_1\). It is \(C^2\) in \(t\) on \([0, 1]\), endpoints included: the first derivative of \(\phi\) is the integrand, which is finite at \(x = \pm 1\), and the second carries a factor \(x\) that cancels the apparent singularity there.

Ripple

ripple is \(\Gamma_m/\Gamma_0\): the peak passband reflection as a fraction of the reflection of the abrupt step the taper replaces. It is parametrised this way, rather than as \(\Gamma_m\) directly, because it is then valid on the whole of \((0, 1)\) with no condition coupling it to start and end; an absolute \(\Gamma_m\) exceeding \(\Gamma_0\) makes \(A\) complex, which under a fit is a mid-run nan rather than a rejected value. A design stated as an absolute \(\Gamma_m\) converts with ripple = gamma_m / (0.5 * log(end / start)).

The bound \(\rho = 1\) is excluded, because there the design degenerates: \(A = 0\), the correction term vanishes, and the profile is the constant \(\sqrt{p_0 p_1}\) – the abrupt step the taper was meant to replace. The quadrature is written to reach that limit as a finite value rather than a nan, since a fixed coefficient is not range-checked and can be set there.

Example

import numpy as np
from pmrf.models import KlopfensteinProfile

# Pozar Example 5.8: 50 to 100 ohm with a maximum reflection of 0.02.
gamma_0 = 0.5 * np.log(100.0 / 50.0)
taper = KlopfensteinProfile(start=50.0, end=100.0, ripple=0.02 / gamma_0)
taper.evaluate(0.5)   # 70.71, the geometric mean

References

Klopfenstein, R. W. (1956). A transmission line taper of improved design. Proceedings of the IRE, 44(1), 31-35. doi:10.1109/JRPROC.1956.274847

Kajfez, D., & Prewitt, J. O. (1973). Correction to “A transmission line taper of improved design”. IEEE Transactions on Microwave Theory and Techniques, 21(5), 364. doi:10.1109/TMTT.1973.1128003

Pozar, D. M. (2011). Microwave Engineering (4th ed.), Section 5.8. Wiley.

Parameters:
  • start (Param) – Terminating value at the t = 0, port-1 end. Must be positive.

  • end (Param) – Terminating value at the t = 1, port-2 end. Must be positive.

  • ripple (Param, default=0.05) – Peak passband reflection as a fraction of \(\Gamma_0\), in \((0, 1)\).

evaluate(t: Array | ndarray | bool | number | bool | int | float | complex) → Array | ndarray | bool | number | bool | int | float | complex

Evaluate the profile at a normalised position along the line.

This is elementwise: t may be a scalar or an array of any shape, and the result has that same shape. A caller sampling many positions, such as a profiled line sampling its section midpoints, passes the whole array in one call.

Parameters:

t (ArrayLike) – Normalised position along the line, in \([0, 1]\). t = 0 is at port 1 and t = 1 is at port 2.

Returns:

The profiled value at t, in the physical units of whatever parameter the profile is attached to. Same shape as t.

Return type:

ArrayLike

end: Param

Terminating value at the t = 1, port-2 end

ripple: Param = 0.05

Peak passband reflection as a fraction of the abrupt step’s reflection

start: Param

Terminating value at the t = 0, port-1 end