math_lib.c
上传用户:csczyc
上传日期:2021-02-19
资源大小:1051k
文件大小:28k
源码类别:

语音压缩

开发平台:

C/C++

  1. #include <stdio.h>
  2. #include <math.h>
  3. #include "spbstd.h"
  4. #include "mathhalf.h"
  5. #include "mathdp31.h"
  6. #include "wmops.h"
  7. #include "math_lib.h"
  8. #include "constant.h"
  9. //extern int complexity;
  10. extern int saturation;
  11. Shortword DEBUG;
  12. /***************************************************************************
  13.  *
  14.  *   FUNCTION NAME: L_divider2
  15.  *
  16.  *   PURPOSE:
  17.  *
  18.  *     Divide numer by denom.  If numer is bigger than denom, a warning
  19.  *     is given and a zero is returned.
  20.  *
  21.  *
  22.  *   INPUTS:
  23.  *
  24.  *     numer
  25.  *                     32 bit long signed integer (Longword).
  26.  *     denom
  27.  *                     32 bit long signed integer (Longword).
  28.  *     numer_shift
  29.  *                     16 bit short signed integer (Shortword) represents
  30.  *                     number of right shifts for numer.
  31.  *     denom_shift
  32.  *                     16 bit short signed integer (Shortword) represents
  33.  *                     number of left shifts for denom.
  34.  *
  35.  *   OUTPUTS:
  36.  *
  37.  *     none
  38.  *
  39.  *   RETURN VALUE:
  40.  *
  41.  *     result
  42.  *                     16 bit short signed integer (Shortword).
  43.  *
  44.  *************************************************************************/
  45. Shortword L_divider2(Longword numer, Longword denom, Shortword numer_shift, 
  46.      Shortword denom_shift)
  47. {
  48.   
  49.   Shortword result;
  50.   Shortword sign=0;
  51.   Shortword short_shift=0;
  52.   Longword L_temp;
  53.   
  54.   Shortword temp1,temp2;
  55.   Longword L_temp1;
  56.   
  57.   DEBUG = 1;
  58.   if (denom==0&& DEBUG )
  59.     printf("L_divider2: division by 0n");
  60.   
  61.   /* increment complexity for if statement */
  62. //  compare_zero();mark del
  63.   if (numer<0) {
  64.     sign = !sign;
  65. //        data_move();mark del
  66.   }
  67.   /* increment complexity for if statement */
  68. //  compare_zero();mark del
  69.   if (denom<0) {
  70.     sign = !sign;  
  71. //      data_move();mark del
  72.   }
  73. /*   L_temp = L_shl(denom, denom_shift); */
  74. /*   denom = L_abs(L_temp);              */
  75. /*  //     L_data_move();mark del        */
  76. /*   L_temp = L_shr(numer, numer_shift); */
  77. /*   numer = L_abs(L_temp);              */
  78. /*  //    L_data_move();mark del         */
  79.   L_temp = _sshvl(denom, denom_shift);
  80.   denom = _abs(L_temp);
  81.  //     L_data_move();mark del
  82.   L_temp = _sshvr(numer, numer_shift);
  83.   numer = _abs(L_temp); 
  84.  //    L_data_move();mark del
  85.   
  86.   while (denom>(Longword)SW_MAX)
  87.     {
  88.       /* increment complexity for while statement */
  89. //      L_compare_nonzero();mark del
  90.       /* denom = L_shr(denom,1);  */
  91.   denom = _sshvr(denom,1); 
  92.  //        L_data_move();mark del
  93.       /* short_shift = add(short_shift,1); */
  94.   L_temp1 = _sadd2((Longword)short_shift,1);
  95.   short_shift = (Shortword) (0x0000ffffL & L_temp1);
  96.  //         data_move();mark del
  97.     }
  98.  /*  numer = L_shr(numer, short_shift);  */
  99.      numer = _sshvr(numer, short_shift); 
  100.   //   L_data_move();mark del
  101.   if (numer > denom && DEBUG)
  102.       printf("warning: L_divide2>1: numer %.1f times denomn",
  103.      (float)numer / (float)denom);
  104.   
  105.  /*  result = divide_s(extract_l(numer),extract_l(denom)); */
  106.     temp1 = (Shortword) (0x0000ffffL & numer);
  107. temp2 = (Shortword) (0x0000ffffL & denom);
  108. result = divide_s(temp1,temp2);
  109.   
  110.   /* increment complexity for if statement */
  111. //  compare_zero();mark del
  112.   if (sign) {
  113.     result = negate(result); 
  114. //       data_move();mark del
  115.   }
  116.   return(result);
  117. } /* L_divider2 */
  118. /***************************************************************************
  119.  *
  120.  *   FUNCTION NAME: log10_fxp
  121.  *
  122.  *   PURPOSE:
  123.  *
  124.  *     Compute the logarithm to the base 10 of x.
  125.  *
  126.  *
  127.  *   INPUTS:
  128.  *
  129.  *     x
  130.  *                     16 bit short signed integer (Shortword).
  131.  *     Q
  132.  *                     16 bit short signed integer (Shortword) represents
  133.  *                     Q value of x.
  134.  *
  135.  *   OUTPUTS:
  136.  *
  137.  *     none
  138.  *
  139.  *   RETURN VALUE:
  140.  *
  141.  *     y
  142.  *                     16 bit short signed integer (Shortword) in Q12.
  143.  *
  144.  *************************************************************************/
  145. Shortword log10_fxp(Shortword x, Shortword Q)
  146. {
  147.   /* table is Q13 */
  148.   static Shortword table[256]=
  149.   {
  150.     0, 2466, 3908, 4932, 5725, 6374, 6923, 7398, 7817, 8192, 
  151.     8531, 8840, 9125, 9389, 9634, 9864, 10079, 10283, 10475, 10658, 
  152.     10831, 10997, 11155, 11306, 11451, 11591, 11725, 11855, 11979, 12100, 
  153.     12217, 12330, 12439, 12545, 12649, 12749, 12846, 12941, 13034, 13124, 
  154.     13211, 13297, 13381, 13463, 13543, 13621, 13697, 13772, 13846, 13917, 
  155.     13988, 14057, 14125, 14191, 14257, 14321, 14384, 14446, 14506, 14566, 
  156.     14625, 14683, 14740, 14796, 14851, 14905, 14959, 15011, 15063, 15115, 
  157.     15165, 15215, 15264, 15312, 15360, 15407, 15454, 15500, 15545, 15590, 
  158.     15634, 15677, 15721, 15763, 15805, 15847, 15888, 15929, 15969, 16009, 
  159.     16048, 16087, 16125, 16163, 16201, 16238, 16275, 16312, 16348, 16384, 
  160.     16419, 16454, 16489, 16523, 16557, 16591, 16624, 16657, 16690, 16723, 
  161.     16755, 16787, 16818, 16850, 16881, 16912, 16942, 16972, 17002, 17032, 
  162.     17062, 17091, 17120, 17149, 17177, 17206, 17234, 17262, 17289, 17317, 
  163.     17344, 17371, 17398, 17425, 17451, 17477, 17504, 17529, 17555, 17581, 
  164.     17606, 17631, 17656, 17681, 17705, 17730, 17754, 17778, 17802, 17826, 
  165.     17850, 17873, 17896, 17920, 17943, 17966, 17988, 18011, 18033, 18056, 
  166.     18078, 18100, 18122, 18144, 18165, 18187, 18208, 18229, 18250, 18271, 
  167.     18292, 18313, 18334, 18354, 18374, 18395, 18415, 18435, 18455, 18475, 
  168.     18494, 18514, 18533, 18553, 18572, 18591, 18610, 18629, 18648, 18667, 
  169.     18686, 18704, 18723, 18741, 18759, 18778, 18796, 18814, 18832, 18850, 
  170.     18867, 18885, 18903, 18920, 18937, 18955, 18972, 18989, 19006, 19023, 
  171.     19040, 19057, 19074, 19090, 19107, 19123, 19140, 19156, 19172, 19189, 
  172.     19205, 19221, 19237, 19253, 19269, 19284, 19300, 19316, 19331, 19347, 
  173.     19362, 19378, 19393, 19408, 19423, 19438, 19453, 19468, 19483, 19498, 
  174.     19513, 19528, 19542, 19557, 19572, 19586, 19600, 19615, 19629, 19643, 
  175.     19658, 19672, 19686, 19700, 19714, 19728 };
  176.   
  177.     Shortword y, interp_factor, interp_component;
  178.     Shortword index1, index2;
  179.     Shortword shift;
  180.     Shortword temp1;
  181.     Longword L_temp;
  182. Longword L_temp1,L_temp2,L_y;
  183.     
  184.     shift = sub(7,Q);
  185.     //        data_move();mark del
  186.     /* increment complexity for if statement */
  187.  //   compare_zero();mark del
  188.     if (!x)
  189.       {
  190. return(-SW_MAX);
  191.       }
  192.     while( !(index2=shr(x,7)) && x)
  193.       {
  194. /* increment complexity for while statement */
  195. // data_move();    compare_zero();mark del
  196. /* x=shl(x,1);  */
  197. x = (Shortword)(_sshl((Longword)x,1));
  198. //    data_move();mark del
  199. shift = sub(shift,1);  
  200. //   data_move();mark del
  201.       }
  202.     index1 = sub(index2,1);  
  203.  //       data_move();mark del
  204.     
  205.     /* interpolation */
  206.     interp_factor = shl_a((Shortword)(x&127),8);  
  207.     // logic();mark del
  208.     temp1 = sub(table[index2],table[index1]);
  209.    /*  interp_component = mult(temp1,interp_factor);  */
  210.      L_temp1 = _smpy(temp1,interp_factor);                            
  211.      interp_component = (Shortword) (0x0000ffffL & (L_temp1 >> 16));     
  212.     // data_move();mark del
  213.     /* return a Q12 */
  214.    /*  L_temp = L_mult(table[1],shift);      */
  215. /*     L_temp = L_shr(L_temp,2);             */
  216. /*     temp1 = shr(table[index1],1);         */
  217. /*     temp1 = add(temp1,extract_l(L_temp)); */
  218. /*     temp2 = shr(interp_component,1);      */
  219. /*     y = add(temp1,temp2);                 */ 
  220.        L_temp = _smpy(table[1],shift);
  221.        L_temp = _sshvr(L_temp,2);
  222.        L_temp1 = (Longword)(table[index1]);
  223.        L_temp1 =  _shr2(L_temp1,1);  
  224.    L_temp1 = _sadd2(L_temp1,L_temp);
  225.    L_temp2 = (Longword)interp_component;
  226.    L_temp2 = _shr2(L_temp2,1);
  227.    L_y = _sadd2(L_temp1,L_temp2);
  228.    y = (Shortword) (0x0000ffffL & L_y);
  229.     // data_move();mark del
  230.     return(y);
  231. } /* log10_fxp */
  232. /***************************************************************************
  233.  *
  234.  *   FUNCTION NAME: L_log10_fxp
  235.  *
  236.  *   PURPOSE:
  237.  *
  238.  *     Compute the logarithm to the base 10 of x.
  239.  *
  240.  *
  241.  *   INPUTS:
  242.  *
  243.  *     x
  244.  *                     32 bit long signed integer (Longword).
  245.  *     Q
  246.  *                     16 bit short signed integer (Shortword) represents
  247.  *                     Q value of x.
  248.  *
  249.  *   OUTPUTS:
  250.  *
  251.  *     none
  252.  *
  253.  *   RETURN VALUE:
  254.  *
  255.  *     y
  256.  *                     16 bit short signed integer (Shortword) in Q11.
  257.  *
  258.  *************************************************************************/
  259. Shortword L_log10_fxp(Longword x, Shortword Q)
  260. {
  261.   /* table is Q13 */
  262.   static Shortword table[256]=
  263.   {
  264.     0, 2466, 3908, 4932, 5725, 6374, 6923, 7398, 7817, 8192, 
  265.     8531, 8840, 9125, 9389, 9634, 9864, 10079, 10283, 10475, 10658, 
  266.     10831, 10997, 11155, 11306, 11451, 11591, 11725, 11855, 11979, 12100, 
  267.     12217, 12330, 12439, 12545, 12649, 12749, 12846, 12941, 13034, 13124, 
  268.     13211, 13297, 13381, 13463, 13543, 13621, 13697, 13772, 13846, 13917, 
  269.     13988, 14057, 14125, 14191, 14257, 14321, 14384, 14446, 14506, 14566, 
  270.     14625, 14683, 14740, 14796, 14851, 14905, 14959, 15011, 15063, 15115, 
  271.     15165, 15215, 15264, 15312, 15360, 15407, 15454, 15500, 15545, 15590, 
  272.     15634, 15677, 15721, 15763, 15805, 15847, 15888, 15929, 15969, 16009, 
  273.     16048, 16087, 16125, 16163, 16201, 16238, 16275, 16312, 16348, 16384, 
  274.     16419, 16454, 16489, 16523, 16557, 16591, 16624, 16657, 16690, 16723, 
  275.     16755, 16787, 16818, 16850, 16881, 16912, 16942, 16972, 17002, 17032, 
  276.     17062, 17091, 17120, 17149, 17177, 17206, 17234, 17262, 17289, 17317, 
  277.     17344, 17371, 17398, 17425, 17451, 17477, 17504, 17529, 17555, 17581, 
  278.     17606, 17631, 17656, 17681, 17705, 17730, 17754, 17778, 17802, 17826, 
  279.     17850, 17873, 17896, 17920, 17943, 17966, 17988, 18011, 18033, 18056, 
  280.     18078, 18100, 18122, 18144, 18165, 18187, 18208, 18229, 18250, 18271, 
  281.     18292, 18313, 18334, 18354, 18374, 18395, 18415, 18435, 18455, 18475, 
  282.     18494, 18514, 18533, 18553, 18572, 18591, 18610, 18629, 18648, 18667, 
  283.     18686, 18704, 18723, 18741, 18759, 18778, 18796, 18814, 18832, 18850, 
  284.     18867, 18885, 18903, 18920, 18937, 18955, 18972, 18989, 19006, 19023, 
  285.     19040, 19057, 19074, 19090, 19107, 19123, 19140, 19156, 19172, 19189, 
  286.     19205, 19221, 19237, 19253, 19269, 19284, 19300, 19316, 19331, 19347, 
  287.     19362, 19378, 19393, 19408, 19423, 19438, 19453, 19468, 19483, 19498, 
  288.     19513, 19528, 19542, 19557, 19572, 19586, 19600, 19615, 19629, 19643, 
  289.     19658, 19672, 19686, 19700, 19714, 19728 };
  290.   
  291.     Shortword y, interp_component;
  292.     Longword interp_factor;    
  293.     Shortword index1, index2;
  294.     Shortword shift;
  295.     Shortword temp1;
  296.     Longword L_temp;
  297. Longword L_temp1,L_y;
  298.     
  299.     
  300.     shift = sub(23,Q);
  301.     //        data_move();mark del
  302.     /* increment complexity for if statement */
  303.     //compare_zero();mark del
  304.     if (!x)
  305.       {
  306. return((Shortword)-SW_MAX);
  307.       }
  308.     
  309.     while( !(index2=extract_l(_sshvr(x,23))) && x)
  310.       {
  311. /* increment complexity for while statement */
  312. // compare_zero();    data_move();mark del
  313. /* x=L_shl(x,1); */
  314. x = _sshl(x,1);
  315. shift = sub(shift,1);//    data_move();mark del
  316.       }
  317.     index1 = sub(index2,1);//    data_move();mark del
  318.     
  319.     
  320.     /* interpolation */
  321.     /* interp_factor = L_shl(x&(Longword)0x7fffff, 8);//    L_logic();mark del */
  322. /*     temp1 = sub(table[index2],table[index1]);                               */
  323. /*     interp_component = extract_h(L_mpy_ls(interp_factor,temp1));            */
  324.     interp_factor = _sshl(x&(Longword)0x7fffff, 8);//    L_logic();mark del
  325.     temp1 = sub(table[index2],table[index1]);
  326. L_temp1 = L_mpy_ls(interp_factor,temp1);
  327.     interp_component = (Shortword) (0x0000ffffL & (L_temp1 >> 16));
  328.     /* return a Q11 */
  329.    /*  L_temp = L_mult(table[1],shift);        log10(2^shift) */ 
  330. /*     L_temp = L_shr(L_temp,3);                                   */
  331. /*     temp1 = shr(table[index1],2);                               */
  332. /*     temp1 = add(temp1,extract_l(L_temp));                       */
  333. /*     temp2 = shr(interp_component,2);                            */
  334. /*     y = add(temp1,temp2); //  data_move();mark del              */
  335.     L_temp = _smpy(table[1],shift);       /* log10(2^shift) */
  336.     L_temp = _sshvr(L_temp,3);
  337. L_temp1 = _shr2((Longword)(table[index1]),2);
  338.     L_temp1 = _sadd2(L_temp1,L_temp);
  339.     L_temp = _shr2((Longword)interp_component,2);
  340.     L_y = _sadd2(L_temp1,L_temp); //  data_move();mark del
  341. y = (Shortword) (0x0000ffffL & L_y);
  342.     
  343.       
  344.     return(y);
  345. } /* L_log10_fxp */
  346. /***************************************************************************
  347.  *
  348.  *   FUNCTION NAME: pow10_fxp
  349.  *
  350.  *   PURPOSE:
  351.  *
  352.  *     Compute 10 raised to the power x.
  353.  *
  354.  *
  355.  *   INPUTS:
  356.  *
  357.  *     x
  358.  *                     16 bit short signed integer (Shortword) in Q12.
  359.  *     Q
  360.  *                     16 bit short signed integer (Shortword) represents
  361.  *                     required Q value of returned result.
  362.  *
  363.  *   OUTPUTS:
  364.  *
  365.  *     none
  366.  *
  367.  *   RETURN VALUE:
  368.  *
  369.  *     y
  370.  *                     16 bit short signed integer (Shortword).
  371.  *
  372.  *************************************************************************/
  373. Shortword pow10_fxp(Shortword x, Shortword Q)
  374. {
  375.   /* table in Q11 */
  376.   Shortword table[257]=
  377.   {
  378.     2048, 2066, 2085, 2104, 2123, 2142, 2161, 2181, 2200, 2220, 
  379.     2240, 2260, 2281, 2302, 2322, 2343, 2364, 2386, 2407, 2429, 
  380.     2451, 2473, 2496, 2518, 2541, 2564, 2587, 2610, 2634, 2658, 
  381.     2682, 2706, 2731, 2755, 2780, 2805, 2831, 2856, 2882, 2908, 
  382.     2934, 2961, 2988, 3015, 3042, 3069, 3097, 3125, 3153, 3182, 
  383.     3211, 3240, 3269, 3298, 3328, 3358, 3389, 3419, 3450, 3481, 
  384.     3513, 3544, 3576, 3609, 3641, 3674, 3708, 3741, 3775, 3809, 
  385.     3843, 3878, 3913, 3948, 3984, 4020, 4056, 4093, 4130, 4167, 
  386.     4205, 4243, 4281, 4320, 4359, 4399, 4438, 4478, 4519, 4560, 
  387.     4601, 4643, 4684, 4727, 4769, 4813, 4856, 4900, 4944, 4989, 
  388.     5034, 5079, 5125, 5172, 5218, 5266, 5313, 5361, 5410, 5458, 
  389.     5508, 5558, 5608, 5658, 5710, 5761, 5813, 5866, 5919, 5972, 
  390.     6026, 6081, 6136, 6191, 6247, 6303, 6360, 6418, 6476, 6534, 
  391.     6593, 6653, 6713, 6774, 6835, 6897, 6959, 7022, 7085, 7149, 
  392.     7214, 7279, 7345, 7411, 7478, 7546, 7614, 7683, 7752, 7822, 
  393.     7893, 7964, 8036, 8109, 8182, 8256, 8331, 8406, 8482, 8559, 
  394.     8636, 8714, 8793, 8872, 8952, 9033, 9115, 9197, 9280, 9364, 
  395.     9449, 9534, 9620, 9707, 9795, 9883, 9973, 10063, 10154, 10245, 
  396.     10338, 10431, 10526, 10621, 10717, 10813, 10911, 11010, 11109, 11210, 
  397.     11311, 11413, 11516, 11620, 11725, 11831, 11938, 12046, 12155, 12265, 
  398.     12375, 12487, 12600, 12714, 12829, 12945, 13062, 13180, 13299, 13419, 
  399.     13540, 13663, 13786, 13911, 14036, 14163, 14291, 14420, 14550, 14682, 
  400.     14815, 14948, 15084, 15220, 15357, 15496, 15636, 15777, 15920, 16064, 
  401.     16209, 16355, 16503, 16652, 16803, 16955, 17108, 17262, 17418, 17576, 
  402.     17734, 17895, 18056, 18220, 18384, 18550, 18718, 18887, 19058, 19230, 
  403.     19404, 19579, 19756, 19934, 20114, 20296, 20480 };
  404.   
  405.   static Shortword tens_table[9]=
  406.   {
  407.     26844, 16777, 20972, 26214, 1, 10, 100, 1000, 10000
  408.   };
  409.   
  410.   static Shortword Q_table[4]=
  411.   {
  412.     28, 24, 21, 18
  413.   };
  414.   
  415.   
  416.   Shortword y, interp_factor, interp_component;
  417.   Shortword index1, index2;
  418.   Shortword ten_multiple;
  419.   Longword L_y;
  420.   Shortword temp1, temp2;
  421.   
  422.   Shortword temp;
  423.   Longword L_temp;
  424.   
  425.  /*  ten_multiple = shr(x,12);  // data_move();mark del */
  426.   L_temp = _shr2((Longword)x,12);
  427.   ten_multiple = (Shortword) (0x0000ffffL & L_temp);
  428.   if (ten_multiple < -4)
  429.     return((Shortword)0);
  430.   else if (ten_multiple > 4) {
  431.     saturation = saturation + 1;
  432.     return((Shortword)SW_MAX);
  433.   }
  434.   
  435.   /* index1 = shr((Shortword)(x&(Shortword)0x0ff0), 4);   // logic();  data_move();mark del */
  436. /*   index2 = add(index1,1); //   data_move();mark del                                      */
  437.   L_temp = _shr2((Longword)(x&(Shortword)0x0ff0),4);
  438.   index1 = (Shortword) (0x0000ffffL & L_temp);   // logic();  data_move();mark del
  439.   L_temp = _sadd2(L_temp,(Longword)1);
  440.   index2 = (Shortword) (0x0000ffffL & L_temp);; //   data_move();mark del
  441.   
  442.     
  443.   /* interpolation */
  444.   /* shift by 11 to make it a number between 0 & 1 in Q15 */
  445.   interp_factor = shl_a((Shortword)(x&(Shortword)0x000f),11); //   logic();   data_move();mark del
  446.   temp1 = sub(table[index2],table[index1]);
  447.   /* interp_component = mult(temp1,interp_factor);  //  data_move();mark del */
  448.   L_temp = _smpy(temp1,interp_factor);  //  data_move();mark del
  449.   interp_component = (Shortword) (0x0000ffffL & (L_temp >> 16));
  450.   
  451.   /* L_y in Q12 if x >= 0 and in Q_table[temp2]+12 if x < 0 */
  452.  /*  temp1 = add(table[index1], interp_component);                       */
  453. /*   temp2 = add(ten_multiple,4);                                        */
  454. /*   L_y = L_mult(tens_table[temp2],temp1);  //   L_data_move();mark del */
  455.   L_temp = _sadd2((Longword)(table[index1]),(Longword)interp_component);
  456.   temp1 = (Shortword) (0x0000ffffL & L_temp);
  457.   L_temp = _sadd2((Longword)ten_multiple,(Longword)4);
  458.   temp2 = (Shortword) (0x0000ffffL & L_temp);
  459.   L_y = _smpy(tens_table[temp2],temp1);  //   L_data_move();mark del
  460.   /* increment complexity for if statement */
  461. //  compare_zero();mark del
  462.   if (ten_multiple >= 0)
  463.     {
  464.       /* temp1 = sub(12,Q);       */
  465. /*       L_y = L_shr(L_y, temp1); */
  466. /*       y = extract_l(L_y);      */
  467.       temp1 = sub(12,Q);
  468.       L_y = _sshvr(L_y, temp1);
  469.       y = (Shortword) (0x0000ffffL & L_y);
  470.       
  471.   temp = (Shortword) (0x0000ffffL & (L_y >> 16));
  472.       if (temp) {
  473. y=SW_MAX; //   data_move();mark del
  474. saturation = saturation + 1;
  475.       }
  476.     }
  477.   else
  478.     {
  479.      /*  temp1 = add(Q_table[temp2],12); */
  480.   L_temp = _sadd2((Longword)(Q_table[temp2]),(Longword)12);
  481.   temp1 = (Shortword) (0x0000ffffL & L_temp);
  482.       temp1 = sub(temp1,Q);
  483.      /*  y = extract_l(L_shr(L_y, temp1)); */
  484.   L_temp = _sshvr(L_y, temp1);
  485.   y = (Shortword) (0x0000ffffL & L_temp);
  486.     }
  487.   
  488.   return(y);
  489. } /* pow10_fxp */
  490. /***************************************************************************
  491.  *
  492.  *   FUNCTION NAME: sqrt_fxp
  493.  *
  494.  *   PURPOSE:
  495.  *
  496.  *     Compute the square root of x.
  497.  *
  498.  *
  499.  *   INPUTS:
  500.  *
  501.  *     x
  502.  *                     16 bit short signed integer (Shortword).
  503.  *     Q
  504.  *                     16 bit short signed integer (Shortword) represents
  505.  *                     Q value of x.
  506.  *
  507.  *   OUTPUTS:
  508.  *
  509.  *     none
  510.  *
  511.  *   RETURN VALUE:
  512.  *
  513.  *     temp
  514.  *                     16 bit short signed integer (Shortword) in same Q.
  515.  *
  516.  *************************************************************************/
  517. Shortword sqrt_fxp(Shortword x, Shortword Q)
  518. {
  519.   Shortword temp;
  520.   
  521.   Longword L_temp;
  522.   /* increment complexity for if statement */
  523.  // compare_zero();mark del  @@@@@
  524.   if (!x)
  525.     return((Shortword)0);
  526.   /* temp = shr(log10_fxp(x,Q),1); */
  527.   temp = log10_fxp(x,Q);
  528.   L_temp = _shr2((Longword)temp,1);
  529.   temp = (Shortword) (0x0000ffffL & L_temp);
  530.   temp = pow10_fxp(temp,Q);
  531.   return (temp);
  532. }
  533. /***************************************************************************
  534.  *
  535.  *   FUNCTION NAME: L_sqrt_fxp
  536.  *
  537.  *   PURPOSE:
  538.  *
  539.  *     Compute the square root of x.
  540.  *
  541.  *
  542.  *   INPUTS:
  543.  *
  544.  *     x
  545.  *                     32 bit long signed integer (Longword).
  546.  *     Q
  547.  *                     16 bit short signed integer (Shortword) represents
  548.  *                     Q value of x.
  549.  *
  550.  *   OUTPUTS:
  551.  *
  552.  *     none
  553.  *
  554.  *   RETURN VALUE:
  555.  *
  556.  *     temp
  557.  *                     16 bit short signed integer (Shortword) in same Q.
  558.  *
  559.  *************************************************************************/
  560. Shortword L_sqrt_fxp(Longword x, Shortword Q)
  561. {
  562.   Shortword temp;
  563.   /* increment complexity for if statement */
  564. //  compare_zero();@@@@@
  565.   if (!x)
  566.     return((Shortword)0);
  567.   temp = L_log10_fxp(x,Q);
  568.   /* temp in Q11, pow10 treat it as Q12, => no need to shr by 1. */
  569.   temp = pow10_fxp(temp,Q);
  570.   return (temp);
  571. }
  572. /***************************************************************************
  573.  *
  574.  *   FUNCTION NAME: L_pow_fxp
  575.  *
  576.  *   PURPOSE:
  577.  *
  578.  *     Compute the value of x raised to the power 'power'.
  579.  *
  580.  *
  581.  *   INPUTS:
  582.  *
  583.  *     x
  584.  *                     32 bit long signed integer (Longword).
  585.  *     power
  586.  *                     16 bit short signed integer (Shortword) in Q15.
  587.  *     Q_in
  588.  *                     16 bit short signed integer (Shortword) represents
  589.  *                     Q value of x.
  590.  *     Q_out
  591.  *                     16 bit short signed integer (Shortword) represents
  592.  *                     required Q value of returned result.
  593.  *
  594.  *   OUTPUTS:
  595.  *
  596.  *     none
  597.  *
  598.  *   RETURN VALUE:
  599.  *
  600.  *     temp
  601.  *                     16 bit short signed integer (Shortword).
  602.  *
  603.  *************************************************************************/
  604. Shortword L_pow_fxp(Longword x,Shortword power,Shortword Q_in,Shortword Q_out)
  605. {
  606.   Shortword temp;
  607.   Longword L_temp;
  608.   /* increment complexity for if statement */
  609. //  compare_zero();@@@@@
  610.   if (!x)
  611.     return((Shortword)0);
  612.   temp = L_log10_fxp(x,Q_in);   /* temp in Q11 */
  613. /*   temp = mult(power,shl(temp,1)); //  data_move();  mark del  temp in Q12 */ 
  614.   L_temp = _smpy(power,shl_a(temp,1)); 
  615.   temp = (Shortword) (0x0000ffffL & (L_temp >> 16));
  616.   temp = pow10_fxp(temp,Q_out);
  617.   return (temp);
  618. }
  619. /***************************************************************************
  620.  *
  621.  *   FUNCTION NAME: sin_fxp
  622.  *
  623.  *   PURPOSE:
  624.  *
  625.  *     Compute the sine of x whose value is expressed in radians/PI.
  626.  *
  627.  *
  628.  *   INPUTS:
  629.  *
  630.  *     x
  631.  *                     16 bit short signed integer (Shortword) in Q15.
  632.  *
  633.  *   OUTPUTS:
  634.  *
  635.  *     none
  636.  *
  637.  *   RETURN VALUE:
  638.  *
  639.  *     ty
  640.  *                     16 bit short signed integer (Shortword) in Q15.
  641.  *
  642.  *************************************************************************/
  643. #define PI_Q13     24576    /* M_PI*(1<<13) */
  644. Shortword sin_fxp(Shortword x)
  645. {
  646.     static Shortword table[129] =
  647.     { 
  648.             0,   402,   804,  1206,  1608,  2009,  2411,  2811,  3212,
  649.  3612,  4011,  4410,  4808,  5205,  5602,  5998,  6393,  6787,
  650.  7180,  7571,  7962,  8351,  8740,  9127,  9512,  9896, 10279,
  651. 10660, 11039, 11417, 11793, 12167, 12540, 12910, 13279, 13646,
  652. 14010, 14373, 14733, 15091, 15447, 15800, 16151, 16500, 16846,
  653. 17190, 17531, 17869, 18205, 18538, 18868, 19195, 19520, 19841,
  654. 20160, 20475, 20788, 21097, 21403, 21706, 22006, 22302, 22595,
  655. 22884, 23170, 23453, 23732, 24008, 24279, 24548, 24812, 25073,
  656. 25330, 25583, 25833, 26078, 26320, 26557, 26791, 27020, 27246,
  657. 27467, 27684, 27897, 28106, 28311, 28511, 28707, 28899, 29086,
  658. 29269, 29448, 29622, 29792, 29957, 30118, 30274, 30425, 30572,
  659. 30715, 30853, 30986, 31114, 31238, 31357, 31471, 31581, 31686,
  660. 31786, 31881, 31972, 32058, 32138, 32214, 32286, 32352, 32413,
  661. 32470, 32522, 32568, 32610, 32647, 32679, 32706, 32729, 32746,
  662. 32758, 32766, 32767
  663.     };
  664.     
  665.     Shortword tx, ty;
  666.     Shortword sign;
  667.     Shortword index1,index2;
  668.     Shortword m;
  669.     Shortword temp;
  670. Longword L_temp,L_ty;
  671.     sign = 0;
  672.     if (x < 0) {
  673.         tx = negate(x); //    data_move();mark del
  674. sign = -1;  //   data_move();mark del
  675.     }
  676.     else {
  677.       tx = x;   //  data_move();mark del
  678.     }
  679.     /* if angle > pi/2, sin(angle) = sin(pi-angle) */
  680.     if (tx > X05_Q15)
  681.     {
  682.         tx = sub(ONE_Q15,tx); //    data_move();mark del
  683.     }
  684.     /* convert input to be within range 0-128 */
  685.     /* index1 = shr(tx,7);   //  data_move();mark del     */
  686. /*     index2 = add(index1,1);   //  data_move();mark del */
  687.       L_temp = _shr2((Longword)tx,7);
  688.   index1 = (Shortword) (0x0000ffffL & L_temp);
  689.   L_temp = _sadd2(L_temp,(Longword)1);
  690.   index2 = (Shortword) (0x0000ffffL & L_temp);
  691.     
  692.     /* increment complexity for if statement */
  693. //    compare_nonzero();mark del
  694.     if (index1 == 128) {
  695.       if (sign != 0)
  696.         return(negate(table[index1]));
  697.       else
  698. return(table[index1]);
  699.     }
  700.     
  701.     m = sub(tx,shl_a(index1,7));
  702.     /* convert decimal part to Q15 */
  703.     m = shl_a(m,8); //    data_move();mark del
  704.     /* interpolate */
  705.     temp = sub(table[index2],table[index1]);
  706.  /*    temp = mult(m,temp);                                     */
  707. /*     ty = add(table[index1],temp);  //   data_move();mark del */
  708.     L_temp = _smpy(m,temp);
  709. temp = (Shortword) (0x0000ffffL & (L_temp >> 16));
  710. L_ty = _sadd2((Longword)(table[index1]),(Longword)temp);
  711. ty = (Shortword) (0x0000ffffL & L_ty);
  712.     /* increment complexity for if statement */
  713. //    compare_zero();mark del
  714.     if (sign != 0)
  715.         return(negate(ty));
  716.     else
  717.         return(ty);
  718. } /* sin_fxp */
  719. /***************************************************************************
  720.  *
  721.  *   FUNCTION NAME: cos_fxp
  722.  *
  723.  *   PURPOSE:
  724.  *
  725.  *     Compute the cosine of x whose value is expressed in radians/PI.
  726.  *
  727.  *
  728.  *   INPUTS:
  729.  *
  730.  *     x
  731.  *                     16 bit short signed integer (Shortword) in Q15.
  732.  *
  733.  *   OUTPUTS:
  734.  *
  735.  *     none
  736.  *
  737.  *   RETURN VALUE:
  738.  *
  739.  *     ty
  740.  *                     16 bit short signed integer (Shortword) in Q15.
  741.  *
  742.  *************************************************************************/
  743. Shortword cos_fxp(Shortword x)
  744. {
  745.     static Shortword table[129] =
  746.     { 
  747.         32767, 32766, 32758, 32746, 32729, 32706, 32679, 32647, 32610,
  748.         32568, 32522, 32470, 32413, 32352, 32286, 32214, 32138, 32058,
  749.         31972, 31881, 31786, 31686, 31581, 31471, 31357, 31238, 31114,
  750.         30986, 30853, 30715, 30572, 30425, 30274, 30118, 29957, 29792,
  751.         29622, 29448, 29269, 29086, 28899, 28707, 28511, 28311, 28106,
  752.         27897, 27684, 27467, 27246, 27020, 26791, 26557, 26320, 26078,
  753.         25833, 25583, 25330, 25073, 24812, 24548, 24279, 24008, 23732,
  754.         23453, 23170, 22884, 22595, 22302, 22006, 21706, 21403, 21097,
  755.         20788, 20475, 20160, 19841, 19520, 19195, 18868, 18538, 18205,
  756.         17869, 17531, 17190, 16846, 16500, 16151, 15800, 15447, 15091,
  757.         14733, 14373, 14010, 13646, 13279, 12910, 12540, 12167, 11793,
  758.         11417, 11039, 10660, 10279,  9896,  9512,  9127,  8740,  8351,
  759.         7962,   7571,  7180,  6787,  6393,  5998,  5602,  5205,  4808,
  760.         4410,   4011,  3612,  3212,  2811,  2411,  2009,  1608,  1206,
  761.         804,     402,     0
  762.     };
  763.     
  764.     Shortword tx, ty;
  765.     Shortword sign;
  766.     Shortword index1,index2;
  767.     Shortword m;
  768.     Shortword temp;
  769. Longword L_temp,L_ty;
  770.     sign = 0;
  771.     /* increment complexity for if statement */
  772.   //  compare_zero();mark del
  773.     if (x < 0) {
  774.       tx = negate(x);   //  data_move();mark del
  775.     }
  776.     else {
  777.         tx = x;  //   data_move();mark del
  778.     }
  779.     /* if angle > pi/2, cos(angle) = -cos(pi-angle) */
  780.     /* increment complexity for if statement */
  781. //    compare_nonzero();mark del
  782.     if (tx > X05_Q15)
  783.     {
  784.         tx = sub(ONE_Q15,tx);  //   data_move();mark del
  785.         sign = -1;    // data_move();mark del
  786.     }
  787.     /* convert input to be within range 0-128 */
  788.     /* index1 = shr(tx,7);    // data_move();mark del     */
  789. /*     index2 = add(index1,1);  //   data_move();mark del */
  790.       L_temp = _shr2((Longword)tx,7);
  791.   index1 = (Shortword) (0x0000ffffL & L_temp);
  792.   L_temp = _sadd2(L_temp,(Longword)1);
  793.   index2 = (Shortword) (0x0000ffffL & L_temp);
  794.     
  795.     /* increment complexity for if statement */
  796. //    compare_nonzero();mark del
  797.     if (index1 == 128)
  798.         return((Shortword)0);
  799.     
  800.     m = sub(tx,shl_a(index1,7));
  801.     /* convert decimal part to Q15 */
  802.     m = shl_a(m,8);   //  data_move();mark del
  803.     temp = sub(table[index2],table[index1]);
  804.   /*   temp = mult(m,temp);                                     */
  805. /*     ty = add(table[index1],temp);  //   data_move();mark del */
  806.     L_temp = _smpy(m,temp);
  807.   temp = (Shortword) (0x0000ffffL & (L_temp >> 16));  
  808. L_ty = _sadd2((Longword)(table[index1]),(Longword)temp);
  809.     ty = (Shortword) (0x0000ffffL & L_ty);
  810.     /* increment complexity for if statement */
  811. //    compare_zero();mark del
  812.     if (sign != 0)
  813.         return(negate(ty));
  814.     else
  815.         return(ty);
  816. } /* cos_fxp */