encoder.c
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:5k
源码类别:

Symbian

开发平台:

C/C++

  1. /*
  2.  *===================================================================
  3.  *  3GPP AMR Wideband Floating-point Speech Codec
  4.  *===================================================================
  5.  */
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include "typedef.h"
  10. #include "enc_if.h"
  11. /*
  12.  * ENCODER.C
  13.  *
  14.  *    Usage : encoder (-dtx) mode speech_file  bitstream_file
  15.  *
  16.  *    Format for speech_file:
  17.  *      Speech is read from a binary file of 16 bits data.
  18.  *
  19.  *    Format for bitstream_file:
  20.  *        Described in TS26.201
  21.  *
  22.  *    mode = 0..8 (bit rate = 6.60 to 23.85 k)
  23.  *
  24.  *    -dtx if DTX is ON
  25.  */
  26. int main(int argc, char *argv[])
  27. {
  28.    FILE *f_speech = NULL;                 /* File of speech data                   */
  29.    FILE *f_serial = NULL;                 /* File of serial bits for transmission  */
  30.    FILE *f_mode = NULL;                   /* File of modes for each frame          */
  31.    Word32 serial_size, frame;
  32.    Word16 signal[L_FRAME16k];             /* Buffer for speech @ 16kHz             */
  33.    Word16 coding_mode = 0, allow_dtx, mode_file, mode = 0;
  34.    UWord8 serial[NB_SERIAL_MAX];
  35.    void *st;
  36.    fprintf(stderr, "n");
  37.    fprintf(stderr, "===================================================================n");
  38.    fprintf(stderr, " 3GPP AMR-WB Floating-point Speech Coder, v5.0.0, Mar 05, 2002n");
  39.    fprintf(stderr, "===================================================================n");
  40.    fprintf(stderr, "n");
  41.    /*
  42.     * Open speech file and result file (output serial bit stream)
  43.     */
  44.    if ((argc < 4) || (argc > 6))
  45.    {
  46.       fprintf(stderr, "Usage : encoder  (-dtx) mode speech_file  bitstream_filen");
  47.       fprintf(stderr, "n");
  48.       fprintf(stderr, "Format for speech_file:n");
  49.       fprintf(stderr, "  Speech is read form a binary file of 16 bits data.n");
  50.       fprintf(stderr, "n");
  51.       fprintf(stderr, "Format for bitstream_file:n");
  52.       fprintf(stderr, "  Described in TS26.201.n");
  53.       fprintf(stderr, "n");
  54.       fprintf(stderr, "mode: 0 to 8 (9 bits rates) orn");
  55.       fprintf(stderr, "      -modefile filenamen");
  56.       fprintf(stderr, " ===================================================================n");
  57.       fprintf(stderr, " mode   :  (0)  (1)   (2)   (3)   (4)   (5)   (6)   (7)   (8)     n");
  58.       fprintf(stderr, " bitrate: 6.60 8.85 12.65 14.25 15.85 18.25 19.85 23.05 23.85 kbit/sn");
  59.       fprintf(stderr, " ===================================================================n");
  60.       fprintf(stderr, "n");
  61.       fprintf(stderr, "-dtx if DTX is ON, default is OFFn");
  62.       fprintf(stderr, "n");
  63.       exit(0);
  64.    }
  65.    allow_dtx = 0;
  66.    if (strcmp(argv[1], "-dtx") == 0)
  67.    {
  68.       allow_dtx = 1;
  69.       argv++;
  70.    }
  71.    mode_file = 0;
  72.    if (strcmp(argv[1], "-modefile") == 0)
  73.    {
  74.       mode_file = 1;
  75.       argv++;
  76.       if ((f_mode = fopen(argv[1], "r")) == NULL)
  77.       {
  78.          fprintf(stderr, "Error opening input file  %s !!n", argv[1]);
  79.          exit(0);
  80.       }
  81.       fprintf(stderr, "Mode file:  %sn", argv[1]);
  82.    }
  83.    else
  84.    {
  85.       mode = (Word16) atoi(argv[1]);
  86.       if ((mode < 0) || (mode > 8))
  87.       {
  88.          fprintf(stderr, " error in bit rate mode %d: use 0 to 8n", mode);
  89.          exit(0);
  90.       }
  91.    }
  92.    if ((f_speech = fopen(argv[2], "rb")) == NULL)
  93.    {
  94.       fprintf(stderr, "Error opening input file  %s !!n", argv[2]);
  95.       exit(0);
  96.    }
  97.    fprintf(stderr, "Input speech file:  %sn", argv[2]);
  98.    if ((f_serial = fopen(argv[3], "wb")) == NULL)
  99.    {
  100.       fprintf(stderr, "Error opening output bitstream file %s !!n", argv[3]);
  101.       exit(0);
  102.    }
  103.    fprintf(stderr, "Output bitstream file:  %sn", argv[3]);
  104.    /*
  105.     * Initialisation
  106.     */
  107.    st = E_IF_init();
  108.    /*
  109.     * Loop for every analysis/transmission frame.
  110.     *   -New L_FRAME data are read. (L_FRAME = number of speech data per frame)
  111.     *   -Conversion of the speech data from 16 bit integer to real
  112.     *   -Call coder to encode the speech.
  113.     *   -The compressed serial output stream is written to a file.
  114.     */
  115.    fprintf(stderr, "n --- Running ---n");
  116.    frame = 0;
  117.    while (fread(signal, sizeof(Word16), L_FRAME16k, f_speech) == L_FRAME16k)
  118.    {
  119.       if (mode_file)
  120.       {
  121.          if (fscanf(f_mode, "%hd", &mode) == EOF)
  122.          {
  123.             mode = coding_mode;
  124.             fprintf(stderr, "n end of mode control file reachedn");
  125.             fprintf(stderr, " From now on using mode: %hd.n", mode);
  126.             mode_file = 0;
  127.          }
  128.          if ((mode < 0) || (mode > 8))
  129.          {
  130.             fprintf(stderr, " error in bit rate mode %hd: use 0 to 8n", mode);
  131.             E_IF_exit(st);
  132.             fclose(f_speech);
  133.             fclose(f_serial);
  134.             fclose(f_mode);
  135.             exit(0);
  136.          }
  137.       }
  138.       coding_mode = mode;
  139.       frame++;
  140.       fprintf(stderr, " Frames processed: %ldr", frame);
  141.       serial_size = E_IF_encode(st, coding_mode, signal, serial, allow_dtx);
  142.       fwrite(serial, 1, serial_size, f_serial);
  143.    }
  144.    E_IF_exit(st);
  145.    fclose(f_speech);
  146.    fclose(f_serial);
  147.    if (f_mode != NULL)
  148.    {
  149.       fclose(f_mode);
  150.    }
  151.    return 0;
  152. }