-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdct.nim
126 lines (102 loc) · 25.3 KB
/
dct.nim
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import std/math
# NOTE: this is a stripped down forward only version that uses pre computed values
##########################################################################
const
# eightTable = [
# [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ],
# [0.9807852804032304, 0.8314696123025452, 0.5555702330196023, 0.1950903220161283, -0.1950903220161282, -0.555570233019602, -0.8314696123025453, -0.9807852804032304],
# [0.9238795325112867, 0.3826834323650898, -0.3826834323650897, -0.9238795325112867, -0.9238795325112868, -0.3826834323650903, 0.38268343236509, 0.9238795325112865],
# [0.8314696123025452, -0.1950903220161282, -0.9807852804032304, -0.5555702330196022, 0.5555702330196018, 0.9807852804032304, 0.1950903220161288, -0.8314696123025451],
# [0.7071067811865476, -0.7071067811865475, -0.7071067811865477, 0.7071067811865474, 0.7071067811865477, -0.7071067811865467, -0.7071067811865471, 0.7071067811865466],
# [0.5555702330196023, -0.9807852804032304, 0.1950903220161283, 0.8314696123025455, -0.8314696123025451, -0.195090322016128, 0.9807852804032307, -0.5555702330196015],
# [0.3826834323650898, -0.9238795325112868, 0.9238795325112865, -0.3826834323650899, -0.3826834323650906, 0.9238795325112867, -0.9238795325112864, 0.3826834323650896],
# [0.1950903220161283, -0.5555702330196022, 0.8314696123025455, -0.9807852804032307, 0.9807852804032304, -0.831469612302545, 0.5555702330196015, -0.1950903220161286]
# ]
thirtyTwoTable = [
[1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ],
[0.9987954562051724, 0.989176509964781, 0.970031253194544, 0.9415440651830208, 0.9039892931234433, 0.8577286100002721, 0.8032075314806449, 0.7409511253549591, 0.6715589548470183, 0.5956993044924335, 0.5141027441932217, 0.4275550934302822, 0.3368898533922201, 0.242980179903264, 0.1467304744553617, 0.04906767432741813, -0.04906767432741801, -0.1467304744553616, -0.2429801799032639, -0.3368898533922199, -0.4275550934302819, -0.5141027441932217, -0.5956993044924334, -0.6715589548470184, -0.7409511253549589, -0.8032075314806448, -0.857728610000272, -0.9039892931234433, -0.9415440651830207, -0.970031253194544, -0.989176509964781, -0.9987954562051724 ],
[0.9951847266721969, 0.9569403357322088, 0.881921264348355, 0.773010453362737, 0.6343932841636455, 0.4713967368259978, 0.2902846772544623, 0.09801714032956077, -0.09801714032956065, -0.2902846772544622, -0.4713967368259977, -0.6343932841636454, -0.773010453362737, -0.8819212643483549, -0.9569403357322088, -0.9951847266721968, -0.9951847266721969, -0.9569403357322089, -0.881921264348355, -0.7730104533627371, -0.6343932841636459, -0.4713967368259979, -0.2902846772544624, -0.09801714032956045, 0.09801714032956009, 0.2902846772544621, 0.4713967368259976, 0.6343932841636456, 0.7730104533627367, 0.8819212643483548, 0.9569403357322088, 0.9951847266721969 ],
[0.989176509964781, 0.9039892931234433, 0.7409511253549591, 0.5141027441932217, 0.242980179903264, -0.04906767432741801, -0.3368898533922199, -0.5956993044924334, -0.8032075314806448, -0.9415440651830207, -0.9987954562051724, -0.970031253194544, -0.8577286100002721, -0.6715589548470187, -0.4275550934302825, -0.1467304744553623, 0.1467304744553619, 0.4275550934302821, 0.6715589548470183, 0.857728610000272, 0.970031253194544, 0.9987954562051724, 0.9415440651830209, 0.8032075314806453, 0.5956993044924332, 0.3368898533922201, 0.04906767432741815, -0.2429801799032628, -0.5141027441932214, -0.7409511253549593, -0.9039892931234431, -0.989176509964781 ],
[0.9807852804032304, 0.8314696123025452, 0.5555702330196023, 0.1950903220161283, -0.1950903220161282, -0.555570233019602, -0.8314696123025453, -0.9807852804032304, -0.9807852804032304, -0.8314696123025455, -0.5555702330196022, -0.1950903220161287, 0.1950903220161283, 0.5555702330196018, 0.8314696123025452, 0.9807852804032303, 0.9807852804032304, 0.8314696123025455, 0.5555702330196023, 0.1950903220161288, -0.1950903220161273, -0.5555702330196017, -0.8314696123025451, -0.9807852804032305, -0.9807852804032307, -0.8314696123025456, -0.5555702330196024, -0.195090322016128, 0.1950903220161272, 0.5555702330196016, 0.8314696123025451, 0.9807852804032304 ],
[0.970031253194544, 0.7409511253549591, 0.3368898533922201, -0.1467304744553616, -0.5956993044924334, -0.9039892931234433, -0.9987954562051724, -0.8577286100002721, -0.5141027441932218, -0.04906767432741803, 0.4275550934302821, 0.8032075314806451, 0.9891765099647809, 0.9415440651830209, 0.6715589548470188, 0.2429801799032642, -0.2429801799032628, -0.6715589548470177, -0.9415440651830205, -0.9891765099647811, -0.8032075314806454, -0.4275550934302827, 0.04906767432741742, 0.5141027441932213, 0.8577286100002719, 0.9987954562051724, 0.9039892931234434, 0.5956993044924335, 0.1467304744553618, -0.3368898533922201, -0.7409511253549592, -0.9700312531945441 ],
[0.9569403357322088, 0.6343932841636455, 0.09801714032956077, -0.4713967368259977, -0.8819212643483549, -0.9951847266721969, -0.7730104533627371, -0.2902846772544624, 0.2902846772544621, 0.7730104533627367, 0.9951847266721969, 0.881921264348355, 0.471396736825998, -0.09801714032955997, -0.6343932841636448, -0.9569403357322085, -0.9569403357322087, -0.6343932841636454, -0.09801714032956069, 0.4713967368259974, 0.8819212643483547, 0.9951847266721969, 0.7730104533627377, 0.2902846772544636, -0.2902846772544626, -0.773010453362737, -0.9951847266721968, -0.8819212643483562, -0.4713967368259983, 0.09801714032956137, 0.6343932841636445, 0.9569403357322089 ],
[0.9415440651830208, 0.5141027441932217, -0.1467304744553616, -0.7409511253549589, -0.9987954562051724, -0.8032075314806449, -0.2429801799032641, 0.4275550934302821, 0.9039892931234431, 0.9700312531945441, 0.5956993044924332, -0.04906767432741754, -0.6715589548470177, -0.989176509964781, -0.8577286100002723, -0.336889853392221, 0.3368898533922202, 0.8577286100002719, 0.9891765099647811, 0.6715589548470182, 0.0490676743274184, -0.5956993044924326, -0.9700312531945441, -0.9039892931234434, -0.4275550934302813, 0.2429801799032624, 0.8032075314806447, 0.9987954562051724, 0.7409511253549601, 0.146730474455362, -0.5141027441932225, -0.9415440651830203 ],
[0.9238795325112867, 0.3826834323650898, -0.3826834323650897, -0.9238795325112867, -0.9238795325112868, -0.3826834323650903, 0.38268343236509, 0.9238795325112865, 0.9238795325112867, 0.3826834323650904, -0.3826834323650899, -0.9238795325112864, -0.9238795325112867, -0.3826834323650906, 0.3826834323650898, 0.9238795325112864, 0.9238795325112867, 0.3826834323650907, -0.3826834323650897, -0.9238795325112864, -0.9238795325112875, -0.3826834323650908, 0.3826834323650896, 0.923879532511287, 0.9238795325112875, 0.3826834323650909, -0.3826834323650894, -0.923879532511287, -0.9238795325112876, -0.382683432365091, 0.3826834323650893, 0.9238795325112868 ],
[0.9039892931234433, 0.242980179903264, -0.5956993044924334, -0.9987954562051724, -0.6715589548470187, 0.1467304744553619, 0.857728610000272, 0.9415440651830209, 0.3368898533922201, -0.5141027441932214, -0.989176509964781, -0.7409511253549599, 0.04906767432741742, 0.8032075314806448, 0.9700312531945443, 0.4275550934302828, -0.4275550934302818, -0.9700312531945441, -0.8032075314806455, -0.04906767432741852, 0.7409511253549591, 0.9891765099647809, 0.5141027441932239, -0.3368898533922182, -0.9415440651830203, -0.8577286100002726, -0.1467304744553622, 0.6715589548470184, 0.9987954562051724, 0.5956993044924352, -0.2429801799032621, -0.9039892931234428 ],
[0.881921264348355, 0.09801714032956077, -0.773010453362737, -0.9569403357322089, -0.2902846772544624, 0.6343932841636456, 0.9951847266721969, 0.471396736825998, -0.4713967368259975, -0.9951847266721969, -0.6343932841636454, 0.2902846772544627, 0.9569403357322085, 0.7730104533627377, -0.09801714032955972, -0.8819212643483547, -0.8819212643483562, -0.0980171403295627, 0.7730104533627358, 0.9569403357322094, 0.2902846772544639, -0.6343932841636444, -0.995184726672197, -0.4713967368259985, 0.4713967368259969, 0.9951847266721968, 0.6343932841636458, -0.2902846772544621, -0.9569403357322088, -0.7730104533627369, 0.09801714032956088, 0.8819212643483553 ],
[0.8577286100002721, -0.04906767432741779, -0.9039892931234431, -0.8032075314806453, 0.1467304744553611, 0.9415440651830205, 0.7409511253549598, -0.2429801799032628, -0.9700312531945436, -0.6715589548470194, 0.3368898533922186, 0.9891765099647807, 0.5956993044924349, -0.4275550934302803, -0.9987954562051723, -0.5141027441932238, 0.5141027441932196, 0.9987954562051725, 0.4275550934302846, -0.5956993044924309, -0.9891765099647815, -0.3368898533922232, 0.6715589548470159, 0.9700312531945449, 0.2429801799032675, -0.7409511253549564, -0.9415440651830221, -0.1467304744553659, 0.8032075314806423, 0.9039892931234452, 0.04906767432742268, -0.8577286100002696 ],
[0.8314696123025452, -0.1950903220161282, -0.9807852804032304, -0.5555702330196022, 0.5555702330196018, 0.9807852804032304, 0.1950903220161288, -0.8314696123025451, -0.8314696123025456, 0.1950903220161272, 0.9807852804032304, 0.5555702330196025, -0.5555702330196015, -0.9807852804032307, -0.19509032201613, 0.831469612302544, 0.8314696123025448, -0.1950903220161286, -0.9807852804032304, -0.5555702330196027, 0.5555702330196013, 0.9807852804032308, 0.1950903220161304, -0.8314696123025438, -0.831469612302545, 0.1950903220161282, 0.9807852804032303, 0.5555702330196061, -0.555570233019601, -0.9807852804032301, -0.1950903220161307, 0.8314696123025456 ],
[0.8032075314806449, -0.3368898533922202, -0.9987954562051724, -0.2429801799032633, 0.857728610000272, 0.7409511253549586, -0.427555093430282, -0.9891765099647808, -0.1467304744553617, 0.9039892931234438, 0.6715589548470182, -0.5141027441932227, -0.9700312531945439, -0.04906767432741852, 0.9415440651830215, 0.5956993044924322, -0.5956993044924338, -0.9415440651830209, 0.04906767432742048, 0.9700312531945444, 0.514102744193221, -0.6715589548470184, -0.9039892931234421, 0.1467304744553636, 0.9891765099647811, 0.4275550934302787, -0.7409511253549611, -0.857728610000271, 0.2429801799032651, 0.9987954562051724, 0.3368898533922204, -0.8032075314806442 ],
[0.773010453362737, -0.4713967368259977, -0.9569403357322089, 0.09801714032956009, 0.9951847266721969, 0.2902846772544626, -0.8819212643483548, -0.6343932841636454, 0.6343932841636447, 0.8819212643483553, -0.2902846772544626, -0.9951847266721969, -0.0980171403295627, 0.9569403357322089, 0.4713967368259984, -0.7730104533627357, -0.7730104533627368, 0.4713967368259969, 0.9569403357322095, -0.09801714032956099, -0.9951847266721968, -0.2902846772544642, 0.8819212643483553, 0.634393284163646, -0.6343932841636468, -0.8819212643483565, 0.2902846772544618, 0.9951847266721967, 0.09801714032956356, -0.9569403357322087, -0.471396736825996, 0.7730104533627351 ],
[0.7409511253549591, -0.5956993044924329, -0.8577286100002721, 0.4275550934302814, 0.9415440651830209, -0.2429801799032628, -0.9891765099647811, 0.04906767432741742, 0.9987954562051723, 0.1467304744553636, -0.9700312531945436, -0.3368898533922229, 0.9039892931234429, 0.5141027441932239, -0.8032075314806425, -0.6715589548470199, 0.6715589548470159, 0.8032075314806457, -0.5141027441932192, -0.9039892931234452, 0.3368898533922178, 0.970031253194545, -0.1467304744553565, -0.9987954562051727, -0.04906767432741925, 0.9891765099647806, 0.242980179903268, -0.9415440651830188, -0.4275550934302886, 0.8577286100002712, 0.5956993044924359, -0.740951125354956 ],
[0.7071067811865476, -0.7071067811865475, -0.7071067811865477, 0.7071067811865474, 0.7071067811865477, -0.7071067811865467, -0.7071067811865471, 0.7071067811865466, 0.7071067811865472, -0.7071067811865465, -0.7071067811865474, 0.7071067811865464, 0.7071067811865475, -0.7071067811865464, -0.7071067811865476, 0.7071067811865462, 0.7071067811865476, -0.7071067811865461, -0.7071067811865477, 0.707106781186546, 0.7071067811865503, -0.707106781186546, -0.7071067811865479, 0.7071067811865483, 0.7071067811865505, -0.7071067811865458, -0.707106781186548, 0.7071067811865482, 0.7071067811865507, -0.7071067811865456, -0.7071067811865482, 0.707106781186548 ],
[0.6715589548470183, -0.8032075314806451, -0.5141027441932218, 0.9039892931234434, 0.3368898533922201, -0.9700312531945441, -0.1467304744553617, 0.9987954562051724, -0.04906767432741907, -0.9891765099647809, 0.2429801799032659, 0.9415440651830208, -0.4275550934302832, -0.8577286100002726, 0.5956993044924337, 0.7409511253549579, -0.7409511253549589, -0.5956993044924325, 0.8577286100002733, 0.4275550934302787, -0.9415440651830214, -0.2429801799032644, 0.9891765099647816, 0.04906767432741583, -0.9987954562051724, 0.1467304744553596, 0.9700312531945433, -0.3368898533922206, -0.903989293123444, 0.5141027441932247, 0.8032075314806442, -0.6715589548470177 ],
[0.6343932841636455, -0.8819212643483549, -0.2902846772544624, 0.9951847266721969, -0.09801714032955997, -0.9569403357322087, 0.4713967368259974, 0.7730104533627377, -0.773010453362737, -0.4713967368259983, 0.9569403357322089, 0.09801714032956282, -0.995184726672197, 0.2902846772544622, 0.8819212643483563, -0.6343932841636443, -0.6343932841636459, 0.8819212643483553, 0.2902846772544643, -0.9951847266721968, 0.09801714032956063, 0.9569403357322086, -0.4713967368259933, -0.7730104533627394, 0.7730104533627351, 0.4713967368259993, -0.9569403357322086, -0.09801714032956038, 0.9951847266721968, -0.2902846772544578, -0.8819212643483568, 0.6343932841636434 ],
[0.5956993044924335, -0.9415440651830207, -0.04906767432741803, 0.9700312531945443, -0.5141027441932214, -0.6715589548470194, 0.903989293123443, 0.1467304744553636, -0.9891765099647811, 0.4275550934302801, 0.7409511253549601, -0.8577286100002717, -0.2429801799032674, 0.9987954562051725, -0.3368898533922179, -0.8032075314806458, 0.8032075314806423, 0.3368898533922202, -0.9987954562051723, 0.2429801799032583, 0.8577286100002729, -0.7409511253549561, -0.4275550934302886, 0.9891765099647806, -0.146730474455356, -0.903989293123444, 0.6715589548470151, 0.514102744193228, -0.9700312531945433, 0.04906767432741216, 0.9415440651830237, -0.5956993044924298 ],
[0.5555702330196023, -0.9807852804032304, 0.1950903220161283, 0.8314696123025455, -0.8314696123025451, -0.195090322016128, 0.9807852804032307, -0.5555702330196015, -0.5555702330196026, 0.9807852804032304, -0.1950903220161286, -0.8314696123025449, 0.8314696123025438, 0.1950903220161304, -0.9807852804032308, 0.5555702330196011, 0.5555702330196061, -0.9807852804032297, 0.1950903220161245, 0.8314696123025471, -0.8314696123025435, -0.195090322016131, 0.9807852804032309, -0.5555702330196005, -0.5555702330196036, 0.9807852804032302, -0.1950903220161274, -0.8314696123025456, 0.8314696123025451, 0.1950903220161281, -0.9807852804032303, 0.555570233019603 ],
[0.5141027441932217, -0.9987954562051724, 0.4275550934302821, 0.5956993044924332, -0.989176509964781, 0.3368898533922202, 0.6715589548470182, -0.9700312531945441, 0.2429801799032659, 0.7409511253549601, -0.9415440651830215, 0.1467304744553603, 0.8032075314806436, -0.9039892931234428, 0.04906767432742024, 0.8577286100002728, -0.8577286100002732, -0.04906767432741925, 0.9039892931234423, -0.8032075314806442, -0.1467304744553594, 0.9415440651830211, -0.7409511253549608, -0.2429801799032649, 0.9700312531945434, -0.6715589548470177, -0.3368898533922176, 0.9891765099647811, -0.5956993044924355, -0.4275550934302829, 0.9987954562051723, -0.5141027441932271 ],
[0.4713967368259978, -0.9951847266721969, 0.6343932841636449, 0.2902846772544634, -0.9569403357322093, 0.7730104533627359, 0.09801714032956259, -0.8819212643483562, 0.8819212643483538, -0.0980171403295577, -0.773010453362739, 0.9569403357322078, -0.2902846772544587, -0.6343932841636487, 0.9951847266721965, -0.4713967368259935, -0.4713967368260021, 0.9951847266721974, -0.6343932841636412, -0.2902846772544681, 0.9569403357322107, -0.7730104533627328, -0.09801714032956746, 0.8819212643483584, -0.8819212643483515, 0.09801714032955283, 0.7730104533627421, -0.9569403357322064, 0.290284677254454, 0.6343932841636525, -0.9951847266721959, 0.4713967368259891 ],
[0.4275550934302822, -0.970031253194544, 0.8032075314806445, -0.04906767432741754, -0.7409511253549599, 0.9891765099647807, -0.5141027441932212, -0.3368898533922229, 0.9415440651830208, -0.8577286100002717, 0.1467304744553603, 0.6715589548470199, -0.9987954562051723, 0.5956993044924307, 0.2429801799032678, -0.9039892931234438, 0.9039892931234411, -0.2429801799032616, -0.5956993044924386, 0.9987954562051726, -0.6715589548470179, -0.1467304744553666, 0.8577286100002731, -0.9415440651830187, 0.3368898533922169, 0.5141027441932282, -0.9891765099647817, 0.7409511253549532, 0.04906767432741681, -0.8032075314806467, 0.9700312531945422, -0.4275550934302718 ],
[0.3826834323650898, -0.9238795325112868, 0.9238795325112865, -0.3826834323650899, -0.3826834323650906, 0.9238795325112867, -0.9238795325112864, 0.3826834323650896, 0.3826834323650909, -0.9238795325112876, 0.9238795325112868, -0.3826834323650892, -0.3826834323650912, 0.9238795325112877, -0.9238795325112854, 0.3826834323650856, 0.3826834323650883, -0.9238795325112865, 0.9238795325112866, -0.3826834323650885, -0.3826834323650919, 0.9238795325112881, -0.9238795325112851, 0.3826834323650849, 0.382683432365089, -0.9238795325112868, 0.9238795325112863, -0.3826834323650813, -0.3826834323650926, 0.9238795325112856, -0.9238795325112849, 0.3826834323650908 ],
[0.3368898533922201, -0.8577286100002721, 0.989176509964781, -0.6715589548470189, 0.04906767432741742, 0.5956993044924335, -0.9700312531945439, 0.9039892931234429, -0.4275550934302832, -0.242980179903264, 0.8032075314806457, -0.9987954562051724, 0.7409511253549588, -0.1467304744553635, -0.5141027441932244, 0.941544065183021, -0.9415440651830213, 0.5141027441932248, 0.146730474455363, -0.7409511253549584, 0.9987954562051722, -0.8032075314806439, 0.2429801799032644, 0.4275550934302796, -0.9039892931234442, 0.9700312531945441, -0.5956993044924352, -0.04906767432741338, 0.6715589548470133, -0.9891765099647817, 0.8577286100002706, -0.3368898533922194 ],
[0.2902846772544623, -0.7730104533627369, 0.9951847266721968, -0.8819212643483556, 0.4713967368259974, 0.09801714032955905, -0.6343932841636456, 0.9569403357322084, -0.9569403357322089, 0.634393284163647, -0.09801714032956099, -0.4713967368259956, 0.8819212643483547, -0.9951847266721968, 0.7730104533627398, -0.2902846772544651, -0.2902846772544613, 0.7730104533627373, -0.9951847266721964, 0.8819212643483566, -0.4713967368259991, -0.09801714032956063, 0.6343932841636413, -0.9569403357322078, 0.9569403357322095, -0.6343932841636514, 0.09801714032956649, 0.4713967368259939, -0.8819212643483538, 0.9951847266721969, -0.7730104533627365, 0.2902846772544601 ],
[0.242980179903264, -0.6715589548470187, 0.9415440651830209, -0.9891765099647807, 0.8032075314806448, -0.4275550934302803, -0.04906767432741852, 0.5141027441932239, -0.8577286100002726, 0.9987954562051725, -0.9039892931234428, 0.5956993044924307, -0.1467304744553565, -0.3368898533922236, 0.7409511253549605, -0.9700312531945442, 0.9700312531945425, -0.740951125354956, 0.3368898533922172, 0.1467304744553632, -0.595699304492439, 0.9039892931234457, -0.9987954562051722, 0.8577286100002709, -0.5141027441932149, 0.04906767432741876, 0.4275550934302864, -0.803207531480651, 0.9891765099647812, -0.9415440651830184, 0.671558954847009, -0.2429801799032599 ],
[0.1950903220161283, -0.5555702330196022, 0.8314696123025455, -0.9807852804032307, 0.9807852804032304, -0.831469612302545, 0.5555702330196015, -0.1950903220161286, -0.1950903220161302, 0.5555702330196028, -0.831469612302545, 0.9807852804032309, -0.9807852804032297, 0.8314696123025456, -0.5555702330196007, 0.1950903220161243, 0.1950903220161276, -0.5555702330196036, 0.8314696123025475, -0.9807852804032303, 0.9807852804032301, -0.8314696123025431, 0.555570233019603, -0.1950903220161269, -0.195090322016125, 0.5555702330196073, -0.8314696123025459, 0.9807852804032298, -0.9807852804032293, 0.8314696123025446, -0.5555702330196052, 0.1950903220161226 ],
[0.1467304744553617, -0.4275550934302825, 0.6715589548470181, -0.8577286100002723, 0.9700312531945439, -0.9987954562051724, 0.9415440651830204, -0.8032075314806446, 0.5956993044924337, -0.3368898533922213, 0.04906767432741668, 0.2429801799032609, -0.5141027441932244, 0.7409511253549605, -0.9039892931234439, 0.989176509964781, -0.989176509964781, 0.9039892931234439, -0.7409511253549605, 0.5141027441932244, -0.2429801799032609, -0.04906767432742023, 0.3368898533922213, -0.5956993044924337, 0.8032075314806446, -0.9415440651830204, 0.9987954562051723, -0.9700312531945448, 0.8577286100002741, -0.671558954847022, 0.4275550934302873, -0.1467304744553684 ],
[0.09801714032956077, -0.2902846772544633, 0.471396736825998, -0.6343932841636467, 0.7730104533627377, -0.8819212643483562, 0.9569403357322094, -0.995184726672197, 0.9951847266721965, -0.9569403357322078, 0.8819212643483536, -0.7730104533627331, 0.6343932841636439, -0.4713967368259933, 0.2902846772544547, -0.09801714032955673, -0.09801714032956746, 0.2902846772544651, -0.4713967368260027, 0.6343932841636523, -0.7730104533627399, 0.8819212643483586, -0.9569403357322119, 0.9951847266721983, -0.9951847266721966, 0.9569403357322073, -0.8819212643483511, 0.7730104533627297, -0.6343932841636343, 0.4713967368259948, -0.2902846772544563, 0.09801714032955137],
[0.04906767432741813, -0.1467304744553623, 0.2429801799032642, -0.336889853392221, 0.4275550934302828, -0.5141027441932238, 0.595699304492435, -0.6715589548470199, 0.7409511253549602, -0.8032075314806458, 0.8577286100002728, -0.9039892931234438, 0.941544065183021, -0.9700312531945442, 0.989176509964781, -0.9987954562051724, 0.9987954562051721, -0.98917650996478, 0.9700312531945424, -0.9415440651830186, 0.9039892931234407, -0.8577286100002726, 0.8032075314806414, -0.7409511253549601, 0.6715589548470144, -0.5956993044924235, 0.5141027441932174, -0.4275550934302714, 0.3368898533922158, -0.2429801799032528, 0.1467304744553577, -0.04906767432740702]
]
##########################################################################
proc transpose(matrix: seq[seq[float]]): seq[seq[float]] =
let numRows = matrix.len
let numCols = matrix[0].len
var transposed = newSeq[seq[float]](numCols)
for i in 0 ..< numCols:
transposed[i] = newSeq[float](numRows)
for j in 0 ..< numRows:
transposed[i][j] = matrix[j][i]
return transposed
proc roundDown(n: float): float =
## values very close to zero are returned as zero
const threshold: float = 1e-13
if abs(n) < threshold:
return 0.0
return n
##########################################################################
proc dct1d*[T](vector: seq[T], ortho: bool = false): seq[float] =
## DCT II
let N = vector.len
result = newSeq[float](vector.len)
for k in 0 ..< vector.len:
var sum = 0.0
for n in 0 ..< vector.len:
case N:
# of 8:
# sum += vector[n].float * eightTable[k][n]
of 32:
sum += vector[n].float * thirtyTwoTable[k][n]
else:
sum += vector[n].float * cos(PI * k.float * (2.0 * n.float + 1.0) / (2.0 * N.float))
if ortho:
if k == 0:
result[k] = roundDown((sqrt(1.0 / (4 * N.float)) * 2.0) * sum)
else:
result[k] = roundDown((sqrt(1.0 / (2 * N.float)) * 2.0) * sum)
else:
result[k] = roundDown(2.0 * sum)
return result
proc dct2d*[T](matrix: seq[seq[T]], ortho: bool = false): seq[seq[float]] =
## DCT II
let N = matrix.len
var intermediate = newSeq[seq[float]](N)
result = newSeq[seq[float]](N)
# NOTE: apply 1D DCT to each row
for i in 0 ..< N:
intermediate[i] = dct1d(matrix[i], ortho)
# NOTE: transpose the matrix
let transposed = transpose(intermediate)
# NOTE: apply 1D DCT to each transposed row (original column)
for i in 0 ..< N:
result[i] = dct1d(transposed[i], ortho)
return transpose(result)
##########################################################################