dct_scales.h (12557B)
1 // Copyright (c) the JPEG XL Project Authors. All rights reserved. 2 // 3 // Use of this source code is governed by a BSD-style 4 // license that can be found in the LICENSE file. 5 6 #ifndef LIB_JXL_DCT_SCALES_H_ 7 #define LIB_JXL_DCT_SCALES_H_ 8 9 // Scaling factors. 10 11 #include <stddef.h> 12 13 namespace jxl { 14 15 static constexpr float kSqrt2 = 1.41421356237f; 16 static constexpr float kSqrt0_5 = 0.70710678118f; 17 18 // For n != 0, the n-th basis function of a N-DCT, evaluated in pixel k, has a 19 // value of cos((k+1/2) n/(2N) pi). When downsampling by 2x, we average 20 // the values for pixel k and k+1 to get the value for pixel (k/2), thus we get 21 // 22 // [cos((k+1/2) n/N pi) + cos((k+3/2) n/N pi)]/2 = 23 // cos(n/(2N) pi) cos((k+1) n/N pi) = 24 // cos(n/(2N) pi) cos(((k/2)+1/2) n/(N/2) pi) 25 // 26 // which is exactly the same as the value of pixel k/2 of a N/2-sized DCT, 27 // except for the cos(n/(2N) pi) scaling factor (which does *not* 28 // depend on the pixel). Thus, when using the lower-frequency coefficients of a 29 // DCT-N to compute a DCT-(N/2), they should be scaled by this constant. Scaling 30 // factors for a DCT-(N/4) etc can then be obtained by successive 31 // multiplications. The structs below contain the above-mentioned scaling 32 // factors. 33 // 34 // Python code for the tables below: 35 // 36 // for i in range(N // 8): 37 // v = math.cos(i / (2 * N) * math.pi) 38 // v *= math.cos(i / (N) * math.pi) 39 // v *= math.cos(i / (N / 2) * math.pi) 40 // print(v, end=", ") 41 42 template <size_t FROM, size_t TO> 43 struct DCTResampleScales; 44 45 template <> 46 struct DCTResampleScales<8, 1> { 47 static constexpr float kScales[] = { 48 1.000000000000000000, 49 }; 50 }; 51 52 template <> 53 struct DCTResampleScales<16, 2> { 54 static constexpr float kScales[] = { 55 1.000000000000000000, 56 0.901764195028874394, 57 }; 58 }; 59 60 template <> 61 struct DCTResampleScales<32, 4> { 62 static constexpr float kScales[] = { 63 1.000000000000000000, 64 0.974886821136879522, 65 0.901764195028874394, 66 0.787054918159101335, 67 }; 68 }; 69 70 template <> 71 struct DCTResampleScales<64, 8> { 72 static constexpr float kScales[] = { 73 1.0000000000000000, 0.9936866130906366, 0.9748868211368796, 74 0.9440180941651672, 0.9017641950288744, 0.8490574973847023, 75 0.7870549181591013, 0.7171081282466044, 76 }; 77 }; 78 79 template <> 80 struct DCTResampleScales<128, 16> { 81 static constexpr float kScales[] = { 82 1.0, 83 0.9984194528776054, 84 0.9936866130906366, 85 0.9858278282666936, 86 0.9748868211368796, 87 0.9609244059440204, 88 0.9440180941651672, 89 0.9242615922757944, 90 0.9017641950288744, 91 0.8766500784429904, 92 0.8490574973847023, 93 0.8191378932865928, 94 0.7870549181591013, 95 0.7529833816270532, 96 0.7171081282466044, 97 0.6796228528314651, 98 }; 99 }; 100 101 template <> 102 struct DCTResampleScales<256, 32> { 103 static constexpr float kScales[] = { 104 1.0, 105 0.9996047255830407, 106 0.9984194528776054, 107 0.9964458326264695, 108 0.9936866130906366, 109 0.9901456355893141, 110 0.9858278282666936, 111 0.9807391980963174, 112 0.9748868211368796, 113 0.9682788310563117, 114 0.9609244059440204, 115 0.9528337534340876, 116 0.9440180941651672, 117 0.9344896436056892, 118 0.9242615922757944, 119 0.913348084400198, 120 0.9017641950288744, 121 0.8895259056651056, 122 0.8766500784429904, 123 0.8631544288990163, 124 0.8490574973847023, 125 0.8343786191696513, 126 0.8191378932865928, 127 0.8033561501721485, 128 0.7870549181591013, 129 0.7702563888779096, 130 0.7529833816270532, 131 0.7352593067735488, 132 0.7171081282466044, 133 0.6985543251889097, 134 0.6796228528314651, 135 0.6603391026591464, 136 }; 137 }; 138 139 // Inverses of the above. 140 template <> 141 struct DCTResampleScales<1, 8> { 142 static constexpr float kScales[] = { 143 1.000000000000000000, 144 }; 145 }; 146 147 template <> 148 struct DCTResampleScales<2, 16> { 149 static constexpr float kScales[] = { 150 1.000000000000000000, 151 1.108937353592731823, 152 }; 153 }; 154 155 template <> 156 struct DCTResampleScales<4, 32> { 157 static constexpr float kScales[] = { 158 1.000000000000000000, 159 1.025760096781116015, 160 1.108937353592731823, 161 1.270559368765487251, 162 }; 163 }; 164 165 template <> 166 struct DCTResampleScales<8, 64> { 167 static constexpr float kScales[] = { 168 1.0000000000000000, 1.0063534990068217, 1.0257600967811158, 169 1.0593017296817173, 1.1089373535927318, 1.1777765381970435, 170 1.2705593687654873, 1.3944898413647777, 171 }; 172 }; 173 174 template <> 175 struct DCTResampleScales<16, 128> { 176 static constexpr float kScales[] = { 177 1.0, 178 1.0015830492062623, 179 1.0063534990068217, 180 1.0143759095928793, 181 1.0257600967811158, 182 1.0406645869480142, 183 1.0593017296817173, 184 1.0819447744633812, 185 1.1089373535927318, 186 1.1407059950032632, 187 1.1777765381970435, 188 1.2207956782315876, 189 1.2705593687654873, 190 1.3280505578213306, 191 1.3944898413647777, 192 1.4714043176061107, 193 }; 194 }; 195 196 template <> 197 struct DCTResampleScales<32, 256> { 198 static constexpr float kScales[] = { 199 1.0, 200 1.0003954307206069, 201 1.0015830492062623, 202 1.0035668445360069, 203 1.0063534990068217, 204 1.009952439375063, 205 1.0143759095928793, 206 1.0196390660647288, 207 1.0257600967811158, 208 1.0327603660498115, 209 1.0406645869480142, 210 1.049501024072585, 211 1.0593017296817173, 212 1.0701028169146336, 213 1.0819447744633812, 214 1.0948728278734026, 215 1.1089373535927318, 216 1.124194353004584, 217 1.1407059950032632, 218 1.158541237256391, 219 1.1777765381970435, 220 1.1984966740820495, 221 1.2207956782315876, 222 1.244777922949508, 223 1.2705593687654873, 224 1.2982690107339132, 225 1.3280505578213306, 226 1.3600643892400104, 227 1.3944898413647777, 228 1.4315278911623237, 229 1.4714043176061107, 230 1.5143734423314616, 231 }; 232 }; 233 234 // Constants for DCT implementation. Generated by the following snippet: 235 // for i in range(N // 2): 236 // print(1.0 / (2 * math.cos((i + 0.5) * math.pi / N)), end=", ") 237 template <size_t N> 238 struct WcMultipliers; 239 240 template <> 241 struct WcMultipliers<4> { 242 static constexpr float kMultipliers[] = { 243 0.541196100146197, 244 1.3065629648763764, 245 }; 246 }; 247 248 template <> 249 struct WcMultipliers<8> { 250 static constexpr float kMultipliers[] = { 251 0.5097955791041592, 252 0.6013448869350453, 253 0.8999762231364156, 254 2.5629154477415055, 255 }; 256 }; 257 258 template <> 259 struct WcMultipliers<16> { 260 static constexpr float kMultipliers[] = { 261 0.5024192861881557, 0.5224986149396889, 0.5669440348163577, 262 0.6468217833599901, 0.7881546234512502, 1.060677685990347, 263 1.7224470982383342, 5.101148618689155, 264 }; 265 }; 266 267 template <> 268 struct WcMultipliers<32> { 269 static constexpr float kMultipliers[] = { 270 0.5006029982351963, 0.5054709598975436, 0.5154473099226246, 271 0.5310425910897841, 0.5531038960344445, 0.5829349682061339, 272 0.6225041230356648, 0.6748083414550057, 0.7445362710022986, 273 0.8393496454155268, 0.9725682378619608, 1.1694399334328847, 274 1.4841646163141662, 2.057781009953411, 3.407608418468719, 275 10.190008123548033, 276 }; 277 }; 278 template <> 279 struct WcMultipliers<64> { 280 static constexpr float kMultipliers[] = { 281 0.500150636020651, 0.5013584524464084, 0.5037887256810443, 282 0.5074711720725553, 0.5124514794082247, 0.5187927131053328, 283 0.52657731515427, 0.535909816907992, 0.5469204379855088, 284 0.5597698129470802, 0.57465518403266, 0.5918185358574165, 285 0.6115573478825099, 0.6342389366884031, 0.6603198078137061, 286 0.6903721282002123, 0.7251205223771985, 0.7654941649730891, 287 0.8127020908144905, 0.8683447152233481, 0.9345835970364075, 288 1.0144082649970547, 1.1120716205797176, 1.233832737976571, 289 1.3892939586328277, 1.5939722833856311, 1.8746759800084078, 290 2.282050068005162, 2.924628428158216, 4.084611078129248, 291 6.796750711673633, 20.373878167231453, 292 }; 293 }; 294 template <> 295 struct WcMultipliers<128> { 296 static constexpr float kMultipliers[] = { 297 0.5000376519155477, 0.5003390374428216, 0.5009427176380873, 298 0.5018505174842379, 0.5030651913013697, 0.5045904432216454, 299 0.5064309549285542, 0.5085924210498143, 0.5110815927066812, 300 0.5139063298475396, 0.5170756631334912, 0.5205998663018917, 301 0.524490540114724, 0.5287607092074876, 0.5334249333971333, 302 0.538499435291984, 0.5440022463817783, 0.549953374183236, 303 0.5563749934898856, 0.5632916653417023, 0.5707305880121454, 304 0.5787218851348208, 0.5872989370937893, 0.5964987630244563, 305 0.606362462272146, 0.6169357260050706, 0.6282694319707711, 306 0.6404203382416639, 0.6534518953751283, 0.6674352009263413, 307 0.6824501259764195, 0.6985866506472291, 0.7159464549705746, 308 0.7346448236478627, 0.7548129391165311, 0.776600658233963, 309 0.8001798956216941, 0.8257487738627852, 0.8535367510066064, 310 0.8838110045596234, 0.9168844461846523, 0.9531258743921193, 311 0.9929729612675466, 1.036949040910389, 1.0856850642580145, 312 1.1399486751015042, 1.2006832557294167, 1.2690611716991191, 313 1.346557628206286, 1.4350550884414341, 1.5369941008524954, 314 1.6555965242641195, 1.7952052190778898, 1.961817848571166, 315 2.163957818751979, 2.4141600002500763, 2.7316450287739396, 316 3.147462191781909, 3.7152427383269746, 4.5362909369693565, 317 5.827688377844654, 8.153848602466814, 13.58429025728446, 318 40.744688103351834, 319 }; 320 }; 321 322 template <> 323 struct WcMultipliers<256> { 324 static constexpr float kMultipliers[128] = { 325 0.5000094125358878, 0.500084723455784, 0.5002354020255269, 326 0.5004615618093246, 0.5007633734146156, 0.5011410648064231, 327 0.5015949217281668, 0.502125288230386, 0.5027325673091954, 328 0.5034172216566842, 0.5041797745258774, 0.5050208107132756, 329 0.5059409776624396, 0.5069409866925212, 0.5080216143561264, 330 0.509183703931388, 0.5104281670536573, 0.5117559854927805, 331 0.5131682130825206, 0.5146659778093218, 0.516250484068288, 332 0.5179230150949777, 0.5196849355823947, 0.5215376944933958, 333 0.5234828280796439, 0.52552196311921, 0.5276568203859896, 334 0.5298892183652453, 0.5322210772308335, 0.5346544231010253, 335 0.537191392591309, 0.5398342376841637, 0.5425853309375497, 336 0.545447171055775, 0.5484223888484947, 0.551513753605893, 337 0.554724179920619, 0.5580567349898085, 0.5615146464335654, 338 0.5651013106696203, 0.5688203018875696, 0.5726753816701664, 339 0.5766705093136241, 0.5808098529038624, 0.5850978012111273, 340 0.58953897647151, 0.5941382481306648, 0.5989007476325463, 341 0.6038318843443582, 0.6089373627182432, 0.614223200800649, 342 0.6196957502119484, 0.6253617177319102, 0.6312281886412079, 343 0.6373026519855411, 0.6435930279473415, 0.6501076975307724, 344 0.6568555347890955, 0.6638459418498757, 0.6710888870233562, 345 0.6785949463131795, 0.6863753486870501, 0.6944420255086364, 346 0.7028076645818034, 0.7114857693151208, 0.7204907235796304, 347 0.7298378629074134, 0.7395435527641373, 0.749625274727372, 348 0.7601017215162176, 0.7709929019493761, 0.7823202570613161, 349 0.7941067887834509, 0.8063772028037925, 0.8191580674598145, 350 0.83247799080191, 0.8463678182968619, 0.860860854031955, 351 0.8759931087426972, 0.8918035785352535, 0.9083345588266809, 352 0.9256319988042384, 0.9437459026371479, 0.962730784794803, 353 0.9826461881778968, 1.0035572754078206, 1.0255355056139732, 354 1.048659411496106, 1.0730154944316674, 1.0986992590905857, 355 1.1258164135986009, 1.1544842669978943, 1.184833362908442, 356 1.217009397314603, 1.2511754798461228, 1.287514812536712, 357 1.326233878832723, 1.3675662599582539, 1.411777227500661, 358 1.459169302866857, 1.5100890297227016, 1.5649352798258847, 359 1.6241695131835794, 1.6883285509131505, 1.7580406092704062, 360 1.8340456094306077, 1.9172211551275689, 2.0086161135167564, 361 2.1094945286246385, 2.22139377701127, 2.346202662531156, 362 2.486267909203593, 2.644541877144861, 2.824791402350551, 363 3.0318994541759925, 3.2723115884254845, 3.5547153325075804, 364 3.891107790700307, 4.298537526449054, 4.802076008665048, 365 5.440166215091329, 6.274908408039339, 7.413566756422303, 366 9.058751453879703, 11.644627325175037, 16.300023088031555, 367 27.163977662448232, 81.48784219222516, 368 }; 369 }; 370 371 // Apply the DCT algorithm-intrinsic constants to DCTResampleScale. 372 template <size_t FROM, size_t TO> 373 constexpr float DCTTotalResampleScale(size_t x) { 374 return DCTResampleScales<FROM, TO>::kScales[x]; 375 } 376 377 } // namespace jxl 378 379 #endif // LIB_JXL_DCT_SCALES_H_