Bessel Filters Bessel filters are designed to have maximally flat group-delay characteristics.. These values were generated by the C function besselCoefficients provided in Listing 6.1.
Trang 1Bessel Filters
Bessel filters are designed to have maximally flat group-delay characteristics
As a consequence, there is no ringing in the impulse and step responses 6.1 Transfer Function
The general expression for the transfer function of an nth-order Bessel
lowpass filter is given by
bo
where q,(s) = >, 6,s*
h=il
(2n — k)!
by ~ 92-* Bln — k)!
The following recursion can be used to determine g„(s) from g„_ ;(s) and
Qn —2(8):
Qn = (2n — 1)q„_¡ + 8”q„_›
Table 6.1 lists g„(s) for n = 2 through ø =8 These values were generated by
the C function besselCoefficients( ) provided in Listing 6.1 This function is used by other Bessel filter routines presented later in lân section
Unlike the transfer function for Butterworth and Chebyshev filters, Eq (6.1) does not provide an explicit expression for the poles of the Bessel filter The numerator of (6.1) will be a polynomial in s, upon which numerical
root-finding methods (such as Algorithm 2.1) must be used to determine the
pole locations for H(s) Table 6.2 lists approximate pole locations for n =2
through n = 8
109
Trang 2TABLE 6.1 Denominator Polynomials for Transfer Functions of Bessel Filters Normalized to Have Unit Delay at w =0
2 s?4+3s+3
3 8346s? + 15s +15
4 s*+ 10s? + 45s? + 105s + 105
5 8P + 15st + 105s° + 420s? + 945s + 945
6 s® + 218° + 210s* + 1260s? + 4725s? + 10,395s + 10,895
vi s7 + 285° + 37885 + 3150s? + 17,3253 3 + 62,3708? + 135,135s + 135,135
8 s® + 36s7 + 630s° + 6930s° + 9450s4 + 270,270s? + 945,945s? + 2,027,025s + 2,027,025
TABLE 6.2 Poles of Bessel Filter Normalized
to Have Unit Delay at w =0
— 1.8390 + 1.7543;
— 2.8961 + 0.8672]
— 2.3247 + 3.5710)
—3.3520 + 1.7427)
6 —2.5158 + 4.4927)
—3.7357 + 2.6263)
— 4.2484 + 0.8675;
— 2.6857 + 5.4206;
—4.0701 + 3.5173)
— 4.7584 + 1.7393)
— 4.3683 + 4.41467
— 2.8388 + 6.3540)
—5.5878 + 0.86767
The transfer functions given by (6.1) are for Bessel filters normalized to have unit delay at w =0 The poles p, and denominator coefficients b, can be renormalized for a 3-dB frequency of w =1 using
Pi =Ap, 0, =A" * By
where the value of A appropriate for n is selected from Table 6.3 (The
values from the table have been incorporated in the besselCoefficient( ) function.)
Trang 3TABLE 6.3 Factors for Renormalizing Bessel
Filter Poles from Unit Delay at w =0 to
3-dB Attenuation at w =1
1.35994 1.74993 2.13011 2.42003 2.69996 2.95000 3.17002
6.2 Frequency Response
Figures 6.1 and 6.2 show the magnitude responses for Bessel filters of several
different orders The frequency response data was generated by the C routine besselFreqResponse( ), which is provided in Listing 6.2
6.3 Group Delay
Group delays for lowpass Bessel filters of several different orders are plotted
in Fig 6.3 The data for these plots was generated by the C function
besselGroupDelay( ), provided in Listing 6.3, which performs numerical
differentiation of the phase response to evaluate the group delay
' XN °
' œ T
frequency
Figure 61 Pass-band magnitude response of lowpass Bessel filters.
Trang 4
-10 a
m
3
o
9
=
5
frequency
Figure 6.2 Stop-band magnitude response of lowpass Bessel filters
3.5 Ƒ
8
o
2
6
5
frequency
Figure 6.3 Group-delay response of lowpass Bessel filters
10
Trang 5Listing 6.1 besselCoefficienis( )
BA ORIG AAI IIR SIA AA IT #
#include <nath,h?
#include "globDefs,h”
void besselCoefficients( int order,
char type@fNormalization,
real coef{}) {
int t, N, index, indextl, indext2;
nedl B[3][HRXIRDER];
real A, renorm[MAXORDER} ;
renorm[2] = @.?2675;
renorm[ 3] ~ @,57145;
renorm[4] = 6.46946;
renorm[5} = 6.41322;
nenerm[6] = 8.37838;
renorm[?] = 9.33898;
nenonm[B] = @.31546;
A = renormlorder];
index = 1;
indexfl = 8;
indexl2 = 2;
for( i=8; ¡{(3*HRR0BDER); ¡++) B[B][¡) = 8;
B[B8][83 = !.8;
BE11[8] = 1.8;
BETI[H = 1.8;
for( N=2; N<=order; N++)
{
index = Cindextl)83;
index] = Cindexfll + 1723;
indexf2 = (indexH2 + 1)83;
for( =8; LÊN; tt)
{
B[index][i] = (2*R-1) * B[indexH11[i1;
}
for€ i=2; i<=N; itt)
Trang 6{
B{index][i] = B[index][i] + B[indexH2][¡-21;
}
}
if(typedfNormalization == 'R')
{
for( i+; i<sorder; i++) coeffi] = Blindex] [i]; }
else
{
for( i=@; i<=order; i++)
{
coeffi] = Blindex]{i] * powff, Carder - i) ); }
}
return;
}
Listing 6.2 besselFreqResponse( )
ff RREREREEREAERE EAA EAAE RENAE RAR ERE /
JXYKKKXKXK ĐK KX KX KEO KEO KẾ EÐ 2
#include <cRath.h>
*include “gtobDefs.h"
#include “protos,h”
void besselFreqRespanse{ int order,
real coef[],
real frequency, real *magnitude, real *phase}
{
struct conplex numen, omeqg, denon, tronsfenFurrct ion; int i;
numer = cnplx{ coef[B], 8.8);
oRegd = cnplx{ 8.8, fnequencu);
denom = capix( coeflorder], 6.8);
for( itorder-f; i>=8; i )
{
Trang 7denom = cltult (omega, denom);
denon.Re = denow.Re + coef[i],
}
transferFunction = cDiv( numer, denam);
*gagnitude = 26.8 * logi@(cAbs(transferFunction));
*phase = 186.8 * arg(transferFunction) / PI;
return;
}
Listing 6.3 besselGroupDelay( )
LRA IR TTR IT TR TRA IE AACE IR RIP
/* besselBnoupe lau() xf
/XYXXXXXXXXXXXTXXXXSXSXXXSXXXXXX*dS#+/
uoid besse lñnoupDe | quí int order,
real coef[], real frequency,
real delta,
real *groupDe lay)
{
struct complex numer, omega, omegaPlus, denom, transferFunct ion;
int i;
real phase, phased;
numer = cmplx( coef[@], 8.0);
denog = cmplxÍ coef[oarder], 6.8);
omeqg = cnplx( 0., fnequencu);,
for{ jxorder-1; i>*“8; i ) {
denom = cliult (omega, denom) ;
denon.fe = denoa,fe + coef[i];
}
transferFunction = cDiu( numer, denam);
phase = arg(transferFunct ion);
denom = caplx( coefforder], 8,8);
omegaPlus = cmplx(@.0, frequency + delta);
for( isorder-1; i>=8; i ) {
denom = clult (omegaPlus,denom) ;
Trang 8denom.He = denom.Re + coef[i];
}
transferFunction = cDiv( numer, denon);
phase2 = arg(transferFunct ion);
*groupDelay = (phase2 - phase)/delta;
return;
}