class sdr.LoopFilter

Implements a 2nd order, proportional-plus-integrator (PPI) loop filter.

Notes

Proportional-Plus-Integral Loop Filter Block Diagram
           +----+
       +-->| K1 |-------------------+
       |   +----+                   |
x[n] --+                            @--> y[n]
       |   +----+                   |
       +-->| K2 |--@-------------+--+
           +----+  ^             |
                   |  +------+   |
                   +--| z^-1 |<--+
                      +------+

x[n] = Input signal
y[n] = Output signal
K1 = Proportional gain
K2 = Integral gain
z^-1 = Unit delay
@ = Adder

The transfer function of the loop filter is

\[H(z) = K_1 + K_2 \frac{ 1 }{ 1 - z^{-1}} = \frac{(K_1 + K_2) - K_1 z^{-1}}{1 - z^{-1}} .\]

The second-order proportional-plus-integrator loop filter can track a constant phase error and/or frequency error to zero. It cannot, however, track a constant chirp (frequency ramp) to zero.

References

  • Michael Rice, Digital Communications: A Discrete-Time Approach, Appendix C: Phase Locked Loops.

Examples

See the Phase-locked loops example.

Constructors

LoopFilter(noise_bandwidth: float, damping_factor: float, ...)

Creates a 2nd order, proportional-plus-integrator (PPI) loop filter.

Special methods

__call__(x: NDArray) NDArray

Filters the input signal \(x[n]\).

Methods

reset() None

Resets the loop filter.

Properties

property noise_bandwidth : float

The normalized noise bandwidth \(B_n T\) of the loop filter, where \(B_n\) is the noise bandwidth in Hz and \(T\) is the sampling period in seconds.

property damping_factor : float

The damping factor \(\zeta\) of the loop filter. \(\zeta = 1\) is critically damped, \(\zeta < 1\) is underdamped, and \(\zeta > 1\) is overdamped.

property K1 : float

The proportional gain \(K_1\) of the loop filter.

property K2 : float

The integral gain \(K_2\) of the loop filter.

property iir : IIR

The underlying IIR filter used to implement the loop filter.