fontset = special4, "New York", 16, L2, nowordwrap;
fontset = special5, "New York", 20, L2, nowordwrap;]
:[font = title; inactive; ]
Signal Processing Packages:
:[font = title; inactive; ]
Implementing Linear Systems Theory in
:[font = special1; inactive; ]
MATHEMATICA
:[font = message; inactive; center; ]
An overview for NeXT Higher Education
:[font = special4; inactive; center; ]
by
:[font = subtitle; inactive; ]
Brian L. Evans and James H. McClellan
:[font = special4; inactive; center; ]
Digital Signal Processing Laboratory
School of Electrical Engineering
Georgia Institute of Technology
Atlanta, GA 30332-0250
:[font = special5; inactive; center; ]
EMAIL: evans@eedsp.gatech.edu
:[font = text; inactive; ]
What you are reading is a Mathematica notebook. It is a collection of cells containing text, graphics, animation, equations, tables, and "live" Mathematica code arranged a tree structure. You can read about subjects in a notebook like you would in a book. The advantage over a book is that you can interact with the "text" by tinkering with the mathematics underlying the subject. And because the information is presented in a hierarchy, you can select more information on a topic either by searching for more information on a subject via the Find menu option or by opening up a closed section of cells. A closed section is displayed with a downward pointing half arrow, such as the one shown below:
Fonts are indicative of what the cell is. For example, this cell is normal-sized text. The next cell is "live" Mathematica code, and the cell after that contains the output of the "live" code:
:[font = input; startGroup; ]
2 + 2
:[font = output; inactive; output; endGroup; ]
4
;[o]
4
:[font = text; inactive; ]
You can have the Mathematica kernel evaluate code by selecting the cell with the code in it and then hitting either SHIFT-RETURN or ENTER. The RETURN key by itself is only useful for formatting text.
This notebook provides an overview of packges that implement aspects of linear systems theory. The packages can take transforms, perform convolution, etc. Several notebooks accompany the packages. Three teach the z-transform, the mechanics of convolution, and analog filter design. The other signal processing notebooks serve as user guides and reference manuals. Although the packages and notebooks are in the public domain, they are not bundled with the Higher Education Mailbox. You can order them from Wolfram Research Inc. (for the cost of the distribution medium, shipping, and handling) or you can download them at no cost via anonymous ftp (which is the topic of the first subsection below).
To download the extensions, perform the following commands (begin at Unix prompt):
:[font = text; inactive; ]
unix> ftp vax.eedsp.gatech.edu
:[font = special3; inactive; ]
Connected to vax.eedsp.gatech.edu
220 vax.eedsp.gatech.edy FTP server ...
:[font = text; inactive; ]
Name: anonymous
:[font = special3; inactive; ]
331 Guest login ok, send ident as password
:[font = text; inactive; ]
Password: <your email address goes here>
:[font = text; inactive; ]
ftp> cd Mathematica
:[font = special3; inactive; ]
250 CWD command successful
:[font = text; inactive; ]
ftp> binary
:[font = special3; inactive; ]
200 Type set to I
:[font = text; inactive; ]
ftp> get SigProc2.0.tar.Z
:[font = text; inactive; ]
ftp> quit
:[font = text; inactive; ]
unix> uncompress SigProc2.0.tar.Z
:[font = text; inactive; ]
unix> tar xf SigProc2.0.tar
:[font = text; inactive; endGroup; ]
(The "get" command should take 2 minutes or so.) These commands should produce a README and four sub-directories: Macintosh, Notebooks, Packages, and doc. Packages and Notebooks contain the signal processing packages and notebooks, respectively, which are discussed in detail in this notebook. A reference manual and a user's guide to the packages reside in the doc sub-directory as two LaTeX files. The notebooks document the extensions more thoroughly than do the LaTeX files.
Once you have acquired the signal processing packages, you can load all or part of them as desired. To load all of the packages, simply execute the following command:
:[font = input; center; ]
Needs[ "SignalProcessing`SignalProcessing`" ]
:[font = text; inactive; ]
To load in only the digital signal processing packages, execute
:[font = input; center; ]
Needs[ "SignalProcessing`Digital`" ]
:[font = text; inactive; ]
To load in only the digital signal processing packages, execute
:[font = input; center; ]
Needs[ "SignalProcessing`Analog`" ]
:[font = text; inactive; endGroup; ]
The loading process for all of the packages may take up to five minutes. You the reader do not have to execute any of the above commands to make sense out of this document.
Mathematica is really two distinct programs: the kernel and the user interface. The kernel is available for a dozen computer systems. All extensions to the kernel written in the Mathematica programming language are 100% portable across machines. The user interface varies from machine to machine. On the NeXT, Macintosh, and 386 machines (under MicroSoft Windows), this notebook interface is available. A notebook is an ASCII file which is compatible on all three machines. You are reading such a notebook.
The interactive nature of Mathematica and its multimedia capabilities make it a good platform in which to write tutorials. Teachers can also use them to create problem sets and their solutions. Students can use them to solve problems and document their solution as they go. At the very least, such a facility can provide decent on-line help.
For the last three years, Don Brown, Horacio Porta, and Jerry Uhl at the University of Illinois at Urbana-Champaign have been developing a one-year Calculus course in the form of tutorial notebooks. They have adapted a conventional one-year freshmen Calculus course into a laboratory setting where the teacher only lecture 30 minutes per week. The lessons are broken down into 60 notebooks, which students complete at a rate of two per week. The developers faced two major obstacles. First, how does one take advantage of the multimedia capabilities so that one does not simply dump the contents of a text book into a notebook format? So, they split each notebook into six sections:
:[font = special5; inactive; ]
1. Introduction 2. Basic Problems
:[font = special5; inactive; ]
3. Tutorial problems 4. "Give It a Try"
:[font = special5; inactive; ]
5. Student feedback 6. "Literacy Sheet"
:[font = text; inactive; endGroup; ]
The second issue was grading. They decided to embed problems in the notebook which had been partially completed. It was then up to the students to fill in the missing pieces and document why they chose certain procedures. Students also worked problems from scratch. The primary source of their grades was conventional paper-and-pencil tests.
Besides the Calculus courseware discussed in the previous subsubsection, other educators are using Mathematica to enhance the learning process. The list below is only representative and by no means exhaustive. The first two lines identify the departments and the school. The third line indicates the purpose. The remaining lines list the classes in which Mathematica without any extensions is being used. (The next section entitled "Signal Processing Notebooks" lists some of the schools that are using the signal processing packages and notebooks as educational tools).
:[font = text; inactive; ]
:[font = special3; inactive; ]
Engineering, Mathematics, Physics, and Chemistry Departments
Mathematica comes with several notebooks. The notebook entitled "TourOfMathematica" in the /NextLibrary/Mathematica/Notebooks directory provides an overview of the system.
:[font = text; inactive; ]
Several books published by Addison-Wesley are listed below. The first is more of a reference manual than a user's guide. The 1988 edition documents Mathematica 1.0 and the 1991 edition documents Mathematica 2.0. The second book is an introduction on how to encode knowledge in Mathematica. The other book are less general.
:[font = subsubsection; inactive; ]
S. Wolfram, Mathematica: A System for Doing Mathematics by Computer, 1988.
:[font = subsubsection; inactive; ]
R. Maeder, Programming in Mathematica, 1990.
:[font = subsubsection; inactive; ]
S. Skiena, Implementing Discrete Mathematics: Combinatorics and Graph Theory with Mathematica, 1990.
:[font = subsubsection; inactive; ]
T. Gray and J. Glynn, Exploring Mathematics with Mathematica, 1991.
The following is taken from "Symbolic Transform with Applications to Signal Processing" by B. L. Evans and J. H. McClellan which appeared in the Fall 1990 issue of "The Mathematica Journal" pages 70-80. The reference section lists this article as [Evans, 1990].
:[font = text; inactive; ]
Transform theory is a powerful tool employed by scientists
[Oberhettinger and Badii 1973], mathematicians [Churchill 1958], and engineers [Lathi 1983; Muth 1978; Oppenheim and Schafer 1989]. One important use of this theory is to transform equations involving integrals and derivatives into algebraic equations that are easier to solve. The solutions to the original equations are obtained by inverse transforming the algebraic solutions. This is the case when the Laplace transform is applied to linear
differential equations with constant coefficients, or when the z-transform is applied to linear difference equations with constant coefficients.
:[font = text; inactive; ]
This process is one of the staples of signal processing, the area
of engineering that deals with the design and analysis of systems that act on signals in prescribed ways. A signal is essentially a function of one or more variables; often, in the one-variable case, the variable is time. The variable can be continuous (for an analog signal), or discrete (for a digital, or sampled, signal). Thus a one-dimensional discrete-time signal is a finite or infinite sequence of values, or samples.
:[font = text; inactive; ]
A system is a mathematical operator that transforms one signal into
another, according to characteristic rules. Filters, or linear time-invariant systems, form a particularly important class of systems, eminently suited to
the application of transform methods. A filter is characterized by a function, its impulse response, in terms of which the filter's action on any signal can be determined. The output signal is the convolution of the input signal with the filter's impulse response; the operation of convolution involves an integral for continuous signals and a summation for discrete ones. Using transforms, one can reduce the task of convolving these two functions to that of multiplying two algebraic expressions--- the functions' transforms--- and then inverse transforming the product.
:[font = text; inactive; ]
For an example of analog system design, consider the transmission of AM radio signals. Each AM radio station broadcasts at a specific frequency fo which is between 550 kHz and 1600 kHz and is a multiple of 10 kHz [Lathi 1983]. In order to avoid overlap with other stations, a station must transmit its signal between the frequencies fo - 5 kHz and fo + 5 kHz. Before transmission, a station filters its signal so that frequencies above 5 kHz are rejected and frequencies below 5 kHz are passed. This filtered signal is then shifted by fo in the frequency domain and transmitted. The entire design and analysis of this system can be carried out in the frequency domain: the Laplace transform would be used for the design and implementation of the 5 kHz low-pass filter, and the Fourier transform would be used to analyze the transmission system.
:[font = text; inactive; ]
By contrast, digital signal processing (DSP) deals with discrete-time signals (sequences) and systems that act on them [Oppenheim and Schafer 1989]. Primarily, digital signals come from sampling and quantizing
analog signals. In many cases, implementing a system in digital hardware is faster, more flexible, and more cost-effective than building it from
analog components. One reason for this is that increasing precision in discrete systems is as simple as adding bits, whereas more expensive components may be required in analog systems. Another reason is that the time to prototype a system is often shorter for discrete systems. Apart from that, some DSP operators, like those that alter the sampling rate, have little meaning in the continuous domain, and may be very difficult to implement with analog components.
:[font = text; inactive; ]
The most commonly used transforms in DSP are the z-transform, the discrete-time Fourier transform (DTFT) and the discrete Fourier transform (DFT). Just as the Laplace transform is a generalization of the Fourier transform, the z-transform is a generalized form of the DTFT. The z-transform is most useful in the implementation of digital filters as digital hardware or programs for DSP chips, while the DTFT is preferred when the frequency-domain characteristics of a system must be defined.
:[font = text; inactive; ]
Neither digital nor analog signal processing is confined to a single dimension. Many spatial array and imaging applications require two- and
three-dimensional processing. This is the case for detecting edges in monochrome digital images, or finding angles of arrival with an array of sensors. A digitized image can be thought of as a function defined on an N x M grid, where each grid square is assigned an intensity value known as a grey level (usually a positive integer). In such a digitized image, human eyes perceive an edge as a sharp transition between grey levels in adjacent regions. Such a sharp transition gives rise to high-frequency components in
the image. Therefore, filtering the image to boost its high-frequency components and decrease its low-frequency components would sharpen edges in the image. This operation on the image is a two-dimensional high-pass filter; it corresponds to convolution in the two-dimensional ``time'' domain.
:[font = text; inactive; ]
Digital signal processing has always been tied closely to computer implementations, where the signals are viewed as a stream of numbers. The machine provides an efficient way to compute the DSP operator that transforms one stream of numbers into another. On the other hand, the design of a signal processing system treats the signals as functions (in the mathematical sense).
:[font = text; inactive; ]
Over the last decade, special attention has been devoted by several researchers to the field of symbolic signal processing [Kopec 1980, 1985;
Myers 1986; Covell 1989]. In symbolic processing, the signal is represented in a computer as a formula, rather than as a sequence of numbers. Thus, the value of a signal might only be known in terms of a formula, instead of a number. In a similar manner, signal processing operators, the building
blocks for systems, are maintained in symbolic form. This enables a machine to simplify, rearrange, and rewrite symbolic expressions until they take a desired form. For example, the desired form might be an optimal implementation of an expression in which the number of additions and multiplications is minimized.
:[font = text; inactive; ]
The remainder of this paper [notebook] describes a set of packages that provide a general platform for implementing symbolic transforms in Mathematica and that represent a first step toward the building of a comprehensive signal processing environment in Mathematica. The packages are divided into three groups, corresponding to the contexts
:[font = input; center; ]
SignalProcessing`Support`
:[font = input; center; ]
SignalProcessing`Digital`
:[font = input; center; ]
SignalProcessing`Analog`
:[font = text; inactive; endGroup; ]
(Loading either of the last two automatically causes the first to load as well.)
The signal processing packages are extensions to the Mathematica kernel. These packages add knowledge representations for functions, operators, and structures common in signal processing and implement the bilateral forms of the usual linear transforms:
:[font = special3; inactive; center; ]
discrete signals
:[font = network; inactive; center; ]
z-transform
discrete-time Fourier transform
discrete Fourier transform
:[font = special3; inactive; center; ]
continuous signals
:[font = network; inactive; center; ]
Laplace transform
Fourier transform
:[font = text; inactive; ]
The transforms can fully justify their answers so that students can learn the mechanics of how to compute transform. [Evans, 1990]
:[font = text; inactive; ]
The packages also perform convolution and solve difference/differential equations. The solvers can tackle linear constant coefficient (lcc) difference and differential equations subject to initial conditions. Like the transform rule base, these solvers can fully justify their answers. [Evans, 1990]
Of course, no implementation of signal processing operations would be complete without special graphical representations for signals (functions) and systems (operators):
These packages can compute transforms as well as fully justify the answers. This is useful for showing the mechanics of taking transforms to students. Since the justification (dialogue) capabilities are pretty much the same for all of the transforms,we have included only Laplace transform examples because the Laplace transform is probably the most familiar of the implemented linear transforms.
For the example below, note that CStep is the continuous step function. The justification is enabled by the Dialogue -> All option. Other possible values for Dialogue are True and False. True, the default value, tells the Laplace transform object LaPlace to report only strategies used in finding the transform (like partial fractions or series expansion).
The justification is enabled by the Dialogue -> Trueoption. Other possible values for Dialogue are All and False. True, the default value, tells the Laplace transform object LaPlace to report only strategies used in finding the transform (like partial fractions or series expansion).
The signal processing packages can perform high-level signal analysis on digital signals (via DSPAnalyze) and analog signals (via ASPAnalyze). The analysis mimics that expected of a junior or senior electrical engineering student. For 1-D and 2-D signals, DSPAnalyze and ASPAnalyze
:[font = special3; inactive; ]
1. plot the time-domain signal,
:[font = special3; inactive; ]
2. take its transform (z-transform for digital signals and Laplace
transform for analog signals),
:[font = special3; inactive; ]
3. determine conditions on the free parameters for the signal
to be stable,
:[font = special3; inactive; ]
4. display the pole-zero diagram, and
:[font = special3; inactive; ]
5. compute and plots the frequency response (if it exists).
:[font = text; inactive; ]
Since the digital analysis performed by DSPAnalyze is similar to the analog analysis by ASPAnalyze, we have included one example. aHere is the analysis of a two-sided decaying one-dimensional discrete-time exponential signal:
The signal processing packages can solve linear constant coefficient (lcc) difference (via via ZSolve) and differential (LSolve) equations subject to initial conditions. ZSolve and LSolve need to know the difference / differential equation and the function to be solved for. Like the transform rule bases, ZSolve and LSolve can fully justify their answers.
We have written several notebooks to accompany the signal processing packages, including tutorials on convolution, the z-transform, and analog filter design. The tutorials are designed to accompany junior, senior, and first-year graduate engineering courses. The other notebooks provided on-line help and training. The LaplaceTest notebook demonstrates how-to-use the forward and inverse Laplace transform objects as well as their limitations. Two notebooks, SignalProcessingExamples and EducationalTool, provide an overview of the signal processing packages and notebooks. The last notebook, SignalProcessingUsage, contains an on-line reference to all of the new Mathematica objects introduced by the signal processing packages. [Evans, 1991]
These tutorials present the usual text book information, but they allow the reader to tinker with mathematical models and to visualize ideas through animation. For example, the analog filter design notebook animates the effect of filter order on filter roll-off . The z-transform notebook illustrates the effect on a filter's magnitude response when the location of a pair of poles is slightly disturbed. The convolution notebook animates the flip-and-slide approach to piecewise convolution.
Animation of the Flip-and-Slide View of Convolution
:[font = text; inactive; ]
Teaching the mechanics of the flip-and-slide approach to piecewise convolution is difficult. The following animation illustrates the method of "sliding" one function against another by showing the resulting function as it is generated in time. We will convolve x with h.
:[font = input; startGroup; ]
x = ConvertFromList[{{2 t,0,2}},t]
:[font = output; inactive; output; endGroup; ]
2*t*CPulse[2, t]
;[o]
2 t CPulse [t]
2
:[font = input; startGroup; ]
h = ConvertFromList[{{2,0,2},{1,2,3}},t]
:[font = output; inactive; output; endGroup; ]
CPulse[1, -2 + t] + 2*CPulse[2, t]
;[o]
CPulse [-2 + t] + 2 CPulse [t]
1 2
:[font = text; inactive; ]
To animate the graphics below, select the grouped closed cells and select the "Animate Selected Graphics" option (COMMAND-y) off of the Graph menu. The new function is aligned with the leading edge of h(t-u).
The z-transform notebook defines the bilateral z-transform and discusses the importance of the region of convergence (ROC). This ROC coupled with the location of poles characterizes the stability and casuality of the signal. The notebook then explores the relationship between the z-transform and the discrete-time Fourier transform (DTFT), namely the fact that not every function with a z-transform has a DTFT and vice-versa. The notebook comes stocked with built-in exercises and many animations, including two that show the effect on the magnitude response of slight perturbations of poles and several that show how the locations of poles and zeroes influence the magnitude response.
The analog filter design notebook discusses the characteristics of the classical Bessel, Butterworth, Chebyshev I, Chebyshev II, and Elliptic analog filters as well as lowpass, bandpass, bandstop, and highpass magnitude responses. It shows how to manipulate filter representations (namely how to take transforms and plot the results). It demonstrates the effects of coefficient truncation and how to convolve an input function with a filter symbolically. The notebook contains two animations. One shows how the magnitude filter response varies with filter order and the other how the ripple varies with the ripple gain parameter epsilon.
Teaching convolution water flow (input) through soil (linear system) to find contribution to local water level (output) in graduate-level hydrology class.
:[font = text; inactive; ]
:[font = special3; inactive; ]
Georgia Institute of Technology
School of Electrical Engineering
:[font = text; inactive; ]
Teaching convolution and Fourier transforms in an introductory communications class.
:[font = text; inactive; endGroup; endGroup; ]
Generating problems z-transform sets and their solutions for an introductory digital signal processing class.
Several schools (Rose-Hulman, University of Illinois, etc.) are experimenting with integrating Mathematica into the freshmen curriculum. The signal processing packages and notebooks are an attempt at developing the extensions for classes at a higher level, namely those that teach linear systems, signal processing, and transform methods. This means that engineering, mathematics, chemistry, and physics students can benefit from these extensions.
The signal processing packages implement a wide range of topics from linear systems theory from an engineering perspective. These packages provide many functions and operators common in linear systems theory and signal processing that are not defined in Mathematica: [Evans, 1990]
:[font = text; inactive; ]
:[font = special3; inactive; center; ]
discrete signals
:[font = network; inactive; center; ]
z-transform
discrete-time Fourier transform
discrete Fourier transform
:[font = network; inactive; center; ]
one-dimensional convolution
solving lcc difference equations
:[font = network; inactive; center; ]
signal analysis
:[font = text; inactive; ]
:[font = special3; inactive; center; ]
continuous signals
:[font = network; inactive; center; ]
Laplace transform *
Fourier transform *
:[font = network; inactive; center; ]
one-dimensional piecewise convolution
solving lcc differential equations
:[font = network; inactive; center; ]
signal analysis
:[font = network; inactive; center; ]
one-dimensional analog filter design
:[font = text; inactive; ]
:[font = special3; inactive; center; ]
general plotting
:[font = network; inactive; center; ]
1-D and 2-D signals and sequences
frequency responses
pole-zero diagrams
root loci
:[font = text; inactive; endGroup; ]
* Although Mathematica 2.0 comes with some Laplace and Fourier
transform capabilities (written from a mathematicians point of view),
it will not be able to transform expressions common in signal
processing because Mathematica 2.0 manipulates mathematical
formulas not signal processing expressions. Besides, Mathematica's
implementation is for one-dimensional, one-sided functions, whereas
ours handles two-sided and multidimensional functions.
So far, seven notebooks (besides the one you are presently reading) describe the signal processing packages. Three serve as tutorials on the z-transform, convolution, and analog filter design. The others serve as on-line help. Together, these notebooks allow students to read about signal processing, tinker with equations, and visualize ideas through animation [Evans, 1991]. With Mathematica 2.0, students will also be able to learn through hearing. As a multimedia tool, Mathematica can enhance the learning process and make it more enjoyable.
M. A. Clements and J. P. Pease. 1989. ``On Causal Linear Phase IIR Digital Filters,'' {IEEE Transactions on Acoustics, Speech, and Signal Processing}, vol. 37 (4), pp. 479-484.
:[font = subsection; inactive; startGroup; ]
[Churchill 1978]
:[font = text; inactive; endGroup; ]
R. Churchill. 1958. {Operational Mathematics}. McGraw-Hill, New York.
:[font = subsection; inactive; startGroup; ]
[Covell 1989]
:[font = text; inactive; endGroup; ]
M. M. Covell. 1989. {An Algorithm Design Environment for Signal Processing}. Ph. D. Thesis and RLE Tech. Rep. #549. MIT, Cambridge (MA).
:[font = subsection; inactive; startGroup; ]
[Dudgeon & Mersereau 1984]
:[font = text; inactive; endGroup; ]
D. E. Dudgeon and R. M. Mersereau. 1984. {Multidimensional Digital Signal Processing}. Prentice Hall, Englewood Cliffs (NJ).
:[font = subsection; inactive; startGroup; ]
[Evans 1990]
:[font = text; inactive; endGroup; ]
B. L. Evans, J. H. McClellan, and W. B. McClure. 1990. "Symbolic Transforms with Application to Signal Processing." {The Mathematica Journal}. Fall, 1990. vol. 1, issue #2, pp. 70-80.
:[font = subsection; inactive; startGroup; ]
[Evans 1991]
:[font = text; inactive; endGroup; ]
B. L. Evans, J. H. McClellan, and K. A. West. "Mathematica As An Educational Tool for Signal Processing". {Proc. of IEEE Southeastern Conference}. April, 1991. pp. 1172-1176.
:[font = subsection; inactive; startGroup; ]
[Kopec 1980]
:[font = text; inactive; endGroup; ]
G. Kopec. 1980. {The Representation of Discrete-Time Signals and Systems in Programs.} Ph. D. Thesis. MIT, Cambridge (MA).
:[font = subsection; inactive; startGroup; ]
[Kopec 1985]
:[font = text; inactive; endGroup; ]
G. Kopec. 1985. ``The Signal Representation Language SRL.'' {IEEE Transactions on Acoustics, Speech, and Signal Processing}, vol. 33 (4), pp. 921-932.
:[font = subsection; inactive; startGroup; ]
[Lathi 1983]
:[font = text; inactive; endGroup; ]
B. P. Lathi. 1983. {Modern Digital and Analog Communication Systems}. Holt, Rinehart, and Winston, New York.
:[font = subsection; inactive; startGroup; ]
[Muth 1978]
:[font = text; inactive; endGroup; ]
E. J. Muth. 1978. {Transform Methods}. Prentice Hall, Englewood Cliffs (NJ).
:[font = subsection; inactive; startGroup; ]
[Myers 1986]
:[font = text; inactive; endGroup; ]
C. S. Myers. 1986. {Signal Representation for Symbolic and Numeric Processing}. Ph. D. Thesis and RLE Tech. Rep. #521. MIT, Cambridge (MA).
:[font = subsection; inactive; startGroup; ]
[Oberhettinger & Badii 1973]
:[font = text; inactive; endGroup; ]
F. Oberhettinger and L. Badii. 1973. {Tables of Laplace Transforms}. Springer-Verlag, New York.
:[font = subsection; inactive; startGroup; ]
[Oppenheim & Schafer 1989]
:[font = text; inactive; endGroup; ]
A. V. Oppenheim and R. W. Schafer. 1989. {Discrete-Time Signal Processing}. Prentice Hall, Englewood Cliffs (NJ).
:[font = subsection; inactive; startGroup; ]
[Oppenheim & Willsky 1983]
:[font = text; inactive; endGroup; endGroup; ]
A. V. Oppenheim and A. Willsky. 1983. {Signals and Systems}. Prentice Hall, Englewood Cliffs (NJ).