summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/dsptricks/dspfunctions.sty
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2014-07-25 21:05:22 +0000
committerKarl Berry <karl@freefriends.org>2014-07-25 21:05:22 +0000
commit2aa608cd9808e84c462362be9eb92a98a1b79e4d (patch)
treea2b6a17091695597883f496158d73b85c18ab32f /Master/texmf-dist/tex/latex/dsptricks/dspfunctions.sty
parent43255aab4df3eb4f9d71e5f80e9bab45f8bdad72 (diff)
dsptricks (25jul14)
git-svn-id: svn://tug.org/texlive/trunk@34724 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/dsptricks/dspfunctions.sty')
-rw-r--r--Master/texmf-dist/tex/latex/dsptricks/dspfunctions.sty258
1 files changed, 258 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/dsptricks/dspfunctions.sty b/Master/texmf-dist/tex/latex/dsptricks/dspfunctions.sty
new file mode 100644
index 00000000000..ae63eccaa0d
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/dsptricks/dspfunctions.sty
@@ -0,0 +1,258 @@
+%% This is the package dspfunctions
+%%
+%% (c) Paolo Prandoni <paolo.prandoni _at_ epfl.ch>
+%%
+%% This program can be redistributed and/or modified under the terms
+%% of the LaTeX Project Public License Distributed from CTAN archives
+%% in directory macros/latex/base/lppl.txt.
+%%
+%% DESCRIPTION:
+%% `dspfunctions' is a companion package to dsptricks; it contains a
+%% set of postscript macros to compute the value of various DSP
+%% common functions
+%%
+%% v1.0, July 2014
+%%
+
+\ProvidesPackage{dspfunctions}[2014/07/24 package for signal processing graphics]
+
+\def\dspToDeg{180 mul }
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% \dspRect{a}{b} rect((x-a)/b)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\def\dspRect#1#2{ #1 sub abs #2 div 0.5 gt {0} {1} ifelse }
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% \dspTri{a}{b} triangle((x-a)/b)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\def\dspTri#1#2{ #1 sub abs #2 div dup 1 gt {pop 0} {1 exch sub} ifelse }
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% \dspExpDec{a}{b} b^(x-a)u[x-a]
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\def\dspExpDec#1#2{ #1 sub dup 0 lt {pop 0} {#2 exch exp} ifelse }
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% \dspQuad{a}{b} quadratic((x-a)/b)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\def\dspQuad#1#2{ #1 sub abs #2 div dup 1 gt {pop 0} {dup mul 1 exch sub } ifelse }
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Porkpie hat shape (useful for spectral prototypes
+% \dspPorkpie{a}{b} phi((x-a)/b)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\def\dspPorkpie#1#2{ #1 sub #2 div dup abs 1 gt {pop 0}%
+ {32.4 mul dup cos exch %
+ dup 3 mul cos 2 mul exch %
+ 12 mul cos -0.7 mul %
+ add add 0.31 mul 0.017 add } ifelse }
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Raised cosine
+% \dspRaisedCos{cutoff}{rolloff}
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\def\dspRaisedCos#1#2{abs %
+ dup dup
+ 1 #2 sub #1 mul lt %
+ {pop pop 1} %
+ {1 #2 add #1 mul gt %
+ {pop 0} {1 #2 sub #1 mul sub 2 #2 #1 mul mul div 3.14 mul RadtoDeg cos 1 add 0.5 mul} ifelse } %
+ ifelse }
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Raised cosine, better syntax
+% \dspRaisedCos{a}{b}{r} b = cutoff, r = rolloff
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\def\dspRaisedCosine#1#2#3{%
+ #1 sub abs #2 div
+ dup dup
+ 1 #3 sub lt
+ {pop pop 1}
+ {1 #3 add gt
+ {pop 0}
+ {1 #3 sub sub 2 #3 mul div 180 mul cos 1 add 0.5 mul}
+ ifelse}
+ ifelse }
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% \dspSinc{a}{b} sinc((x-a)/b)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\def\dspSinc#1#2{ #1 sub #2 div dup 0 eq {pop 1} {dup 180 mul sin exch 3.1415 mul div} ifelse }
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% \dspSincN{a}{b} (1/b)sinc((x-a)/b)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\def\dspSincN#1#2{\dspSinc{#1}{#2} #2 div }
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Fourier transform of a symmetric 2N+1 tap rect
+% \dspSincS{a}{N} sin((x-a)(2N+1)/2)/sin((x-a)/2)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\def\dspSincS#1#2{ #1 sub 90 mul dup #2 2 mul 1 add mul sin exch sin dup 0 eq {pop pop #2 2 mul 1 add} {div} ifelse}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Fourier transform magnitude of a causal N tap rect
+% (phase is e^{-j\frac{N-1}{2}\omega})
+% \dspSincC{a}{N} sin((x-a)(N/2))/sin((x-a)/2)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\def\dspSincC#1#2{ #1 sub 90 mul dup #2 mul sin exch sin dup 0 eq {pop pop #2} {div} ifelse}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% \dspRand % Random number uniformly distributed over [-1 1]
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\def\dspRand{rand 2147483647 div 0.5 sub 2 mul }
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Discrete Fourier Transform of an input sequence; input is
+% the integer value of the DFT coefficient.
+%
+% \dspDFTRE{a_0 a_1 ... a_{N-1}} (real part)
+% \dspDFTIM{a_0 a_1 ... a_{N-1}} (imaginary part)
+% \dspDFTMAG{a_0 a_1 ... a_{N-1}} (magnitude)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\def\dspDFT#1{%
+ cvi [#1] length mod % DFT is N periodic
+ 360 mul [#1] length div % w = (2k\pi)/N
+ 0 % index n
+ 0 % accumulator Re
+ 0 % accumulator Im
+ [#1] % data points
+ { % STACK:
+ % w n re im a_n
+ dup % w n re im a_n a_n
+ 5 index % w n re im a_n a_n w
+ 5 index % w n re im a_n a_n w n
+ mul dup % w n re im a_n a_n nw nw
+ sin exch cos % w n re im a_n a_n sin(nw) cos(nw)
+ 4 1 roll mul % w n re im cos(nw) a_n (a_n)sin(nw)
+ 3 1 roll mul % w n re im (a_n)sin(nw) (a_n)cos(nw)
+ 4 1 roll add % w n (a_n)cos(nw) re im'
+ 3 1 roll add exch % w n re' im'
+ 3 2 roll 1 add % w re' im' n'
+ 3 1 roll % w n re im
+ } forall
+ 4 2 roll pop pop % re im
+}
+\def\dspDFTRE#1{\dspDFT{#1} pop }
+\def\dspDFTIM#1{\dspDFT{#1} exch pop }
+\def\dspDFTMAG#1{\dspDFT{#1} dup mul exch dup mul add sqrt }
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Frequency response of a (2N+1)-tap Type-I FIR computed at a given
+% normalized frequency value. Frequency response is real for Type-I
+% The filter is considered zero-centered, so a_0 is the center tap
+%
+% \dspFIRI{a_0 a_1 ... a_{N-1}}
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\def\dspFIRI#1{%
+ \dspToDeg % input to degrees
+ 0 % index n
+ 0 % accumulator A
+ [#1] % coefficients a_n
+ {
+ 3 index % x
+ 3 index % n [*** using index INCREASES stack size... so it's 3 3 rather than 3 2]
+ mul cos mul % a_n cos nx
+ add % accumulate
+ exch 1 add exch % i++
+ } forall
+ 3 1 roll pop pop
+ 2 mul % final value is 2A - a_0
+ [#1] 0 get sub
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Magnitude response of a generic digital filter defined by the
+% constant-coefficient difference equation:
+% y[n] = a_0 x[n] + a_1 x[n-1] + ... + a_{N-1} x[n-N+1]
+% - b_1 y[n-1] - ... - b_{M-1} y[n-M+1]
+%
+% The response is computed at the given normalized frequency value
+%
+% \dspTFM{a_0 a_1 ... a_{N-1}}{b_1 b_2 ... b_{M-1}}
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\def\dspTFM#1#2{%
+ \dspToDeg % input to degrees
+ dup % save a copy for denominator
+ 0 % index n
+ 0 % accumulator Re
+ 0 % accumulator Im
+ [#1] % coefficients a_n
+ { % STACK (neglecting saved input at bottom):
+ % x n re im a_n
+ dup % x n re im a_n a_n
+ 5 index % x n re im a_n a_n x
+ 5 index % x n re im a_n a_n x n
+ mul dup % x n re im a_n a_n nx nx
+ sin exch cos % x n re im a_n a_n sin(nx) cos(nx)
+ 4 1 roll mul % x n re im cos(nx) a_n (a_n)sin(nx)
+ 3 1 roll mul % x n re im (a_n)sin(nx) (a_n)cos(nx)
+ 4 1 roll add % x n (a_n)cos(nx) re im'
+ 3 1 roll add exch % x n re' im'
+ 3 2 roll 1 add % x re' im' n'
+ 3 1 roll % x n re im
+ } forall
+ 4 2 roll pop pop % re im
+ dup mul exch dup mul add % (re^2 + im^2)
+ sqrt % mag of the numerator of transfer function
+ exch % bring up saved input copy
+ 0 % same loop for the b_n coefficients
+ 0
+ 0
+ [#2]
+ {
+ dup
+ 5 index
+ 5 index
+ mul dup
+ sin exch cos
+ 4 1 roll mul
+ 3 1 roll mul
+ 4 1 roll add
+ 3 1 roll add exch
+ 3 2 roll 1 add
+ 3 1 roll
+ } forall
+ 4 2 roll pop pop
+ dup mul exch dup mul add
+ sqrt
+ div %0 eq {pop pop 0} {div} ifelse
+}
+