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

语音压缩

开发平台:

C/C++

  1. /***************************************************************************
  2.  *
  3.  *   File Name:  mathdp31.c
  4.  *
  5.  *   Purpose:  Contains functions increased-precision arithmetic operations.
  6.  *
  7.  *      Below is a listing of all the functions in this file.  There
  8.  *      is no interdependence among the functions.
  9.  *
  10.  *      L_mpy_ls()
  11.  *      L_mpy_ll()
  12.  *      isLwLimit()
  13.  *      isSwLimit()
  14.  *
  15.  ***************************************************************************/
  16. /*_________________________________________________________________________
  17.  |                                                                         |
  18.  |                              Include Files                              |
  19.  |_________________________________________________________________________|
  20. */
  21. #include "mathhalf.h"
  22. #include "typedefs.h"
  23. /****************************************************************************
  24.  *
  25.  *     FUNCTION NAME: isLwLimit
  26.  *
  27.  *     PURPOSE:
  28.  *
  29.  *        Check to see if the input Longword is at the
  30.  *        upper or lower limit of its range.  i.e.
  31.  *        0x7fff ffff or -0x8000 0000
  32.  *
  33.  *        Ostensibly this is a check for an overflow.
  34.  *        This does not truly mean an overflow occurred,
  35.  *        it means the value reached is the
  36.  *        maximum/minimum value representable.  It may
  37.  *        have come about due to an overflow.
  38.  *
  39.  *     INPUTS:
  40.  *
  41.  *       L_In               A Longword input variable
  42.  *
  43.  *
  44.  *     OUTPUTS:             none
  45.  *
  46.  *     RETURN VALUE:        1 if input == 0x7fff ffff or -0x8000 0000
  47.  *                          0 otherwise
  48.  *
  49.  *     KEYWORDS: saturation, limit
  50.  *
  51.  ***************************************************************************/
  52. short  isLwLimit(Longword L_In)
  53. {
  54.   Longword L_ls;
  55.   short  siOut;
  56.   if (L_In != 0)
  57.   {
  58.     L_ls = L_shl(L_In, 1);
  59.     if (L_sub(L_In, L_ls) == 0)
  60.       siOut = 1;
  61.     else
  62.       siOut = 0;
  63.   }
  64.   else
  65.   {
  66.     siOut = 0;
  67.   }
  68.   return (siOut);
  69. }
  70. /****************************************************************************
  71.  *
  72.  *     FUNCTION NAME: isSwLimit
  73.  *
  74.  *     PURPOSE:
  75.  *
  76.  *        Check to see if the input Shortword is at the
  77.  *        upper or lower limit of its range.  i.e.
  78.  *        0x7fff or -0x8000
  79.  *
  80.  *        Ostensibly this is a check for an overflow.
  81.  *        This does not truly mean an overflow occurred,
  82.  *        it means the value reached is the
  83.  *        maximum/minimum value representable.  It may
  84.  *        have come about due to an overflow.
  85.  *
  86.  *     INPUTS:
  87.  *
  88.  *       swIn               A Shortword input variable
  89.  *
  90.  *
  91.  *     OUTPUTS:             none
  92.  *
  93.  *     RETURN VALUE:        1 if input == 0x7fff or -0x8000
  94.  *                          0 otherwise
  95.  *
  96.  *     KEYWORDS: saturation, limit
  97.  *
  98.  ***************************************************************************/
  99. short  isSwLimit(Shortword swIn)
  100. {
  101.   Shortword swls;
  102.   short  siOut;
  103.   if (swIn != 0)
  104.   {
  105.     swls = shl(swIn, 1);
  106.     if (sub(swIn, swls) == 0)          /* logical compare outputs 1/0 */
  107.       siOut = 1;
  108.     else
  109.       siOut = 0;
  110.   }
  111.   else
  112.   {
  113.     siOut = 0;
  114.   }
  115.   return (siOut);
  116. }
  117. /****************************************************************************
  118.  *
  119.  *     FUNCTION NAME: L_mpy_ll
  120.  *
  121.  *     PURPOSE:    Multiply a 32 bit number (L_var1) and a 32 bit number
  122.  *                 (L_var2), and return a 32 bit result.
  123.  *
  124.  *     INPUTS:
  125.  *
  126.  *       L_var1             A Longword input variable
  127.  *
  128.  *       L_var2             A Longword input variable
  129.  *
  130.  *     OUTPUTS:             none
  131.  *
  132.  *     IMPLEMENTATION:
  133.  *
  134.  *        Performs a 31x31 bit multiply, Complexity=24 Ops.
  135.  *
  136.  *        Let x1x0, or y1y0, be the two constituent halves
  137.  *        of a 32 bit number.  This function performs the
  138.  *        following:
  139.  *
  140.  *        low = ((x0 >> 1)*(y0 >> 1)) >> 16     (low * low)
  141.  *        mid1 = [(x1 * (y0 >> 1)) >> 1 ]       (high * low)
  142.  *        mid2 = [(y1 * (x0 >> 1)) >> 1]        (high * low)
  143.  *        mid =  (mid1 + low + mid2) >> 14      (sum so far)
  144.  *        output = (y1*x1) + mid                (high * high)
  145.  *
  146.  *
  147.  *     RETURN VALUE:        A Longword value
  148.  *
  149.  *     KEYWORDS: mult,mpy,multiplication
  150.  *
  151.  ***************************************************************************/
  152. Longword L_mpy_ll(Longword L_var1, Longword L_var2)
  153. {
  154.   Shortword swLow1,
  155.          swLow2,
  156.          swHigh1,
  157.          swHigh2;
  158.   Longword L_varOut,
  159.          L_low,
  160.          L_mid1,
  161.          L_mid2,
  162.          L_mid;
  163.   swLow1 = shr(extract_l(L_var1), 1);
  164.   swLow1 = SW_MAX & swLow1;
  165.   swLow2 = shr(extract_l(L_var2), 1);
  166.   swLow2 = SW_MAX & swLow2;
  167.   swHigh1 = extract_h(L_var1);
  168.   swHigh2 = extract_h(L_var2);
  169.   L_low = L_mult(swLow1, swLow2);
  170.   L_low = L_shr(L_low, 16);
  171.   L_mid1 = L_mult(swHigh1, swLow2);
  172.   L_mid1 = L_shr(L_mid1, 1);
  173.   L_mid = L_add(L_mid1, L_low);
  174.   L_mid2 = L_mult(swHigh2, swLow1);
  175.   L_mid2 = L_shr(L_mid2, 1);
  176.   L_mid = L_add(L_mid, L_mid2);
  177.   L_mid = L_shr(L_mid, 14);
  178.   L_varOut = L_mac(L_mid, swHigh1, swHigh2);
  179.   return (L_varOut);
  180. }
  181. /****************************************************************************
  182.  *
  183.  *     FUNCTION NAME: L_mpy_ls
  184.  *
  185.  *     PURPOSE:    Multiply a 32 bit number (L_var2) and a 16 bit
  186.  *                 number (var1) returning a 32 bit result. L_var2
  187.  *                 is truncated to 31 bits prior to executing the
  188.  *                 multiply.
  189.  *
  190.  *     INPUTS:
  191.  *
  192.  *       L_var2             A Longword input variable
  193.  *
  194.  *       var1               A Shortword input variable
  195.  *
  196.  *     OUTPUTS:             none
  197.  *
  198.  *     RETURN VALUE:        A Longword value
  199.  *
  200.  *     KEYWORDS: mult,mpy,multiplication
  201.  *
  202.  ***************************************************************************/
  203. Longword L_mpy_ls(Longword L_var2, Shortword var1)
  204. {
  205.   Longword L_varOut,L_temp;
  206.   Shortword swtemp,temp;
  207.  /*  swtemp = shr(extract_l(L_var2), 1); */
  208.   L_temp = _shr2(L_var2,1);
  209.   swtemp = (Shortword) (0x0000ffffL & L_temp);
  210.   swtemp = (short) 32767 & (short) swtemp;
  211.  /*  L_varOut = L_mult(var1, swtemp);                     */
  212. /*   L_varOut = L_shr(L_varOut, 15);                      */
  213. /*   L_varOut = L_mac(L_varOut, var1, extract_h(L_var2)); */
  214.   L_varOut = _smpy(var1, swtemp);
  215.   L_varOut = _sshvr(L_varOut, 15);
  216.   temp = (Shortword) (0x0000ffffL & (L_var2 >> 16));
  217.   L_varOut = _sadd(L_varOut,_smpy(var1,temp));
  218.   return (L_varOut);
  219. }