www.gusucode.com > 图像FFT_DCT源码程序 > 图像FFT_DCT源码程序/spectral_saliency_matlab/qdct_impl/dct_type3_48.cpp
/** * Copyright 2011 B. Schauerte. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * THIS SOFTWARE IS PROVIDED BY B. SCHAUERTE ''AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL B. SCHAUERTE OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * The views and conclusions contained in the software and documentation * are those of the authors and should not be interpreted as representing * official policies, either expressed or implied, of B. Schauerte. */ /** * If you use any of this work in scientific research or as part of a larger * software system, you are kindly requested to cite the use in any related * publications or technical documentation. The work is based upon: * * [1] B. Schauerte, and R. Stiefelhagen, "Predicting Human Gaze using * Quaternion DCT Image Signature Saliency and Face Detection," in IEEE * Workshop on the Applications of Computer Vision (WACV), 2012. * [2] B. Schauerte, and R. Stiefelhagen, "Quaternion-based Spectral * Saliency Detection for Eye Fixation Prediction," in European * Conference on Computer Vision (ECCV), 2012 */ #include "dct_type2.hpp" #include <cstddef> // for size_t #ifndef DK #define DK(name, value) const E name = K(value) #endif #ifndef WS #define WS(stride, i) (stride * i) #endif #ifndef MAKE_VOLATILE_STRIDE #define MAKE_VOLATILE_STRIDE(x) x #endif template <typename R, typename stride, typename INT> void dct_type3_48(const R * I, R * O, stride is, stride os, INT v, INT ivs, INT ovs) { typedef R E; typedef R K; DK(KP1_913880671, +1.913880671464417729871595773960539938965698411); DK(KP580569354, +0.580569354508924735272384751634790549382952557); DK(KP1_763842528, +1.763842528696710059425513727320776699016885241); DK(KP942793473, +0.942793473651995297112775251810508755314920638); DK(KP1_662939224, +1.662939224605090474157576755235811513477121624); DK(KP1_111140466, +1.111140466039204449485661627897065748749874382); DK(KP1_268786568, +1.268786568327290996430343226450986741351374190); DK(KP1_546020906, +1.546020906725473921621813219516939601942082586); DK(KP1_990369453, +1.990369453344393772489673906218959843150949737); DK(KP196034280, +0.196034280659121203988391127777283691722273346); DK(KP1_961570560, +1.961570560806460898252364472268478073947867462); DK(KP390180644, +0.390180644032256535696569736954044481855383236); DK(KP382683432, +0.382683432365089771728459984030398866761344562); DK(KP923879532, +0.923879532511286756128183189396788286822416626); DK(KP612372435, +0.612372435695794524549321018676472847991486870); DK(KP353553390, +0.353553390593273762200422181052424519642417969); DK(KP765366864, +0.765366864730179543456919968060797733522689125); DK(KP1_847759065, +1.847759065022573512256366378793576573644833252); DK(KP707106781, +0.707106781186547524400844362104849039284835938); DK(KP1_414213562, +1.414213562373095048801688724209698078569671875); DK(KP1_224744871, +1.224744871391589049098642037352945695982973740); DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); DK(KP1_732050807, +1.732050807568877293527446341505872366942805254); DK(KP500000000, +0.500000000000000000000000000000000000000000000); DK(KP866025403, +0.866025403784438646763723170752936183471402627); INT i; for (i = v; i > 0; i = i - 1, I = I + ivs, O = O + ovs, MAKE_VOLATILE_STRIDE(is), MAKE_VOLATILE_STRIDE(os)) { E T250; E T252; E T54; E T183; E T60; E T179; E T257; E T274; E T75; E T187; E T134; E T202; E T6; E T172; E T13; E T173; E T242; E T288; E T23; E T176; E T28; E T175; E T245; E T289; E T45; E T180; E T249; E T253; E T63; E T182; E T106; E T124; E T267; E T270; E T195; E T199; E T121; E T125; E T264; E T271; E T192; E T198; E T90; E T201; E T260; E T273; E T129; E T188; { E T52; E T56; E T48; E T57; E T51; E T59; E T53; E T58; T52 = I[WS(is, 42)]; T56 = I[WS(is, 6)]; { E T46; E T47; E T49; E T50; T46 = I[WS(is, 38)]; T47 = I[WS(is, 26)]; T48 = KP866025403 * (T46 - T47); T57 = T47 + T46; T49 = I[WS(is, 22)]; T50 = I[WS(is, 10)]; T51 = T49 - T50; T59 = KP866025403 * (T49 + T50); } T250 = T51 + T52; T252 = T56 - T57; T53 = FMS(KP500000000, T51, T52); T54 = T48 + T53; T183 = T53 - T48; T58 = FMA(KP500000000, T57, T56); T60 = T58 + T59; T179 = T58 - T59; } { E T67; E T132; E T70; E T130; E T74; E T131; E T71; E T133; T67 = I[WS(is, 3)]; T132 = I[WS(is, 45)]; { E T68; E T69; E T72; E T73; T68 = I[WS(is, 29)]; T69 = I[WS(is, 35)]; T70 = T68 + T69; T130 = KP866025403 * (T69 - T68); T72 = I[WS(is, 19)]; T73 = I[WS(is, 13)]; T74 = KP866025403 * (T72 + T73); T131 = T72 - T73; } T257 = T67 - T70; T274 = T131 + T132; T71 = FMA(KP500000000, T70, T67); T75 = T71 + T74; T187 = T71 - T74; T133 = FMS(KP500000000, T131, T132); T134 = T130 + T133; T202 = T133 - T130; } { E T7; E T5; E T3; E T240; E T10; E T12; E T4; E T11; E T241; T7 = I[WS(is, 24)]; T4 = I[WS(is, 16)]; T5 = KP1_732050807 * T4; { E T1; E T2; E T8; E T9; T1 = I[0]; T2 = I[WS(is, 32)]; T3 = T1 + T2; T240 = FNMS(KP2_000000000, T2, T1); T8 = I[WS(is, 8)]; T9 = I[WS(is, 40)]; T10 = T8 - T9; T12 = KP1_224744871 * (T8 + T9); } T6 = T3 + T5; T172 = T3 - T5; T11 = FMA(KP1_414213562, T7, KP707106781 * T10); T13 = T11 + T12; T173 = T12 - T11; T241 = KP1_414213562 * (T7 - T10); T242 = T240 + T241; T288 = T240 - T241; } { E T15; E T26; E T18; E T24; E T22; E T25; T15 = I[WS(is, 12)]; T26 = I[WS(is, 36)]; { E T16; E T17; E T20; E T21; T16 = I[WS(is, 20)]; T17 = I[WS(is, 44)]; T18 = T16 + T17; T24 = KP866025403 * (T17 - T16); T20 = I[WS(is, 28)]; T21 = I[WS(is, 4)]; T22 = KP866025403 * (T20 + T21); T25 = T20 - T21; } { E T19; E T27; E T243; E T244; T19 = FMA(KP500000000, T18, T15); T23 = T19 + T22; T176 = T19 - T22; T27 = FMS(KP500000000, T25, T26); T28 = T24 + T27; T175 = T27 - T24; T243 = T15 - T18; T244 = T25 + T26; T245 = FMA(KP1_847759065, T243, KP765366864 * T244); T289 = FNMS(KP1_847759065, T244, KP765366864 * T243); } } { E T31; E T34; E T35; E T36; E T41; E T42; E T40; E T43; E T37; E T44; { E T32; E T33; E T38; E T39; T31 = I[WS(is, 30)]; T32 = I[WS(is, 2)]; T33 = I[WS(is, 34)]; T34 = T32 - T33; T35 = FMA(KP707106781, T31, KP353553390 * T34); T36 = KP612372435 * (T32 + T33); T41 = I[WS(is, 18)]; T38 = I[WS(is, 14)]; T39 = I[WS(is, 46)]; T42 = T38 - T39; T40 = KP612372435 * (T38 + T39); T43 = FMA(KP707106781, T41, KP353553390 * T42); } T37 = T35 - T36; T44 = T40 - T43; T45 = T37 + T44; T180 = T44 - T37; { E T247; E T248; E T61; E T62; T247 = T31 - T34; T248 = T41 - T42; T249 = KP707106781 * (T247 - T248); T253 = KP707106781 * (T247 + T248); T61 = T35 + T36; T62 = T43 + T40; T63 = T61 + T62; T182 = T62 - T61; } } { E T101; E T102; E T94; E T103; E T98; E T97; E T99; E T104; E T100; E T105; { E T92; E T93; E T95; E T96; T101 = I[WS(is, 9)]; T92 = I[WS(is, 23)]; T93 = I[WS(is, 41)]; T102 = T93 + T92; T94 = KP866025403 * (T92 - T93); T103 = FMA(KP500000000, T102, T101); T98 = I[WS(is, 39)]; T95 = I[WS(is, 7)]; T96 = I[WS(is, 25)]; T97 = T95 - T96; T99 = FMA(KP500000000, T97, T98); T104 = KP866025403 * (T95 + T96); } T100 = T94 + T99; T105 = T103 + T104; T106 = FNMS(KP382683432, T105, KP923879532 * T100); T124 = FMA(KP923879532, T105, KP382683432 * T100); { E T265; E T266; E T193; E T194; T265 = T101 - T102; T266 = T98 - T97; T267 = FMA(KP923879532, T265, KP382683432 * T266); T270 = FNMS(KP923879532, T266, KP382683432 * T265); T193 = T103 - T104; T194 = T99 - T94; T195 = FMA(KP923879532, T193, KP382683432 * T194); T199 = FNMS(KP382683432, T193, KP923879532 * T194); } } { E T107; E T110; E T111; E T116; E T118; E T117; E T114; E T119; E T115; E T120; { E T108; E T109; E T112; E T113; T107 = I[WS(is, 15)]; T108 = I[WS(is, 17)]; T109 = I[WS(is, 47)]; T110 = T108 + T109; T111 = FMA(KP500000000, T110, T107); T116 = KP866025403 * (T109 - T108); T118 = I[WS(is, 33)]; T112 = I[WS(is, 31)]; T113 = I[WS(is, 1)]; T117 = T112 - T113; T114 = KP866025403 * (T112 + T113); T119 = FMS(KP500000000, T117, T118); } T115 = T111 + T114; T120 = T116 + T119; T121 = FMA(KP382683432, T115, KP923879532 * T120); T125 = FNMS(KP382683432, T120, KP923879532 * T115); { E T262; E T263; E T190; E T191; T262 = T107 - T110; T263 = T117 + T118; T264 = FMA(KP923879532, T262, KP382683432 * T263); T271 = FNMS(KP923879532, T263, KP382683432 * T262); T190 = T111 - T114; T191 = T119 - T116; T192 = FNMS(KP382683432, T191, KP923879532 * T190); T198 = FMA(KP382683432, T190, KP923879532 * T191); } } { E T76; E T79; E T80; E T81; E T83; E T86; E T87; E T88; E T82; E T89; { E T77; E T78; E T84; E T85; T76 = I[WS(is, 27)]; T77 = I[WS(is, 5)]; T78 = I[WS(is, 37)]; T79 = T77 - T78; T80 = FMA(KP707106781, T76, KP353553390 * T79); T81 = KP612372435 * (T77 + T78); T83 = I[WS(is, 21)]; T84 = I[WS(is, 11)]; T85 = I[WS(is, 43)]; T86 = T84 - T85; T87 = FMA(KP707106781, T83, KP353553390 * T86); T88 = KP612372435 * (T84 + T85); } T82 = T80 + T81; T89 = T87 + T88; T90 = T82 + T89; T201 = T89 - T82; { E T258; E T259; E T127; E T128; T258 = T76 - T79; T259 = T83 - T86; T260 = KP707106781 * (T258 + T259); T273 = KP707106781 * (T258 - T259); T127 = T80 - T81; T128 = T88 - T87; T129 = T127 + T128; T188 = T128 - T127; } } { E T246; E T280; E T255; E T281; E T269; E T283; E T276; E T284; E T251; E T254; T246 = T242 + T245; T280 = T242 - T245; T251 = T249 - T250; T254 = T252 + T253; T255 = FNMS(KP1_961570560, T254, KP390180644 * T251); T281 = FMA(KP390180644, T254, KP1_961570560 * T251); { E T261; E T268; E T272; E T275; T261 = T257 + T260; T268 = T264 + T267; T269 = T261 + T268; T283 = T261 - T268; T272 = T270 - T271; T275 = T273 - T274; T276 = T272 - T275; T284 = T272 + T275; } { E T256; E T277; E T286; E T287; T256 = T246 + T255; T277 = FNMS(KP1_990369453, T276, KP196034280 * T269); O[WS(os, 40)] = T256 - T277; O[WS(os, 7)] = T256 + T277; T286 = T280 + T281; T287 = FMA(KP1_546020906, T283, KP1_268786568 * T284); O[WS(os, 19)] = T286 - T287; O[WS(os, 28)] = T286 + T287; } { E T278; E T279; E T282; E T285; T278 = T246 - T255; T279 = FMA(KP1_990369453, T269, KP196034280 * T276); O[WS(os, 16)] = T278 - T279; O[WS(os, 31)] = T278 + T279; T282 = T280 - T281; T285 = FNMS(KP1_546020906, T284, KP1_268786568 * T283); O[WS(os, 43)] = T282 - T285; O[WS(os, 4)] = T282 + T285; } } { E T290; E T304; E T293; E T305; E T297; E T307; E T300; E T308; E T291; E T292; T290 = T288 - T289; T304 = T288 + T289; T291 = T252 - T253; T292 = T249 + T250; T293 = FMA(KP1_111140466, T291, KP1_662939224 * T292); T305 = FNMS(KP1_111140466, T292, KP1_662939224 * T291); { E T295; E T296; E T298; E T299; T295 = T257 - T260; T296 = T271 + T270; T297 = T295 - T296; T307 = T295 + T296; T298 = T264 - T267; T299 = T273 + T274; T300 = T298 - T299; T308 = T298 + T299; } { E T294; E T301; E T310; E T311; T294 = T290 - T293; T301 = FMA(KP942793473, T297, KP1_763842528 * T300); O[WS(os, 10)] = T294 - T301; O[WS(os, 37)] = T294 + T301; T310 = T304 - T305; T311 = FMA(KP580569354, T307, KP1_913880671 * T308); O[WS(os, 22)] = T310 - T311; O[WS(os, 25)] = T310 + T311; } { E T302; E T303; E T306; E T309; T302 = T290 + T293; T303 = FNMS(KP1_763842528, T297, KP942793473 * T300); O[WS(os, 34)] = T302 - T303; O[WS(os, 13)] = T302 + T303; T306 = T304 + T305; T309 = FNMS(KP580569354, T308, KP1_913880671 * T307); O[WS(os, 46)] = T306 - T309; O[WS(os, 1)] = T306 + T309; } } { E T30; E T140; E T136; E T144; E T65; E T141; E T123; E T143; { E T14; E T29; E T126; E T135; T14 = T6 - T13; T29 = FMA(KP765366864, T23, KP1_847759065 * T28); T30 = T14 + T29; T140 = T14 - T29; T126 = T124 - T125; T135 = T129 - T134; T136 = T126 - T135; T144 = T126 + T135; } { E T55; E T64; E T91; E T122; T55 = T45 - T54; T64 = T60 - T63; T65 = FNMS(KP1_662939224, T64, KP1_111140466 * T55); T141 = FMA(KP1_111140466, T64, KP1_662939224 * T55); T91 = T75 - T90; T122 = T106 - T121; T123 = T91 - T122; T143 = T91 + T122; } { E T66; E T137; E T146; E T147; T66 = T30 + T65; T137 = FNMS(KP1_913880671, T136, KP580569354 * T123); O[WS(os, 41)] = T66 - T137; O[WS(os, 6)] = T66 + T137; T146 = T140 + T141; T147 = FMA(KP1_763842528, T143, KP942793473 * T144); O[WS(os, 18)] = T146 - T147; O[WS(os, 29)] = T146 + T147; } { E T138; E T139; E T142; E T145; T138 = T30 - T65; T139 = FMA(KP1_913880671, T123, KP580569354 * T136); O[WS(os, 17)] = T138 - T139; O[WS(os, 30)] = T138 + T139; T142 = T140 - T141; T145 = FNMS(KP1_763842528, T144, KP942793473 * T143); O[WS(os, 42)] = T142 - T145; O[WS(os, 5)] = T142 + T145; } } { E T218; E T232; E T228; E T236; E T221; E T233; E T225; E T235; { E T216; E T217; E T226; E T227; T216 = T172 + T173; T217 = FMA(KP765366864, T176, KP1_847759065 * T175); T218 = T216 + T217; T232 = T216 - T217; T226 = T192 - T195; T227 = T201 + T202; T228 = T226 - T227; T236 = T226 + T227; } { E T219; E T220; E T223; E T224; T219 = T179 + T180; T220 = T182 + T183; T221 = FMA(KP1_662939224, T219, KP1_111140466 * T220); T233 = FNMS(KP1_662939224, T220, KP1_111140466 * T219); T223 = T187 + T188; T224 = T199 - T198; T225 = T223 - T224; T235 = T223 + T224; } { E T222; E T229; E T238; E T239; T222 = T218 - T221; T229 = FMA(KP580569354, T225, KP1_913880671 * T228); O[WS(os, 9)] = T222 - T229; O[WS(os, 38)] = T222 + T229; T238 = T232 - T233; T239 = FMA(KP942793473, T235, KP1_763842528 * T236); O[WS(os, 21)] = T238 - T239; O[WS(os, 26)] = T238 + T239; } { E T230; E T231; E T234; E T237; T230 = T218 + T221; T231 = FNMS(KP1_913880671, T225, KP580569354 * T228); O[WS(os, 33)] = T230 - T231; O[WS(os, 14)] = T230 + T231; T234 = T232 + T233; T237 = FNMS(KP942793473, T236, KP1_763842528 * T235); O[WS(os, 45)] = T234 - T237; O[WS(os, 2)] = T234 + T237; } } { E T178; E T208; E T204; E T212; E T185; E T209; E T197; E T211; { E T174; E T177; E T200; E T203; T174 = T172 - T173; T177 = FNMS(KP1_847759065, T176, KP765366864 * T175); T178 = T174 - T177; T208 = T174 + T177; T200 = T198 + T199; T203 = T201 - T202; T204 = T200 - T203; T212 = T200 + T203; } { E T181; E T184; E T189; E T196; T181 = T179 - T180; T184 = T182 - T183; T185 = FMA(KP1_961570560, T181, KP390180644 * T184); T209 = FNMS(KP1_961570560, T184, KP390180644 * T181); T189 = T187 - T188; T196 = T192 + T195; T197 = T189 + T196; T211 = T189 - T196; } { E T186; E T205; E T214; E T215; T186 = T178 - T185; T205 = FMA(KP196034280, T197, KP1_990369453 * T204); O[WS(os, 8)] = T186 - T205; O[WS(os, 39)] = T186 + T205; T214 = T208 - T209; T215 = FMA(KP1_268786568, T211, KP1_546020906 * T212); O[WS(os, 20)] = T214 - T215; O[WS(os, 27)] = T214 + T215; } { E T206; E T207; E T210; E T213; T206 = T178 + T185; T207 = FNMS(KP1_990369453, T197, KP196034280 * T204); O[WS(os, 32)] = T206 - T207; O[WS(os, 15)] = T206 + T207; T210 = T208 + T209; T213 = FNMS(KP1_268786568, T212, KP1_546020906 * T211); O[WS(os, 44)] = T210 - T213; O[WS(os, 3)] = T210 + T213; } } { E T150; E T164; E T160; E T168; E T153; E T165; E T157; E T167; { E T148; E T149; E T158; E T159; T148 = T6 + T13; T149 = FNMS(KP765366864, T28, KP1_847759065 * T23); T150 = T148 - T149; T164 = T148 + T149; T158 = T121 + T106; T159 = T129 + T134; T160 = T158 - T159; T168 = T158 + T159; } { E T151; E T152; E T155; E T156; T151 = T60 + T63; T152 = T45 + T54; T153 = FMA(KP390180644, T151, KP1_961570560 * T152); T165 = FNMS(KP390180644, T152, KP1_961570560 * T151); T155 = T75 + T90; T156 = T125 + T124; T157 = T155 - T156; T167 = T155 + T156; } { E T154; E T161; E T170; E T171; T154 = T150 - T153; T161 = FMA(KP1_268786568, T157, KP1_546020906 * T160); O[WS(os, 11)] = T154 - T161; O[WS(os, 36)] = T154 + T161; T170 = T164 - T165; T171 = FMA(KP196034280, T167, KP1_990369453 * T168); O[WS(os, 23)] = T170 - T171; O[WS(os, 24)] = T170 + T171; } { E T162; E T163; E T166; E T169; T162 = T150 + T153; T163 = FNMS(KP1_546020906, T157, KP1_268786568 * T160); O[WS(os, 35)] = T162 - T163; O[WS(os, 12)] = T162 + T163; T166 = T164 + T165; T169 = FNMS(KP196034280, T168, KP1_990369453 * T167); O[WS(os, 47)] = T166 - T169; O[0] = T166 + T169; } } } } template void dct_type3_48<>(const double*, double*, int, int, int, int, int); template void dct_type3_48<>(const float*, float*, int, int, int, int, int); template void dct_type3_48<>(const double*, double*, size_t, size_t, size_t, size_t, size_t); template void dct_type3_48<>(const float*, float*, size_t, size_t, size_t, size_t, size_t);