buttord: Butterworth filter order and cutoff

View source: R/buttord.R

buttordR Documentation

Butterworth filter order and cutoff


Compute butterworth filter order and cutoff for the desired response characteristics.


buttord(Wp, Ws, Rp, Rs)


Wp, Ws

pass-band and stop-band edges. For a low-pass or high-pass filter, Wp and Ws are scalars. For a band-pass or band-rejection filter, both are vectors of length 2. For a low-pass filter, Wp < Ws. For a high-pass filter, Ws > Wp. For a band-pass (Ws[1] < Wp[1] < Wp[2] < Ws[2]) or band-reject (Wp[1] < Ws[1] < Ws[2] < Wp[2]) filter design, Wp gives the edges of the pass band, and Ws gives the edges of the stop band. Frequencies are normalized to [0,1], corresponding to the range [0, Fs/2].


allowable decibels of ripple in the pass band.


minimum attenuation in the stop band in dB.


Deriving the order and cutoff is based on:

|H(W)|^2 = \frac{1}{1+(W/Wc)^{2n}} = 10^{-R/10}

With some algebra, you can solve simultaneously for Wc and n given Ws, Rs and Wp, Rp. For high-pass filters, subtracting the band edges from Fs/2, performing the test, and swapping the resulting Wc back works beautifully. For bandpass- and bandstop-filters, this process significantly overdesigns. Artificially dividing n by 2 in this case helps a lot, but it still overdesigns.


An object of class FilterOfOrder with the following list elements:


filter order


cutoff frequency


filter type, one of “low”, “high”, “stop”, or “pass”

This object can be passed directly to butter to compute filter coefficients.


Original Octave version by Paul Kienzle, pkienzle@user.sf.net. Conversion to R by Tom Short.


Octave Forge https://octave.sourceforge.io/

See Also

butter, FilterOfOrder, cheb1ord


Fs <- 10000
btord <- buttord(1000/(Fs/2), 1200/(Fs/2), 0.5, 29)
plot(c(0, 1000, 1000, 0, 0), c(0, 0, -0.5, -0.5, 0),
     type = "l", xlab = "Frequency (Hz)", ylab = "Attenuation (dB)")
bt <- butter(btord)
plot(c(0, 1000, 1000, 0, 0), c(0, 0, -0.5, -0.5, 0),
     type = "l", xlab = "Frequency (Hz)", ylab = "Attenuation (dB)",
     col = "red", ylim = c(-10,0), xlim = c(0,2000))
hf <- freqz(bt, Fs = Fs)
lines(hf$f, 20*log10(abs(hf$h)))

signal documentation built on June 26, 2024, 9:06 a.m.

Related to buttord in signal...