Statistics
| Branch: | Revision:

root / synthbench / euroben-dm / mod2g / .svn / text-base / synthr.f.svn-base @ 0:839f52ef7657

History | View | Annotate | Download (2.7 kB)

1
      Subroutine synthr( a, w, n, m )
2
! ---------------------------------------------------------------------
3
! --- 'synthr' does a Haar wavelet synthesis. Iput array is 'a';
4
!     output array is 'w'. Length is n and m = Log2(n).
5
!     The code looks more complicated than is really is
6
!     because of the hand-unrolling by a factor of 4
7
! ---------------------------------------------------------------------
8
      Use         numerics
9
      Integer  :: n, m
10
      Real(l_) :: a(n), w(n)
11

    
12
      Integer  :: i, j, j2, k, n1
13
      Logical  :: odd
14
! ---------------------------------------------------------------------
15
      n1 = 1
16
      odd = .TRUE.
17
      w(1) = a(1)
18
      Do i = 1, m
19
         If ( odd ) Then
20
            If ( n1 >= 4 ) Then
21
               Do j = 1, n1, 4
22
                  w(j*2-1) = a(j)   + a(j+n1)
23
                  w(j*2)   = a(j)   - a(j+n1)
24
                  w(j*2+1) = a(j+1) + a(j+n1+1)
25
                  w(j*2+2) = a(j+1) - a(j+n1+1)
26
                  w(j*2+3) = a(j+2) + a(j+n1+2)
27
                  w(j*2+4) = a(j+2) - a(j+n1+2)
28
                  w(j*2+5) = a(j+3) + a(j+n1+3)
29
                  w(j*2+6) = a(j+3) - a(j+n1+3)
30
               End Do
31
            Else If ( n1 >= 2 ) Then
32
               Do j = 1, n1, 2
33
                  w(j*2-1) = a(j)   + a(j+n1)
34
                  w(j*2)   = a(j)   - a(j+n1)
35
                  w(j*2+1) = a(j+1) + a(j+n1+1)
36
                  w(j*2+2) = a(j+1) - a(j+n1+1)
37
               End Do
38
            Else
39
               Do j = 1, n1
40
                  w(j*2-1) = a(j) + a(j+n1)
41
                  w(j*2)   = a(j) - a(j+n1)
42
               End Do
43
            End If
44
         Else
45
            If ( n1 >= 4 ) Then
46
               Do j = 1, n1, 4
47
                  a(j*2-1) = w(j)   + a(j+n1)
48
                  a(j*2)   = w(j)   - a(j+n1)
49
                  a(j*2+1) = w(j+1) + a(j+n1+1)
50
                  a(j*2+2) = w(j+1) - a(j+n1+1)
51
                  a(j*2+3) = w(j+2) + a(j+n1+2)
52
                  a(j*2+4) = w(j+2) - a(j+n1+2)
53
                  a(j*2+5) = w(j+3) + a(j+n1+3)
54
                  a(j*2+6) = w(j+3) - a(j+n1+3)
55
               End Do
56
            Else If ( n1 >= 2 ) Then
57
               Do j = 1, n1, 2
58
                  a(j*2-1) = w(j)   + a(j+n1)
59
                  a(j*2)   = w(j)   - a(j+n1)
60
                  a(j*2+1) = w(j+1) + a(j+n1+1)
61
                  a(j*2+2) = w(j+1) - a(j+n1+1)
62
               End Do
63
            Else
64
               Do j = 1, n1
65
                  a(j*2-1) = w(j) + a(j+n1)
66
                  a(j*2)   = w(j) - a(j+n1)
67
               End Do 
68
            End If
69
         End If
70
         n1 = n1 + n1
71
         odd = .NOT. odd
72
      End Do
73
      If ( m == 2*(m/2) ) w = a
74
! ---------------------------------------------------------------------
75
      End Subroutine synthr