Complete Listing of the Changes by Version to the
Signal Processing Packages and Notebooks
for the Mathematica Environment
Brian Evans James McClellan
211-105 Cory Hall Digital Signal Processing Group
Dept. of Electrical Engineering School of Electrical and
and Computer Sciences Computer Engineering
University of California Georgia Institute of Technology
Berkeley, CA 94720 Atlanta, GA 30332-0250
E-MAIL: ble@ohm.eecs.berkeley.edu
2/4/94
Since the version of the signal processing packages released by
_The Mathematica Journal_ in the Fall of 1990, I have made changes to
every file and added many new ones. The major changes implemented by
the new version of the signal processing packages are listed by topic
in the "SignalProcessingExamples" notebook and summarized in the file
"CHANGES.SUMMARY". This file lists the changes version by version.
-------------------------- Version 2.0 ----------------------------------
(1) added object SignalPlot that plots the real and imaginary components
of a 1-D function simultaneously on the same plot, as well as
Dirac delta functions. It also plots 2-D signals. (The signal
processing packages already plot 1-D discrete-time functions in
lollipop style via DiscreteGraphics.)
(2) the option Dialogue -> All now works for the forward bilateral Laplace
transform (which means that all transform rule bases can completely
justify their answers)
(3) can plot upsampled sequences again
(4) unified piecewise convolution (either function can be in list
or expression form)
(5) added many transform pairs to the continuous-time Fourier transform
rule bases CTFTransform and InvCTFTransform
(6) the Fourier transform rule bases now handle the convolution operator:
CTFTransform[ Convolve[t][CPulse[1, t + 1/2], CPulse[1, t + 1/2]], t, w ]
(7) RootLocus plots a root locus for one varying parameter
(8) CFIR and CIIR structures have an optional third argument: Roots -> roots.
Change is reflected in AnalogFilters Notebook.
(9) Computational objects for IIR structures, called IIRFunction, now exist.
Also, FIR structures can be rewritten as a formula. Their values
can now be plotted. Values are calculated as they are needed, and
IIRFunction remembers (caches) previous calculations.
(10) SequencePlot now provides a standard way to plot discrete-time expressions
(11) Mathematica 1.2 has a problem performing partial fractions decomposition
on real-valued polynomials even if you do all the factoring yourself.
So, we have added a new option to the InvLaPlace object called Apart.
If set to All, then we kludge around the Apart deficiency so that
a partial fractions decomposition is formed. Otherwise, we inverse
transform the function as an continuous-time IIR filter whose input
is the inverse transform of the numerator. This is made possible
by a new function called MyApart (see below).
(12) The z-transform of IIR structures returns a valid region of convergence.
(13) RealQ[z] returns True if and only if the head (tag) of z is Real.
We have added RealValuedQ[z] which returns True if the imaginary
component of z is 0 or 0.0 (this behaves the way RealQ used to).
-------------------------- Version 2.1 ----------------------------------
(14) ZSolve, a difference equation solver, is more robust. ZSolve can
also justify its answers in the same way as the transforms do.
(15) DTFT of Step[n] is now correct (was missing a pi term).
(16) LSolve can also justify its answers in the same way as the transforms do.
(17) Convolution is now represented by more than one operator.
Linear convolution in the discrete domain is Convolve[n] and
linear convolution in the continuous domain is CConvolve[t].
-------------------------- Version 2.2 ----------------------------------
(18) Discrete-time convolution is now implemented. The Domain option
sets the domain for the convolution routines (except for routines
DTPiecewiseConvolution and CTPiecewiseConvolution). When absent,
Domain takes the value of $ConvolutionDomain (initially Continuous).
The routine SetConvolutionDomain should be used to change the
value of $ConvolutionDomain.
(19) New Notebook called "SignalProcessingIntroduction" serves as an
introduction to Mathematica as well as DSP.
------------------------- Version 2.2.1 ---------------------------------
(20) SequencePlot for 2-D signals now samples functions at integer
indices.
------------------------- Version 2.2.2 ---------------------------------
(21) Stable will resolve stability of non-separable signals more often
(e.g., Stable will return False when applied to the z-transform of
(1/2)^n1 (4/5)^n2 Multinomial[n1,n2] Step[n1,n2]
instead of an unresolved expression.)
------------------------- Version 2.2.3 ---------------------------------
(22) Cleaned up descriptions and implementation of parameterized
operators like Shift, Upsample, and Z.
-------------------------- Version 2.3 ----------------------------------
(23) The TransformLookup option for the transform rule bases allows one
to specify additional transform pairs. This is useful when a trans-
form rule base does not contain a pair that you need. It is also
useful for transforming abstract functions (i.e., saying that x[n]
becomes X[z]). For example,
In:= ZTransform[a^n x[n], n, z, TransformLookup -> { x[n] :> X[z] }]
Out= ZTransData[ X[a z], Rminus[0], Rplus[Infinity], ZVariables[z]]
The N-dimensional case is not as straightforward because each
transform rule base applies a one-dimensional rule base N times in
the order that the N time variables are given. Therefore, users
must specify intermediate transform pairs:
In:= LaPlace[ x[t1,t2], {t1,t2}, {s1,s2},
TransformLookup -> { x[t1,t2] :> X1[s1,t2],
X1[s1,t2] :> X[s1,s2 } ]
Out= LTransData[ X[s1, s2], Rminus[{0, 0}],
Rplus[{Infinity, Infinity}], LVariables[{s1, s2}] ]
Here, X1[s1, t2] denotes the Laplace transform of x[t1,t2] with
respect to the first variable t1. It turns out that you could use
X instead of X1 and the transform will still work out correctly.
(This has been made simpler--- see Version 2.7).
------------------------- Version 2.3.1 ---------------------------------
(24) Debugged the TeX forms of the signals (functions) and systems
(operators) introduced by the signal processing packages, esp.
their multidimensional forms.
(25) Added AllSubsets function which returns all of the possible subsets
of a set. For example, AllSubsets[ {v1,v2,v3} ] returns
{ v1, v2, v3, {v1, v2}, {v1, v3}, {v2, v3}, {v1, v2, v3} }.
Similarly, AllSubsets[ {v1, v2, v3}, Plus] returns
{ v1, v2, v3, v1 + v2, v1 + v3, v2 + v3, v1 + v2 + v3 }.
------------------------- Version 2.3.2 --------------------------------
(26) The Laplace transform of (t - 1) CStep[t] was incorrect. It
returned the same transform as (t - 1) CStep[t - 1] did. One rule
was patched in "LaPlace.m".
(27) The inverse Laplace transform cannot handle complex-valued roots of
a rational polynomial because of limitations of 1.2 Mathematica's
Apart function. We have encoded a new function MyApart which
works around the problem but it is very, very slow. Now, inverse
transforms of functions like "s / ( s^2 + 4 )^2" are possible.
------------------------- Version 2.3.3 --------------------------------
(28) The inverse Laplace transform was not always correctly inverting
terms that corresponded to integration in the time domain. Patched
one rule and added another to the post-processing rules.
(29) The primitive MyApart did not normalize the coefficient of the
highest power term in the denominator before rooting it.
------------------------- Version 2.3.4 --------------------------------
(30) The inverse Laplace transform was still not always correctly in-
verting terms that corresponded to integration in the time domain.
Patched one rule and added another to the post-processing rules.
------------------------- Version 2.4 --------------------------------
(31) Integrating Delta functions over a finite interval did not work
when the coefficient on the variable was one. Fixed.
(36) The routines supporting the rules for multirate multidimensional
signal processing (i.e., lattice and integer matrix theory) have
been gathered in "Multirate.m" in the Support directory, including
"DistinctCosetVectors", "SmithNormalForm", and "SmithReducedForm".
(33) Inverse z-transforms of affine log functions are fixed.
(34) WORKS UNDER ALL VERSIONS OF MATHEMATICA NOW!!!!!
In making sure that the signal processing packages work for BOTH
Mathematica 1.2 and 2.0, the following changes have taken place:
(a) aliases have been discontinued so the former aliased objects
AliasedSinc, AliasSinc, ASinc, InverseLaPlaceTransform,
LaPlaceTransform, and MagnitudePhasePlot are now set equal to
Dirichlet, Dirichlet, Dirichlet, InvLaPlace, LaPlace, and
MagPhasePlot, respectively. Pretty much a transparent change.
Added new alias: RootLocusPlot for RootLocus.
(b) Mathematica 2.0 has a new undocumented function called ListQ
which replaces the one provide by us (our definition for ListQ
is still used for Mathematica 1.2 and lower).
(c) Mathematica 2.0 represents collections (headless expressions
like "(0,2,1,0)") using the head (data tag) Sequence.
So, ToCollection has been modified to return a collection
with the proper syntax under both Mathematica 1.2 and 2.0.
As an indirect result, the functions GetAllExponents and
GetAllFactors have been rewritten to return lists instead
of collections. We have removed the function ExtractVariables,
but GetVariables was kept so use it instead.
(d) The evaluation strategy for the Which construct has changed.
Now, each conditional statement in the construct MUST evaluate
to True or False. We now force all of our Which conditional
statements to evaluate to True or False by using TrueQ.
(35) Mathematica 2.0 offers the DeclarePackage which allows one to
specify the objects defined by a package. That way, when a user
invokes a new primitive, Mathematica 2.0 will automatically load
the package that defines it and then continue evaluating the
expression. This works for most objects but does not handle the
case where additional packages build up a definition incrementally.
The initialization files "Analog.m", "Digital.m", and "Support.m"
now only define the ``stubs'' for the objects in the analog,
digital, and support signal processing packages, respectively.
As a result, one can place Needs[ "SignalProcessing`Master`" ]
in the initialization file without noticeably slowing down the
initialization process. That way, students can go about their
business without having to know which packages to load beforehand.
(36) One warning about Mathematica 2.0: it now assumes that variables
represent complex (instead of real) numbers, so Sqrt[x^2] remains
unsimplified. Although this is usually beneficial, this assumption
sometimes clashes when you want to treat a variable as real-valued.
For example, Plot[ x^(1/3), {x, -5, 5} ] cannot handle x in [-5, 0)
because it takes the wrong branch cut at the origin which can be
seen by plotting the real part of x^(1/3). It does plot the
correct curve over x in [0, 5].
(37) For the most part, the Notebook interface in 2.0 is upwardly
compatible with that of Mathematica 1.2. However, 2.0 no longer
saves bit maps of graphics when you save the Notebook. Therefore,
when reading in a Notebook, the machine will have to generate a
bit map for each graphics cell (an extra 20 kb of information per
graphics cell). As a consequence, some of our Notebooks require
twice the memory they occupy on disk. As a consequence, we have
split the z-transform Notebook into three Notebooks.
------------------------ Version 2.4.1 --------------------------------
(38) MagPhasePlot no longer generates a "Set::raw" warning message.
and can plot Delta functions that appear in the frequency response
(including impulse trains).
(39) The inverse Laplace transform finally works identically under
Mathematica 1.2 and 2.0. The main problem was that the partial
fractions primitive Apart no longer normalized polynomials in
denominators so the resulting denominators failed to match any
of the transform pairs.
(40) Added SPSimplify which applies simplification rules for signal
processing expressions. It supports a dialogue option.
(41) SequencePlot displays the "lollipops" more boldly and adapts
their widths according to the number of samples plotted.
------------------------ Version 2.4.2 -------------------------------
(42) New tutorial Notebook on the discrete-time Fourier transform.
(43) SPSimplify failed to return if Dialogue was enabled.
(44) Apart in Mathematica 2.0 does not handle non-rational polynomials
(45) SignalPlot, SequencePlot, and MagPhasePlot are more robust
under Mathematica 2.0.
(46) ASPAnalyze and DSPAnalyze print more descriptions for the analyses
that they perform. They are also immune to changes in the Global
environment.
------------------------ Version 2.4.3 -------------------------------
(47) CTFTransform cannot find SPSimplify. Fix to BeginPackage.
(48) MagPhasePlot did not handle discontinuities well. Fixed.
(49) Integral of Delta[t] over a finite interval. Fixed.
(50) Continuous-time piecewise convolution works again.
------------------------ Version 2.4.4 --------------------------------
(51) Made the forward and inverse continuous-time Fourier transforms
use the same set of rules by exploiting the duality property.
(52) Fixed the procedure that normalizes expressions in the inverse
Laplace transform rule base
------------------------ Version 2.4.5 -------------------------------
(53) Discrete convolution has been fixed.
------------------------- Version 2.5 --------------------------------
(54) Discrete and continuous Convolution has been fixed to work when
one or more endpoints is infinite.
(55) For SequencePlot of 1-D signals, the integer axis now is
guaranteed to have integer ticks.
(56) RationalGCD accepts the same style as Mathematica's GCD primitive.
Specifically, RationalGCD no longer accepts a list of elements but
instead has the form RationalGCD[e1, e2, ...].
(57) Added the Multirate supporting functions ColumnHermiteForm and
RowHermiteForm as well as LCLM, LCRM, GCRD, and GCLD.
(58) Automatic simplification of expressions is no longer performed,
but syntax checking is still automatic. Simplification is now
handled by SPSimplify which augments the built-in routine Simplify.
There are new routines that perform extensive rewriting of signal
processing expressions as discussed below.
(59) The evaluation of Needs[ "SignalProcessing`ObjectOriented`" ] will
enable the attachment of properties to (parameterized) operators
using the routine DefSystem. The default properties (ASSOCIATIVE,
LINEAR, SHIFTINVARIANT, etc.) are kept in the variable SPproperties.
They will have already been attached to Mathematica's built-in
operators (Re, Im, Conjugate, Plus, and Times) and to the new
operators (Shift, Upsample, etc.). Users can attach properties
to their own or other existing operators.
(60) Syntax checking and simplification rules have already been
developed for the new signals (functions) and systems (operators).
We have also developed a comprehensive set of rearrangement
rules for signals and systems based on their properties.
These are accessible by the routine SPRecursiveRewrite. Heuristic
techniques will be added soon.
------------------------- Version 2.5.1 -------------------------------
(61) SignalPlot supports exactly the same options as do Plot and Plot3D.
Signal plots look better, too.
(62) The Laplace transform rule bases now handle the Summation operator.
------------------------- Version 2.5.2 -------------------------------
(63) Cleaned up definition of the Summation operator and Delta function.
(64) Cleaned up SignalPlot's display of delta functions and a train of
delta functions. Updated DeltaPlot, Arrow2D, and SignalPlot.
------------------------- Version 2.5.3 -------------------------------
(65) Integration rules for Delta functions are now covered by
DeltaIntegrate. Users can customize them (but first you
will need to unprotect it).
------------------------- Version 2.5.4 -------------------------------
(66) The inverse z-transform can now inverse the forward transform of
a downsample operation.
(67) The forward and inverse z-transforms handle more cases involving
the Summation operator.
(68) The forward z-transform handles affine step functions and the
inverse z-transform more cleanly works around the shortcomings
of Mathematica's Apart primitive by relying on MyApart to invert
those transforms than Apart cannot handle.
(69) Integration is now more robust for expressions involving continuous
step (CStep) functions and continuous pulse (CPulse) forms.
(70) A minor adjustment was made to DistinctCosetVectors function.
------------------------ Version 2.5.5 -------------------------------
(71) Provided a "master" file for the signal processing extensions as
to be compatible with the convention used by Mathematica's
standard packages: use Needs["SignalProcessing`Master`"]
(72) Inverse z-transform of the forward z-transform of Sin[b n] Step[n]
returns Sin[b n] Step[n] as it used to do. The sequence of steps
for the inverse z-transform has changed.
OLD ORDER: rational pairs, non-rational pairs, partial fractions,
pick off constants, additivity, delays, partial
fractions (again), logarithm properties, downsampled
sequence, multiplication by a^n, ....
NEW ORDER: rational pairs, non-rational pairs, downsampled
sequence, additivity in form of summation operator,
multiplication by a^n, pick off constants, delays,
additivity, normalize denominator, partial fractions,
additivity in numerator, logarithm properties, ...
(73) The routine TheFunction that converts signal processing expressions
to formulas has been extended.
(74) GetAllFactors, the function that helps determine if a variable
in an expression has been scaled, is more robust. This helps the
inverse z-transform properly handle the z-transform of functions
like a^n Sin[b n] Step[n]. I have also improved ScalingFactor
and UpsampleFactor so that the factors returned are independent
of the variable being checked.
------------------------- Version 2.6 --------------------------------
(75) Introduced a heuristic to apply rewrite rules intelligently
called SPHeuristicRewrite.
(76) CirclePS, used by the pole-zero plotting routine, now uses the
built-in Graphics primitive Circle.
(77) The inverse Laplace transform produces right-sided transforms
more often. The problem was in Mathematica 2.0 because Apart
(and therefore MyApart) does not normalize the denominator(s)
after partial fractions. Also, the Similarity Property is
correctly implemented as only to allow f(cs) to be rewritten
when c > 0.
(78) Regardless of the value of the Dialogue option, the transform
rule bases will keep track of the assumptions made on the free
parameters. They can be retrieved at any time by evaluating
Assuming[All]. The set of conditions can be cleared by
evaluating Assuming[].
(79) The transform rule bases now print out assumptions made
on parameters if the Dialogue option is set to All.
(80) SignalPlot and SequencePlot handle periodic functions better,
so Summation[i, -Infinity, Infinity, 1][CStep[1, t + 2 i]], or
alternately Periodic[2,t][CStep[1,t]], plots correctly.
(81) The TransformLookup option is more robust for all transforms.
(82) You can now specify a list of symbols to treat as variables to
SPSimplify by using the Variables option.
(83) Improved DTFT Notebook that introduces Fourier analysis of
sequences, the DTFT, and the DFT.
------------------------ Version 2.6.1 -------------------------------
(84) The user-specified transform pairs are now put at the beginning
of the rule base so that they override the built-in knowledge
and they appear in proper order during dialogue. As a consequence,
the forward and inverse Fourier transforms now properly handle
the TransformLookup option for specifying new transform pairs.
(85) The inverse z-transform can handle downsampled and upsampled
signals again.
(86) The assumptions made on free parameters during the taking of a
linear transforms are displayed in a more meaningful way.
(87) New operator called CircularShift which is an abstract form of
the primitive RotateRight. It was introduced because of the
new DFT transform pairs written into the DFT rule bases.
(88) I have idiot-proofed the transform rule bases. So, if you typed
something like LaPlace[ CStep[t], t s ] it would complain about
t s because you meant t, s. This should help new users.
------------------------ Version 2.6.2 -------------------------------
(89) The MagPhasePlot routine now takes the same options as Plot does.
Furthermore, it works better under Mathematica 2.0.
(90) The notation for PolyphaseDownsample and PolyphaseUpsample has
changed to include the filter as a parameter. These operators
are now single input, single output operators.
(91) The rearrangement rules contained in SystemRewriteRules have been
debugged, including the m-D versions of Crochiere and Rabiner's
rules for 1-D multirate signal processing. Some rules were added.
------------------------ Version 2.6.3 -------------------------------
(92) All of the system rearrangement and simplification rules listed
in Appendix D of Myers' MIT thesis have been encoded in their
original 1-D forms. The multidimensional analogs have been
developed and encoded as well.
(93) ConvertToList, which converts an algebraic form of a (piecewise)
function into a list of F-intervals, is more robust. It now
properly converts functions like the trapezoid function defined by
(t+1) u(t+1) - t u(t) - (t-1) u(t - 1) + (t-2) u(t-2)
where u(v) is the continuous step function. Before, it would
have claimed that this function had infinite extent when in fact
its extent is from t=-1 to t=2 inclusive.
(94) Renamed "Multirate.m" as "LatticeTheory.m" and made the package
independent from other signal processing packages.
(95) added the number theoretic EuclidFactors to complement the routine
BezoutNumbers. BezoutNumbers finds integers mu and lambda given
integers a and b such that
a mu + b lambda == gcd(a,b)
(BezoutNumbers calls the Mathematica primitive ExtendedGCD.)
EuclidFactors finds the integers mu and lambda given relatively
prime integers p and q and any integer k so that
p mu + q lambda == k
EuclidFactors also works when p and q are integer matrices (in
which case mu, lambda, and k become integer vectors).
------------------------ Version 2.6.4 -------------------------------
(96) One of the simplification rules that handles the conjugation of
complex exponentials dropped terms. It is fixed. Also, more
simplification rules for complex exponentials have been added.
(97) Under Mathematica 2.0, SPSimplify did not support the Trig option
that Simplify supports.
(98) For 1-D signals and sequences, SequencePlot and SignalPlot will
plot a list of them on the same graph.
(99) ZSolve switched the driving function and the difference equation
when there were no initial conditions.
(100) The continuous Fourier transform can handle filter sections again
and even returns the proper region of convergence.
------------------------ Version 2.6.5 -------------------------------
(101) Made RootLocus faster and more robust.
(102) 2-D pole-zero root locus plots handle non-separable polynomials.
(103) The DFT of impulses is faster
(104) GetShiftFactor computes shift factors in an expression for a
given variable.
(105) The inverse Laplace transform rule base better handles shifts in
the Laplace variable. For example, s is shifted by b below:
InvLaPlace[ Sqrt[Pi] Exp[-2 Sqrt[a] Sqrt[b + s] / Sqrt[b + s], s ]
-(a/t) - b t
E CStep[t]
----------------------
Sqrt[t]
(106) The forward and inverse DFT, DTFT, and Laplace transform rule
bases support an option called Definition. If set to True, then
the rule base will apply the definition of the transform if all
other attempts at the transform have failed.
------------------------ Version 2.6.6 -------------------------------
(107) The convolution routines simplify expressions involving Delta and
Impulse functions.
(108) The Definition option has been implemented for the z- and Fourier
transforms so now all of the rule bases have this option.
------------------------ Version 2.6.7 -------------------------------
(109) When the Fourier transform cannot find a transform, it will try to
apply the definition before it calls the Laplace transform rule
bases. Also, the extra comma introduced in Version 2.66 at the
end of the list of the Fourier transform rules has been removed.
------------------------ Version 2.6.8 -------------------------------
(110) The forward z-transform recognizes common shifts in the discrete-
time variable, e.g. (n + 1) f[n + 1].
(111) Introduced ZPolynomial[m, n] which is an mth degree polynomial in n.
It implements the property that the inverse z-transform of the mth
derivative of F(z) is ZPolynomial[m, n] times f[n] shifted by m.
(112) Simplification of conjugated polynomials carried out by SPSimplify
has been enhanced. It now will show that H(z) = H*(z*) when H(z)
is a rational polynomial having real-valued poles and zeroes.
(113) PoleZeroPlot shades regions of convergence for the s-domain.
Also, the DisplayFunction option is properly support so that
you can redirect the output of the pole-zero plot to file via
PoleZeroPlot[ s / ((s+1)(s+2)), s, -3, -2, False,
DisplayFunction -> ( Display["pzplot1.mps", #1]& ) ]
(114) SignalPlot for 1-D signals was generating the correct graphics
but not plotting them on the screen. Fixed.
------------------------- Version 2.7 --------------------------------
(115) Using the TransformLookup option for multidimensional transforms
is now as straightforward as saying x[n1,n2] :> X[z1,z2], i.e.
intermediate transform pairs (one per dimension) do not have
to be specified.
(116) The forward z-transform now transforms multidimensional upsampled
and downsampled functions and properly adjusts the region of
convergence. It also handles transforms of expressions like
Upsample[l1,n1][ Upsample[l2,n2][ x[n1,n2 ] ]:
In:= ZTransform[ Upsample[l1,n1][ Upsample[l2,n2][ x[n1,n2] ] ],
{n1,n2}, {z1, z2},
TransformLookup -> { x[n1,n2] :> X[z1,z2] } ]
l1 l2
Out= ZTransData[ X[z1 , z2 ], Rminus[{0, 0}],
Rplus[{Infinity, Infinity}], ZVariables[{z1, z2}] ]
(117) The forward DTFT handles multidimensional upsampled and downsampled
signals. It also inverse transforms upsampled signals such as the
diamond tile CPulse[2 Pi, w1 + w2 + Pi] CPulse[2 Pi, w1 - w2 + Pi]
which is Upsample[{{1,1},{-1,1}}. {n1,n2}][ Sinc[Pi n1] Sinc[Pi n2] ]
in the discrete-time domain.
(118) Discontinued the functions MyTogether, NegExponent, and NormalizedQ.
(119) GetAllFactors, the function that helps determine if a variable has
been scaled in an expression, has been made more robust (again).
It is used by the z and Laplace transforms.
(120) Added the System property SEPARABLE
(121) The best news is that many of the multidimensional capabilities
have been decoupled from the signal processing packages so that
only 1-D and simple m-D operations are initially loaded. The
packages will load in m-D extensions to existing operators
(e.g., z-transforms of multidimensional resampled signals) as
needed. This strikes a balance in its use by researchers and
students. That is, the SPP initial load the facilities useful
to undergraduates. Additional features are loaded as needed.
(122) SPSimplify works around an infinite loop in Mathematica's Simplify
command. This error in Simplify causes both LSolve and DSolve to
hang when solving some first-order DE's. LSolve no longer hangs
because it uses SPSimplify.
(123) Analog filters can now be specified completely by their poles.
CIIR[t, Roots -> {-1, -2, -3}] would compute the missing coefficient
list from the poles: CIIR[t, {6, 11, 6, 1}]. Similarly,
CFIR[t, Roots -> {-1, 0, 1}] gives CFIR[t, {0, -1, 0, 1}].
(124) The time responses of analog filters can be plotted.
(125) By default, MyApart will now root denominators of higher than
fifth order numerically.
------------------------ Version 2.7.1 -------------------------------
(126) When an improper region of convergence is given to PoleZeroPlot,
it will now display a union of all possible combinations.
(127) All linear symbolic transforms (z, LaPlace, etc.) are faster---
the efficiency increase is proportional to the size of the
expression being transformed. The speed of the transformation
is now independent of the size of local information associated
with each sub-expression.
(128) The symbolic DFT is more robust.
------------------------ Version 2.7.2 -------------------------------
(129) The signal processing Notebooks are finally compatible with the
two versions of Mathematica (1.2/2.0).
(130) Inverse DTFT's of transforms that are upsampled in the time domain
now work under 2.0.
(131) Values for signals that are upsampled in multidimensions can now
be computed and plotted, e.g.
SequencePlot[ Upsample[{{1, 1},{-1, 1}}, {n1,n2}][ Abs[n1 + n2] ],
{n1, 0, 9}, {n2, 0, 9} ]
(132) ASPAnalyze does a better job analyzing simple functions like sin(t).
(133) The continuous-time Fourier transform communicates better with
the Laplace transform rule base so more transforms can be resolved.
Also, many CTFT transform pairs were fixed and enhanced.
(134) Magnitude responses involving Dirac delta functions are properly
displayed again.
------------------------ Version 2.7.3 -------------------------------
(135) The plotting routines are now uniform in the way they convert Delta
Delta functions, infinite summations, periodic operators, and other
oddities into standard Mathematica expressions. The Extent1D
routine has been improved and the SignalCleanup routine has been
introduced.
(136) The Aliasby operator is now always rewritten in terms of the
Periodic operator.
(137) The discrete-time Fourier transform (DTFT) has been made
"mathematically correct" in that the forward transforms track
the inherent periodicity. Normally, DTFT's are periodic with
a period of 2 Pi, but resampled signals exhibit different
periodicities.
(138) The filter design routines automatically load additional routines
when necessary.
(139) PlotList has now been aliased to PiecewisePlot so as to reduce the
confusion with ListPlot.
------------------------ Version 2.7.4 -------------------------------
(140) There is a new global variable called $DeltaFunctionScaling that
controls how the height of Delta functions are to be plotted.
The heights are either scaled to be proportional to the areas
under the Delta functions (Scaled) or are set to maximum value
of the rest of the plot. The default option is Scaled which is
the way students learn to plot Delta functions.
(141) Arrows representing Delta functions are drawn in a more uniform
way. Downward and upward arrows are drawn according to the sign
of the fourth parameter to Arrow2D.
(142) Sampling with infinite impulse trains is now implemented as a part
of the forward and inverse Fourier transform rule bases. Infinite
impulse trains in continuous time are represented either as
Summation[n, -Infinity, Infinity, 1][Delta[t + T n]] or as
Periodic[T,t][Delta[t]] where T is the sampling period, n is an
integer (index) variable, and t is the continuous-time variable.
------------------------ Version 2.7.5 -------------------------------
(143) Delta with imaginary amplitudes are plotted as dotted arrows thanks
to a revision of the Arrow2D function.
(144) ASPAnalyze[Sinc[t], t] works again. Now, when ASPAnalyze finds the
frequency response from the Laplace transform, the mag/phase plot
of the frequency response will be log-log. If ASPAnalyze obtains
it from the Fourier transform, then the mag/phase plot will be
linear-linear.
(145) The convolution property has been implemented for impulse trains
and sinc functions in the continuous Fourier transform rule base.
(146) Fixed a bug in SmithReducedForm.
(147) New routine SmithFormPivot which takes a Smith Form of an integer
matrix U D V and moves a factor of one of the elements of the
diagonal matrix D to another diagonal element. A new U, D, and
V are returned.
(148) SmithNormalForm nows works for rectangular integer matrices.
------------------------ Version 2.7.6 -------------------------------
(149) Fixed a small bug in the Fourier transform.
(150) Additional Notebooks are available on the archive site in the
files beginning with "OtherNotebooks" including an excellent
Notebook on sampling theory.
(151) Enchanced the operator notation so that they can now take options
after the required parameters have been specified. Also, their
TeX representations are more robust.
(152) Fixed DeltaPlot for the case when $DeltaFunctionScaling is
Scaled and the area under a Delta function is a function of
the independent variable.
------------------------ Version 2.7.7 -------------------------------
(153) Introduced SmithLLLForm. SmithLLLForm applies a Smith form
decomposition after running the Lenstra-Lenstra-Lovatz (LLL)
algorithm on the integer matrix. The result will be a Smith
ordered form U D V with either U or V being minimum in a
Frobenius (L1) norm sense.
(154) Introduced SmithEquivalentForm which returns a Smith form U D V
such that U is minimum in a Frobenius norm sense and the diagonal
elements of D are approximately equal.
(155) For Mathematica 2.1 and higher users, the continuous step and
delta functions are now defined in terms of Mathematica's UnitStep
and UnitDelta which are a part of the extended Calculus packages
in Mathematica 2.1. The change will be transparent because CStep
and Delta will still be displayed as CStep and Delta. This
implies that UnitStep and UnitDelta functions will be displayed as
CStep and Delta as well.
------------------------ Version 2.7.8 -------------------------------
(156) Fixed BilinearTransformation.
(157) Delta functions are no longer automatically decomposed into 1-D
functions.
(158) Introduced SmithFormPartiallyMinimizeU which takes a Smith form
decomposition U D V and minimizes the Frobenius norm of two columns
of U. Applying this to columns 1 and 2, then 3 and 4, and so on
will minimize the entire U matrix.
(159) Step[-1-n] Step[n+4] now properly evaluates to Pulse[4, 4 + n]
and Extent1D[ Pulse[4, 4+n], n ] returns {-4, -1}.
(160) Fixed to one transform lookup rule and added post-processing cleanup
rules to the continuous Fourier transform CTFTransform rule base
and added rules to SPSimplify specifically for Fourier transforms.
(161) Fixed typo in the inverse DTFT transform rule base and improved
its handling of continuous frequency pulses.
(162) Integration of CStep, Delta, CPulse, etc. now works properly under
Mathematica 2.0.
------------------------ Version 2.7.9 -------------------------------
(163) Removed two redundant simplification rules in SPSimplify which
sometimes caused DTPiecewiseConvolution to crash. The new rules
were introduced after 2.75.
------------------------- Version 2.8 --------------------------------
(164) PiecewiseToFormula and FormulaToPiecewise now replace the
functions ConvertFromList and ConvertToList, respectively.
(165) MagPhasePlot better handles Delta functions with complex-valued
heights (areas). For magnitude plots, the height of a Delta
function is now plotted as the absolute value of the height at
the Delta function's location. The phase of the height function
is added to the phase response.
(166) SignalPlot plots Delta functions of complex-valued amplitude as a
superposition of a 2-D arrow of the real part draw in solid lines
and a 2-D arrow of the imaginary part drawn in dashed lines.
(167) The convolution packages does not load the infinite summation
routine (GosperSum under Mma 1.2 or SymbolicSum under Mma 2.0)
until the discrete convolution routine DTPiecewiseConvolution is
first used.
(168) The convolution routines now support a Dialogue option which when
True or All will generate the graphs for an animation of the
flip-and-slide approach to convolution.
(169) The convolution routines now handle once again functions defined
at symbolic endpoints such as Delta[t - t0].
(170) The forward/inverse continuous Fourier transforms better handle
functions defined piecewise in terms of polynomials such as
t^a CPulse[10, t] + t^b CPulse[10, t+10].
(171) More rules have been added to SPSimplify so that more kinds of
expressions can be simplified.
(172) All the Notebooks are now in Mathematica 2.0 format to take full
advantage of the abilities of the new version of the front end.
A ``portable'' version of the Notebooks is available from the
Mathematica/Mathematica1.2 directory on the FTP site.
(173) InvZTransform better handles the inverse z-transforms of functions
whose denominators are second-order polynomials in z.
(174) SequencePlot now supports a PlotStyle option.
(175) PoleZeroPlot now recognizes options provided by the user.
(176) PoleZeroPlot can now return either the list of poles (if the Return
option is Roots) or the pole-zero plot(s) (if the Return option is
Graphics).
------------------------ Version 2.8.1 -------------------------------
(177) The definitions of signal processing operators as systems and
rewrite rules for those systems now work properly under
Mathematica 2.0.
(178) Convolution now has two levels of Dialogue. A value of True means
to generate only the animation of the flip-and-slide approach to
convolution. A value of All means that each frame of the animation
will also plot the overlapping functions.
(179) When Dialogue is enabled, the convolution routines will display
a legend of what the different graphics styles mean.
(180) The continuous Fourier transform handles piecewise polynomials
robustly thanks to the debugging efforts of Joe Mark Winograd
(added a transform pair for continuous Unit functions).
------------------------ Version 2.8.2 -------------------------------
(181) The DTFT transform of a discrete pulse (a Dirichlet kernel)
is already periodic with period 2 Pi so the Periodic[2 Pi, w]
operator was removed from the transform pair.
(182) Added definitions to the CPulse function so that it would handle
negative pulse lengths. SPSimplify now rewrites continuous
pulses that are functions of -t so that they are functions of t
and a negative pulse length. The Fourier transform of a pulse
is now scaled by Abs[T] instead of T, where T is the pulse length.
(183) The MagPhasePlot of the Fourier transform of a sine wave is now
correct.
(184) Even and odd functions (such as Sign, Sinc, and Delta) simplify
more often.
------------------------ Version 2.8.3 -------------------------------
(185) New function SmithChart to plot impedance functions.
(186) New function VectorConvolution to convolve two vectors representing
two finite-extent sequences.
(187) Improvement to the continuous Fourier transform CTFTransform and
SPSimplify routines enables the SPP to compute the Fourier transform
of a general unit triangle function from t = -a to t = a, defined as
(1 + t/a) CPulse[a,t+a] + (1 - t/a) CPulse[a,t], to be returned as
a Sign[a] Sinc[a w / 2]^2.
(188) Improvement to the piecewise convolution routines. When dialogue
is All, the second graph shown in each frame indicates the delay
in the flip-and-slide animation (the "n" in the x[m] h[n-m] term
in discrete time or the "t" in the x(u) h(t-u) term in continuous
time).
------------------------ Version 2.8.4 -------------------------------
(189) Plotting the magnitude and phase response of the result of the
CTFTransform function works again, e.g. for the FT of a square wave
MagPhasePlot[ CTFTransform[ Perioidic[2, t][ CPulse[1, t] ], t, w ],
{w, -10, 10} ]
(190) Bug in one of the the discrete-time Fourier transform strategies.
Now, Sin[ (n - 1) Pi / 4 ] is transformed properly.
(191) Fixed bug in RewriteSummations which supports SignalCleanup. Also,
changed the order of operations in SignalCleanup. SignalCleanup
supports the various signal plotting routines (MagPhasePlot,
SignalPlot, etc.). Overall, the fixes were necessary to plot
the magnitude and phase of the DTFT of Sin[ (n - 1) Pi / 4 ].
(192) Made the inverse z-transform handle more cases of Summation.
(193) The Dirichlet kernel now returns 1 when evaluate at w = 0 for all
values of N.
(194) All of the Notebooks have finally been ported to Mathematica 2.0.
Furthermore, for the IBM PC release, the Notebooks have been
postprocessed in order to make them display formatted equations
properly under Windows.
------------------------ Version 2.8.5 -------------------------------
(195) ZSolve finally generates left-sided solutions to difference
equations. (It already generated right-sided solutions).
(196) The inverse Laplace transform of the forward Laplace transform of
Exp[a Abs[t]] works. Like for the Fourier transform of the beast.
(197) The forward/inverse continuous Fourier transform handles more cases
of rational polynomials.
(198) The forward/inverse continuous Fourier transform can transform the
sinc function raised to any positive integer power. For this
transform, the rule base calls the new function in the convolution
packages called SymmetricPulseConvolutions which convolves a pulse
with itself n-1 times.
------------------------- Version 2.8.6 --------------------------------
(200) The lattice theory package implements SmithFormPartiallyMinimizeU
and SmithFormPartiallyMinimizeV, two routines to post-process a
Smith form so that the entries of either (U-I) or (V-I) is
minimized in a least squares sense.
(201) All of the Smith form decomposition routines now work in terms of
U, D, and V. Before, some worked that way, others worked with
U^-1, D, and V^-1. Smith form decomposes an integer matrix into
the product of three simpler integer matrices U D V where D is
diagonal.
(202) Fixed errors displaying CPulse/Pulse functions and in five of the
ten transform routines, fixed the dialog that tells the user which
functions (if any) could not be transformed.
------------------------- Version 2.9 --------------------------------
(203) Added a new operator called PolyphaseResample which represents an
efficient way to change the sampling rate by a rational factor.
(204) A new file called "Ptolemy.m" supports the translation of signal
processing expressions in Mathematica into the Ptolemy interpreter
language. The translation, carried out by the PtolemyProgram
routine, is only valid for 1-D algorithms.
(205) The animation feature of the convolution routines requires less
memory. On a Macintosh, for example, Mathematica 2.0 can run the
animation with a total of 9 Mb allocated to it.
(206) The inverse z- and Laplace transform resolve left-sided functions
given a symbolic region of convergence more often (they worked
fine for a numeric region of convergence and numeric roots).
(207) In computing magnitude plots, the MagPhasePlot routine now displays
logarithmic ticks on the w and magnitude axes when requested.
(208) The transform routines when passed no arguments returns the head
used in the transform rules. This is useful in adding properties
or strategies to the transform rule bases via the TransformLookup
option.
(209) Validated the algorithm underlying the piecewise convolution
routines.
------------------------- Version 2.9.1 -------------------------------
(210) The continuous-time Fourier transform is truly multidimensional.
The multidimensional strategy is no longer to apply the
the one-dimensional rule base once per dimension. Instead, only
one rule base is applied to all of the time variables. The new
approach can transform functions with cylindrical symmetry, etc.
(211) The Fourier transform routines have been extended to support the
tomographic reconstruction of Gaussian kernels.
(212) Applying TheFunction to convolution and transform operators works
properly, i.e. TheFunction[CConvolve[n][CPulse[1,t], CPulse[1,t]]].
(213) Primitive cost functions have been encoded to rank the cost of
algorithms.
(214) A brand new package "Polygons.m" is available to manipulate poly-
gons (intersections of convex polygons)
(215) A brand new package "Decimation.m" assists in the design and
analysis of two-dimensional rational decimation systems. Check
out the DesignDecimationSystem and DownsamplingAliasing, e.g.
analyze the classic quincunx decimator (a filter with a diamond-
shaped passband in the frequency domain followed by a quincunx
downsampler which downsamples by the matrix {{1, 1}, {-1, 1}}):
quincunx = {{1, 1}, {-1, 1}};
passband = Polygon[{{-Pi, 0}, {0, Pi}, {Pi,0}, {0,-Pi}}];
DownsamplingAliasing[quincunx, passband]
------------------------- Version 2.9.2 -------------------------------
(215) The convolution routines apply even more simplification strategies.
(217) The inverse Laplace transform now warns the user in those cases
when the form of the inverse transform depends on the region of
convergence.
(218) The new package "EngConventions.m" configures Mathematica to obey
conventions followed by engineers. It is not loaded by the
SignalProcessing`Master.m file. The user must manually load
in the file (because not all the users are engineers) by
<< SignalProcessing`EngConventions`
(219) Added code in the discrete-time convolution routines to handle the
quirks in some versions of Mathematica 2.0's built-in symbolic
summation routine SymbolicSum.
(220) The Integrate routine finally recognizes the signal processing
functions like CPulse.
------------------------- Version 2.9.3 -------------------------------
(221) Several fixes to the Fourier transform routines. The bugs resulted
from the changes made to support the new tomographics abilities
for version 2.9.1.
------------------------- Version 2.9.4 -------------------------------
(222) The TransformLookup option now works properly for the Fourier
transform routines.
(223) No longer distributing "DataType.m" with the release.
(224) Introduced a file called "Lisp.m" that implements many Lisp
routines not present in Mathematica.
------------------------- Version 2.9.5 -------------------------------
(225) Made a correction to the algorithm that convolves two F-intervals
(function intervals) in the "Convolution.m" package.
(226) Made the ASPAnalyze and DSPAnalyze routines takes arguments
in a form like the other plotting routines, e.g.
ASPAnalyze[ Sin[t], {t, 0, Pi} ]
(227) See (18) for the explanation of the Domain option for the
convolution routines and its default value $ConvolutionDomain.
(228) A new option for the convolution routines, ConvolutionOutpuForm,
directs the routines to return the convolution in piecewise form
(the default) or an algebraic form. Possible values of this
option are Formula, Piecewise, and Automatic.
(229) Mathematica 2.2 introduces a rule for DiracDelta that causes it
to disappear during some simplifications. The signal processing
packages remove the offending rule when its defines Delta.
(230) Fixed the integration-in-time Fourier transform property.
------------------------- Future Plans --------------------------------
(231) The old way to convert signal processing expressions to formulas was
to use TheFunction. That is still supported, but the functionality
of TheFunction has been transferred to Mathematica's Normal routine.
(232) Upsample and Downsample should take an optional third argument,
namely a reindexing symbol.
(233) Generating C/SPOX code for algorithms
(234) Providing an algorithm design environment for linear multidimensional
multirate systems (at the level of saying "write thesis")
Because of changes (1), (5), and (6), we can recreate (for the
most part) the pictorial dictionary of Fourier transforms in
chapter 19 of Bracewell's book entitled "The Fourier Transform and
Its Applications".
Because of changes (9) and (12) and because of subtle modifications to
the ExtractVariables object, DSPAnalyze now works correctly for
IIR and FIR structures.
I have included a release of all of the files that compose the
signal processing packages. We have updated all of the Notebooks
because of the above changes. We have included all eight Notebooks.
The signal processing packages alter these standard Mathematica functions:
(a) Integrate so that it can handle generalized functions like the
Dirac delta (Delta) and functions with discontinuities like
continuous-time step (CStep) and pulse (CPulse) functions.
(b) Simplify applied to an And expression removes redundant conditions
(c) Det of a number is that number
(d) Dot product of two numbers is the product of the two numbers
(e) The TeX forms of Re and Im primitives are Re and Im instead of
R and I.
(f) Under Mathematica 2.0, the default options for the Limit operator have
been changed to { Analytic -> True, Direction -> Automatic }.