dmain.c
上传用户:touchwatch
上传日期:2007-01-06
资源大小:168k
文件大小:4k
源码类别:

语音压缩

开发平台:

Unix_Linux

  1. /*************************************************************************/
  2. /*                                                                       */
  3. /*                            LD-CELP  G.728                             */
  4. /*                                                                       */
  5. /*    Low-Delay Code Excitation Linear Prediction speech compression.    */
  6. /*                                                                       */
  7. /*    Code edited by Michael Concannon.                                  */
  8. /*    Based on code written by Alex Zatsman, Analog Devices 1993         */
  9. /*                                                                       */
  10. /*************************************************************************/
  11. #include <stdio.h>
  12. #include <signal.h>
  13. #include "common.h"
  14. #include "parm.h"
  15. #include "prototyp.h"
  16. extern void init_output();
  17. void init_decoder();
  18. void decoder();
  19. void decode_vector(int);
  20. void adapt_decoder();
  21. #ifdef NOPF
  22. int postfiltering_p = 0;
  23. #else
  24. int postfiltering_p = 1;
  25. #endif
  26. static int d_vec_start; /* Index of the start of the decoded speech vector */
  27. static int d_vec_end; /* Index of the end   of the decoded speech vector */
  28. static int w_vec_start; /* Index of the start of vector being written */
  29. static int w_vec_end; /* Index of the end   of vector being written */
  30. int VOLATILE decoder_done = 0;
  31. #ifdef MAIN
  32. extern char *ofile_name;
  33. extern char *xfile_name;
  34. void main (int argc, char *argv[])
  35. {
  36.     static void usage(char*);
  37.     
  38.     if (argc != 3)
  39. usage(argv[0]);
  40.     xfile_name = argv[1];
  41.     ofile_name = argv[2];
  42.     init_decoder();
  43.     ffase = 1;
  44.     decoder();
  45. }
  46. static void usage(char *name)
  47. {
  48.     fprintf(stderr, "Usage: %s  <index-file> <audio-file>n", name);
  49.     exit(0);
  50. }
  51. #endif
  52. real thequeue[QSIZE];
  53. real *vector_end;
  54. void decoder()
  55. {
  56.     int i;
  57.     for(i=0; i<QSIZE; i++) thequeue[i] = 0; 
  58.     init_decoder();
  59.     for(w_vec_start=0; ! decoder_done; w_vec_start+=IDIM) {
  60. if (w_vec_start >= QSIZE)
  61.     w_vec_start = 0;
  62. w_vec_end = w_vec_start;
  63. vector_end = thequeue + w_vec_end;
  64. decode_vector(0);
  65. w_vec_end = w_vec_start + IDIM;
  66. if(! decoder_done) {
  67.   if (w_vec_end >= QSIZE)
  68.     w_vec_end = 0;
  69.   write_sound_buffer(IDIM, thequeue + w_vec_end);
  70.   adapt_decoder();
  71. }
  72.     }
  73. }
  74. void init_decoder()
  75. {
  76.     init_bsf_adapter(sf_coeff);
  77.     sf_coeff_next[0] = 1.0;
  78.     sf_coeff_obsolete_p = 0;
  79.     init_gain_adapter(gp_coeff);
  80.     init_gain_buf();
  81.     gp_coeff_next[0] = 1.0;
  82.     gp_coeff_next[1] = -1.0;
  83.     gp_coeff_obsolete_p = 0;
  84.     init_output();
  85.     vector_end=thequeue;
  86. }
  87. void decode_vector(int ignore)
  88. {
  89.     int ix; /* Computed Codebook Index */
  90.     int lgx; /* Log Gains INdex */
  91.     static real zero_response[IDIM], cb_vec[IDIM];
  92.     static real pf_speech[IDIM];
  93.     real qs[NUPDATE*IDIM];
  94.     static real gain = 1.0;
  95.     w_vec_end = vector_end - thequeue;
  96.     d_vec_start = w_vec_end + IDIM;
  97.     if (d_vec_start >= QSIZE)
  98. d_vec_start -= QSIZE;
  99.     ix = get_index();
  100.     if (ix < 0)
  101. decoder_done = 1;
  102.     UPDATE(sf_coeff);
  103.     zresp(zero_response);
  104.     cb_excitation(ix, cb_vec);
  105.     UPDATE(gp_coeff);
  106.     gain = predict_gain();
  107.     sig_scale(gain, cb_vec, qspeech+d_vec_start);
  108.     lgx = d_vec_start/IDIM;
  109.     update_gain(qspeech+d_vec_start, log_gains+lgx);
  110.     mem_update(qspeech+d_vec_start, synspeech+d_vec_start);
  111.     d_vec_end = d_vec_start + IDIM;
  112.     if (d_vec_end >= QSIZE)
  113. d_vec_end -= QSIZE;
  114.     if (postfiltering_p) {
  115.       inv_filter(synspeech+d_vec_start);
  116.       FFASE(3) 
  117. {
  118.   CIRCOPY(qs, synspeech, d_vec_end, NUPDATE*IDIM, QSIZE);
  119.   psf_adapter(qs);
  120. }
  121.       FFASE(1)
  122. compute_sh_coeff();
  123.       postfilter(synspeech+d_vec_start, pf_speech);
  124.       RCOPY(pf_speech, thequeue+d_vec_start, IDIM);
  125.     }
  126.     else {
  127. RCOPY(synspeech+d_vec_start, thequeue+d_vec_start, IDIM);
  128.     }
  129.     NEXT_FFASE;
  130. }
  131. void adapt_decoder()
  132. {
  133.     real
  134. synth [NUPDATE*IDIM],
  135. lg    [NUPDATE];
  136.     int
  137. gx; /* gain index */
  138.     
  139.     
  140.     FFASE(1)
  141.     {     
  142. CIRCOPY(synth, synspeech, d_vec_end, NUPDATE*IDIM, QSIZE);
  143. bsf_adapter (synth, sf_coeff_next);
  144.     }
  145.     FFASE(2)
  146.     {
  147. gx = d_vec_end / IDIM;
  148. CIRCOPY(lg, log_gains, gx, NUPDATE, QSIZE/IDIM);
  149. gain_adapter(lg, gp_coeff_next);
  150. gp_coeff_obsolete_p = 1;
  151.     }
  152.     FFASE(3)
  153.       sf_coeff_obsolete_p = 1;
  154. }