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 |