The matlab code below designs a bandpass filter which passes
frequencies between 4 kHz and 6 kHz, allowing transition bands from 3-4
kHz and 6-8 kHz (i.e., the stop-bands are 0-3 kHz and 8-10 kHz, when the
sampling rate is 20 kHz). The desired stop-band attenuation is 80 dB,
and the pass-band ripple is required to be no greater than 0.1 dB. For
these specifications, the function kaiserord returns a beta
value of
and a window length of
. These values
are passed to the function kaiser which computes the window
function itself. The ideal bandpass-filter impulse response is
computed in fir1, and the supplied Kaiser window is applied
to shorten it to length
.
fs = 20000; % sampling rate F = [3000 4000 6000 8000]; % band limits A = [0 1 0]; % band type: 0='stop', 1='pass' dev = [0.0001 10^(0.1/20)-1 0.0001]; % ripple/attenuation spec [M,Wn,beta,typ] = kaiserord(F,A,dev,fs); % window parameters b = fir1(M,Wn,typ,kaiser(M+1,beta),'noscale'); % filter design
Note the conciseness of the matlab code thanks to the use of kaiserord and fir1 from Octave or the Matlab Signal Processing Toolbox.
Figure 4.6 shows the magnitude frequency response
of the resulting FIR filter
. Note that
the upper pass-band edge has been moved to 6500 Hz instead of 6000 Hz,
and the stop-band begins at 7500 Hz instead of 8000 Hz as requested.
While this may look like a bug at first, it's actually a perfectly
fine solution. As discussed earlier (§4.5), all
transition-widths in filters designed by the window method must equal
the window-transform's main-lobe width. Therefore, the only way to
achieve specs when there are multiple transition regions specified is
to set the main-lobe width to the minimum transition width.
For the others, it makes sense to center the transition within
the requested transition region.