melp.c
上传用户:cxx_68
上传日期:2021-02-21
资源大小:161k
文件大小:7k
源码类别:

语音压缩

开发平台:

Visual C++

  1. /*
  2. 2.4 kbps MELP Proposed Federal Standard speech coder
  3. Fixed-point C code, version 1.0
  4. Copyright (c) 1998, Texas Instruments, Inc.  
  5. Texas Instruments has intellectual property rights on the MELP
  6. algorithm.  The Texas Instruments contact for licensing issues for
  7. commercial and non-government use is William Gordon, Director,
  8. Government Contracts, Texas Instruments Incorporated, Semiconductor
  9. Group (phone 972 480 7442).
  10. The fixed-point version of the voice codec Mixed Excitation Linear
  11. Prediction (MELP) is based on specifications on the C-language software
  12. simulation contained in GSM 06.06 which is protected by copyright and
  13. is the property of the European Telecommunications Standards Institute
  14. (ETSI). This standard is available from the ETSI publication office
  15. tel. +33 (0)4 92 94 42 58. ETSI has granted a license to United States
  16. Department of Defense to use the C-language software simulation contained
  17. in GSM 06.06 for the purposes of the development of a fixed-point
  18. version of the voice codec Mixed Excitation Linear Prediction (MELP).
  19. Requests for authorization to make other use of the GSM 06.06 or
  20. otherwise distribute or modify them need to be addressed to the ETSI
  21. Secretariat fax: +33 493 65 47 16.
  22. */
  23. /*                                                                  */
  24. /*  melp.c: Mixed Excitation LPC speech coder                       */
  25. /*                                                                  */
  26. /*  compiler include files  */
  27. #include <stdio.h>
  28. #include "melp.h"
  29. #include "spbstd.h"
  30. #include "mat.h"
  31. /*  compiler constants */
  32. #define ANA_SYN 0
  33. #define ANALYSIS 1
  34. #define SYNTHESIS 2
  35. /* note: CHSIZE is shortest integer number of words in channel packet */
  36. #define CHSIZE 9
  37. #define NUM_CH_BITS 54
  38. /* global variables for fixed-point library */
  39. int complexity, saturation = 0;
  40. int max_complexity = 0;
  41. /*  external memory */
  42. Shortword melpmode = ANA_SYN;
  43. char in_name[80], out_name[80];
  44. void main(int argc, char **argv)
  45. {
  46.     void parse(int argc, char **argv);
  47.     Shortword i;
  48.     Longword length, frame;
  49.     Shortword eof_reached;
  50.     Longword num_frames = 0;
  51.     Shortword speech_in[FRAME];
  52.     Shortword speech_out[FRAME];
  53.     static struct melp_param melp_par;      /* melp parameters */
  54.     UShortword chbuf[CHSIZE];
  55.     unsigned int tempbuf[CHSIZE];
  56.     FILE *fp_in, *fp_out;
  57.     /* Print user message */
  58.     printf("n2.4 kb/s Federal Standard MELP speech codern");
  59.     printf("  Fixed-point C simulation, version 1.0nn");
  60.     /* Get input parameters from command line */
  61.     parse(argc, argv);
  62.     /* Open input, output, and parameter files */
  63.     if (( fp_in = fopen(in_name,"rb")) == NULL ) {
  64. printf("  ERROR: cannot read file %s.n",in_name);
  65. exit(1);
  66.     }
  67.     if (( fp_out = fopen(out_name,"wb")) == NULL ) {
  68. printf("  ERROR: cannot write file %s.n",out_name);
  69. exit(1);
  70.     }
  71.     /* Check length of channel input if needed */
  72.     if (melpmode == SYNTHESIS) {
  73. fseek(fp_in,0L,2);      /* go to end of input file */
  74. length = ftell(fp_in);
  75. rewind(fp_in);
  76. num_frames = (Longword)(0.5 + length * (8.0/NUM_CH_BITS) * (6.0/32));
  77.     }
  78.     /* Initialize MELP analysis and synthesis */
  79.     if (melpmode != SYNTHESIS)
  80.       melp_ana_init();
  81.     if (melpmode != ANALYSIS)
  82.       melp_syn_init();
  83.     /* Run MELP coder on input signal */
  84.     frame = 0;
  85.     melp_par.chptr = chbuf;
  86.     melp_par.chbit = 0;
  87.     eof_reached = 0;
  88.     while (eof_reached == 0) {
  89. #if (COMPLEXITY_COUNT)
  90. complexity_reset();
  91. #endif
  92. /* Perform MELP analysis */
  93. if (melpmode != SYNTHESIS) {
  94.     /* read input speech */
  95.     length = readbl(speech_in,fp_in,FRAME);
  96.     if (length < FRAME) {
  97. v_zap(&speech_in[length],(Shortword)(FRAME-length));
  98. eof_reached = 1;
  99.     }
  100.     /* Run MELP analyzer */
  101.     if (melpmode == ANA_SYN) {
  102. /* reset pointers to short channel buffer */
  103. melp_par.chptr = chbuf;
  104. melp_par.chbit = 0;
  105.     }
  106.     melp_ana(speech_in,&melp_par);
  107.  
  108.     /* Write channel output if needed */
  109.     if (melpmode == ANALYSIS && melp_par.chbit == 0) {
  110.         for (i = 0; i < CHSIZE; i++)
  111.     tempbuf[i] = (int)chbuf[i];
  112. fwrite((void *) tempbuf,sizeof(int),
  113.        melp_par.chptr-chbuf,fp_out);
  114. /* reset pointer to short channel buffer */
  115. melp_par.chptr = chbuf;
  116.     }
  117.     if (melp_par.chptr >= &chbuf[CHSIZE] && melp_par.chbit > 0) {
  118. printf("nERROR: Ran out of channel buffer memory.n");
  119. exit(1);
  120.     }
  121. }          
  122. /* Perform MELP synthesis (skip first frame) */
  123. if (melpmode != ANALYSIS) {
  124.     if (melpmode == ANA_SYN) {
  125. /* reset pointers to short channel buffer */
  126. melp_par.chptr = chbuf;
  127. melp_par.chbit = 0;
  128.     }
  129.     /* Read channel input if needed */
  130.     if (melpmode == SYNTHESIS && melp_par.chbit == 0) {
  131. fread((void *) tempbuf,sizeof(int),CHSIZE,fp_in);
  132. for (i = 0; i <CHSIZE; i++)
  133.   chbuf[i] = (Shortword)tempbuf[i];
  134. /* reset pointer to short channel buffer */
  135. melp_par.chptr = chbuf;
  136.     }
  137.     melp_syn(&melp_par,speech_out);
  138.     if (frame > 0)
  139.       writebl(speech_out,fp_out,FRAME);
  140. }
  141. frame++; 
  142. if (melpmode == SYNTHESIS) {
  143.     if (frame >= num_frames)
  144.       eof_reached = 1;
  145. }
  146.     }
  147.  
  148.     /* Write channel output if needed */
  149.     if (melpmode == ANALYSIS) {
  150.       if (melp_par.chbit > 0) {
  151.   for (i = 0; i < CHSIZE; i++)
  152.       tempbuf[i] = (int)chbuf[i];
  153.   fwrite((void *) tempbuf,sizeof(int),melp_par.chptr-chbuf+1,fp_out);
  154.       }
  155.       else {
  156.   for (i = 0; i < CHSIZE; i++)
  157.       tempbuf[i] = (int)chbuf[i];
  158.   fwrite((void *) tempbuf,sizeof(int),melp_par.chptr-chbuf,fp_out);
  159.       }
  160.     }
  161. #if (COMPLEXITY_COUNT)
  162.     complexity_print();
  163. #endif
  164.     fclose(fp_in);
  165.     fclose(fp_out);
  166. }
  167. void parse(int argc,char **argv){
  168.     int error_flag;
  169.     error_flag = 0;
  170.     if (argc < 2)
  171.       error_flag = 1;
  172.     melpmode = ANA_SYN;
  173.     while ((--argc>0) && ((*++argv)[0] == '-')){
  174. switch ((*argv)[1]){
  175.   case 'a':
  176.     melpmode=ANALYSIS; break;
  177.   case 's':
  178.     melpmode=SYNTHESIS; break;
  179.   case 'i':
  180.     sscanf(*++argv,"%s",in_name); --argc; break;
  181.   case 'o':
  182.     sscanf(*++argv,"%s",out_name); --argc; break;
  183.   default:
  184.     error_flag = 1;
  185.     break;
  186. }
  187.     }
  188.     if (error_flag == 1) {
  189. fprintf(stderr,"Usage:nn"); 
  190. fprintf(stderr,"Analysis/synthesis: melp -i infile -o outfilen");
  191. fprintf(stderr,"Analysis only:  melp -a -i infile  -o bitfilen"); 
  192. fprintf(stderr,"Synthesis only: melp -s -i bitfile -o outfilen");
  193.         exit(1);
  194.     }
  195.     if (melpmode == ANA_SYN)
  196.       printf(" MELP analysis and synthesis n");
  197.     else if (melpmode == ANALYSIS)
  198.       printf(" MELP analysis n");
  199.     else if (melpmode == SYNTHESIS)
  200.       printf(" MELP synthesis n");
  201.     printf("   input from %sn   output to %s.n",in_name, out_name);
  202. }