ADPCM.C
上传用户:taicent
上传日期:2021-01-27
资源大小:32k
文件大小:5k
源码类别:

语音压缩

开发平台:

Visual C++

  1. /*****************************************************************************/
  2. /*   ADPCM Encoder and Decoder (based on IMA ADPCM)                          */
  3. /*                                                                           */
  4. /*   Initialization, encoder, and decoder function for ADPCM compression.    */
  5. /*                                                                           */
  6. /*   Texas Instruments Deutschland GmbH                                      */
  7. /*   July 2007, Christian Hernitscheck                                       */
  8. /*   Built with IAR Embedded Workbench Version 3.42A                         */
  9. /*****************************************************************************/
  10. signed int PrevSample;   // Predicted sample
  11. int        PrevStepSize;//Index into step size table
  12. // Index changes
  13. const signed char StepSizeAdaption[8] = {
  14.     -1, -1, -1, -1, 2, 4, 6, 8
  15. };
  16. // Quantizer step size lookup table
  17. const int StepSize[89] = {
  18.        7,    8,    9,   10,   11,   12,   13,   14,
  19.       16,   17,   19,   21,   23,   25,   28,   31,
  20.       34,   37,   41,   45,   50,   55,   60,   66,
  21.       73,   80,   88,   97,  107,  118,  130,  143,
  22.      157,  173,  190,  209,  230,  253,  279,  307,
  23.      337,  371,  408,  449,  494,  544,  598,  658,
  24.      724,  796,  876,  963, 1060, 1166, 1282, 1411,
  25.     1552, 1707, 1878, 2066, 2272, 2499, 2749, 3024,
  26.     3327, 3660, 4026, 4428, 4871, 5358, 5894, 6484,
  27.     7132, 7845, 8630, 9493,10442,11487,12635,13899,
  28.    15289,16818,18500,20350,22385,24623,27086,29794,
  29.    32767
  30. };
  31. //-----------------------------------------------------------------------------
  32. // ADPCM Initialization function.
  33. // ADPCM_Init() should be called before starting a new encode oder decode
  34. // sequence.
  35. void ADPCM_Init(void)
  36. {  PrevSample=0;
  37.    PrevStepSize=0;
  38. }
  39. //-----------------------------------------------------------------------------
  40. // ADPCM Encoder function
  41. //   This function converts a 16-bit sample into a 4-bit ADPCM code.
  42. char ADPCM_Encoder(signed int Input)
  43. {  int code;        // ADPCM code (4-bit code)
  44.    int Se;          // Signal estimate, Output of predictor
  45.    int step;        // Quantizer step size
  46.    int step2;
  47.    signed int d;    // Signal difference between input sample and Se
  48.    signed int dq;   // Quantized difference signal
  49.    int StepSizePTR; // Step size table pointer
  50.    Se = PrevSample; // Restore previous values of signal estimate
  51.    StepSizePTR= PrevStepSize;   // and step size pointer
  52.    step = StepSize[StepSizePTR];
  53.    d = Input - Se;  // calculate difference between sample and signal estimate
  54.    if(d >= 0)
  55.       code = 0;
  56.    else
  57.       { code = 8;
  58.          d = -d;
  59.       }
  60.    step2=step;       // Quantize signal difference into 4-bit ADPCM code
  61.    if( d >= step2 )
  62.    { code |= 4;
  63.       d -= step2;
  64.    }
  65.    step2 >>= 1;
  66.    if( d >= step2 )
  67.    { code |= 2;
  68.       d -= step2;
  69.    }
  70.    step2 >>= 1;
  71.    if( d >= step2 )
  72.    { code |= 1; }
  73.    dq = step >> 3;   // Inverse quantize into reconstructed signal
  74.    if (code & 4)
  75.       dq += step;
  76.    if (code & 2)
  77.       dq += step >> 1;
  78.    if (code & 1)
  79.       dq += step >> 2;
  80.    if( code & 8 )
  81.       Se -= dq;
  82.    else
  83.       Se += dq;
  84.    if( Se > 4095 )   // check for underflow/overflow
  85.       Se = 4095;
  86.    else if( Se < 0 )
  87.       Se = 0;
  88.    StepSizePTR += StepSizeAdaption[code & 0x07]; // find new quantizer stepsize
  89.    if( StepSizePTR < 0 )   // check for underflow/overflow
  90.       StepSizePTR = 0;
  91.    if( StepSizePTR > 88 )
  92.       StepSizePTR = 88;
  93.    PrevSample = Se;        // save signal estimate and step size pointer
  94.    PrevStepSize = StepSizePTR;
  95.    return ( code & 0x0f ); // return ADPCM code
  96. }
  97. //-----------------------------------------------------------------------------
  98. // ADPCM Decoder function
  99. //   This function converts the 4-bit ADPCM code into a 16-bit sample.
  100. signed int ADPCM_Decoder(char code)
  101. {
  102.    signed int Se;   // Signal estimate, Output of predictor
  103.    int step;        // Quantizer step size
  104.    signed int dq;   // Quantized predicted difference
  105.    int StepSizePTR; // Index into step size table
  106.    Se = PrevSample; // Restore previous values of signal estimate
  107.    StepSizePTR = PrevStepSize;  // and step size pointer
  108.    step = StepSize[StepSizePTR];
  109.    dq = step >> 3;  // Inverse quantize into reconstructed signal
  110.    if (code & 4)
  111.       dq += step;
  112.    if (code & 2)
  113.       dq += step >> 1;
  114.    if (code & 1)
  115.       dq += step >> 2;
  116.    if( code & 8 )
  117.       Se -= dq;
  118.    else
  119.       Se += dq;
  120.    if( Se > 4095 )   // check for underflow/overflow
  121.       Se = 4095;
  122.    else if( Se < 0 )
  123.       Se = 0;
  124.    StepSizePTR += StepSizeAdaption[code & 0x07]; // find new quantizer stepsize
  125.    if( StepSizePTR < 0 )   // check for underflow/overflow
  126.       StepSizePTR = 0;
  127.    if( StepSizePTR > 88 )
  128.       StepSizePTR = 88;
  129.    PrevSample = Se;  // save signal estimate and step size pointer
  130.    PrevStepSize = StepSizePTR;
  131.    return( Se );     // return 16-bit sample
  132. }