preprocess.c
上传用户:sy_wanhua
上传日期:2013-07-25
资源大小:3048k
文件大小:2k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. /*
  2.  * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
  3.  * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
  4.  * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
  5.  */
  6. /* $Header: /cvsroot/vocal.modules/contrib/libsndfile-0.0.22/src/GSM610/preprocess.c,v 1.2 2001/02/27 19:23:13 deepalir Exp $ */
  7. #include <stdio.h>
  8. #include <assert.h>
  9. #include "private.h"
  10. #include "gsm.h"
  11. #include  "proto.h"
  12. /* 4.2.0 .. 4.2.3 PREPROCESSING SECTION
  13.  *  
  14.  *   After A-law to linear conversion (or directly from the
  15.  *    Ato D converter) the following scaling is assumed for
  16.  *  input to the RPE-LTP algorithm:
  17.  *
  18.  *      in:  0.1.....................12
  19.  *      S.v.v.v.v.v.v.v.v.v.v.v.v.*.*.*
  20.  *
  21.  * Where S is the sign bit, v a valid bit, and * a "don't care" bit.
  22.  *  The original signal is called sop[..]
  23.  *
  24.  *      out:   0.1................... 12 
  25.  *      S.S.v.v.v.v.v.v.v.v.v.v.v.v.0.0
  26.  */
  27. void Gsm_Preprocess P3((S, s, so),
  28. struct gsm_state * S,
  29. word  * s,
  30. word   * so ) /* [0..159]  IN/OUT */
  31. {
  32. word       z1 = S->z1;
  33. longword L_z2 = S->L_z2;
  34. word     mp = S->mp;
  35. word      s1;
  36. longword      L_s2;
  37. longword      L_temp;
  38. word msp, lsp;
  39. word SO;
  40. longword ltmp; /* for   ADD */
  41. ulongword utmp; /* for L_ADD */
  42. register int k = 160;
  43. while (k--) {
  44. /*  4.2.1   Downscaling of the input signal
  45.  */
  46. SO = SASR( *s, 3 ) << 2;
  47. s++;
  48. assert (SO >= -0x4000); /* downscaled by     */
  49. assert (SO <=  0x3FFC); /* previous routine. */
  50. /*  4.2.2   Offset compensation
  51.  * 
  52.  *  This part implements a high-pass filter and requires extended
  53.  *  arithmetic precision for the recursive part of this filter.
  54.  *  The input of this procedure is the array so[0...159] and the
  55.  *  output the array sof[ 0...159 ].
  56.  */
  57. /*   Compute the non-recursive part
  58.  */
  59. s1 = SO - z1; /* s1 = gsm_sub( *so, z1 ); */
  60. z1 = SO;
  61. assert(s1 != MIN_WORD);
  62. /*   Compute the recursive part
  63.  */
  64. L_s2 = s1;
  65. L_s2 <<= 15;
  66. /*   Execution of a 31 bv 16 bits multiplication
  67.  */
  68. msp = SASR( L_z2, 15 );
  69. lsp = L_z2-((longword)msp<<15); /* gsm_L_sub(L_z2,(msp<<15)); */
  70. L_s2  += GSM_MULT_R( lsp, 32735 );
  71. L_temp = (longword)msp * 32735; /* GSM_L_MULT(msp,32735) >> 1;*/
  72. L_z2   = GSM_L_ADD( L_temp, L_s2 );
  73. /*    Compute sof[k] with rounding
  74.  */
  75. L_temp = GSM_L_ADD( L_z2, 16384 );
  76. /*   4.2.3  Preemphasis
  77.  */
  78. msp   = GSM_MULT_R( mp, -28180 );
  79. mp    = SASR( L_temp, 15 );
  80. *so++ = GSM_ADD( mp, msp );
  81. }
  82. S->z1   = z1;
  83. S->L_z2 = L_z2;
  84. S->mp   = mp;
  85. }