Step response: Difference between revisions
imported>John R. Brews m (→References: details of source) |
mNo edit summary |
||
(5 intermediate revisions by 2 users not shown) | |||
Line 120: | Line 120: | ||
and let α be set by the amount of overshoot that is acceptable. | and let α be set by the amount of overshoot that is acceptable. | ||
The figure at right illustrates the procedure. Comparing the top panel (α = 4) with the lower panel (α = 0.5) shows lower values for α increase the rate of response, but increase overshoot. The case α = 2 (center panel) is the [[Butterworth_filter#Maximal_flatness|''maximally flat'']] design that shows no peaking in the [[Bode plot|Bode gain vs. frequency plot]]. That design has the | The figure at right illustrates the procedure. Comparing the top panel (α = 4) with the lower panel (α = 0.5) shows lower values for α increase the rate of response, but increase overshoot. The case α = 2 (center panel) is the [[Butterworth_filter#Maximal_flatness|''maximally flat'']] design that shows no peaking in the [[Bode plot|Bode gain ''vs.'' frequency plot]]. That design has the rule of thumb built-in safety margin to deal with non-ideal realities like multiple poles (or zeros), nonlinearity (signal amplitude dependence) and manufacturing variations, any of which can lead to too much overshoot. The adjustment of the pole separation (that is, setting α ) is the subject of [[frequency compensation]], and one such method is [[pole splitting]]. | ||
===Control of settling time === | ===Control of settling time === | ||
Line 170: | Line 170: | ||
<ref name=note2 group=Note> | <ref name=note2 group=Note> | ||
According to Johns and Martin, | According to Johns and Martin, cited below, settling time is significant in [[switched capacitor|switched-capacitor circuits]], for example, where an op amp settling time must be less than half a clock period for sufficiently rapid charge transfer. | ||
</ref> | </ref> | ||
Line 180: | Line 180: | ||
For more detail on the use of logarithmic scales, see [[Logarithmic_scale#Slope_of_a_log-log_plot|log scale]]. | For more detail on the use of logarithmic scales, see [[Logarithmic_scale#Slope_of_a_log-log_plot|log scale]]. | ||
</ref> | </ref> | ||
}} | }} | ||
Line 196: | Line 194: | ||
|location=New York | |location=New York | ||
|isbn=0-471-14448-7 | |isbn=0-471-14448-7 | ||
|url=http:// | |url=http://www.amazon.com/Analog-Integrated-Circuit-Design-David/dp/0471144487/ref=sr_1_1?s=books&ie=UTF8&qid=1307383572&sr=1-1#reader_0471144487}} | ||
</ref> | </ref> | ||
Line 217: | Line 215: | ||
|author=Benjamin C Kuo & Golnaraghi F | |author=Benjamin C Kuo & Golnaraghi F | ||
|title=Cited work | |title=Cited work | ||
|year= 2009 | |||
|chapter=Transient response of a prototype second-order system; Eq. 5-103 | |chapter=Transient response of a prototype second-order system; Eq. 5-103 | ||
|pages=p. 283 | |pages=p. 283 | ||
Line 259: | Line 258: | ||
|url=http://www.amazon.com/Essentials-Springer-International-Engineering-Computer/dp/0387257462#reader_0387257462}} | |url=http://www.amazon.com/Essentials-Springer-International-Engineering-Computer/dp/0387257462#reader_0387257462}} | ||
</ref> | </ref> | ||
}}[[Category:Suggestion Bot Tag]] | |||
}} |
Latest revision as of 06:01, 22 October 2024
In electronic engineering and control theory, step response of a system refers to the time behavior of its output when its input changes rapidly from zero to a finite value. In a more idealized mathematical formulation, the step response of a system refers to the time evolution of its output when its input is proportional to a Heaviside step function.
From a practical standpoint, knowing how the system responds to a sudden input is important because large and fast input signals may have extreme effects on the component itself and on other portions of the overall system dependent on this component. In some cases, the overall system cannot act until the component's output settles down to some vicinity of its final state, delaying the overall system response. Formally, the step response of a dynamical system gives information about the stability of the system, and about its ability to reach one stationary state when starting from another.
This article describes in detail a negative feedback amplifier using feedback with a main amplifier characterized by two time constants , and shows how the step response of the feedback amplifier is connected to the main amplifier's underlying two time constants.
Description of time-domain behavior
The step response of a system can be described by the following aspects of its time behavior:
- Overshoot: The maximum output swing above the final value, or less specifically any swing above final value
- Undershoot: The minimum output swing below the final value, or less specifically any swing below final value
- Ringing: The alternation of overshoot and undershoot around final value
- Settling time: The time for the output to settle down and remain below a specified departure from final value
- Rise time: The time to first reach a specified fraction of final value (for example, 1−1/e, e the base of natural logarithms); in general, not the only time it will cross this value
In the case of linear dynamic systems, much can be inferred about the system from these characteristics. Below, the step response of a simple two-time-constant amplifier is presented, and some of these terms are illustrated.
Step response of feedback amplifiers
This section describes the step response of a simple negative feedback amplifier shown in the figure. The amplifier when the feedback is disconnected is called the open-loop amplifier. When the amplifier including feedback is meant, it is called the closed-loop amplifier.
The feedback amplifier consists of a main open-loop amplifier of gain AOL and a feedback loop governed by a feedback factor β. This feedback amplifier is analyzed to determine how its step response depends upon the time constants governing the response of the main amplifier, and upon the amount of feedback used.
Analysis
A negative feedback amplifier has gain given by (see negative feedback amplifier):
- Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle A_{FB} = \frac {A_{OL}} {1+ \beta A_{OL}} \ , }
where AOL = open-loop gain, AFB = closed-loop gain (the gain with negative feedback present) and β = feedback factor. The step response of such an amplifier is easily handled in the case that the open-loop gain has two time constants, τ1, τ2, introduced by postulating the open-loop gain is given by:
- Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle A_{OL} = \frac {A_0} {(1+j \omega \tau_1) (1 + j \omega \tau_2)} \ , }
with zero-frequency gain A0 and angular frequency ω = 2πf. It is usual to describe the behavior of this function in the complex plane, using the complex variable s:
- Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle A_{OL}(s) = \frac {A_0} {(1+s \tau_1) (1 + s \tau_2)} \ , }
which leads to the above gain expression on the imaginary s-axis, when s = jω. On the other hand, this open-loop gain has two poles on the real s-axis at s=−1/τ1 and s=−1/τ2. With this open-loop gain, the closed-loop gain becomes:
- Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle A_{FB} = \frac {A_0} {1+ \beta A_0}} • Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle \ \frac {1} {1+j \omega \frac { \tau_1 + \tau_2 } {1 + \beta A_0} + (j \omega )^2 \frac { \tau_1 \tau_2} {1 + \beta A_0} } \ . }
The time dependence of the amplifier is easy to discover by switching variables to s, whereupon the gain becomes:
- Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle A_{FB} = \frac {A_0} { \tau_1 \tau_2 }} • Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle \frac {1} {s^2 +s \left( \frac {1} {\tau_1} + \frac {1} {\tau_2} \right) + \frac {1+ \beta A_0} {\tau_1 \tau_2}} }
The poles of this expression (that is, the zeros of the denominator) occur at:
- Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle 2s = - \left( \frac {1} {\tau_1} + \frac {1} {\tau_2} \right) }
- Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle \pm \sqrt { \left( \frac {1} {\tau_1} - \frac {1} {\tau_2} \right) ^2 -\frac {4 \beta A_0 } {\tau_1 \tau_2 } } \ ,}
which shows for large enough values of βA0 the square root becomes the square root of a negative number, that is the square root becomes imaginary, and the pole positions are complex conjugate numbers, either s+ or s−; see the figure:
- Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle s_{\pm} = -\rho \pm j \mu \ , }
with
- Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle \rho = \frac {1}{2} \left( \frac {1} {\tau_1} + \frac {1} {\tau_2} \right ) \ , }
and
- Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle \mu = \frac {1} {2} \sqrt { \frac {4 \beta A_0} { \tau_1 \tau_2} - \left( \frac {1} {\tau_1} - \frac {1} {\tau_2} \right)^2 } \ . }
Using polar coordinates with the magnitude of the radius to the roots given by |s| (See figure):
- Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle | s | = |s_{ \pm } | = \sqrt{ \rho^2 +\mu^2} \ , }
and the angular coordinate φ is given by:
- Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle \mathrm {cos}\ \phi = \frac { \rho} { | s | } \ } Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle \mathrm {sin}\ \phi = \frac { \mu} { | s | } \ .}
Tables of Laplace transforms show that the time response of such a system is composed of combinations of the two functions:
- Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle e^{- \rho t} \mathrm {sin} ( \mu t) \ } Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle \quad } and Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle \quad } Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle e^{- \rho t} \mathrm {cos} ( \mu t) \ , }
which is to say, the solutions are damped oscillations in time. In particular, the unit step response of the system is:[1]
- Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle S(t) = 1 - e^{- \rho t} \ \frac { \mathrm {sin} \left( \mu t + \phi \right)}{ \mathrm {sin}( \phi )} \ . }
Notice that the damping of the response is set by ρ, that is, by the time constants of the open-loop amplifier. In contrast, the frequency of oscillation is set by μ, that is, by the feedback parameter through βA0. Because ρ is a sum of reciprocals of time constants, it is interesting to notice that ρ is dominated by the shorter of the two.
Results
The figure to the right shows the time response to a unit step input for three values of the parameter μ. It can be seen that the frequency of oscillation increases with μ, but the oscillations are contained between the two asymptotes set by the exponentials [ 1 - exp (−ρt) ] and [ 1 + exp (−ρt) ]. These asymptotes are determined by ρ and therefore by the time constants of the open-loop amplifier, independent of feedback.
The phenomena of oscillation about final value is called ringing. The overshoot is the maximum swing above final value, and clearly increases with μ. Likewise, the undershoot is the minimum swing below final value, again increasing with μ. The settling time is the time for departures from final value to sink below some specified level, say 10% of final value.
The dependence of settling time upon μ is not obvious, and the approximation of a two-pole system probably is not accurate enough to make any real-world conclusions about feedback dependence of settling time. However, the asymptotes [ 1 - exp (−ρt) ] and [ 1 + exp (−ρt) ] clearly impact settling time, and they are controlled by the time constants of the open-loop amplifier, particularly the shorter of the two time constants. That suggests that a specification on settling time must be met by appropriate design of the open-loop amplifier.
The two major conclusions from this analysis are:
- Feedback controls the amplitude of oscillation about final value for a given open-loop amplifier and given values of open-loop time constants, τ1 and τ2.
- The open-loop amplifier decides settling time. It sets the time scale of the step response used in the figure, and the faster the open-loop amplifier, the faster this time scale.
As an aside, it may be noted that real-world departures from this linear two-pole model occur due to two major complications: first, real amplifiers have more than two poles, as well as zeros; and second, real amplifiers are nonlinear, so their step response changes with signal amplitude.
Control of overshoot
How overshoot may be controlled by appropriate parameter choices is discussed next.
Using the equations above, the amount of overshoot can be found by differentiating the step response and finding its maximum value. The result for maximum step response Smax is:[2]
- Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle S_{max}= 1 \ } Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle \ +\ \mathrm {exp} \left( - \pi \frac { \rho }{ \mu } \right) \ . }
The final value of the step response is 1, so the exponential is the actual overshoot itself. It is clear the overshoot is zero if μ = 0, which is the condition:
- Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle \frac {4 \beta A_0} { \tau_1 \tau_2} = \left( \frac {1} {\tau_1} - \frac {1} {\tau_2} \right)^2 \ . }
This quadratic is solved for the ratio of time constants by setting x = ( τ1 / τ2 )1 / 2 with the result
- Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle x = \sqrt{ \beta A_0 } + \sqrt { \beta A_0 +1 } \ . }
Because β A0 >> 1, the 1 in the square root can be dropped, and the result is
- Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle \frac { \tau_1} { \tau_2} = 4 \beta A_0 \ . }
In words, the first time constant must be much larger than the second. To be more adventurous than a design allowing for no overshoot we can introduce a factor α in the above relation:
- Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle \frac { \tau_1} { \tau_2} = \alpha \beta A_0 \ , }
and let α be set by the amount of overshoot that is acceptable.
The figure at right illustrates the procedure. Comparing the top panel (α = 4) with the lower panel (α = 0.5) shows lower values for α increase the rate of response, but increase overshoot. The case α = 2 (center panel) is the maximally flat design that shows no peaking in the Bode gain vs. frequency plot. That design has the rule of thumb built-in safety margin to deal with non-ideal realities like multiple poles (or zeros), nonlinearity (signal amplitude dependence) and manufacturing variations, any of which can lead to too much overshoot. The adjustment of the pole separation (that is, setting α ) is the subject of frequency compensation, and one such method is pole splitting.
Control of settling time
The amplitude of ringing in the step response is governed by the damping factor exp ( −ρ t ). That is, if we specify some acceptable step response deviation from final value, say Δ, that is:
- Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle S(t) \le 1 + \Delta \ ,}
this condition is satisfied regardless of the value of β AOL provided the time is longer than the settling time, say tS, given by:[Note 1]
- Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle \Delta = e^{- \rho t_S }} or Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle t_S = \frac { \mathrm{ln} \left( \frac{1} { \Delta} \right) } { \rho } = \tau_2 \ \frac {2 \ \mathrm{ln} \left( \frac{1} { \Delta} \right) } { 1 + \frac { \tau_2 } { \tau_1} } \approx 2 \ \tau_2 \ \mathrm{ln} \left( \frac{1} { \Delta} \right)\ , }
where the approximation τ1 >> τ2 is applicable because of the overshoot control condition, which makes τ1 = α βAOL τ2. Often the settling time condition is referred to by saying the settling period is inversely proportional to the unity gain bandwidth, because 1/( 2π τ2 ) is close to this bandwidth for an amplifier with typical dominant pole compensation. However, this result is more precise than this rule of thumb. As an example of this formula, if Δ = 1/e4 = 1.8 %, the settling time condition is tS = 8 τ2.
In general, control of overshoot sets the time constant ratio, and settling time tS sets τ2.[3][4][Note 2]
Phase margin
Next, the choice of pole ratio τ1 / τ2 is related to the phase margin of the feedback amplifier.[Note 3] The procedure outlined in the Bode plot article is followed. To the right is the Bode gain plot for the two-pole amplifier in the range of frequencies up to the second pole position. The assumption behind the plot is that the frequency f0dB lies between the lowest pole at f1 = 1 / ( 2π τ1 ) and the second pole at f2 = 1 / ( 2π τ2 ). As indicated in the figure, this condition is satisfied for values of α ≥ 1.
Using the figure the frequency (denoted by f0dB ) is found where the loop gain βA0 satisfies the unity gain or 0 dB condition , as defined by:
- Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle | \beta A_{OL} ( f_{0db} ) | = 1 \ . }
The slope of the downward leg of the gain plot is (20 dB/decade); for every factor of ten increase in frequency, the gain drops by the same factor:[Note 4]
- Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle f_{0dB} = \beta A_0 f_1 \ . }
The phase margin is the departure of the phase at f0dB from −180°. Thus, the margin is:
- Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle \phi_m = 180 ^\circ - \mathrm {atan} (f_{0dB} /f_1) - \mathrm {atan} ( f_{0dB} /f_2) \ . }
Because f0dB / f1 = βA0 >> 1, the term in f1 is 90°. That makes the phase margin:
- Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle \phi_m = 90 ^\circ - \mathrm {atan} ( f_{0dB} /f_2) }
- Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle = 90 ^\circ - \mathrm {atan} \left( \frac {\beta A_0 f_1} {\alpha \beta A_0 f_1 } \right) }
- Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle = 90 ^\circ - \mathrm {atan} \left( \frac {1} {\alpha } \right) } Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle = \mathrm {atan} \left( \alpha \right) \ . }
In particular, for case α = 1, φm = 45°, and for α = 2, φm = 63.4°. Sansen[5] recommends α = 3, φm = 71.6° as a "good safety position to start with".
If α is increased by shortening τ2, the settling time tS also is shortened. If α is increased by lengthening τ1, the settling time tS is little altered. More commonly, both τ1 and τ2 change, for example if the technique of pole splitting is used.
As an aside, for an amplifier with more than two poles, the diagram in the figure still may be made to fit the Bode plots by making f2 a fitting parameter, referred to as an "equivalent second pole" position.[6]
Notes
- ↑ This estimate is a bit conservative (long) because the factor 1 /sin(φ) in the overshoot contribution to S ( t ) has been replaced by 1 /sin(φ) ≈ 1.
- ↑ According to Johns and Martin, cited below, settling time is significant in switched-capacitor circuits, for example, where an op amp settling time must be less than half a clock period for sufficiently rapid charge transfer.
- ↑ The gain margin of the amplifier cannot be found using a two-pole model, because gain margin requires determination of the frequency f180 where the gain flips sign, and this never happens in a two-pole system. If we know f180 for the amplifier at hand, the gain margin can be found approximately, but f180 then depends on the third and higher pole positions, as does the gain margin, unlike the estimate of phase margin, which is a two-pole estimate.
- ↑ For more detail on the use of logarithmic scales, see log scale.
References
- ↑ Benjamin C Kuo & Golnaraghi F (2009). “Impulse response and transfer functions of linear systems; Eq. 2-214”, Automatic control systems, Ninth Edition. New York: Wiley, p. 69. ISBN 0470048964.
- ↑ Benjamin C Kuo & Golnaraghi F (2009). “Transient response of a prototype second-order system; Eq. 5-103”, Cited work, p. 283. ISBN 0470048964.
- ↑ David A. Johns & Martin K W (1997). Analog integrated circuit design. New York: Wiley, pp. 234-235. ISBN 0-471-14448-7.
- ↑ Willy M C Sansen (2006). “Stability of operational amplifiers: §0528”, Analog design essentials. Dordrecht, The Netherlands: Springer, p. 163. ISBN 0-387-25746-2.
- ↑ Willy M C Sansen (2006). “Stability of operational amplifiers: §0526”, Cited work, p. 162. ISBN 0-387-25746-2.
- ↑ Gaetano Palumbo & Pennisi S (2002). “§4.4 Three-pole feedback amplifiers with real poles”, Feedback amplifiers: theory and design. Boston/Dordrecht/London: Kluwer Academic Press, pp. 97-98. ISBN 0-7923-7643-9.