gsm610_priv.h
上传用户:shw771010
上传日期:2022-01-05
资源大小:991k
文件大小:7k
源码类别:

Audio

开发平台:

Unix_Linux

  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. #ifndef PRIVATE_H
  7. #define PRIVATE_H
  8. /* Added by Erik de Castro Lopo */
  9. #define USE_FLOAT_MUL
  10. #define FAST
  11. #define WAV49
  12. #ifdef __cplusplus
  13. #error "This code is not designed to be compiled with a C++ compiler."
  14. #endif
  15. /* Added by Erik de Castro Lopo */
  16. typedef short word; /* 16 bit signed int */
  17. typedef int longword; /* 32 bit signed int */
  18. typedef unsigned short uword; /* unsigned word */
  19. typedef unsigned int ulongword; /* unsigned longword */
  20. struct gsm_state
  21. { word dp0[ 280 ] ;
  22. word z1; /* preprocessing.c, Offset_com. */
  23. longword L_z2; /*                  Offset_com. */
  24. int mp; /*                  Preemphasis */
  25. word u[8] ; /* short_term_aly_filter.c */
  26. word LARpp[2][8] ;  /*                              */
  27. word j; /*                              */
  28. word         ltp_cut;        /* long_term.c, LTP crosscorr.  */
  29. word nrp;  /* 40 */ /* long_term.c, synthesis */
  30. word v[9] ; /* short_term.c, synthesis */
  31. word msr; /* decoder.c, Postprocessing */
  32. char verbose; /* only used if !NDEBUG */
  33. char fast; /* only used if FAST */
  34. char wav_fmt; /* only used if WAV49 defined */
  35. unsigned char frame_index; /*            odd/even chaining */
  36. unsigned char frame_chain; /*   half-byte to carry forward */
  37. /* Moved here from code.c where it was defined as static */
  38. word e[50] ;
  39. } ;
  40. typedef struct gsm_state GSM_STATE ;
  41. #define MIN_WORD (-32767 - 1)
  42. #define MAX_WORD   32767
  43. #define MIN_LONGWORD (-2147483647 - 1)
  44. #define MAX_LONGWORD   2147483647
  45. /* Signed arithmetic shift right. */
  46. static inline word
  47. SASR_W (word x, word by)
  48. { return (x >> by) ;
  49. } /* SASR */
  50. static inline longword
  51. SASR_L (longword x, word by)
  52. { return (x >> by) ;
  53. } /* SASR */
  54. /*
  55.  * Prototypes from add.c
  56.  */
  57. word gsm_mult  (word a, word b) ;
  58. longword gsm_L_mult  (word a, word b) ;
  59. word gsm_mult_r (word a, word b) ;
  60. word gsm_div   (word num, word denum) ;
  61. word gsm_add  (word a, word b ) ;
  62. longword gsm_L_add  (longword a, longword b ) ;
  63. word gsm_sub  (word a, word b) ;
  64. longword gsm_L_sub  (longword a, longword b) ;
  65. word gsm_abs  (word a) ;
  66. word gsm_norm  (longword a ) ;
  67. longword gsm_L_asl   (longword a, int n) ;
  68. word gsm_asl  (word a, int n) ;
  69. longword gsm_L_asr   (longword a, int n) ;
  70. word gsm_asr   (word a, int n) ;
  71. /*
  72.  *  Inlined functions from add.h
  73.  */
  74. static inline longword
  75. GSM_MULT_R (word a, word b)
  76. { return (((longword) (a)) * ((longword) (b)) + 16384) >> 15 ;
  77. } /* GSM_MULT_R */
  78. static inline longword
  79. GSM_MULT (word a, word b)
  80. { return (((longword) (a)) * ((longword) (b))) >> 15 ;
  81. } /* GSM_MULT */
  82. static inline longword
  83. GSM_L_MULT (word a, word b)
  84. { return ((longword) (a)) * ((longword) (b)) << 1 ;
  85. } /* GSM_L_MULT */
  86. static inline longword
  87. GSM_L_ADD (longword a, longword b)
  88. { ulongword utmp ;
  89. if (a < 0 && b < 0)
  90. { utmp = (ulongword)-((a) + 1) + (ulongword)-((b) + 1) ;
  91. return (utmp >= (ulongword) MAX_LONGWORD) ? MIN_LONGWORD : -(longword)utmp-2 ;
  92. } ;
  93. if (a > 0 && b > 0)
  94. { utmp = (ulongword) a + (ulongword) b ;
  95. return (utmp >= (ulongword) MAX_LONGWORD) ? MAX_LONGWORD : utmp ;
  96. } ;
  97. return a + b ;
  98. } /* GSM_L_ADD */
  99. static inline longword
  100. GSM_ADD (word a, word b)
  101. { longword ltmp ;
  102. ltmp = ((longword) a) + ((longword) b) ;
  103. if (ltmp >= MAX_WORD)
  104. return MAX_WORD ;
  105. if (ltmp <= MIN_WORD)
  106. return MIN_WORD ;
  107. return ltmp ;
  108. } /* GSM_ADD */
  109. static inline longword
  110. GSM_SUB (word a, word b)
  111. { longword ltmp ;
  112. ltmp = ((longword) a) - ((longword) b) ;
  113. if (ltmp >= MAX_WORD)
  114. ltmp = MAX_WORD ;
  115. else if (ltmp <= MIN_WORD)
  116. ltmp = MIN_WORD ;
  117. return ltmp ;
  118. } /* GSM_SUB */
  119. static inline word
  120. GSM_ABS (word a)
  121. {
  122. if (a > 0)
  123. return a ;
  124. if (a == MIN_WORD)
  125. return MAX_WORD ;
  126. return -a ;
  127. } /* GSM_ADD */
  128. /*
  129.  *  More prototypes from implementations..
  130.  */
  131. void Gsm_Coder (
  132. struct gsm_state * S,
  133. word * s, /* [0..159] samples IN */
  134. word * LARc, /* [0..7] LAR coefficients OUT */
  135. word * Nc, /* [0..3] LTP lag OUT  */
  136. word * bc, /* [0..3] coded LTP gain OUT  */
  137. word * Mc, /* [0..3] RPE grid selection OUT     */
  138. word * xmaxc,/* [0..3] Coded maximum amplitude OUT */
  139. word * xMc) ;/* [13*4] normalized RPE samples OUT */
  140. void Gsm_Long_Term_Predictor ( /* 4x for 160 samples */
  141. struct gsm_state * S,
  142. word * d, /* [0..39]   residual signal IN */
  143. word * dp, /* [-120..-1] d' IN */
  144. word * e, /* [0..40]  OUT */
  145. word * dpp, /* [0..40]  OUT */
  146. word * Nc, /* correlation lag OUT */
  147. word * bc) ; /* gain factor OUT */
  148. void Gsm_LPC_Analysis (
  149. struct gsm_state * S,
  150. word * s, /* 0..159 signals IN/OUT */
  151. word * LARc) ;   /* 0..7   LARc's OUT */
  152. void Gsm_Preprocess (
  153. struct gsm_state * S,
  154. word * s, word * so) ;
  155. void Gsm_Encoding (
  156. struct gsm_state * S,
  157. word * e,
  158. word * ep,
  159. word * xmaxc,
  160. word * Mc,
  161. word * xMc) ;
  162. void Gsm_Short_Term_Analysis_Filter (
  163. struct gsm_state * S,
  164. word * LARc, /* coded log area ratio [0..7]  IN */
  165. word * d) ; /* st res. signal [0..159] IN/OUT */
  166. void Gsm_Decoder (
  167. struct gsm_state * S,
  168. word * LARcr, /* [0..7] IN */
  169. word * Ncr, /* [0..3]  IN  */
  170. word * bcr, /* [0..3] IN */
  171. word * Mcr, /* [0..3]  IN  */
  172. word * xmaxcr, /* [0..3] IN  */
  173. word * xMcr, /* [0..13*4] IN */
  174. word * s) ; /* [0..159] OUT  */
  175. void Gsm_Decoding (
  176. struct gsm_state * S,
  177. word  xmaxcr,
  178. word Mcr,
  179. word * xMcr,   /* [0..12] IN */
  180. word * erp) ;  /* [0..39] OUT  */
  181. void Gsm_Long_Term_Synthesis_Filtering (
  182. struct gsm_state* S,
  183. word Ncr,
  184. word bcr,
  185. word * erp, /* [0..39]   IN  */
  186. word * drp) ;  /* [-120..-1] IN, [0..40] OUT  */
  187. void Gsm_RPE_Decoding (
  188. /*-struct gsm_state *S,-*/
  189. word xmaxcr,
  190. word Mcr,
  191. word * xMcr,  /* [0..12], 3 bits             IN      */
  192. word * erp) ; /* [0..39]                     OUT     */
  193. void Gsm_RPE_Encoding (
  194. /*-struct gsm_state * S,-*/
  195. word    * e,            /* -5..-1][0..39][40..44     IN/OUT  */
  196. word    * xmaxc,        /*                              OUT */
  197. word    * Mc,           /*                              OUT */
  198. word    * xMc) ;        /* [0..12]                      OUT */
  199. void Gsm_Short_Term_Synthesis_Filter (
  200. struct gsm_state * S,
  201. word * LARcr,  /* log area ratios [0..7]  IN */
  202. word * drp, /* received d [0...39]    IN */
  203. word * s) ; /* signal   s [0..159]   OUT */
  204. void Gsm_Update_of_reconstructed_short_time_residual_signal (
  205. word * dpp, /* [0...39] IN */
  206. word * ep, /* [0...39] IN */
  207. word * dp) ; /* [-120...-1]  IN/OUT  */
  208. /*
  209.  *  Tables from table.c
  210.  */
  211. #ifndef GSM_TABLE_C
  212. extern word gsm_A [8], gsm_B [8], gsm_MIC [8], gsm_MAC [8] ;
  213. extern word gsm_INVA [8] ;
  214. extern word gsm_DLB [4], gsm_QLB [4] ;
  215. extern word gsm_H [11] ;
  216. extern word gsm_NRFAC [8] ;
  217. extern word gsm_FAC [8] ;
  218. #endif /* GSM_TABLE_C */
  219. /*
  220.  *  Debugging
  221.  */
  222. #ifdef NDEBUG
  223. # define gsm_debug_words(a, b, c, d) /* nil */
  224. # define gsm_debug_longwords(a, b, c, d) /* nil */
  225. # define gsm_debug_word(a, b) /* nil */
  226. # define gsm_debug_longword(a, b) /* nil */
  227. #else /* !NDEBUG => DEBUG */
  228. void  gsm_debug_words     (char * name, int, int, word *) ;
  229. void  gsm_debug_longwords (char * name, int, int, longword *) ;
  230. void  gsm_debug_longword  (char * name, longword) ;
  231. void  gsm_debug_word      (char * name, word) ;
  232. #endif /* !NDEBUG */
  233. #endif /* PRIVATE_H */