print out some debug statements in fastdctlee
[openpower-isa.git] / src / openpower / decoder / isa / fastdctlee.py
1 #
2 # Fast discrete cosine transform algorithms (Python)
3 #
4 # Copyright (c) 2020 Project Nayuki. (MIT License)
5 # https://www.nayuki.io/page/fast-discrete-cosine-transform-algorithms
6 #
7 # Permission is hereby granted, free of charge, to any person obtaining a copy of
8 # this software and associated documentation files (the "Software"), to deal in
9 # the Software without restriction, including without limitation the rights to
10 # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
11 # the Software, and to permit persons to whom the Software is furnished to do so,
12 # subject to the following conditions:
13 # - The above copyright notice and this permission notice shall be included in
14 # all copies or substantial portions of the Software.
15 # - The Software is provided "as is", without warranty of any kind, express or
16 # implied, including but not limited to the warranties of merchantability,
17 # fitness for a particular purpose and noninfringement. In no event shall the
18 # authors or copyright holders be liable for any claim, damages or other
19 # liability, whether in an action of contract, tort or otherwise, arising from,
20 # out of or in connection with the Software or the use or other dealings in the
21 # Software.
22 #
23
24 import math
25
26
27 # DCT type II, unscaled. Algorithm by Byeong Gi Lee, 1984.
28 # See: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.118.3056&rep=rep1&type=pdf#page=34
29 def transform(vector):
30 n = len(vector)
31 if n == 1:
32 return list(vector)
33 elif n == 0 or n % 2 != 0:
34 raise ValueError()
35 else:
36 half = n // 2
37 alpha = [(vector[i] + vector[-(i + 1)]) for i in range(half)]
38 beta = [(vector[i] - vector[-(i + 1)]) /
39 (math.cos((i + 0.5) * math.pi / n) * 2.0)
40 for i in range(half)]
41 alpha = transform(alpha)
42 beta = transform(beta )
43 result = []
44 for i in range(half - 1):
45 result.append(alpha[i])
46 result.append(beta[i] + beta[i + 1])
47 result.append(alpha[-1])
48 result.append(beta [-1])
49 return result
50
51
52 # DCT type III, unscaled. Algorithm by Byeong Gi Lee, 1984.
53 # See: https://www.nayuki.io/res/fast-discrete-cosine-transform-algorithms/lee-new-algo-discrete-cosine-transform.pdf
54 def inverse_transform(vector, root=True, indent=0):
55 idt = " " * indent
56 if root:
57 vector = list(vector)
58 vector[0] /= 2
59 n = len(vector)
60 if n == 1:
61 return vector, [0]
62 elif n == 0 or n % 2 != 0:
63 raise ValueError()
64 else:
65 half = n // 2
66 alpha = [vector[0]]
67 beta = [vector[1]]
68 for i in range(2, n, 2):
69 alpha.append(vector[i])
70 beta.append(vector[i - 1] + vector[i + 1])
71 print (idt, "n", n, "alpha 0", end=" ")
72 for i in range(2, n, 2):
73 print (i, end=" ")
74 print ("beta 1", end=" ")
75 for i in range(2, n, 2):
76 print ("%d+%d" % (i-1, i+1), end=" ")
77 print()
78 inverse_transform(alpha, False, indent+1)
79 inverse_transform(beta , False, indent+1)
80 for i in range(half):
81 x = alpha[i]
82 y = beta[i] / (math.cos((i + 0.5) * math.pi / n) * 2)
83 vector[i] = x + y
84 vector[-(i + 1)] = x - y
85 print (idt, " v[%d] = alpha[%d]+beta[%d]" % (i, i, i))
86 print (idt, " v[%d] = alpha[%d]-beta[%d]" % (n-i-1, i, i))
87 return vector
88
89
90 def inverse_transform2(vector, root=True):
91 n = len(vector)
92 if root:
93 vector = list(vector)
94 if n == 1:
95 return vector
96 elif n == 0 or n % 2 != 0:
97 raise ValueError()
98 else:
99 half = n // 2
100 alpha = [0]
101 beta = [1]
102 for i in range(2, n, 2):
103 alpha.append(i)
104 beta.append(("add", i - 1, i + 1))
105 inverse_transform2(alpha, False)
106 inverse_transform2(beta , False)
107 for i in range(half):
108 x = alpha[i]
109 y = ("cos", beta[i], i)
110 vector[i] = ("add", x, y)
111 vector[-(i + 1)] = ("sub", x, y)
112 return vector
113
114
115 if __name__ == '__main__':
116 vector = range(8)
117 ops = inverse_transform(vector)
118 print (ops)