Skip to main content
`Ctrl`+`K`
scipy.signal.

# besselap

scipy.signal.besselap(N, norm='phase', *, xp=None, device=None)

  Return (z,p,k) for analog prototype of an Nth-order Bessel filter.

  Parameters:
    N int

      The order of the filter.

    norm{‘phase’, ‘delay’, ‘mag’}, optional

      Frequency normalization:

      `phase`

        The filter is normalized such that the phase response reaches its midpoint at an angular (e.g., rad/s) cutoff frequency of 1. This happens for both low-pass and high-pass filters, so this is the “phase-matched” case. [6]

        The magnitude response asymptotes are the same as a Butterworth filter of the same order with a cutoff of Wn.

        This is the default, and matches MATLAB’s implementation.

      `delay`

        The filter is normalized such that the group delay in the passband is 1 (e.g., 1 second). This is the “natural” type obtained by solving Bessel polynomials

      `mag`

        The filter is normalized such that the gain magnitude is -3 dB at angular frequency 1. This is called “frequency normalization” by Bond. [1]

      Added in version 0.18.0.

    xp array_namespace, optional

      Optional array namespace. Should be compatible with the array API standard, or supported by array-api-compat. Default: `numpy`

    device: any

      optional device specification for output. Should match one of the supported device specification in `xp`.

  Returns:
    z ndarray[float64]

      Zeros of the transfer function. Is always an empty array.

    p ndarray[complex128]

      Poles of the transfer function.

    k float

      Gain of the transfer function. For phase-normalized, this is always 1.

  See also

  `bessel`

    Filter design function using this prototype

  Notes

  To find the pole locations, approximate starting points are generated [2] for the zeros of the ordinary Bessel polynomial [3], then the Aberth-Ehrlich method [4] [5] is used on the Kv(x) Bessel function to calculate more accurate zeros, and these locations are then inverted about the unit circle.

  Array API Standard Support

  `besselap` has experimental support for Python Array API Standard compatible backends in addition to NumPy. Please consider testing these features by setting an environment variable `SCIPY_ARRAY_API=1` and providing CuPy, PyTorch, JAX, or Dask arrays as array arguments. The following combinations of backend and device (or other capability) are supported.

  Library | CPU | GPU
  --- | --- | ---
  NumPy | ✅ | n/a
  CuPy | n/a | ✅
  PyTorch | ✅ | ✅
  JAX | ✅ | ✅
  Dask | ✅ | n/a

  > See Support for the array API standard for more information.

  References

  [1]

  C.R. Bond, “Bessel Filter Constants”, http://www.crbond.com/papers/bsf.pdf

  [2]

  Campos and Calderon, “Approximate closed-form formulas for the zeros of the Bessel Polynomials”, arXiv:1105.0957.

  [3]

  Thomson, W.E., “Delay Networks having Maximally Flat Frequency Characteristics”, Proceedings of the Institution of Electrical Engineers, Part III, November 1949, Vol. 96, No. 44, pp. 487-490.

  [4]

  Aberth, “Iteration Methods for Finding all Zeros of a Polynomial Simultaneously”, Mathematics of Computation, Vol. 27, No. 122, April 1973

  [5]

  Ehrlich, “A modified Newton method for polynomials”, Communications of the ACM, Vol. 10, Issue 2, pp. 107-108, Feb. 1967, DOI:10.1145/363067.363115

  [6]

  Miller and Bohn, “A Bessel Filter Crossover, and Its Relation to Others”, RaneNote 147, 1998, https://www.ranecommercial.com/legacy/note147.html