Shelving Filter Design
This function will generate the coefficients for a single IIR biquad that is a "shelving" design. Wierldy enough, this filter type is not part of the standard Matlab filter design toolbox. These filters are commonly used is audio signal processing to create a graphic equalizer.
The nice part of this filter type is that it has a flat boost or gain above (treble shelf) or below (bass shelf) a specific center frequency. All other frequencies are 0dB. So it is a nice way to emphasize or deempahize a large badwidth by a constant gain level.
See plots below to see what the magnitude response looks like:

function [b, a
] = shelving
(G, fc, fs, Q,
type)
%
% Derive coefficients for a shelving filter with a given amplitude and
% cutoff frequency. All coefficients are calculated as described in
% Zolzer's DAFX book (p. 50 -55).
%
% Usage: [B,A] = shelving(G, Fc, Fs, Q, type);
%
% G is the logrithmic gain (in dB)
% FC is the center frequency
% Fs is the sampling rate
% Q adjusts the slope be replacing the sqrt(2) term
% type is a character string defining filter type
% Choices are: 'Base_Shelf' or 'Treble_Shelf'
%
% Author: sparafucile17 08/22/05
%
%Error Check
if((strcmp(type,
'Base_Shelf') ~=
1) &&
(strcmp(type,
'Treble_Shelf') ~=
1))
error(['Unsupported Filter Type: ' type]);
end
K =
tan((pi * fc
)/fs
);
V0 =
10^
(G/
20);
root2 =
1/Q;
%sqrt(2)
%Invert gain if a cut
if(V0 <
1)
V0 =
1/V0;
end
%%%%%%%%%%%%%%%%%%%%
% BASE BOOST
%%%%%%%%%%%%%%%%%%%%
if(( G >
0 ) &
(strcmp(type,
'Base_Shelf')))
b0 =
(1 +
sqrt(V0
)*root2*K + V0*K^
2) /
(1 + root2*K + K^
2);
b1 =
(2 *
(V0*K^
2 -
1) ) /
(1 + root2*K + K^
2);
b2 =
(1 -
sqrt(V0
)*root2*K + V0*K^
2) /
(1 + root2*K + K^
2);
a1 =
(2 *
(K^
2 -
1) ) /
(1 + root2*K + K^
2);
a2 =
(1 - root2*K + K^
2) /
(1 + root2*K + K^
2);
%%%%%%%%%%%%%%%%%%%%
% BASE CUT
%%%%%%%%%%%%%%%%%%%%
elseif (( G <
0 ) &
(strcmp(type,
'Base_Shelf')))
b0 =
(1 + root2*K + K^
2) /
(1 + root2*
sqrt(V0
)*K + V0*K^
2);
b1 =
(2 *
(K^
2 -
1) ) /
(1 + root2*
sqrt(V0
)*K + V0*K^
2);
b2 =
(1 - root2*K + K^
2) /
(1 + root2*
sqrt(V0
)*K + V0*K^
2);
a1 =
(2 *
(V0*K^
2 -
1) ) /
(1 + root2*
sqrt(V0
)*K + V0*K^
2);
a2 =
(1 - root2*
sqrt(V0
)*K + V0*K^
2) /
(1 + root2*
sqrt(V0
)*K + V0*K^
2);
%%%%%%%%%%%%%%%%%%%%
% TREBLE BOOST
%%%%%%%%%%%%%%%%%%%%
elseif (( G >
0 ) &
(strcmp(type,
'Treble_Shelf')))
b0 =
(V0 + root2*
sqrt(V0
)*K + K^
2) /
(1 + root2*K + K^
2);
b1 =
(2 *
(K^
2 - V0
) ) /
(1 + root2*K + K^
2);
b2 =
(V0 - root2*
sqrt(V0
)*K + K^
2) /
(1 + root2*K + K^
2);
a1 =
(2 *
(K^
2 -
1) ) /
(1 + root2*K + K^
2);
a2 =
(1 - root2*K + K^
2) /
(1 + root2*K + K^
2);
%%%%%%%%%%%%%%%%%%%%
% TREBLE CUT
%%%%%%%%%%%%%%%%%%%%
elseif (( G <
0 ) &
(strcmp(type,
'Treble_Shelf')))
b0 =
(1 + root2*K + K^
2) /
(V0 + root2*
sqrt(V0
)*K + K^
2);
b1 =
(2 *
(K^
2 -
1) ) /
(V0 + root2*
sqrt(V0
)*K + K^
2);
b2 =
(1 - root2*K + K^
2) /
(V0 + root2*
sqrt(V0
)*K + K^
2);
a1 =
(2 *
((K^
2)/V0 -
1) ) /
(1 + root2/
sqrt(V0
)*K +
(K^
2)/V0
);
a2 =
(1 - root2/
sqrt(V0
)*K +
(K^
2)/V0
) /
(1 + root2/
sqrt(V0
)*K +
(K^
2)/V0
);
%%%%%%%%%%%%%%%%%%%%
% All-Pass
%%%%%%%%%%%%%%%%%%%%
else
b0 = V0;
b1 =
0;
b2 =
0;
a1 =
0;
a2 =
0;
end
%return values
a =
[ 1, a1, a2
];
b =
[ b0, b1, b2
];
Rate this code snippet:
4
Rating: 4 | Votes: 1
posted by