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

# firwin2

scipy.signal.firwin2(numtaps, freq, gain, *, nfreqs=None, window='hamming', antisymmetric=False, fs=None)

  FIR filter design using the window method.

  From the given frequencies freq and corresponding gains gain, this function constructs an FIR filter with linear phase and (approximately) the given frequency response.

  Parameters:
    numtaps int

      The number of taps in the FIR filter. numtaps must be less than nfreqs.

    freq array_like, 1-D

      The frequency sampling points. Typically 0.0 to 1.0 with 1.0 being Nyquist. The Nyquist frequency is half fs. The values in freq must be nondecreasing. A value can be repeated once to implement a discontinuity. The first value in freq must be 0, and the last value must be `fs/2`. Values 0 and `fs/2` must not be repeated.

    gain array_like

      The filter gains at the frequency sampling points. Certain constraints to gain values, depending on the filter type, are applied, see Notes for details.

    nfreqs int, optional

      The size of the interpolation mesh used to construct the filter. For most efficient behavior, this should be a power of 2 plus 1 (e.g, 129, 257, etc). The default is one more than the smallest power of 2 that is not less than numtaps. nfreqs must be greater than numtaps.

    window str or (str, float) or float, or None, optional

      Desired window to use. Default is `'hamming'`. The window will be symmetric, unless a suffix `'_periodic'` is appended to the window name (e.g., `'hamming_perodic'`) Consult `get_window` for a list of windows and required parameters. If `None`, no window function is applied.

    antisymmetric bool, optional

      Whether resulting impulse response is symmetric/antisymmetric. See Notes for more details.

    fs float, optional

      The sampling frequency of the signal. Each frequency in cutoff must be between 0 and `fs/2`. Default is 2.

  Returns:
    taps ndarray

      The filter coefficients of the FIR filter, as a 1-D array of length numtaps.

  See also

  `firls`
  `firwin`
  `minimum_phase`
  `remez`

  Notes

  From the given set of frequencies and gains, the desired response is constructed in the frequency domain. The inverse FFT is applied to the desired response to create the associated convolution kernel, and the first numtaps coefficients of this kernel, scaled by window, are returned.

  The FIR filter will have linear phase. The type of filter is determined by the value of ‘numtaps` and antisymmetric flag. There are four possible combinations:

  > - odd numtaps, antisymmetric is False, type I filter is produced

  > - even numtaps, antisymmetric is False, type II filter is produced

  > - odd numtaps, antisymmetric is True, type III filter is produced

  > - even numtaps, antisymmetric is True, type IV filter is produced

  Magnitude response of all but type I filters are subjects to following constraints:

  > - type II – zero at the Nyquist frequency

  > - type III – zero at zero and Nyquist frequencies

  > - type IV – zero at zero frequency

  Added in version 0.9.0.

  Array API Standard Support

  `firwin2` 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 | ⚠️ no JIT | ⛔
  Dask | ⚠️ computes graph | n/a

  See Support for the array API standard for more information.

  References

  [1]

  Oppenheim, A. V. and Schafer, R. W., “Discrete-Time Signal Processing”, Prentice-Hall, Englewood Cliffs, New Jersey (1989). (See, for example, Section 7.4.)

  [2]

  Smith, Steven W., “The Scientist and Engineer’s Guide to Digital Signal Processing”, Ch. 17. http://www.dspguide.com/ch17/1.htm

  Examples

  A lowpass FIR filter with a response that is 1 on [0.0, 0.5], and that decreases linearly on [0.5, 1.0] from 1 to 0:

      >>> from scipy import signal
      >>> taps = signal.firwin2(150, [0.0, 0.5, 1.0], [1.0, 1.0, 0.0])
      >>> print(taps[72:78])
      [-0.02286961 -0.06362756  0.57310236  0.57310236 -0.06362756 -0.02286961]