diff options
author | Joseph Hunkeler <jhunkeler@gmail.com> | 2015-07-08 20:46:52 -0400 |
---|---|---|
committer | Joseph Hunkeler <jhunkeler@gmail.com> | 2015-07-08 20:46:52 -0400 |
commit | fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 (patch) | |
tree | bdda434976bc09c864f2e4fa6f16ba1952b1e555 /math/ieee/chap1/iftsoh.f | |
download | iraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz |
Initial commit
Diffstat (limited to 'math/ieee/chap1/iftsoh.f')
-rw-r--r-- | math/ieee/chap1/iftsoh.f | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/math/ieee/chap1/iftsoh.f b/math/ieee/chap1/iftsoh.f new file mode 100644 index 00000000..6098e6e4 --- /dev/null +++ b/math/ieee/chap1/iftsoh.f @@ -0,0 +1,94 @@ +c +c----------------------------------------------------------------------- +c subroutine: iftsoh +c compute idft for real, symmetric, odd harmonic, n-point sequence +c using n/4-point fft +c symmetric sequence means x(m)=x(n-m), m=1,...,n/2-1 +c odd harmonic means x(2*k)=0, all k, where x(k) is the dft of x(m) +c x(m) has the property x(m)=-x(n/2-m), m=0,1,...,n/4-1, x(n/4)=0 +c note: index m is sequence index--not fortran index +c----------------------------------------------------------------------- +c + subroutine iftsoh(x, n, y) + dimension x(1), y(1) +c +c x = real array which on input contains the n/4 real points of +c the odd harmonics of the transform of the original time sequence +c i.e. the zero valued imaginary parts are not given nor are the +c zero valued even harmonics +c on output x contains the first n/4 points of the original input +c sequence (symmetrical) +c n = true size of input +c y = scratch array of size n/4+2 +c +c +c handle n = 2 and n = 4 cases separately +c + if (n.gt.4) go to 10 +c +c for n=2, 4 assume x(1)=x0, x(2)=-x0, compute idft directly +c + x(1) = x(1)/2. + return +c +c code for values of n which are multiples of 8 +c + 10 twopi = 8.*atan(1.0) + no2 = n/2 + no4 = n/4 + no8 = n/8 + tpn = twopi/float(n) +c +c first compute x1=x(1) term directly +c use recursion on the sine cosine terms +c + cosd = cos(tpn*2.) + sind = sin(tpn*2.) + cosi = 2.*cos(tpn) + sini = 2.*sin(tpn) + x1 = 0. + do 20 i=1,no4 + x1 = x1 + x(i)*cosi + temp = cosi*cosd - sini*sind + sini = cosi*sind + sini*cosd + cosi = temp + 20 continue + x1 = x1/float(n) +c +c scramble original dft (x(k)) to give y(k) +c use recursion relation to give sin multipliers +c + cosi = cos(tpn) + sini = sin(tpn) + do 30 i=1,no8 + ind = 2*i + ind1 = no4 + 1 - i + ak = (x(i)+x(ind1))/2. + bk = (x(i)-x(ind1)) + y(ind-1) = ak + y(ind) = bk*sini + temp = cosi*cosd - sini*sind + sini = cosi*sind + sini*cosd + cosi = temp + 30 continue +c +c the sequence y(k) is the odd harmonics dft output +c use subroutine iftohm to obtain y(m), the inverse transform +c + call iftohm(y, no2) +c +c form x(m) sequence from y(m) sequence +c use x1 initial condition on the recursion +c + x(1) = y(1) + x(2) = x1 + if (no8.eq.1) return + do 40 i=2,no8 + ind = 2*i + ind1 = no4 + 2 - i + t1 = (y(i)+y(ind1))/2. + x(ind-1) = (y(i)-y(ind1))/2. + x(ind) = t1 + x(ind-2) + 40 continue + return + end |