ec_main.cpp
上传用户:lqyjxl
上传日期:2015-08-21
资源大小:14k
文件大小:3k
源码类别:

Audio

开发平台:

Visual C++

  1. // file: ec_main.cc
  2. //
  3. // system include files
  4. //
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <memory.h>
  8. #include <math.h>
  9. #include <assert.h>
  10. // local include files
  11. //
  12. #include "ec.h"
  13. #include "ec_constants.h"
  14. extern unsigned char  l2u( short data );
  15. extern short u2l( unsigned char data );
  16. //-----------------------------------------------------------------------------
  17. //
  18. // program: ec_main.cc
  19. // synopsis: echoc.exe
  20. // example: ec.exe  < foo_stereo_echo.raw >  foo_stereo_clean.raw
  21. //
  22. // options: none
  23. //
  24. // arguments: none
  25. //
  26. // note:
  27. //  this program is a fairly hardcoded implementation of a standard
  28. //  echo canceller.
  29. //-----------------------------------------------------------------------------
  30. int
  31. main( int argc, char * argv[] ) 
  32. {
  33.     
  34.   //---------------------------------------------------------------------------
  35.   //
  36.   // process the command line arguments
  37.   //
  38.   //---------------------------------------------------------------------------
  39.   // check the number of arguments
  40.   //
  41.   if ( argc != 4 ) 
  42.   {
  43.     fprintf(stderr, "usage: ec.exe tx_file rx_file out_file");
  44.     return(1);
  45.   }
  46.   FILE * f_tx  = fopen( argv[ 1 ], "rb" );
  47.   FILE * f_rx  = fopen( argv[ 2 ], "rb" );
  48.   FILE * f_out = fopen( argv[ 3 ], "wb+" );
  49.   assert( f_tx != NULL );
  50.   assert( f_rx != NULL );
  51.   assert( f_out != NULL );
  52.   
  53.   // declare an echo canceller object for the reference far-end speech and
  54.   // the near-end speech
  55.   //
  56.   Echo_canceller ec_near;
  57.   
  58.   // initialize the echo canceller
  59.   //
  60.   ec_near.init_cc(DEFAULT_GAMMA, DEFAULT_N, DEFAULT_M, DEFAULT_BETA1,
  61.   DEFAULT_SIGMA_LY, DEFAULT_SIGMA_LU,
  62.   DEFAULT_ALPHA_ST, DEFAULT_ALPHA_YT, DEFAULT_CUTOFF,
  63.   DEFAULT_HANGT, DEFAULT_SUPPR, DEFAULT_TAU);
  64.   
  65.   //---------------------------------------------------------------------------
  66.   //
  67.   // process data
  68.   //
  69.   //---------------------------------------------------------------------------
  70.   
  71.   // main echo cancellation loop
  72.   //
  73.   unsigned char  sig_tx, sig_rx;
  74.   unsigned char  sig_out;
  75.   short  sig_tx_s, sig_rx_s, sig_out_s;
  76.   
  77.   while ( 1 )
  78.   {
  79.   
  80.      if ( fread( &sig_tx, sizeof(sig_tx), (int)1, f_tx ) <= 0 )
  81.         break;
  82.      if ( fread( &sig_rx, sizeof(sig_rx), (int)1, f_rx ) <= 0 )
  83.         break;
  84.     sig_tx_s = u2l( sig_tx );
  85.     sig_rx_s = u2l( sig_rx );
  86.     // process the data
  87.     //
  88.     // sig_out_s = ec_near.clip_cc( ec_near.process_cc( AMPL_SCALE_1 * sig_tx_s, AMPL_SCALE_1 * sig_rx_s ) );
  89.     sig_out_s = (short)( ec_near.process_cc( sig_tx_s, sig_rx_s ) );
  90.         
  91.     // sig_out_s = (short)ec_near.process_cc( sig_tx_s, sig_rx_s );
  92.     // write the output data
  93.     //
  94.     sig_out = l2u( sig_out_s );
  95.     fwrite( &sig_out, sizeof(sig_out), (int)1, f_out );
  96.     // if ( sig_out != sig_rx )
  97.     //     printf( "%2x:%2x ", sig_rx, sig_out );
  98.   }
  99.   // exit gracefully
  100.   //
  101.   fclose( f_tx );
  102.   fclose( f_rx );
  103.   fclose( f_out );
  104.   return(0);
  105. }