⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fix_8cpp-source.html

📁 Tixys source code, include G.711, G.726, IMA-ADPCM etc.
💻 HTML
📖 第 1 页 / 共 5 页
字号:
00381     <span class="keywordflow">if</span>(a==0)00382         <span class="keywordflow">return</span> (<a class="code" href="group__fix.html#ga0">fix</a>)-0x80000000;00383 00384     <span class="comment">// calculate integer part of result in i</span>00385     <span class="comment">// and set n = normalised value of a</span>00386     <a class="code" href="group__integers.html#ga5">int32</a> i=15*0x10000;00387     <a class="code" href="group__integers.html#ga2">uint32</a> n=a;00388     <span class="keywordflow">if</span>(n&lt;(<a class="code" href="group__integers.html#ga2">uint32</a>)(1&lt;&lt;(32-16)))00389         n &lt;&lt;= 16, i -= 16*0x10000;00390     <span class="keywordflow">if</span>(n&lt;(<a class="code" href="group__integers.html#ga2">uint32</a>)(1&lt;&lt;(32-8)))00391         n &lt;&lt;= 8, i -= 8*0x10000;00392     <span class="keywordflow">if</span>(n&lt;(<a class="code" href="group__integers.html#ga2">uint32</a>)(1&lt;&lt;(32-4)))00393         n &lt;&lt;= 4, i -= 4*0x10000;00394     <span class="keywordflow">if</span>(n&lt;(<a class="code" href="group__integers.html#ga2">uint32</a>)(1&lt;&lt;(32-2)))00395         n &lt;&lt;= 2, i -= 2*0x10000;00396     <span class="keywordflow">if</span>(n&lt;(<a class="code" href="group__integers.html#ga2">uint32</a>)(1&lt;&lt;(32-1)))00397         n &lt;&lt;= 1, i -= 1*0x10000;00398 00399     <span class="comment">// reduce n to the 23 most significant bits and clear</span>00400     <span class="comment">// the most significant bit, leaving a 22 bit value in n</span>00401     n = (n-0x80000000+(1&lt;&lt;8))&gt;&gt;9;00402 00403     <span class="comment">// calculate fractional part of result (in f) by interpolation of lookup table values</span>00404     <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="group__integers.html#ga5">int32</a> LogTable[] =00405         {00406         0xffff45e1,00407         0x00000000,0x0000b73d,0x00016bad,0x00021d67,0x0002cc7f,0x00037908,0x00042316,0x0004caba,00408         0x00057007,0x0006130b,0x0006b3d8,0x0007527c,0x0007ef06,0x00088984,0x00092204,0x0009b892,00409         0x000a4d3c,0x000ae00d,0x000b7111,0x000c0053,0x000c8ddd,0x000d19bb,0x000da3f6,0x000e2c98,00410         0x000eb3aa,0x000f3935,0x000fbd43,0x00103fdb,0x0010c105,0x001140ca,0x0011bf31,0x00123c42,00411         0x0012b803,0x0013327c,0x0013abb4,0x001423b0,0x00149a78,0x00151012,0x00158482,0x0015f7d0,00412         0x00166a01,0x0016db19,0x00174b20,0x0017ba19,0x0018280a,0x001894f7,0x001900e6,0x00196bdb,00413         0x0019d5da,0x001a3ee8,0x001aa709,0x001b0e41,0x001b7495,0x001bda07,0x001c3e9d,0x001ca259,00414         0x001d053f,0x001d6754,0x001dc89a,0x001e2914,0x001e88c7,0x001ee7b4,0x001f45e1,0x001fa34e,00415         0x00200000,0x00205bf9,0x0020b73d00416         };00417     <a class="code" href="group__integers.html#ga5">int32</a> f = Interpolate(LogTable,n,16);00418 00419     <span class="comment">// scale result to 16 bits (from the 22 bit precision used in lookup table)</span>00420     f = (f+(1&lt;&lt;(5-1)))&gt;&gt;5;00421 00422     <span class="comment">// return sum of integer and fractional part</span>00423     <span class="keywordflow">return</span> i+f;00424     }00425 00426 <a name="l00427"></a><a class="code" href="classFix.html#e7">00427</a> <a class="code" href="common_8h.html#a2">EXPORT</a> <a class="code" href="group__fix.html#ga1">ufix</a> <a class="code" href="classFix.html#e7">Fix::Exp2</a>(fix a)00428     {00429     <span class="keywordflow">if</span>(a&gt;=0x00100000)00430         <span class="keywordflow">return</span> 0xffffffffu; <span class="comment">// result will be too big so result max value</span>00431 00432     <span class="comment">// special cases for small values</span>00433     <span class="keywordflow">if</span>(a&lt;-0x000ead96)00434         {00435         <span class="keywordflow">if</span>(a&lt;-0x00110000)00436             <span class="keywordflow">return</span> 0;00437         <span class="keywordflow">if</span>(a&lt;-0x000f6a3f)00438             <span class="keywordflow">return</span> 1;00439         <span class="keywordflow">return</span> 2;00440         }00441 00442     <span class="comment">// table of values for ((2^n)-1)&lt;&lt;32 for n in range 0x0000.0000 to 0x0000.ff00</span>00443     <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="group__integers.html#ga5">int32</a> Exp2TableFF00[] = 00444         {00445         0x00000000,0x00b1afa5,0x0163da9f,0x02168143,0x02c9a3e7,0x037d42e1,0x04315e86,0x04e5f72f,00446         0x059b0d31,0x0650a0e3,0x0706b29d,0x07bd42b7,0x08745187,0x092bdf66,0x09e3ecac,0x0a9c79b1,00447         0x0b5586cf,0x0c0f145e,0x0cc922b7,0x0d83b233,0x0e3ec32d,0x0efa55fd,0x0fb66aff,0x1073028d,00448         0x11301d01,0x11edbab5,0x12abdc06,0x136a814f,0x1429aaea,0x14e95934,0x15a98c8a,0x166a4547,00449         0x172b83c7,0x17ed4869,0x18af9388,0x19726583,0x1a35beb6,0x1af99f81,0x1bbe0840,0x1c82f952,00450         0x1d487316,0x1e0e75eb,0x1ed5022f,0x1f9c1843,0x2063b886,0x212be357,0x21f49917,0x22bdda27,00451         0x2387a6e7,0x2451ffb8,0x251ce4fb,0x25e85711,0x26b4565e,0x2780e341,0x284dfe1f,0x291ba759,00452         0x29e9df51,0x2ab8a66d,0x2b87fd0d,0x2c57e397,0x2d285a6e,0x2df961f6,0x2ecafa93,0x2f9d24ab,00453         0x306fe0a3,0x31432ede,0x32170fc4,0x32eb83ba,0x33c08b26,0x3496266e,0x356c55f9,0x36431a2d,00454         0x371a7373,0x37f26231,0x38cae6d0,0x39a401b7,0x3a7db34e,0x3b57fbfe,0x3c32dc31,0x3d0e544e,00455         0x3dea64c1,0x3ec70df1,0x3fa4504a,0x40822c36,0x4160a21f,0x423fb270,0x431f5d95,0x43ffa3f8,00456         0x44e08606,0x45c2042a,0x46a41ed1,0x4786d668,0x486a2b5c,0x494e1e19,0x4a32af0d,0x4b17dea6,00457         0x4bfdad53,0x4ce41b81,0x4dcb299f,0x4eb2d81d,0x4f9b2769,0x508417f4,0x516daa2c,0x5257de83,00458         0x5342b569,0x542e2f4f,0x551a4ca5,0x56070dde,0x56f4736b,0x57e27dbe,0x58d12d49,0x59c0827f,00459         0x5ab07dd4,0x5ba11fba,0x5c9268a5,0x5d845909,0x5e76f15a,0x5f6a320d,0x605e1b97,0x6152ae6c,00460         0x6247eb03,0x633dd1d1,0x6434634c,0x652b9feb,0x66238825,0x671c1c70,0x68155d44,0x690f4b19,00461         0x6a09e667,0x6b052fa7,0x6c012750,0x6cfdcddd,0x6dfb23c6,0x6ef92985,0x6ff7df95,0x70f7466f,00462         0x71f75e8e,0x72f8286e,0x73f9a48a,0x74fbd35d,0x75feb564,0x77024b1a,0x780694fd,0x790b938a,00463         0x7a11473e,0x7b17b097,0x7c1ed013,0x7d26a62f,0x7e2f336c,0x7f387849,0x80427543,0x814d2add,00464         0x82589994,0x8364c1eb,0x8471a462,0x857f4179,0x868d99b4,0x879cad93,0x88ac7d98,0x89bd0a47,00465         0x8ace5422,0x8be05bad,0x8cf3216b,0x8e06a5e0,0x8f1ae991,0x902fed02,0x9145b0b9,0x925c353a,00466         0x93737b0c,0x948b82b5,0x95a44cbc,0x96bdd9a7,0x97d829fd,0x98f33e47,0x9a0f170c,0x9b2bb4d5,00467         0x9c49182a,0x9d674194,0x9e86319e,0x9fa5e8d0,0xa0c667b5,0xa1e7aed8,0xa309bec4,0xa42c9804,00468         0xa5503b23,0xa674a8af,0xa799e133,0xa8bfe53c,0xa9e6b557,0xab0e5213,0xac36bbfd,0xad5ff3a3,00469         0xae89f995,0xafb4ce62,0xb0e07298,0xb20ce6c9,0xb33a2b84,0xb468415b,0xb59728de,0xb6c6e29f,00470         0xb7f76f2f,0xb928cf22,0xba5b030a,0xbb8e0b79,0xbcc1e904,0xbdf69c3f,0xbf2c25bd,0xc0628614,00471         0xc199bdd8,0xc2d1cd9f,0xc40ab5ff,0xc544778f,0xc67f12e5,0xc7ba8898,0xc8f6d940,0xca340575,00472         0xcb720dce,0xccb0f2e6,0xcdf0b555,0xcf3155b5,0xd072d4a0,0xd1b532b0,0xd2f87080,0xd43c8eac,00473         0xd5818dcf,0xd6c76e86,0xd80e316c,0xd955d71f,0xda9e603d,0xdbe7cd63,0xdd321f30,0xde7d5641,00474         0xdfc97337,0xe11676b1,0xe264614f,0xe3b333b1,0xe502ee78,0xe6539246,0xe7a51fbc,0xe8f7977c,00475         0xea4afa2a,0xeb9f4867,0xecf482d8,0xee4aaa21,0xefa1bee6,0xf0f9c1cb,0xf252b376,0xf3ac948d,00476         0xf50765b6,0xf6632798,0xf7bfdad9,0xf91d8022,0xfa7c1819,0xfbdba369,0xfd3c22b8,0xfe9d96b200477         };00478 00479     <span class="comment">// table of values for ((2^n)-1)&lt;&lt;40 for n in range 0x0000.0000 to 0x0000.00ff</span>00480     <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="group__integers.html#ga5">int32</a> Exp2Table00FF[] =00481         {00482         0x00000000,0x00b17255,0x0162e525,0x02145871,0x02c5cc37,0x03774079,0x0428b535,0x04da2a6d,00483         0x058ba01f,0x063d164d,0x06ee8cf5,0x07a00419,0x08517bb7,0x0902f3d1,0x09b46c65,0x0a65e575,00484         0x0b175eff,0x0bc8d905,0x0c7a5386,0x0d2bce81,0x0ddd49f8,0x0e8ec5e9,0x0f404256,0x0ff1bf3e,00485         0x10a33ca1,0x1154ba7e,0x120638d7,0x12b7b7ab,0x136936fa,0x141ab6c4,0x14cc3709,0x157db7c9,00486         0x162f3904,0x16e0baba,0x17923ceb,0x1843bf97,0x18f542be,0x19a6c660,0x1a584a7d,0x1b09cf16,00487         0x1bbb5429,0x1c6cd9b7,0x1d1e5fc1,0x1dcfe645,0x1e816d45,0x1f32f4bf,0x1fe47cb5,0x20960526,00488         0x21478e11,0x21f91778,0x22aaa15a,0x235c2bb7,0x240db68f,0x24bf41e2,0x2570cdb0,0x262259f9,00489         0x26d3e6bd,0x278573fd,0x283701b7,0x28e88fed,0x299a1e9d,0x2a4badc9,0x2afd3d6f,0x2baecd91,00490         0x2c605e2e,0x2d11ef46,0x2dc380d9,0x2e7512e7,0x2f26a570,0x2fd83874,0x3089cbf4,0x313b5fee,00491         0x31ecf464,0x329e8954,0x33501ec0,0x3401b4a7,0x34b34b09,0x3564e1e6,0x3616793e,0x36c81111,00492         0x3779a95f,0x382b4228,0x38dcdb6d,0x398e752c,0x3a400f67,0x3af1aa1d,0x3ba3454e,0x3c54e0fa,00493         0x3d067d21,0x3db819c3,0x3e69b6e0,0x3f1b5479,0x3fccf28c,0x407e911b,0x41303025,0x41e1cfaa,00494         0x42936faa,0x43451025,0x43f6b11b,0x44a8528d,0x4559f479,0x460b96e1,0x46bd39c3,0x476edd21,00495         0x482080fa,0x48d2254e,0x4983ca1e,0x4a356f68,0x4ae7152e,0x4b98bb6e,0x4c4a622a,0x4cfc0961,00496         0x4dadb113,0x4e5f5941,0x4f1101e9,0x4fc2ab0d,0x507454ab,0x5125fec5,0x51d7a95a,0x5289546a,00497         0x533afff5,0x53ecabfc,0x549e587d,0x5550057a,0x5601b2f2,0x56b360e5,0x57650f53,0x5816be3d,00498         0x58c86da1,0x597a1d81,0x5a2bcddc,0x5add7eb2,0x5b8f3003,0x5c40e1cf,0x5cf29417,0x5da446da,00499         0x5e55fa17,0x5f07add1,0x5fb96205,0x606b16b4,0x611ccbdf,0x61ce8184,0x628037a5,0x6331ee41,00500         0x63e3a559,0x64955ceb,0x654714f9,0x65f8cd82,0x66aa8686,0x675c4005,0x680df9ff,0x68bfb475,00501         0x69716f66,0x6a232ad2,0x6ad4e6b9,0x6b86a31b,0x6c385ff9,0x6cea1d52,0x6d9bdb26,0x6e4d9975,00502         0x6eff583f,0x6fb11785,0x7062d746,0x71149782,0x71c65839,0x7278196b,0x7329db19,0x73db9d42,00503         0x748d5fe6,0x753f2305,0x75f0e6a0,0x76a2aab5,0x77546f46,0x78063452,0x78b7f9da,0x7969bfdc,00504         0x7a1b865a,0x7acd4d53,0x7b7f14c7,0x7c30dcb7,0x7ce2a522,0x7d946e07,0x7e463769,0x7ef80145,00505         0x7fa9cb9d,0x805b9670,0x810d61be,0x81bf2d87,0x8270f9cc,0x8322c68c,0x83d493c7,0x8486617d,00506         0x85382fae,0x85e9fe5b,0x869bcd83,0x874d9d27,0x87ff6d45,0x88b13ddf,0x89630ef4,0x8a14e084,00507         0x8ac6b290,0x8b788517,0x8c2a5819,0x8cdc2b96,0x8d8dff8f,0x8e3fd403,0x8ef1a8f2,0x8fa37e5c,00508         0x90555442,0x91072aa3,0x91b9017f,0x926ad8d6,0x931cb0a9,0x93ce88f7,0x948061c0,0x95323b05,00509         0x95e414c5,0x9695ef00,0x9747c9b6,0x97f9a4e8,0x98ab8095,0x995d5cbd,0x9a0f3961,0x9ac1167f,00510         0x9b72f41a,0x9c24d22f,0x9cd6b0c0,0x9d888fcc,0x9e3a6f53,0x9eec4f55,0x9f9e2fd3,0xa05010cc,00511         0xa101f241,0xa1b3d430,0xa265b69b,0xa3179982,0xa3c97ce3,0xa47b60c0,0xa52d4519,0xa5df29ec,00512         0xa6910f3b,0xa742f505,0xa7f4db4b,0xa8a6c20b,0xa958a947,0xaa0a90ff,0xaabc7932,0xab6e61e0,00513         0xac204b09,0xacd234ae,0xad841ece,0xae360969,0xaee7f480,0xaf99e011,0xb04bcc1f,0xb0fdb8a700514         };00515 00516     <span class="comment">// Treat 'a' as i+j+k where i is integer part of value, j is bits 15 to 8 of </span>00517     <span class="comment">// the fractional part and k is bits 7 to 0 of the fractional part </span>00518     <span class="comment">// We calculate 2^a as 2^(i+j+k) which is (2^i)*(2^j)*(2^k)</span>00519 00520     <span class="keywordtype">int</span> i = a&gt;&gt;16; <span class="comment">// i = integer part of value</span>00521     <a class="code" href="group__integers.html#ga2">uint32</a> x=Exp2TableFF00[(a&gt;&gt;8)&amp;0xff];    <span class="comment">// x = (2^j-1) &lt;&lt; 32</span>00522     <a class="code" href="group__integers.html#ga2">uint32</a> y=Exp2Table00FF[a&amp;0xff];         <span class="comment">// y = (2^k-1) &lt;&lt; 40</span>00523 00524     <span class="comment">// calculate p = (x*y)&gt;&gt;32 = (2^j-1)(2^k-1)&lt;&lt;40</span>00525     <a class="code" href="group__integers.html#ga2">uint32</a> xl = x&amp;0xffff;00526     <a class="code" href="group__integers.html#ga2">uint32</a> yl = y&amp;0xffff;00527     <a class="code" href="group__integers.html#ga2">uint32</a> xh = x&gt;&gt;16;00528     <a class="code" href="group__integers.html#ga2">uint32</a> yh = y&gt;&gt;16;00529     <a class="code" href="group__integers.html#ga2">uint32</a> pl = (xl*yl+(1&lt;&lt;15))&gt;&gt;16;00530     <a class="code" href="group__integers.html#ga2">uint32</a> pm1 = xh*yl+pl;00531     <a class="code" href="group__integers.html#ga2">uint32</a> pm2 = xl*yh;00532     <a class="code" href="group__integers.html#ga6">uint</a> p = xh*yh;00533     <a class="code" href="group__integers.html#ga2">uint32</a> pm = pm1+pm2;00534     <span class="keywordflow">if</span>(pm&lt;pm2) p += (1&lt;&lt;16); <span class="comment">// check for carry</span>00535     <span class="keywordflow">if</span>(pm&amp;(1&lt;&lt;15)) p += 1; <span class="comment">// round up if required</span>00536     p += pm&gt;&gt;16;00537 00538     <span class="comment">// calculate n = p+x+y = x*y+x+y = (x+1)(y+1)-1 = ((2^j)(2^k)-1)&lt;&lt;32</span>00539     <a class="code" href="group__integers.html#ga6">uint</a> round = ((p&amp;0xff)+(y&amp;0xff)+0x80)&gt;&gt;8;00540     <a class="code" href="group__integers.html#ga6">uint</a> n = x+(y&gt;&gt;8)+round;00541     n += p&gt;&gt;8;00542 00543     <span class="comment">// n = n&gt;&gt;(16-i) = 2^(i-16)*n = ((2^i)*((2^j)*(2^k)-1)&lt;&lt;16</span>00544     n &gt;&gt;= 15-i;00545     n = (n+1)&gt;&gt;1;00546 00547     <span class="comment">// finally add 2^i to get result of 2^a</span>00548     n += 0x80000000&gt;&gt;(15-i);00549 00550     <span class="keywordflow">return</span> n;00551     }00552 00553 <a name="l00554"></a><a class="code" href="classFix.html#e9">00554</a> <a class="code" href="common_8h.html#a2">EXPORT</a> <a class="code" href="group__fix.html#ga0">fix</a> <a class="code" href="classFix.html#e9">Fix::Cos</a>(fixangle angle)00555     {00556     <span class="keywordflow">return</span> <a class="code" href="classFix.html#e8">Fix::Sin</a>(angle+0x4000);00557     }00558 00559 <a name="l00560"></a><a class="code" href="classFix.html#e8">00560</a> <a class="code" href="common_8h.html#a2">EXPORT</a> <a class="code" href="group__fix.html#ga0">fix</a> <a class="code" href="classFix.html#e8">Fix::Sin</a>(fixangle angle)00561     {00562     <span class="comment">// reduce angle to first quadrant</span>00563     <a class="code" href="group__integers.html#ga6">uint</a> n = angle&amp;0x3FFF;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -