-#
+#
# Fast discrete cosine transform algorithms (Python)
-#
+#
# Copyright (c) 2020 Project Nayuki. (MIT License)
# https://www.nayuki.io/page/fast-discrete-cosine-transform-algorithms
-#
+#
# Permission is hereby granted, free of charge, to any person obtaining a copy of
# this software and associated documentation files (the "Software"), to deal in
# the Software without restriction, including without limitation the rights to
# liability, whether in an action of contract, tort or otherwise,
# arising from, out of or in connection with the Software or the use
# or other dealings in the Software.
-#
+#
import math, random, unittest
-import fastdctlee, naivedct
+import fastdctlee, naivedct, remap_dct_yield
class FastDctTest(unittest.TestCase):
-
- def test_fast_dct_lee_vs_naive(self):
- for i in range(1, 12):
- n = 2**i
- vector = FastDctTest.random_vector(n)
- expect = naivedct.transform(vector)
- actual = fastdctlee.transform(vector)
- self.assertListAlmostEqual(actual, expect)
- expect = naivedct.inverse_transform(vector)
- actual = fastdctlee.inverse_transform(vector)
- self.assertListAlmostEqual(actual, expect)
-
- def test_fast_dct_lee_invertibility(self):
- for i in range(1, 18):
- n = 2**i
- vector = FastDctTest.random_vector(n)
- temp = fastdctlee.transform(vector)
- temp = fastdctlee.inverse_transform(temp)
- temp = [(val * 2.0 / n) for val in temp]
- self.assertListAlmostEqual(vector, temp)
-
- def assertListAlmostEqual(self, actual, expect):
- self.assertEqual(len(actual), len(expect))
- for (x, y) in zip(actual, expect):
- self.assertAlmostEqual(x, y, delta=FastDctTest._EPSILON)
-
- @staticmethod
- def random_vector(n):
- return [random.uniform(-1.0, 1.0) for _ in range(n)]
-
-
- _EPSILON = 1e-9
+
+ def tst_fast_dct_lee_vs_naive(self):
+ for i in range(3, 4):
+ n = 2**i
+ vector = FastDctTest.nonrandom_vector(n)
+ expect = naivedct.transform(vector)
+ original = fastdctlee.transform(vector)
+ actual = fastdctlee.transform2(vector)
+ self.assertListAlmostEqual(actual, expect)
+ expect = naivedct.inverse_transform(vector)
+ original = fastdctlee.inverse_transform2(vector)
+ actual = fastdctlee.inverse_transform_iter(vector)
+ self.assertListAlmostEqual(actual, expect)
+
+ def test_yield_dct_lee_vs_naive(self):
+ for i in range(2, 10):
+ n = 2**i
+ vector = FastDctTest.nonrandom_vector(n)
+ expect = fastdctlee.transform2(vector)
+ actual = remap_dct_yield.transform2(vector)
+ self.assertListAlmostEqual(actual, expect)
+ expect = naivedct.inverse_transform(vector)
+ actual = fastdctlee.inverse_transform_iter(vector)
+ self.assertListAlmostEqual(actual, expect)
+ actual = remap_dct_yield.inverse_transform2(vector)
+ self.assertListAlmostEqual(actual, expect)
+
+ def tst_fast_dct_lee_invertibility(self):
+ for i in range(1, 10):
+ n = 2**i
+ vector = FastDctTest.random_vector(n)
+ temp = fastdctlee.transform2(vector)
+ temp = fastdctlee.inverse_transform(temp)
+ temp = [(val * 2.0 / n) for val in temp]
+ self.assertListAlmostEqual(vector, temp)
+
+ def tst_yield_fast_dct_lee_invertibility(self):
+ for i in range(1, 10):
+ n = 2**i
+ vector = FastDctTest.random_vector(n)
+ temp = remap_dct_yield.transform2(vector)
+ temp = fastdctlee.inverse_transform(temp)
+ temp = [(val * 2.0 / n) for val in temp]
+ self.assertListAlmostEqual(vector, temp)
+
+ def assertListAlmostEqual(self, actual, expect):
+ self.assertEqual(len(actual), len(expect))
+ for (x, y) in zip(actual, expect):
+ self.assertAlmostEqual(x, y, delta=FastDctTest._EPSILON)
+
+ @staticmethod
+ def random_vector(n):
+ return [random.uniform(-1.0, 1.0) for _ in range(n)]
+
+ @staticmethod
+ def nonrandom_vector(n):
+ return [(i-n/2.0+pow(1.001, n)) for i in range(n)]
+
+
+ _EPSILON = 1e-9
if __name__ == "__main__":
- unittest.main()
+ unittest.main()