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 }.