Learn R Programming

signal (version 0.5)

buttord: Butterworth filter order and cutoff

Description

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

Usage

buttord(Wp, Ws, Rp, Rs)

Arguments

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
Rp
allowable decibels of ripple in the pass band.
Rs
minimum attenuation in the stop band in dB.

Value

  • An object of class FilterOfOrder with the following list elements:
  • nfilter order
  • Wccutoff frequency
  • typefilter type, one of "low", "high", "stop", or "pass"
  • This object can be passed directly to butter to compute filter coefficients.

Details

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.

References

Octave Forge http://octave.sf.net

See Also

butter, FilterOfOrder, cheb1ord

Examples

Run this code
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)))

Run the code above in your browser using DataLab