lpcdec.c
上传用户:zslianheng
上传日期:2013-04-03
资源大小:946k
文件大小:9k
源码类别:

Linux/Unix编程

开发平台:

Visual C++

  1. /*
  2. $Log: lpcdec.c,v $
  3. Revision 1.1.1.1  2002/07/28 05:23:30  freeman_yong
  4. lpc10 codec
  5.  * Revision 1.2  1996/08/20  20:30:11  jaf
  6.  * Removed all static local variables that were SAVE'd in the Fortran
  7.  * code, and put them in struct lpc10_encoder_state that is passed as an
  8.  * argument.
  9.  *
  10.  * Removed init function, since all initialization is now done in
  11.  * init_lpc10_encoder_state().
  12.  *
  13.  * Changed name of function from lpcenc_ to lpc10_encode, simply to make
  14.  * all lpc10 functions have more consistent naming with each other.
  15.  *
  16.  * Revision 1.1  1996/08/19  22:31:48  jaf
  17.  * Initial revision
  18.  *
  19. */
  20. #ifdef P_R_O_T_O_T_Y_P_E_S
  21. extern int lpcdec_(integer *bits, real *speech);
  22. extern int initlpcdec_(void);
  23. /* comlen contrl_ 12 */
  24. /*:ref: chanrd_ 14 5 4 4 4 4 4 */
  25. /*:ref: decode_ 14 7 4 4 4 4 4 6 6 */
  26. /*:ref: synths_ 14 6 4 4 6 6 6 4 */
  27. /*:ref: initdecode_ 14 0 */
  28. /*:ref: initsynths_ 14 0 */
  29. #endif
  30. /*  -- translated by f2c (version 19951025).
  31.    You must link the resulting object file with the libraries:
  32. -lf2c -lm   (in that order)
  33. */
  34. #include "f2c.h"
  35. /* Common Block Declarations */
  36. extern struct {
  37.     integer order, lframe;
  38.     logical corrp;
  39. } contrl_;
  40. #define contrl_1 contrl_
  41. /* Table of constant values */
  42. static integer c__10 = 10;
  43. /* ***************************************************************** */
  44. /* $Log: lpcdec.c,v $
  45. /* Revision 1.1.1.1  2002/07/28 05:23:30  freeman_yong
  46. /* lpc10 codec
  47. /*
  48.  * Revision 1.2  1996/08/20  20:30:11  jaf
  49.  * Removed all static local variables that were SAVE'd in the Fortran
  50.  * code, and put them in struct lpc10_encoder_state that is passed as an
  51.  * argument.
  52.  *
  53.  * Removed init function, since all initialization is now done in
  54.  * init_lpc10_encoder_state().
  55.  *
  56.  * Changed name of function from lpcenc_ to lpc10_encode, simply to make
  57.  * all lpc10 functions have more consistent naming with each other.
  58.  *
  59.  * Revision 1.1  1996/08/19  22:31:48  jaf
  60.  * Initial revision
  61.  * */
  62. /* Revision 1.1  1996/03/28  00:03:00  jaf */
  63. /* Initial revision */
  64. /* ***************************************************************** */
  65. /* Decode 54 bits to one frame of 180 speech samples. */
  66. /* Input: */
  67. /*  BITS   - 54 encoded bits, stored 1 per array element. */
  68. /*           Indices 1 through 53 read (SYNC bit ignored). */
  69. /* Output: */
  70. /*  SPEECH - Speech encoded as real values in the range [-1,+1]. */
  71. /*           Indices 1 through 180 written. */
  72. /* This subroutine maintains local state from one call to the next.  If */
  73. /* you want to switch to using a new audio stream for this filter, or */
  74. /* reinitialize its state for any other reason, call the ENTRY */
  75. /* INITLPCDEC. */
  76. /* Subroutine */ int lpc10_decode(integer *bits, real *speech,
  77.   struct lpc10_decoder_state *st)
  78. {
  79.     integer irms, voice[2], pitch, ipitv;
  80.     extern /* Subroutine */ int decode_(integer *, integer *, integer *, 
  81.     integer *, integer *, real *, real *, struct lpc10_decoder_state *);
  82.     real rc[10];
  83.     extern /* Subroutine */ int chanrd_(integer *, integer *, integer *, 
  84.     integer *, integer *), synths_(integer *, 
  85.     integer *, real *, real *, real *, integer *,
  86.    struct lpc10_decoder_state *);
  87.     integer irc[10], len;
  88.     real rms;
  89. /* $Log: lpcdec.c,v $
  90. /* Revision 1.1.1.1  2002/07/28 05:23:30  freeman_yong
  91. /* lpc10 codec
  92. /*
  93.  * Revision 1.2  1996/08/20  20:30:11  jaf
  94.  * Removed all static local variables that were SAVE'd in the Fortran
  95.  * code, and put them in struct lpc10_encoder_state that is passed as an
  96.  * argument.
  97.  *
  98.  * Removed init function, since all initialization is now done in
  99.  * init_lpc10_encoder_state().
  100.  *
  101.  * Changed name of function from lpcenc_ to lpc10_encode, simply to make
  102.  * all lpc10 functions have more consistent naming with each other.
  103.  *
  104.  * Revision 1.1  1996/08/19  22:31:48  jaf
  105.  * Initial revision
  106.  * */
  107. /* Revision 1.3  1996/03/29  22:03:47  jaf */
  108. /* Removed definitions for any constants that were no longer used. */
  109. /* Revision 1.2  1996/03/26  19:34:33  jaf */
  110. /* Added comments indicating which constants are not needed in an */
  111. /* application that uses the LPC-10 coder. */
  112. /* Revision 1.1  1996/02/07  14:43:51  jaf */
  113. /* Initial revision */
  114. /*   LPC Configuration parameters: */
  115. /* Frame size, Prediction order, Pitch period */
  116. /*       Arguments */
  117. /* $Log: lpcdec.c,v $
  118. /* Revision 1.1.1.1  2002/07/28 05:23:30  freeman_yong
  119. /* lpc10 codec
  120. /*
  121.  * Revision 1.2  1996/08/20  20:30:11  jaf
  122.  * Removed all static local variables that were SAVE'd in the Fortran
  123.  * code, and put them in struct lpc10_encoder_state that is passed as an
  124.  * argument.
  125.  *
  126.  * Removed init function, since all initialization is now done in
  127.  * init_lpc10_encoder_state().
  128.  *
  129.  * Changed name of function from lpcenc_ to lpc10_encode, simply to make
  130.  * all lpc10 functions have more consistent naming with each other.
  131.  *
  132.  * Revision 1.1  1996/08/19  22:31:48  jaf
  133.  * Initial revision
  134.  * */
  135. /* Revision 1.3  1996/03/29  22:05:55  jaf */
  136. /* Commented out the common block variables that are not needed by the */
  137. /* embedded version. */
  138. /* Revision 1.2  1996/03/26  19:34:50  jaf */
  139. /* Added comments indicating which constants are not needed in an */
  140. /* application that uses the LPC-10 coder. */
  141. /* Revision 1.1  1996/02/07  14:44:09  jaf */
  142. /* Initial revision */
  143. /*   LPC Processing control variables: */
  144. /* *** Read-only: initialized in setup */
  145. /*  Files for Speech, Parameter, and Bitstream Input & Output, */
  146. /*    and message and debug outputs. */
  147. /* Here are the only files which use these variables: */
  148. /* lpcsim.f setup.f trans.f error.f vqsetup.f */
  149. /* Many files which use fdebug are not listed, since it is only used in */
  150. /* those other files conditionally, to print trace statements. */
  151. /*  integer fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
  152. /*  LPC order, Frame size, Quantization rate, Bits per frame, */
  153. /*    Error correction */
  154. /* Subroutine SETUP is the only place where order is assigned a value, */
  155. /* and that value is 10.  It could increase efficiency 1% or so to */
  156. /* declare order as a constant (i.e., a Fortran PARAMETER) instead of as 
  157. */
  158. /* a variable in a COMMON block, since it is used in many places in the */
  159. /* core of the coding and decoding routines.  Actually, I take that back. 
  160. */
  161. /* At least when compiling with f2c, the upper bound of DO loops is */
  162. /* stored in a local variable before the DO loop begins, and then that is 
  163. */
  164. /* compared against on each iteration. */
  165. /* Similarly for lframe, which is given a value of MAXFRM in SETUP. */
  166. /* Similarly for quant, which is given a value of 2400 in SETUP.  quant */
  167. /* is used in only a few places, and never in the core coding and */
  168. /* decoding routines, so it could be eliminated entirely. */
  169. /* nbits is similar to quant, and is given a value of 54 in SETUP. */
  170. /* corrp is given a value of .TRUE. in SETUP, and is only used in the */
  171. /* subroutines ENCODE and DECODE.  It doesn't affect the speed of the */
  172. /* coder significantly whether it is .TRUE. or .FALSE., or whether it is 
  173. */
  174. /* a constant or a variable, since it is only examined once per frame. */
  175. /* Leaving it as a variable that is set to .TRUE.  seems like a good */
  176. /* idea, since it does enable some error-correction capability for */
  177. /* unvoiced frames, with no change in the coding rate, and no noticeable 
  178. */
  179. /* quality difference in the decoded speech. */
  180. /*  integer quant, nbits */
  181. /* *** Read/write: variables for debugging, not needed for LPC algorithm 
  182. */
  183. /*  Current frame, Unstable frames, Output clip count, Max onset buffer, 
  184. */
  185. /*    Debug listing detail level, Line count on listing page */
  186. /* nframe is not needed for an embedded LPC10 at all. */
  187. /* nunsfm is initialized to 0 in SETUP, and incremented in subroutine */
  188. /* ERROR, which is only called from RCCHK.  When LPC10 is embedded into */
  189. /* an application, I would recommend removing the call to ERROR in RCCHK, 
  190. */
  191. /* and remove ERROR and nunsfm completely. */
  192. /* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in 
  193. */
  194. /* sread.f.  When LPC10 is embedded into an application, one might want */
  195. /* to cause it to be incremented in a routine that takes the output of */
  196. /* SYNTHS and sends it to an audio device.  It could be optionally */
  197. /* displayed, for those that might want to know what it is. */
  198. /* maxosp is never initialized to 0 in SETUP, although it probably should 
  199. */
  200. /* be, and it is updated in subroutine ANALYS.  I doubt that its value */
  201. /* would be of much interest to an application in which LPC10 is */
  202. /* embedded. */
  203. /* listl and lincnt are not needed for an embedded LPC10 at all. */
  204. /*  integer nframe, nunsfm, iclip, maxosp, listl, lincnt */
  205. /*  common /contrl/ fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
  206. /*  common /contrl/ quant, nbits */
  207. /*  common /contrl/ nframe, nunsfm, iclip, maxosp, listl, lincnt */
  208. /*       Local variables that need not be saved */
  209. /*       Uncoded speech parameters */
  210. /*       Coded speech parameters */
  211. /*       Others */
  212. /*       Local state */
  213. /*       None */
  214.     /* Parameter adjustments */
  215.     if (bits) {
  216. --bits;
  217. }
  218.     if (speech) {
  219. --speech;
  220. }
  221.     /* Function Body */
  222.     chanrd_(&c__10, &ipitv, &irms, irc, &bits[1]);
  223.     decode_(&ipitv, &irms, irc, voice, &pitch, &rms, rc, st);
  224.     synths_(voice, &pitch, &rms, rc, &speech[1], &len, st);
  225.     return 0;
  226. } /* lpcdec_ */