简化Basic-op.c
上传用户:meifeng08
上传日期:2013-06-18
资源大小:5304k
文件大小:13k
源码类别:

语音压缩

开发平台:

C/C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "typedef.h"
  4. #include "basic_op.h"
  5.  
  6. Flag Overflow =0;
  7. Flag Carry =0;
  8. Word16 sature(Word32 L_var1)
  9.   {
  10.    Word16 var_out;
  11.    if (L_var1 > 0X00007fffL)
  12.      {
  13.       Overflow = 1;
  14.       var_out = MAX_16;
  15.      }
  16.    else if (L_var1 < (Word32)0xffff8000L)
  17.      {
  18.       Overflow = 1;
  19.       var_out = MIN_16;
  20.      }
  21.    else
  22.      {
  23.       Overflow = 0;
  24.       var_out = extract_l(L_var1);
  25.      }
  26.    return(var_out);
  27.   }
  28. Word16 add(Word16 var1,Word16 var2)
  29.   {
  30.    Word16 var_out;
  31.    Word32 L_somme;
  32.    L_somme = (Word32) var1 + var2;
  33.    var_out = sature(L_somme);
  34.    return(var_out);
  35. Word16 sub(Word16 var1,Word16 var2)
  36.   {
  37.    Word16 var_out;
  38.    Word32 L_diff;
  39.    L_diff = (Word32) var1 - var2;
  40.    var_out = sature(L_diff);
  41.    return(var_out);
  42.   }
  43. Word16 abs_s(Word16 var1)
  44.   {
  45.    Word16 var_out;
  46.    if (var1 == (Word16)0X8000 )
  47.      {
  48.       var_out = MAX_16;
  49.      }
  50.    else
  51.      {
  52.       if (var1 < 0)
  53.         {
  54.          var_out = -var1;
  55.         }
  56.       else
  57.         {
  58.          var_out = var1;
  59.         }
  60.       }
  61.     return(var_out);
  62.   }
  63. Word16 shl(Word16 var1,Word16 var2)
  64.   {
  65.    Word16 var_out;
  66.    Word32 resultat;
  67.    if (var2 < 0)
  68.      {
  69.       var_out = shr(var1,-var2);
  70.      }
  71.    else
  72.      {
  73.       resultat = (Word32) var1 * ((Word32) 1 << var2);
  74.      if ((var2 > 15 && var1 != 0) || (resultat != (Word32)((Word16) resultat)))
  75.         {
  76.          Overflow = 1;
  77.          var_out = (var1 > 0) ? MAX_16 : MIN_16;
  78.         }
  79.       else
  80.         {
  81.          var_out = extract_l(resultat);
  82.         }
  83.      }
  84.    return(var_out);
  85.   }
  86. Word16 shr(Word16 var1,Word16 var2)
  87.   {
  88.    Word16 var_out;
  89.    if (var2 < 0)
  90.      {
  91.       var_out = shl(var1,-var2);
  92.      }
  93.    else
  94.      {
  95.       if (var2 >= 15)
  96.         {
  97.          var_out = (var1 < 0) ? (Word16)(-1) : (Word16)0;
  98.         }
  99.       else
  100.         {
  101.          if (var1 < 0)
  102.            {
  103.      var_out = ~(( ~var1) >> var2 );
  104.            }
  105.          else
  106.            {
  107.             var_out = var1 >> var2;
  108.            }
  109.         }
  110.      }
  111.    return(var_out);
  112.   }
  113. Word16 mult(Word16 var1, Word16 var2)
  114.   {
  115.    Word16 var_out;
  116.    Word32 L_produit;
  117.    L_produit = (Word32)var1 * (Word32)var2;
  118.    L_produit = (L_produit & (Word32) 0xffff8000L) >> 15;
  119.    if (L_produit & (Word32) 0x00010000L)
  120.      L_produit = L_produit | (Word32) 0xffff0000L;
  121.    var_out = sature(L_produit);
  122.    return(var_out);
  123.   }
  124. Word32 L_mult(Word16 var1,Word16 var2)
  125.   {
  126.    Word32 L_var_out;
  127.    L_var_out = (Word32)var1 * (Word32)var2;
  128.    if (L_var_out != (Word32)0x40000000L)
  129.      {
  130.       L_var_out *= 2;
  131.      }
  132.    else
  133.      {
  134.       Overflow = 1;
  135.       L_var_out = MAX_32;
  136.      }
  137.    return(L_var_out);
  138.   }
  139. Word16 negate(Word16 var1)
  140.   {
  141.    Word16 var_out;
  142.    var_out = (var1 == MIN_16) ? MAX_16 : -var1;
  143.    return(var_out);
  144.   }
  145. Word16 extract_h(Word32 L_var1)
  146.   {
  147.    Word16 var_out;
  148.    var_out = (Word16) (L_var1 >> 16);
  149.    return(var_out);
  150.   }
  151. Word16 extract_l(Word32 L_var1)
  152.   {
  153.    Word16 var_out;
  154.    var_out = (Word16) L_var1;
  155.    return(var_out);
  156.   }
  157. Word16 round(Word32 L_var1)
  158.   {
  159.    Word16 var_out;
  160.    Word32 L_arrondi;
  161.    L_arrondi = L_add(L_var1, (Word32)0x00008000);
  162.    var_out = extract_h(L_arrondi);
  163.    return(var_out);
  164.   }
  165. Word32 L_mac(Word32 L_var3, Word16 var1, Word16 var2)
  166.   {
  167.    Word32 L_var_out;
  168.    Word32 L_produit;
  169.    L_produit = L_mult(var1,var2);
  170.    L_var_out = L_add(L_var3,L_produit);
  171.    return(L_var_out);
  172.   }
  173. Word32 L_msu(Word32 L_var3, Word16 var1, Word16 var2)
  174.   {
  175.    Word32 L_var_out;
  176.    Word32 L_produit;
  177.    L_produit = L_mult(var1,var2);
  178.    L_var_out = L_sub(L_var3,L_produit);
  179.    return(L_var_out);
  180.   }
  181. Word32 L_macNs(Word32 L_var3, Word16 var1, Word16 var2)
  182.   {
  183.    Word32 L_var_out;
  184.    L_var_out = L_mult(var1,var2);
  185.    L_var_out = L_add_c(L_var3,L_var_out);
  186.    return(L_var_out);
  187.   }
  188. Word32 L_msuNs(Word32 L_var3, Word16 var1, Word16 var2)
  189.   {
  190.    Word32 L_var_out;
  191.    L_var_out = L_mult(var1,var2);
  192.    L_var_out = L_sub_c(L_var3,L_var_out);
  193.    return(L_var_out);
  194.   }
  195. Word32 L_add(Word32 L_var1, Word32 L_var2)
  196.   {
  197.    Word32 L_var_out;
  198.    L_var_out = L_var1 + L_var2;
  199.    if (((L_var1 ^ L_var2) & MIN_32) == 0)
  200.      {
  201.       if ((L_var_out ^ L_var1) & MIN_32)
  202.         {
  203.          L_var_out = (L_var1 < 0) ? MIN_32 : MAX_32;
  204.          Overflow = 1;
  205.         }
  206.      }
  207.    return(L_var_out);
  208.   }
  209. Word32 L_sub(Word32 L_var1, Word32 L_var2)
  210.   {
  211.    Word32 L_var_out;
  212.    L_var_out = L_var1 - L_var2;
  213.    if (((L_var1 ^ L_var2) & MIN_32) != 0)
  214.      {
  215.       if ((L_var_out ^ L_var1) & MIN_32)
  216.         {
  217.          L_var_out = (L_var1 < 0L) ? MIN_32 : MAX_32;
  218.          Overflow = 1;
  219.         }
  220.      }
  221.    return(L_var_out);
  222.   }
  223. Word32 L_add_c(Word32 L_var1, Word32 L_var2)
  224.   {
  225.    Word32 L_var_out;
  226.    Word32 L_test;
  227.    Flag carry_int = 0;
  228.    L_var_out = L_var1 + L_var2 + Carry;
  229.    L_test = L_var1 + L_var2;
  230.    if ((L_var1>0) && (L_var2 >0) && (L_test < 0))
  231.      {
  232.       Overflow = 1;
  233.       carry_int = 0;
  234.      }
  235.    else
  236.      {
  237.       if ((L_var1<0) && (L_var2 <0) && (L_test >0))
  238.         {
  239.          Overflow = 1;
  240.          carry_int = 1;
  241.         }
  242.       else
  243.         {
  244.          if (((L_var1 ^ L_var2) < 0) && (L_test > 0))
  245.            {
  246.             Overflow = 0;
  247.             carry_int = 1;
  248.            }
  249.          else
  250.            {
  251.             Overflow = 0;
  252.             carry_int = 0;
  253.            }
  254.         }
  255.      }
  256.    if (Carry)
  257.      {
  258.       if (L_test == MAX_32)
  259.         {
  260.          Overflow = 1;
  261.          Carry = carry_int;
  262.         }
  263.       else
  264.         {
  265.          if (L_test == (Word32) 0xFFFFFFFFL)
  266.            {
  267.             Carry = 1;
  268.            }
  269.          else
  270.            {
  271.             Carry = carry_int;
  272.            }
  273.         }
  274.      }
  275.    else
  276.      {
  277.       Carry = carry_int;
  278.      }
  279.    return(L_var_out);
  280.   }
  281. Word32 L_sub_c(Word32 L_var1, Word32 L_var2)
  282.   {
  283.    Word32 L_var_out;
  284.    Word32 L_test;
  285.    Flag carry_int = 0;
  286.    if (Carry)
  287.      {
  288.       Carry = 0;
  289.       if (L_var2 != MIN_32)
  290.         {
  291.          L_var_out = L_add_c(L_var1,-L_var2);
  292.         }
  293.       else
  294.         {
  295.          L_var_out = L_var1 - L_var2;
  296.          if (L_var1 > 0L)
  297.            {
  298.             Overflow = 1;
  299.             Carry = 0;
  300.            }
  301.         }
  302.      }
  303.    else
  304.      {
  305.       L_var_out = L_var1 - L_var2 - (Word32)0X00000001;
  306.       L_test = L_var1 - L_var2;
  307.       if ((L_test < 0) && (L_var1 > 0) && (L_var2 < 0))
  308.         {
  309.          Overflow = 1;
  310.          carry_int = 0;
  311.         }
  312.       else if ((L_test > 0) && (L_var1 < 0) && (L_var2 > 0))
  313.         {
  314.          Overflow = 1;
  315.          carry_int = 1;
  316.         }
  317.       else if ((L_test > 0) && ((L_var1 ^ L_var2) > 0))
  318.         {
  319.          Overflow = 0;
  320.          carry_int = 1;
  321.         }
  322.       if (L_test == MIN_32)
  323.         {
  324.          Overflow = 1;
  325.          Carry = carry_int;
  326.         }
  327.       else
  328.         {
  329.          Carry = carry_int;
  330.         }
  331.      }
  332.    return(L_var_out);
  333.   }
  334. Word32 L_negate(Word32 L_var1)
  335.   {
  336.    Word32 L_var_out;
  337.    L_var_out = (L_var1 == MIN_32) ? MAX_32 : -L_var1;
  338.    return(L_var_out);
  339.   }
  340. Word16 mult_r(Word16 var1, Word16 var2)
  341.   {
  342.    Word16 var_out;
  343.    Word32 L_produit_arr;
  344.    L_produit_arr = (Word32)var1 * (Word32)var2; /* product */
  345.    L_produit_arr += (Word32) 0x00004000;        /* round */
  346.    L_produit_arr &= (Word32) 0xffff8000L;
  347.    L_produit_arr >>= 15;                        /* shift */
  348.    if (L_produit_arr & (Word32) 0x00010000L)   /* sign extend when necessary */
  349.      {
  350.       L_produit_arr |= (Word32) 0xffff0000L;
  351.      }
  352.    var_out = sature(L_produit_arr);
  353.    return(var_out);
  354.   }
  355. Word32 L_shl(Word32 L_var1, Word16 var2)
  356. {
  357.    Word32 L_var_out;
  358.    /* initialization used only to suppress Microsoft Visual C++ warnings */
  359.    L_var_out = 0L;
  360.    if (var2 <= 0)
  361.      {
  362.       L_var_out = L_shr(L_var1,-var2);
  363.      }
  364.    else
  365.      {
  366.       for(;var2>0;var2--)
  367.         {
  368.          if (L_var1 > (Word32) 0X3fffffffL)
  369.            {
  370.             Overflow = 1;
  371.             L_var_out = MAX_32;
  372.             break;
  373.            }
  374.          else
  375.            {
  376.             if (L_var1 < (Word32) 0xc0000000L)
  377.               {
  378.                Overflow = 1;
  379.                L_var_out = MIN_32;
  380.                break;
  381.               }
  382.            }
  383.          L_var1 *= 2;
  384.          L_var_out = L_var1;
  385.         }
  386.      }
  387.    return(L_var_out);
  388.   }
  389. Word32 L_shr(Word32 L_var1, Word16 var2)
  390.   {
  391.    Word32 L_var_out;
  392.    if (var2 < 0)
  393.      {
  394.       L_var_out = L_shl(L_var1,-var2);
  395.      }
  396.    else
  397.      {
  398.       if (var2 >= 31)
  399.         {
  400.          L_var_out = (L_var1 < 0L) ? -1 : 0;
  401.         }
  402.       else
  403.         {
  404.          if (L_var1<0)
  405.            {
  406.             L_var_out = ~((~L_var1) >> var2);
  407.            }
  408.         else
  409.           {
  410.            L_var_out = L_var1 >> var2;
  411.           }
  412.         }
  413.      }
  414.    return(L_var_out);
  415.   }
  416. Word16 shr_r(Word16 var1, Word16 var2)
  417.   {
  418.    Word16 var_out;
  419.    if (var2>15)
  420.      {
  421.       var_out = 0;
  422.      }
  423.    else
  424.      {
  425.       var_out = shr(var1,var2);
  426.       if (var2 > 0)
  427.         {
  428.          if ((var1 & ((Word16)1 << (var2-1))) != 0)
  429.            {
  430.             var_out++;
  431.            }
  432.         }
  433.      }
  434.    return(var_out);
  435.   }
  436. Word16 mac_r(Word32 L_var3, Word16 var1, Word16 var2)
  437.   {
  438.    Word16 var_out;
  439.    L_var3 = L_mac(L_var3,var1,var2);
  440.    L_var3 = L_add(L_var3, (Word32) 0x00008000);
  441.    var_out = extract_h(L_var3);
  442.    return(var_out);
  443.   }
  444. Word16 msu_r(Word32 L_var3, Word16 var1, Word16 var2)
  445.   {
  446.    Word16 var_out;
  447.    L_var3 = L_msu(L_var3,var1,var2);
  448.    L_var3 = L_add(L_var3, (Word32) 0x00008000);
  449.    var_out = extract_h(L_var3);
  450.    return(var_out);
  451.   }
  452. Word32 L_deposit_h(Word16 var1)
  453.   {
  454.    Word32 L_var_out;
  455.    L_var_out = (Word32) var1 << 16;
  456.    return(L_var_out);
  457.   }
  458. Word32 L_deposit_l(Word16 var1)
  459.   {
  460.    Word32 L_var_out;
  461.    L_var_out = (Word32) var1;
  462.    return(L_var_out);
  463.   }
  464. Word32 L_shr_r(Word32 L_var1,Word16 var2)
  465.   {
  466.    Word32 L_var_out;
  467.    if (var2 > 31)
  468.      {
  469.       L_var_out = 0;
  470.      }
  471.    else
  472.      {
  473.       L_var_out = L_shr(L_var1,var2);
  474.       if (var2 > 0)
  475.         {
  476.          if ( (L_var1 & ( (Word32)1 << (var2-1) )) != 0)
  477.            {
  478.             L_var_out++;
  479.            }
  480.         }
  481.      }
  482.    return(L_var_out);
  483.   }
  484. Word32 L_abs(Word32 L_var1)
  485.   {
  486.    Word32 L_var_out;
  487.    if (L_var1 == MIN_32)
  488.      {
  489.       L_var_out = MAX_32;
  490.      }
  491.    else
  492.      {
  493.       if (L_var1 < 0)
  494.         {
  495.          L_var_out = -L_var1;
  496.         }
  497.       else
  498.         {
  499.          L_var_out = L_var1;
  500.         }
  501.      }
  502.    return(L_var_out);
  503.   }
  504. Word32 L_sat (Word32 L_var1)
  505.   {
  506.    Word32 L_var_out;
  507.    L_var_out = L_var1;
  508.    if (Overflow)
  509.      {
  510.       if (Carry)
  511.         {
  512.          L_var_out = MIN_32;
  513.         }
  514.       else
  515.         {
  516.          L_var_out = MAX_32;
  517.         }
  518.       Carry = 0;
  519.       Overflow = 0;
  520.      }
  521.    return(L_var_out);
  522.   }
  523. Word16 norm_s(Word16 var1)
  524.   {
  525.    Word16 var_out;
  526.    if (var1 == 0)
  527.      {
  528.       var_out = 0;
  529.      }
  530.    else
  531.      {
  532.       if (var1 == (Word16) 0xffff)
  533.         {
  534.          var_out = 15;
  535.         }
  536.       else
  537.         {
  538.          if (var1 < 0)
  539.            {
  540.             var1 = ~var1;
  541.            }
  542.          for(var_out = 0; var1 < 0x4000; var_out++)
  543.            {
  544.             var1 <<= 1;
  545.            }
  546.         }
  547.      }
  548.    return(var_out);
  549.   }
  550. Word16 div_s(Word16 var1, Word16 var2)
  551.   {
  552.    Word16 var_out = 0;
  553.    Word16 iteration;
  554.    Word32 L_num;
  555.    Word32 L_denom;
  556.    if ((var1 > var2) || (var1 < 0) || (var2 < 0))
  557.      {
  558.       printf("Division Error var1=%d  var2=%dn",var1,var2);
  559.       exit(0);
  560.      }
  561.    if (var2 == 0)
  562.      {
  563.       printf("Division by 0, Fatal error n");
  564.       exit(0);
  565.      }
  566.    if (var1 == 0)
  567.      {
  568.       var_out = 0;
  569.      }
  570.    else
  571.      {
  572.       if (var1 == var2)
  573.         {
  574.          var_out = MAX_16;
  575.         }
  576.       else
  577.         {
  578.          L_num = L_deposit_l(var1);
  579.          L_denom = L_deposit_l(var2);
  580.          for(iteration=0;iteration<15;iteration++)
  581.            {
  582.             var_out <<=1;
  583.             L_num <<= 1;
  584.             if (L_num >= L_denom)
  585.               {
  586.                L_num = L_sub(L_num,L_denom);
  587.                var_out = add(var_out,1);
  588.               }
  589.            }
  590.         }
  591.      }
  592.    return(var_out);
  593.   }
  594. Word16 norm_l(Word32 L_var1)
  595.   {
  596.    Word16 var_out;
  597.    if (L_var1 == 0)
  598.      {
  599.       var_out = 0;
  600.      }
  601.    else
  602.      {
  603.       if (L_var1 == (Word32)0xffffffffL)
  604.         {
  605.          var_out = 31;
  606.         }
  607.       else
  608.         {
  609.          if (L_var1 < 0)
  610.            {
  611.             L_var1 = ~L_var1;
  612.            }
  613.          for(var_out = 0;L_var1 < (Word32)0x40000000L;var_out++)
  614.            {
  615.             L_var1 <<= 1;
  616.            }
  617.         }
  618.      }
  619.    return(var_out);
  620.   }