sp_coef_cal.cpp
上传用户:gelin96
上传日期:2017-01-08
资源大小:20993k
文件大小:51k
源码类别:

MTK

开发平台:

C++ Builder

  1. /*****************************************************************************
  2. *  Copyright Statement:
  3. *  --------------------
  4. *  This software is protected by Copyright and the information contained
  5. *  herein is confidential. The software may not be copied and the information
  6. *  contained herein may not be used or disclosed except with the written
  7. *  permission of MediaTek Inc. (C) 2005
  8. *
  9. *  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  10. *  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
  11. *  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
  12. *  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
  13. *  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
  14. *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
  15. *  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
  16. *  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
  17. *  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
  18. *  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
  19. *  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
  20. *  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
  21. *
  22. *  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
  23. *  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
  24. *  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
  25. *  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
  26. *  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
  27. *
  28. *  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
  29. *  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
  30. *  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
  31. *  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
  32. *  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
  33. *
  34. *****************************************************************************/
  35. /*****************************************************************************
  36.  *
  37.  * Filename:
  38.  * ---------
  39.  *   sp_coef_cal.cpp
  40.  *
  41.  * Project:
  42.  * --------
  43.  *   Maui META APP
  44.  *
  45.  * Description:
  46.  * ------------
  47.  *  Acoustic FIR coefficient calibration source
  48.  *
  49.  * Author:
  50.  * -------
  51.  *  Andy Ueng (mtk00490)
  52.  *
  53.  *============================================================================
  54.  *             HISTORY
  55.  * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
  56.  *------------------------------------------------------------------------------
  57.  * $Revision$
  58.  * $Modtime$
  59.  * $Log$
  60.  * 
  61.  *------------------------------------------------------------------------------
  62.  * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
  63.  *============================================================================
  64.  ****************************************************************************/
  65. #include <IniFiles.hpp>
  66. #include <stdio.h>
  67. #include <math.h>
  68. #pragma hdrstop
  69. #include "misc.h"
  70. #include "meta_utils.h"
  71. #include "man_active.h"
  72. #include "sp_coef.h"
  73. #include "sp_coef_cal.h"
  74. #include "traceconversion.h"
  75. #define LOG_FLOOR  0.000001
  76. //===========================================================================
  77. static CSPCOEFCAL*  sp_coef_cal_ptr;
  78. static bool g_bIsRunning;
  79. //===========================================================================
  80. //===========================================================================
  81. CSPCOEFCAL::CSPCOEFCAL( void )
  82. {
  83.    g_bIsRunning = false;
  84.    ConfirmCallback = 0;
  85.    CoefCalBufSize = 0;
  86.    CoefCalBuf = 0;
  87. }
  88. //---------------------------------------------------------------------------
  89. CSPCOEFCAL::~CSPCOEFCAL( )
  90. {
  91.    g_bIsRunning = false;
  92.    ConfirmCallback = 0;
  93.    if(CoefCalBuf)
  94.    {
  95.       delete [] CoefCalBuf;
  96.       CoefCalBuf = NULL;
  97.    }
  98.    AFT_close();
  99.    
  100. }
  101. //---------------------------------------------------------------------------
  102. void  CSPCOEFCAL::REQ_Finish( void )
  103. {
  104.    if(!g_bIsRunning)  return;
  105.    Confirm( STATE_COEF_CAL_OK );
  106.    g_bIsRunning = false;
  107. }
  108. //---------------------------------------------------------------------------
  109. void  CSPCOEFCAL::REQ_Stop( void )
  110. {
  111.    if(!g_bIsRunning)  return;
  112.    META_Cancel_r( m_META_HANDLE_Obj.Get_MainHandle(), SPID_COEF_CAL );
  113.    Confirm( STATE_COEF_CAL_STOP );
  114.    g_bIsRunning = false;
  115. }
  116. //---------------------------------------------------------------------------
  117. void  CSPCOEFCAL::REQ_TimeOut( void )
  118. {
  119.    if(!g_bIsRunning)  return;
  120.    META_Cancel_r( m_META_HANDLE_Obj.Get_MainHandle(), SPID_COEF_CAL );
  121.    Confirm( STATE_COEF_CAL_TIMEOUT );
  122.    g_bIsRunning = false;
  123. }
  124. //---------------------------------------------------------------------------
  125. void  CSPCOEFCAL::Confirm( int confirm_state )
  126. {
  127.    if(!g_bIsRunning)  return;
  128.    if(ConfirmCallback==0)  return;
  129.    ConfirmState = confirm_state;
  130.    ActiveMan->SetActiveFunction( ConfirmCallback );
  131. }
  132. //---------------------------------------------------------------------------
  133. bool  CSPCOEFCAL::REQ_Read_TRC_File( char *filename, double* p_TrcScale, sSpCoefCalParameters *p_SpCoefCal )
  134. {
  135.     FILE *fp;
  136.     unsigned int i;
  137.     char str[512];
  138.     AnsiString as_Str;
  139.     bool isMatch = false;
  140.     for( i=0; i<TOTAL_TRC_FREQ_NUM; i++ )
  141.     {
  142.         p_SpCoefCal->Hz[i] = 0;
  143.         p_SpCoefCal->Mag[i] = 0;
  144.         p_SpCoefCal->MagdB[i] = 0;
  145.     }
  146.     fp = fopen(filename, "r");
  147.     if(fp == NULL)
  148.     return false;
  149.     for( i=0; i<TRC_FREQ_POSITION; i++ )
  150.     {
  151.         if( feof(fp) )
  152.             return  false;
  153.         fscanf( fp, "%s", &str);
  154.     }
  155.     as_Str = str;
  156.     p_SpCoefCal->num = as_Str.ToInt();
  157.     while(!feof(fp))
  158.     {
  159.         fscanf( fp, "%s", &str);
  160.         if( strcmpi(str, "#----X-------------Y---------") == 0)
  161.         {
  162.             isMatch = true;
  163.             break;
  164.         }
  165.     }
  166.     if( !isMatch )
  167.     {
  168.         fclose(fp);
  169.         return false;
  170.     }
  171.     for( i=0; i<2*p_SpCoefCal->num; i++ )
  172.     {
  173.         fscanf( fp, "%s", &str);
  174.         if( i % 2 == 0 )
  175.         {
  176.             as_Str = str;
  177.             p_SpCoefCal->Hz[i/2] = as_Str.ToInt();
  178.         }
  179.         else
  180.         {
  181.             as_Str = str;
  182.             p_SpCoefCal->Mag[i/2] = atof(as_Str.c_str());
  183.            // getYfromStr( as_Str, &TrcFreq[i] );
  184.         }
  185.     }
  186.     for( i=0; i<SCALING_FACTOR_POSITION; i++)
  187.     {
  188.         fscanf( fp, "%s", &str);
  189.     }
  190.     as_Str = str;
  191.     *p_TrcScale = atof(as_Str.c_str());
  192.     if( *p_TrcScale == 0.0 ) *p_TrcScale = 1.0;
  193.     if( p_SpCoefCal->Hz[p_SpCoefCal->num-1] > 3960.0 )
  194.     {
  195.         p_SpCoefCal->num--;
  196.     }
  197.     for( i=0; i<p_SpCoefCal->num; i++ )
  198.     {
  199.         p_SpCoefCal->Mag[i] = p_SpCoefCal->Mag[i] / (*p_TrcScale);
  200.         p_SpCoefCal->MagdB[i] = 20.0 * log10(p_SpCoefCal->Mag[i]);
  201.         sprintf(str, "%.3f",  p_SpCoefCal->MagdB[i]);
  202.         as_Str = (AnsiString) str;
  203.         p_SpCoefCal->MagdB[i] = atof(as_Str.c_str());
  204.     }
  205.     fclose(fp);
  206.     return true;
  207. }
  208. //==============================================================================
  209. bool  CSPCOEFCAL::REQ_Read_FIR_File( char *filename, bool b_45TapSupport, sFirCoefParameters *p_FirCoef )
  210. {
  211.     FILE *fp;
  212.     char str[512];
  213.     AnsiString as_Str;
  214.     fp = fopen(filename, "r");
  215.     if(fp == NULL)
  216.         return false;
  217.     // get taps
  218.     fscanf( fp, "%s", &str);
  219.     as_Str = (AnsiString) str;
  220.     p_FirCoef->taps = as_Str.ToInt();
  221.     if( b_45TapSupport )
  222.     {
  223.         if( p_FirCoef->taps > SPEECH_FIR_45_TAPS_NUM )
  224.         {
  225.             p_FirCoef->taps = SPEECH_FIR_45_TAPS_NUM;
  226.         }
  227.     }
  228.     else
  229.     {
  230.         if( p_FirCoef->taps > SPEECH_FIR_30_TAPS_NUM )
  231.         {
  232.             p_FirCoef->taps = SPEECH_FIR_30_TAPS_NUM;
  233.         }
  234.     }
  235.     for (unsigned int i=0; i<p_FirCoef->taps; i++)
  236.     {
  237.          fscanf( fp, "%s", &str);
  238.          as_Str = (AnsiString) str;
  239.          p_FirCoef->FirCoef[i] = atof(as_Str.c_str());
  240.     }
  241.     if( p_FirCoef->taps <= 0 )
  242.     {
  243.         p_FirCoef->taps = 4;
  244.         p_FirCoef->FirCoef[0] = FIR_COEFF_SCALE;
  245.         p_FirCoef->FirCoef[1] =               0;
  246.         p_FirCoef->FirCoef[2] =               0;
  247.         p_FirCoef->FirCoef[3] =               0;
  248.     }
  249.     fclose(fp);
  250.     return true;
  251. }
  252. //------------------------------------------------------------------------------
  253. bool  CSPCOEFCAL::REQ_Write_FIR_File( char *filename, sFirCoefParameters *p_FirCoef )
  254. {
  255.     FILE *fp;
  256.     char str[512];
  257.     AnsiString as_Str;
  258.     fp = fopen(filename, "w");
  259.     if(fp == NULL)
  260.         return false;
  261.     fprintf( fp, "%dn", (int) p_FirCoef->taps);
  262.     for (unsigned int i=0; i<p_FirCoef->taps; i++)
  263.     {
  264.         fprintf( fp, "%dn", (int) p_FirCoef->FirCoef[i]);
  265.     }
  266.     fclose(fp);
  267.     return  true;
  268. }
  269. #if 0
  270. //------------------------------------------------------------------------------
  271. bool  CSPCOEFCAL::CheckLicenseDat( void )
  272. {
  273.     FILE *fp;
  274.     AnsiString asPath, asFileName;
  275.     if ( getPathFromStr(Application->ExeName, asPath) &&
  276.          withPath( asPath) &&
  277.          !withPath( asFileName)
  278.        )
  279.     {
  280.        asFileName = asPath + "license.dat";
  281.     }
  282.     fp = fopen(asFileName.c_str(), "r");
  283.     if( fp == NULL )
  284.     {
  285.         fclose(fp);
  286.         return false;
  287.     }
  288.     fclose(fp);
  289.     return true;
  290. }
  291. #endif
  292. //==============================================================================
  293. void CSPCOEFCAL::ReorderFirCoef(sFirCoefParameters *p_FirCoef)
  294. {
  295.     double temp_old_fir_coeffs[SPEECH_FIR_45_TAPS_NUM];
  296.     for (unsigned int i=0; i<p_FirCoef->taps; i++ )
  297.     {
  298.         temp_old_fir_coeffs[i] = p_FirCoef->FirCoef[i];
  299.     }
  300.     for (unsigned int i=0; i<p_FirCoef->taps; i++)
  301.     {
  302.         p_FirCoef->FirCoef[i] = temp_old_fir_coeffs[p_FirCoef->taps-1-i];
  303.     }
  304. }
  305. //==============================================================================
  306. void  CSPCOEFCAL::getSelHzIndex(int *p_TplHz, int *p_SelHz, int* p_SelHzIndex)
  307. {
  308.     int k=0;
  309.     for( int i=0; i<TOTAL_TRC_FREQ_NUM; i++ )
  310.     {
  311.         for( int j=0; j<TOTAL_SEL_FREQ_NUM; j++)
  312.         {
  313.             if( *(p_TplHz+i) == *(p_SelHz+j) )
  314.             {
  315.                 p_SelHzIndex[k]=i;
  316.                 k++;
  317.                 break;
  318.             }
  319.         }
  320.     }
  321. }
  322. //-----------------------------------------------------------------------------
  323. void  CSPCOEFCAL::getSeldB( double *p_TpldB, double *p_SeldB, int* p_SelHzIndex)
  324. {
  325.     for(int i=0; i<TOTAL_SEL_FREQ_NUM; i++)
  326.     {
  327.         *(p_SeldB+i) =  *(p_TpldB+*(p_SelHzIndex+i));
  328.     }
  329. }
  330. //==============================================================================
  331. #if 0
  332. bool  CSPCOEFCAL::CheckEngineExist( void )
  333. {
  334.     // engine test code
  335.     Engine  *mat;
  336.     mat = engOpen( "" );
  337.     if( mat == NULL )
  338.     {
  339.         return  false;
  340.     }
  341. }
  342. #endif
  343. //--------------------------------------------------------------------------
  344. AFT_RESULT  CSPCOEFCAL::freqz( bool b_45TapSupport, sFirCoefParameters  *p_old_FIR, sSpCoefCalParameters  *p_ProcessSpCoef, double Fs, sSpCoefCalParameters *p_OldFirSpCoef)
  345. {
  346.     AFT_RESULT    ret;
  347.     sSpCoefCalParameters r_OldFirSpCoef, i_OldFirSpCoef;
  348.     double  Process_Hz[TOTAL_TRC_FREQ_NUM];
  349.     double  *p_old_FIR_Coeffs, *p_UnitArray, *p_process_Hz, *p_old_fir_mag, *p_i_old_fir_mag;
  350.     double  pi = 3.1416;
  351.     char  buf[BUFFER_SIZE];
  352.     // output
  353.     int    nResp;
  354.     double *daRespReal = NULL;
  355.     double *daRespImag = NULL;
  356.     // added for taps<30
  357.     if( b_45TapSupport )
  358.     {
  359.         for (unsigned int i=p_old_FIR->taps; i<SPEECH_FIR_45_TAPS_NUM; i++)
  360.         {
  361.             p_old_FIR->FirCoef[i] = 0.0;
  362.         }
  363.     }
  364.     else
  365.     {
  366.         for (unsigned int i=p_old_FIR->taps; i<SPEECH_FIR_30_TAPS_NUM; i++)
  367.         {
  368.             p_old_FIR->FirCoef[i] = 0.0;
  369.         }
  370.     }
  371.     // end of added
  372.     for (unsigned int i=0; i<p_ProcessSpCoef->num; i++)
  373.     {
  374.         Process_Hz[i] = p_ProcessSpCoef->Hz[i]/Fs*(2*pi);
  375.     }
  376.     ret = AFT_freqz(
  377. &nResp,
  378. &daRespReal,
  379. &daRespImag,
  380. p_old_FIR->FirCoef,
  381. p_old_FIR->taps,
  382. p_ProcessSpCoef->Hz,
  383. p_ProcessSpCoef->num,
  384. Fs
  385. );
  386.     if( ret )
  387.         return ret;
  388.     p_OldFirSpCoef->num = p_ProcessSpCoef->num;
  389.     for (unsigned int i=0; i<p_OldFirSpCoef->num; i++)
  390.     {
  391.         r_OldFirSpCoef.Mag[i] = *(daRespReal + i);
  392.         i_OldFirSpCoef.Mag[i] = *(daRespImag + i);
  393.         p_OldFirSpCoef->Mag[i] = sqrt(pow(r_OldFirSpCoef.Mag[i], 2.0) + pow(i_OldFirSpCoef.Mag[i],2.0));
  394.         p_OldFirSpCoef->MagdB[i] = 20.0*log10( p_OldFirSpCoef->Mag[i] );
  395.     }
  396.     return ret;
  397. }
  398. //------------------------------------------------------------------------------
  399. AFT_RESULT  CSPCOEFCAL::firls( int wanted_ord, sSpCoefCalParameters  *p_ProcessOddSpCoef, sSpCoefCalParameters *p_NewFirOddSpCoef, double Fs, sFirCoefParameters *p_NewFirCoeffF1)
  400. {
  401.     AFT_RESULT    ret;
  402.     double  d_wanted_ord[1], ProcessOddHz[TOTAL_TRC_FREQ_NUM+2];
  403.     double  *p_wanted_ord, *p_new_fir_mag_odd, *p_process_Hz_odd, *p_new_fir_coeff_F1;
  404.     sSpCoefCalParameters  process_Hz_odd, new_fir_mag_odd;
  405.     double  *p_weight;
  406.     int taps;
  407.     p_weight = new double[p_ProcessOddSpCoef->num/2];
  408.     for (unsigned int i=0; i<p_ProcessOddSpCoef->num/2; i++)
  409.     {
  410.         *(p_weight + i) = 1.0;
  411.     }
  412.     for (unsigned int i=0; i<p_ProcessOddSpCoef->num; i++)
  413.     {
  414.         ProcessOddHz[i] = p_ProcessOddSpCoef->Hz[i]/(Fs/2.0);
  415.     }
  416.     for (unsigned int i=p_ProcessOddSpCoef->num; i<TOTAL_TRC_FREQ_NUM+2; i++)
  417.     {
  418.         ProcessOddHz[i] = p_ProcessOddSpCoef->Hz[p_ProcessOddSpCoef->num-1]/(Fs/2.0);
  419.     }
  420.     ret = AFT_firls(
  421. &taps,
  422. &p_new_fir_coeff_F1,
  423. wanted_ord,
  424. ProcessOddHz,
  425. p_ProcessOddSpCoef->num,
  426. p_NewFirOddSpCoef->Mag,
  427. p_ProcessOddSpCoef->num,
  428. p_weight,
  429. p_ProcessOddSpCoef->num/2);
  430.     if( ret )
  431.         return ret;
  432.     p_NewFirCoeffF1->taps = wanted_ord + 1;
  433.     for (unsigned int i=0; i<p_NewFirCoeffF1->taps; i++)
  434.     {
  435.         p_NewFirCoeffF1->FirCoef[i] = *(p_new_fir_coeff_F1 + i);
  436.     }
  437.     return ret;
  438. }
  439. //--------------------------------------------------------------------------
  440. const char*  CSPCOEFCAL::Get_ErrorString(AFT_RESULT code)
  441. {
  442.     return AFT_getErrorString(code);
  443. }
  444. #if 0
  445. //--------------------------------------------------------------------------
  446. bool  CSPCOEFCAL::freqz( bool b_45TapSupport, sFirCoefParameters  *p_old_FIR, sSpCoefCalParameters  *p_ProcessSpCoef, double Fs, sSpCoefCalParameters *p_OldFirSpCoef)
  447. {
  448.     sSpCoefCalParameters r_OldFirSpCoef, i_OldFirSpCoef;
  449.     double  Process_Hz[TOTAL_TRC_FREQ_NUM];
  450.     double  *p_old_FIR_Coeffs, *p_UnitArray, *p_process_Hz, *p_old_fir_mag, *p_i_old_fir_mag;
  451.     double  dUnitArray[1] = {1.0};
  452.    // double  Fs = 8000.0,pi = 3.1416;
  453.     double  pi = 3.1416;
  454.     char  buf[BUFFER_SIZE];
  455.     int  nlhs=1, nrhs = 3;
  456.     int  i;
  457.     mxArray  *mx_old_FIR_Coeffs = NULL, *mx_UnitArray, *mx_process_Hz=NULL, *mx_old_fir_mag=NULL, *mx_i_old_fir_mag=NULL;
  458.     mxArray *plhs[1], *prhs[3];
  459.     if( b_45TapSupport )
  460.     {
  461.         // added for taps<45
  462.         for(i=p_old_FIR->taps; i<SPEECH_FIR_45_TAPS_NUM; i++)
  463.         {
  464.             p_old_FIR->FirCoef[i] = 0.0;
  465.         }
  466.     }
  467.     else
  468.     {
  469.         // added for taps<30
  470.         for(i=p_old_FIR->taps; i<SPEECH_FIR_30_TAPS_NUM; i++)
  471.         {
  472.             p_old_FIR->FirCoef[i] = 0.0;
  473.         }
  474.     }
  475.     // end of added
  476.     for(i=0; i<p_ProcessSpCoef->num; i++)
  477.     {
  478.         Process_Hz[i] = p_ProcessSpCoef->Hz[i]/Fs*(2*pi);
  479.     }
  480.     if( b_45TapSupport )
  481.     {
  482.         mx_old_FIR_Coeffs = mxCreateDoubleMatrix(SPEECH_FIR_45_TAPS_NUM, 1, mxREAL);
  483.     }
  484.     else
  485.     {
  486.         mx_old_FIR_Coeffs = mxCreateDoubleMatrix(SPEECH_FIR_30_TAPS_NUM, 1, mxREAL);
  487.     }
  488.    // mx_old_FIR_Coeffs = mxCreateDoubleMatrix(p_old_FIR->taps, 1, mxREAL);
  489.     mx_UnitArray = mxCreateDoubleMatrix(1, 1, mxREAL);
  490.     //mx_process_Hz = mxCreateDoubleMatrix(TOTAL_TRC_FREQ_NUM, 1, mxREAL);
  491.     mx_process_Hz = mxCreateDoubleMatrix(p_ProcessSpCoef->num, 1, mxREAL);
  492.    // mx_old_fir_mag = mxCreateDoubleMatrix(TOTAL_TRC_FREQ_NUM, 1, mxCOMPLEX);  // output
  493.     mx_old_fir_mag = mxCreateDoubleMatrix(TOTAL_TRC_FREQ_NUM, 1, mxCOMPLEX);  // output
  494.     p_old_FIR_Coeffs = mxGetPr( mx_old_FIR_Coeffs );
  495.     p_process_Hz = mxGetPr( mx_process_Hz );
  496.     p_UnitArray = mxGetPr( mx_UnitArray );
  497.    // p_old_fir_mag = mxGetPr( mx_old_fir_mag );
  498.     memcpy( (void *) p_old_FIR_Coeffs, p_old_FIR->FirCoef, sizeof(p_old_FIR->FirCoef) );
  499.    // memcpy( (void *) p_old_FIR_Coeffs, p_old_FIR->FirCoef, p_old_FIR->taps );
  500.     memcpy( (void *) p_UnitArray, dUnitArray, sizeof(dUnitArray) );
  501.    // memcpy( (void *) p_process_Hz, Process_Hz, sizeof(Process_Hz) );
  502.     memcpy( (void *) p_process_Hz, Process_Hz, (p_ProcessSpCoef->num)*sizeof(double) );
  503.     prhs[0] = mx_old_FIR_Coeffs;
  504.     prhs[1] = mx_UnitArray;
  505.     prhs[2] = mx_process_Hz;
  506.     plhs[0] = mx_old_fir_mag;
  507.    // plhs[1] = i_old_fir_mag;
  508.     InitializeModule_freqz();
  509.     InitializeModule_psdoptions();
  510.     mlxFreqz(nlhs, plhs, nrhs, prhs);
  511.     p_old_fir_mag = mxGetPr( plhs[0] );
  512.     p_i_old_fir_mag = mxGetPi( plhs[0] );
  513.     p_OldFirSpCoef->num = p_ProcessSpCoef->num;
  514.     for( i=0; i<p_OldFirSpCoef->num; i++ )
  515.     {
  516.         r_OldFirSpCoef.Mag[i] = *(p_old_fir_mag + i);
  517.         i_OldFirSpCoef.Mag[i] = *(p_i_old_fir_mag + i);
  518.         p_OldFirSpCoef->Mag[i] = sqrt(pow(r_OldFirSpCoef.Mag[i], 2.0) + pow(i_OldFirSpCoef.Mag[i],2.0));
  519.         p_OldFirSpCoef->MagdB[i] = 20.0*log10( p_OldFirSpCoef->Mag[i] );
  520.     }
  521.     TerminateModule_freqz();
  522.     TerminateModule_psdoptions();
  523.     // free mxArray memory
  524.     mxDestroyArray( mx_old_FIR_Coeffs );
  525.     mxDestroyArray( mx_process_Hz );
  526.     mxDestroyArray( mx_UnitArray );
  527.     mxDestroyArray( mx_old_fir_mag );
  528. }
  529. //---------------------------------------------------------------------------
  530. void  CSPCOEFCAL::freqz2out( bool b_45TapSupport, sFirCoefParameters  *p_new_fir_coeff_F_normalized_fixed_point, double N, double freqz_N, double Fs, sFirRespParameters *p_FirResp_freqz_H, sFirRespParameters *p_FirResp_freqz_F  )
  531. {
  532.     int  i;
  533.     int  nlhs, nrhs;
  534.     mxArray *plhs[2], *prhs[4];
  535.     mxArray  *mx_new_fir_coeff_F_normalized_fx_div=NULL, *mx_UnitArray=NULL, *mx_freqz_N=NULL, *mx_Fs=NULL;
  536.     mxArray  *mx_freqz_H=NULL, *mx_freqz_F=NULL;
  537.     double   *p_mx_new_fir_coeff_F_normalized_fx_div, *p_mx_UnitArray, *p_mx_freqz_N, *p_mx_Fs;
  538.     double   *p_r_mx_freqz_H, *p_i_mx_freqz_H, *p_mx_freqz_F;
  539.     double  dUnitArray[1], d_freqz_N_Array[1], d_Fs_Array[1];
  540.     double  freqz_H_real, freqz_H_image;
  541.     double new_fir_coeff_F_normalized_fx_div[SPEECH_FIR_45_TAPS_NUM];
  542. //    new_fir_coeff_F_normalized_fixed_point_div.taps = p_new_fir_coeff_F_normalized_fixed_point->taps;
  543.     for( i=0; i<p_new_fir_coeff_F_normalized_fixed_point->taps; i++ )
  544.     {
  545.          new_fir_coeff_F_normalized_fx_div[i] = p_new_fir_coeff_F_normalized_fixed_point->FirCoef[i]/FIR_COEFF_SCALE;
  546.     }
  547.     if( b_45TapSupport )
  548.     {
  549.         for( i=p_new_fir_coeff_F_normalized_fixed_point->taps; i<=SPEECH_FIR_45_TAPS_NUM; i++ )
  550.         {
  551.             new_fir_coeff_F_normalized_fx_div[i] = 0;
  552.         }
  553.     }
  554.     else
  555.     {
  556.         for( i=p_new_fir_coeff_F_normalized_fixed_point->taps; i<=SPEECH_FIR_30_TAPS_NUM; i++ )
  557.         {
  558.             new_fir_coeff_F_normalized_fx_div[i] = 0;
  559.         }
  560.     }
  561.     dUnitArray[0] = N;
  562.     d_freqz_N_Array[0] = freqz_N;
  563.     d_Fs_Array[0] = Fs;
  564.     // create mx arrary
  565.     if( b_45TapSupport )
  566.     {
  567.         mx_new_fir_coeff_F_normalized_fx_div = mxCreateDoubleMatrix(SPEECH_FIR_45_TAPS_NUM, 1, mxREAL);
  568.     }
  569.     else
  570.     {
  571.         mx_new_fir_coeff_F_normalized_fx_div = mxCreateDoubleMatrix(SPEECH_FIR_30_TAPS_NUM, 1, mxREAL);
  572.     }
  573.     mx_UnitArray = mxCreateDoubleMatrix(1, 1, mxREAL);
  574.     mx_freqz_N = mxCreateDoubleMatrix(1, 1, mxREAL);
  575.     mx_Fs = mxCreateDoubleMatrix(1, 1, mxREAL);
  576.     mx_freqz_H = mxCreateDoubleMatrix(1024, 1, mxCOMPLEX); // output
  577.     mx_freqz_F = mxCreateDoubleMatrix(1024, 1, mxREAL); // output
  578.     // set pointer to input mx array
  579.     p_mx_new_fir_coeff_F_normalized_fx_div = mxGetPr( mx_new_fir_coeff_F_normalized_fx_div );
  580.     p_mx_UnitArray = mxGetPr( mx_UnitArray );
  581.     p_mx_freqz_N = mxGetPr( mx_freqz_N );
  582.     p_mx_Fs = mxGetPr( mx_Fs );
  583.     // copy to input mx array
  584.     memcpy( (void *) p_mx_new_fir_coeff_F_normalized_fx_div, new_fir_coeff_F_normalized_fx_div, sizeof(new_fir_coeff_F_normalized_fx_div) );
  585.     memcpy( (void *) p_mx_UnitArray, dUnitArray, sizeof(dUnitArray) );
  586.     memcpy( (void *) p_mx_freqz_N, d_freqz_N_Array, sizeof(d_freqz_N_Array) );
  587.     memcpy( (void *) p_mx_Fs, d_Fs_Array, sizeof(d_Fs_Array) );
  588.     // set parameter
  589.     prhs[0] = mx_new_fir_coeff_F_normalized_fx_div;
  590.     prhs[1] = mx_UnitArray;
  591.     prhs[2] = mx_freqz_N;
  592.     prhs[3] = mx_Fs;
  593.     plhs[0] = mx_freqz_H;
  594.     plhs[1] = mx_freqz_F;
  595.     nlhs=2, nrhs=4;
  596.     InitializeModule_freqz();
  597.     InitializeModule_psdoptions();
  598.     libmatlbmxInitialize();
  599.     libmmfile_defsInitialize();
  600. //    InitializeModule_libmmfile();
  601.     libmmfileInitialize();
  602.     //InitializeModule_db();
  603.     mlxFreqz(nlhs, plhs, nrhs, prhs);
  604.     // extract output
  605.     p_r_mx_freqz_H = mxGetPr( plhs[0] );
  606.     p_i_mx_freqz_H = mxGetPr( plhs[0] );
  607.     p_mx_freqz_F = mxGetPr( plhs[1] );
  608.     p_FirResp_freqz_H->dimension =freqz_N;
  609.     for( i=0; i<p_FirResp_freqz_H->dimension; i++ )
  610.     {
  611.         freqz_H_real = *(p_r_mx_freqz_H+i);
  612.         freqz_H_image = *(p_i_mx_freqz_H+i);
  613.         p_FirResp_freqz_H->FirResp[i] = sqrt(pow(freqz_H_real, 2.0) + pow(freqz_H_image,2.0));
  614.     }
  615.     p_FirResp_freqz_F->dimension =freqz_N;
  616.     for( i=0; i<p_FirResp_freqz_F->dimension; i++ )
  617.     {
  618.         p_FirResp_freqz_F->FirResp[i] = *(p_mx_freqz_F+i);
  619.     }
  620.     //TerminateModule_db();
  621.   //  TerminateModule_libmmfile();
  622.     libmmfileTerminate();
  623.     libmmfile_defsTerminate();
  624.     libmatlbmxTerminate();
  625.     TerminateModule_freqz();
  626.     TerminateModule_psdoptions();
  627.     // free mxArray memory
  628.     mxDestroyArray( mx_new_fir_coeff_F_normalized_fx_div );
  629.     mxDestroyArray( mx_UnitArray );
  630.     mxDestroyArray( mx_freqz_N );
  631.     mxDestroyArray( mx_Fs );
  632.     mxDestroyArray( mx_freqz_H );
  633.     mxDestroyArray( mx_freqz_F );
  634. }
  635. //------------------------------------------------------------------------------
  636. bool  CSPCOEFCAL::firls( bool b_45TapSupport, int wanted_ord, sSpCoefCalParameters  *p_ProcessOddSpCoef, sSpCoefCalParameters *p_NewFirOddSpCoef, double Fs, sFirCoefParameters *p_NewFirCoeffF1)
  637. {
  638. //    double  Fs = 8000.0;
  639.     double  d_wanted_ord[1], ProcessOddHz[TOTAL_TRC_FREQ_NUM+2];
  640.     double  *p_wanted_ord, *p_new_fir_mag_odd, *p_process_Hz_odd, *p_new_fir_coeff_F1;
  641.     sSpCoefCalParameters  process_Hz_odd, new_fir_mag_odd;
  642.     int  i, nlhs=1, nrhs = 3;
  643.     mxArray  *mx_wanted_ord = NULL, *mx_process_Hz_odd = NULL, *mx_new_fir_mag_odd = NULL, *mx_new_fir_coeff_F1 = NULL;
  644.     mxArray *plhs[1], *prhs[3];
  645.     for( i=0; i<p_ProcessOddSpCoef->num; i++ )
  646.     {
  647.         ProcessOddHz[i] = p_ProcessOddSpCoef->Hz[i]/(Fs/2.0);
  648.     }
  649.     for( i=p_ProcessOddSpCoef->num; i<TOTAL_TRC_FREQ_NUM+2; i++ )
  650.     {
  651.         ProcessOddHz[i] = p_ProcessOddSpCoef->Hz[p_ProcessOddSpCoef->num-1]/(Fs/2.0);
  652.     }
  653.     d_wanted_ord[0]=wanted_ord;
  654.     mx_wanted_ord = mxCreateDoubleMatrix(1, 1, mxREAL);
  655.     //mx_process_Hz_odd = mxCreateDoubleMatrix( TOTAL_TRC_FREQ_NUM+2, 1, mxREAL );
  656.     mx_process_Hz_odd = mxCreateDoubleMatrix( p_ProcessOddSpCoef->num, 1, mxREAL );
  657.     //mx_new_fir_mag_odd = mxCreateDoubleMatrix( TOTAL_TRC_FREQ_NUM+2, 1, mxREAL );
  658.     mx_new_fir_mag_odd = mxCreateDoubleMatrix( p_NewFirOddSpCoef->num, 1, mxREAL );
  659.     if( b_45TapSupport )
  660.     {
  661.         mx_new_fir_coeff_F1 = mxCreateDoubleMatrix( 1, SPEECH_FIR_45_TAPS_NUM, mxREAL );
  662.     }
  663.     else
  664.     {
  665.         mx_new_fir_coeff_F1 = mxCreateDoubleMatrix( 1, SPEECH_FIR_30_TAPS_NUM, mxREAL );
  666.     }
  667.     p_wanted_ord = mxGetPr( mx_wanted_ord );
  668.     p_process_Hz_odd = mxGetPr( mx_process_Hz_odd );
  669.     p_new_fir_mag_odd = mxGetPr( mx_new_fir_mag_odd );
  670.     //memcpy( (void *) p_process_Hz_odd, d_process_Hz_odd, sizeof(d_wanted_ord) );
  671.     memcpy( (void *) p_wanted_ord, d_wanted_ord, sizeof(d_wanted_ord) );
  672.     //int size = p_ProcessOddSpCoef->num* sizeof(double);
  673.     //memcpy( (void *) p_process_Hz_odd, ProcessOddHz, sizeof(ProcessOddHz) );
  674.     memcpy( (void *) p_process_Hz_odd, ProcessOddHz, (p_ProcessOddSpCoef->num)*sizeof(double) );
  675.     //memcpy( (void *) p_new_fir_mag_odd, p_NewFirOddSpCoef->Mag, sizeof(p_NewFirOddSpCoef->Mag) );
  676.     memcpy( (void *) p_new_fir_mag_odd, p_NewFirOddSpCoef->Mag, (p_NewFirOddSpCoef->num)*sizeof(double) );
  677.     prhs[0] = mx_wanted_ord;
  678.     prhs[1] = mx_process_Hz_odd;
  679.     prhs[2] = mx_new_fir_mag_odd;
  680.     plhs[0] = mx_new_fir_coeff_F1;
  681.     InitializeModule_firls();
  682.     InitializeModule_signal_private_firchk();
  683.     InitializeModule_sinc();
  684.     mlxFirls(nlhs, plhs, nrhs, prhs);
  685.     p_new_fir_coeff_F1 =  mxGetPr( plhs[0] );
  686.     p_NewFirCoeffF1->taps = wanted_ord + 1;
  687.     for(int i=0; i<p_NewFirCoeffF1->taps; i++)
  688.     {
  689.         p_NewFirCoeffF1->FirCoef[i] = *(p_new_fir_coeff_F1 + i);
  690.     }
  691.     TerminateModule_sinc();
  692.     TerminateModule_signal_private_firchk();
  693.     TerminateModule_firls();
  694.     // free mxArray memory
  695.     mxDestroyArray( mx_wanted_ord );
  696.     mxDestroyArray( mx_process_Hz_odd );
  697.     mxDestroyArray( mx_new_fir_mag_odd );
  698.     mxDestroyArray( mx_new_fir_coeff_F1 );
  699. }
  700. //------------------------------------------------------------------------------
  701. void  CSPCOEFCAL::firls4input( bool b_45TapSupport, int wanted_ord, sSpCoefCalParameters  *p_ProcessOddSpCoef, sSpCoefCalParameters *p_NewFirOddSpCoef, sWeightParameters *p_Weight, double Fs, sFirCoefParameters *p_NewFirCoeffF1)
  702. {
  703. //    double  Fs = 8000.0;
  704.     double  d_wanted_ord[1], ProcessOddHz[TOTAL_TRC_FREQ_NUM+2];
  705.     double  *p_mx_wanted_ord, *p_mx_new_fir_mag_odd, *p_mx_process_Hz_odd, *p_mx_weight;
  706.     double  *p_mx_new_fir_coeff_F1;  // output
  707.     sSpCoefCalParameters  process_Hz_odd, new_fir_mag_odd;
  708.     int  i, nlhs, nrhs;
  709.     mxArray  *mx_wanted_ord = NULL, *mx_process_Hz_odd = NULL, *mx_new_fir_mag_odd = NULL, *mx_weight=NULL;
  710.     mxArray  *mx_new_fir_coeff_F1 = NULL; //output
  711.     mxArray *plhs[1], *prhs[4];
  712.     for( i=0; i<p_ProcessOddSpCoef->num; i++ )
  713.     {
  714.         ProcessOddHz[i] = p_ProcessOddSpCoef->Hz[i]/(Fs/2.0);
  715.     }
  716.     for( i=p_ProcessOddSpCoef->num; i<TOTAL_TRC_FREQ_NUM+2; i++ )
  717.     {
  718.         ProcessOddHz[i] = p_ProcessOddSpCoef->Hz[p_ProcessOddSpCoef->num-1]/(Fs/2.0);
  719.     }
  720.     d_wanted_ord[0]=wanted_ord;
  721.     mx_wanted_ord = mxCreateDoubleMatrix(1, 1, mxREAL);
  722.     mx_process_Hz_odd = mxCreateDoubleMatrix( p_ProcessOddSpCoef->num, 1, mxREAL );
  723.     mx_new_fir_mag_odd = mxCreateDoubleMatrix( p_NewFirOddSpCoef->num, 1, mxREAL );
  724.     mx_weight = mxCreateDoubleMatrix( p_Weight->num, 1, mxREAL );
  725.     if( b_45TapSupport )
  726.     {
  727.         mx_new_fir_coeff_F1 = mxCreateDoubleMatrix( 1, SPEECH_FIR_45_TAPS_NUM, mxREAL ); // output
  728.     }
  729.     else
  730.     {
  731.         mx_new_fir_coeff_F1 = mxCreateDoubleMatrix( 1, SPEECH_FIR_30_TAPS_NUM, mxREAL ); // output
  732.     }
  733.     p_mx_wanted_ord = mxGetPr( mx_wanted_ord );
  734.     p_mx_process_Hz_odd = mxGetPr( mx_process_Hz_odd );
  735.     p_mx_new_fir_mag_odd = mxGetPr( mx_new_fir_mag_odd );
  736.     p_mx_weight = mxGetPr( mx_weight );
  737.     memcpy( (void *) p_mx_wanted_ord, d_wanted_ord, sizeof(d_wanted_ord) );
  738.     memcpy( (void *) p_mx_process_Hz_odd, ProcessOddHz, (p_ProcessOddSpCoef->num)*sizeof(double) );
  739.     memcpy( (void *) p_mx_new_fir_mag_odd, p_NewFirOddSpCoef->Mag, (p_NewFirOddSpCoef->num)*sizeof(double) );
  740.     memcpy( (void *) p_mx_weight, p_Weight->weight, (p_Weight->num)*sizeof(double) );
  741.     nlhs=1, nrhs = 4;
  742.     prhs[0] = mx_wanted_ord;
  743.     prhs[1] = mx_process_Hz_odd;
  744.     prhs[2] = mx_new_fir_mag_odd;
  745.     prhs[3] = mx_weight;
  746.     plhs[0] = mx_new_fir_coeff_F1;
  747.     InitializeModule_firls();
  748.     InitializeModule_signal_private_firchk();
  749.     InitializeModule_sinc();
  750.     mlxFirls(nlhs, plhs, nrhs, prhs);
  751.     p_mx_new_fir_coeff_F1 =  mxGetPr( plhs[0] );
  752.     p_NewFirCoeffF1->taps = wanted_ord + 1;
  753.     for(int i=0; i<p_NewFirCoeffF1->taps; i++)
  754.     {
  755.         p_NewFirCoeffF1->FirCoef[i] = *(p_mx_new_fir_coeff_F1 + i);
  756.     }
  757.     TerminateModule_sinc();
  758.     TerminateModule_signal_private_firchk();
  759.     TerminateModule_firls();
  760.     // free mxArray memory
  761.     mxDestroyArray( mx_wanted_ord );
  762.     mxDestroyArray( mx_process_Hz_odd );
  763.     mxDestroyArray( mx_new_fir_mag_odd );
  764.     mxDestroyArray( mx_weight );
  765.     mxDestroyArray( mx_new_fir_coeff_F1 );
  766. }
  767. #endif
  768. //===========================================================================
  769. ////////////////////////////         Acqua        ///////////////////////////
  770. //===========================================================================
  771. bool CSPCOEFCAL::AcquaFile_To_UplFile( char *i_filename, bool b_Rx, bool b_LinearFormat, char *o_filename )
  772. {
  773.     const int TX_SEG_NUM = 5;
  774.     const int RX_SEG_NUM = 5;
  775.     double TX_data[][4]=
  776.     {
  777. {300, 0,-12,-6},  /*Hz, upper, lower, mean*/
  778. {1000,0, -6,-3},  /*Hz, upper, lower, mean*/
  779. {2000,4, -6,-1},  /*Hz, upper, lower, mean*/
  780. {3000,4, -6,-1},  /*Hz, upper, lower, mean*/
  781. {3400,4, -9,-2.5},  /*Hz, upper, lower, mean*/
  782.     };
  783.     double RX_data[][4]=
  784.     {
  785. {300, 2,  -7,-2.5},  /*Hz, upper, lower, mean*/
  786. {500, 1.428571428571429,  -5,-1.785714285714286},  /*Hz, upper, lower, mean*/
  787. {1000,0,  -5,-2.5},  /*Hz, upper, lower, mean*/
  788. {3000,2,  -5,-1.5},  /*Hz, upper, lower, mean*/
  789. {3400,2, -10,-4},  /*Hz, upper, lower, mean*/
  790.     };
  791.     FILE *fp_in;
  792.     //char str[512];
  793.     //AnsiString as_Str;
  794.     int len=0;
  795.     int ch;
  796.     int i, j, k;
  797.     double inCoef[4000][2];   // Hz, dB
  798.     double outCoef[4000][2];  // Hz, dB
  799.     char hz[1024];
  800.     char db[1024];
  801.     double d[4000][2];  // Hz, dB
  802.     double x[4000][2];  // Hz, dB
  803.     double *d_fit;
  804.     double d_m;
  805.     double d_A;
  806.     double d_B;
  807.     double d_offset_g;
  808.     int i_fit_seg;
  809.     fp_in = fopen(i_filename, "r");
  810.     if( fp_in == NULL )  return false;
  811.     do
  812.     {
  813.         ch = fscanf(fp_in,"%s  %s", &hz, &db);
  814.        // AnsiString as_hz(hz);
  815.         if( atof(hz)>90.0 )
  816.         {
  817.        if( len >= 0 )
  818.             {
  819.         inCoef[len][0]=atof(hz);
  820.                // inCoef[len][0] = atof(as_hz.c_str());
  821.                 if( b_LinearFormat )
  822.                 {
  823.                inCoef[len][1] = 20*log10( atof(db) + LOG_FLOOR ); // linear
  824.                 }
  825.                 else
  826.                 {
  827.             inCoef[len][1] = atof(db); // log dB
  828.                 }
  829.         if( inCoef[len][0] >= 4000 ) break;
  830.             }
  831.     len++;
  832.     if( len >= 4000 ) break;
  833. }
  834.     }while( ch != EOF );
  835.     fclose(fp_in);
  836.     //Caculate Target Curve using the Hz given by input file
  837.     if( b_Rx )
  838.     {
  839.         d_fit = &RX_data[0][0];
  840. i_fit_seg = RX_SEG_NUM;
  841.     }
  842.     else
  843.     {
  844.         d_fit = &TX_data[0][0];
  845. i_fit_seg = TX_SEG_NUM;
  846.     }
  847.     k=0;
  848.     for( i=0; i<len;i++ )
  849.     {
  850.         for( j=0; j<i_fit_seg-1; j++ )
  851.         {
  852.             if( inCoef[i][0]>=d_fit[j*4+0] && inCoef[i][0]<=d_fit[(j+1)*4+0] )
  853.             {
  854.                 x[k][0] = inCoef[i][0];  //Hz
  855.                 x[k][1] = inCoef[i][1];  //dB
  856.                 d[k][0] = inCoef[i][0];  //Hz
  857.                 d_m     = (d_fit[(j+1)*4+3]-d_fit[j*4+3])/(d_fit[(j+1)*4+0]-d_fit[j*4+0]);
  858.                 d[k][1] = d_m*(inCoef[i][0]-d_fit[j*4+0])+d_fit[j*4+3];
  859.                 k++;
  860.                 break;
  861.             }
  862.         }//end of for(j
  863.     }//end of for(i
  864.     //Compute the Offset
  865.     for( i=0; i<k; i++ ) x[i][1]=pow(10.0,x[i][1]/20);
  866.     for( i=0; i<k; i++ ) d[i][1]=pow(10.0,d[i][1]/20);
  867.     d_A=0; d_B=0;
  868.     for( i=0; i<k; i++ ) d_A += x[i][1]*x[i][1];
  869.     for( i=0; i<k; i++ ) d_B += x[i][1]*d[i][1];
  870.     if( d_A!=0 )
  871.     {
  872.         d_offset_g = fabs(d_B/d_A);
  873.     }
  874.     else
  875.     {
  876.         d_offset_g=1;
  877.     }
  878.     d_offset_g = 20*log10( d_offset_g );
  879.     //Apply the Offset to input data to obtain output
  880.     for( i=0; i<len; i++ )
  881.     {
  882.        outCoef[i][0] = inCoef[i][0]; //Hz
  883.        outCoef[i][1] = inCoef[i][1] + d_offset_g; //dB
  884.        outCoef[i][1] = pow( 10.0,outCoef[i][1]/20 ); //to linear scale in TRC file
  885.     }
  886.     //Write output to file
  887.     AnsiString asPath;
  888.     AnsiString asStr(i_filename);
  889.     AnsiString asInputFile;
  890.     if ( getPathFromStr(Application->ExeName, asPath) && getFilenameFromStr( asStr, asInputFile ) )
  891.     {
  892.         AnsiString asOutputFile = asPath + asInputFile + ".trc";
  893.         strcpy( o_filename, asOutputFile.c_str() );
  894.     }
  895.     else
  896.     {
  897.         return false;
  898.     }
  899.     FILE *fp_out = fopen( o_filename, "w" );
  900.     if( fp_out == NULL )  return false;
  901.     fprintf( fp_out, "213n" );
  902.     fprintf( fp_out, "2n" );
  903.     fprintf( fp_out, "10n" );
  904.     fprintf( fp_out, "1n" );
  905.     fprintf( fp_out, "%dn", len );
  906.     fprintf( fp_out, "1n" );
  907.     fprintf( fp_out, "0n" );
  908.     fprintf( fp_out,"#----X-------------Y---------n" );
  909.     for( i=0; i<len; i++)
  910.     {
  911.         fprintf( fp_out, "%4.0f  %6.2f n", outCoef[i][0], outCoef[i][1] );
  912.     }
  913.     fprintf( fp_out, "0n");
  914.     fprintf( fp_out, "373n");
  915.     fprintf( fp_out, "0n");
  916.     fprintf( fp_out, "4n");
  917.     fprintf( fp_out, "1000n");
  918.     fprintf( fp_out, "0n");
  919.     fprintf( fp_out, "3n");
  920.     fprintf( fp_out, "1n");
  921.     fprintf( fp_out, "4000n");
  922.     fprintf( fp_out, "1n");
  923.     fprintf( fp_out, "4n");
  924.     fprintf( fp_out, "100n");
  925.     fprintf( fp_out, "0n");
  926.     fprintf( fp_out, "4n");
  927.     fprintf( fp_out, "13n");
  928.     fprintf( fp_out, "20n");
  929.     fprintf( fp_out, "1.0n");  // useful
  930.     fprintf( fp_out, "0n" );
  931.     fprintf( fp_out, "14n" );
  932.     fprintf( fp_out, "0n" );
  933.     fprintf( fp_out, "0.252982n" );
  934.     fprintf( fp_out, "15n" );
  935.     fprintf( fp_out, "32n" );
  936.     fprintf( fp_out, "0.008n" );
  937.     fprintf( fp_out, "15n" );
  938.     fprintf( fp_out, "32n" );
  939.     fprintf( fp_out, "0n" );
  940.     fprintf( fp_out, "0n" );
  941.     fprintf( fp_out, "0n" );
  942.     fprintf( fp_out, "0n" );
  943.     fprintf( fp_out, "0n" );
  944.     fprintf( fp_out, "0n" );
  945.     fprintf( fp_out, "0n" );
  946.     fprintf( fp_out, "0n" );
  947.     fprintf( fp_out, "0n" );
  948.     fprintf( fp_out, "0n" );
  949.     fprintf( fp_out, "0n" );
  950.     fprintf( fp_out, "0n" );
  951.     fprintf( fp_out, "  Hz     GEN FREQ  n" );
  952.     fprintf( fp_out, "dBr  RMS(FFT) CH2 n" );
  953.     fprintf( fp_out, "??   Not avail.   n" );
  954.     fprintf( fp_out, "1n" );
  955.     fprintf( fp_out, "0n" );
  956.     fclose(fp_out);
  957.     return true;
  958. }
  959. //===========================================================================
  960. /////////////////////////////   Microtronix   ///////////////////////////////
  961. //===========================================================================
  962. bool CSPCOEFCAL::MicrotronixFile_To_UplFile( char *i_filename, bool b_Rx, bool b_LinearFormat, char *o_filename )
  963. {
  964.     const int TX_SEG_NUM = 9;
  965.     const int RX_SEG_NUM = 9;
  966.     double SEND_data[][4]=
  967.     {
  968. {100, -7,-10,-8.5},  /*Hz, upper, lower, mean*/
  969. {150,  0, -9.5,-4.75},  /*Hz, upper, lower, mean*/
  970. {300,  0,-8,-4},  /*Hz, upper, lower, mean*/
  971. {500,  0, -6,-3},  /*Hz, upper, lower, mean*/
  972. {1000, 0,-6,-3},  /*Hz, upper, lower, mean*/
  973. {2000, 5, -6,-0.5},  /*Hz, upper, lower, mean*/
  974. {3000, 5, -6,-0.5},  /*Hz, upper, lower, mean*/
  975. {3400, 5, -9,-2},  /*Hz, upper, lower, mean*/
  976. {4000, 0,-13.5,-6.75},  /*Hz, upper, lower, mean*/
  977.     };
  978.     double RX_data[][4]=
  979.     {
  980. {100, -7,-9,-8},  /*Hz, upper, lower, mean*/
  981. {170,  2, -8.3,-3.15},  /*Hz, upper, lower, mean*/
  982. {300,  2,-7,-2.5},  /*Hz, upper, lower, mean*/
  983. {500,  1.43, -5,-1.785},  /*Hz, upper, lower, mean*/
  984. {1000, 0,-5,-2.5},  /*Hz, upper, lower, mean*/
  985. {3000, 2, -5,-1.5},  /*Hz, upper, lower, mean*/
  986. {3400, 2, -8,-3},  /*Hz, upper, lower, mean*/
  987. {4000, 2, -12.5,-5.25},  /*Hz, upper, lower, mean*/
  988. {8000, -18,-20,-19},  /*Hz, upper, lower, mean*/
  989.     };
  990.    // int type;
  991.    // char typeS[1024];
  992.     double *fit;
  993.     int fit_seg;
  994.     char out_fn[1024];
  995.     double in[4000][2];   // Hz, dB
  996.     double out[4000][2];  // Hz, dB
  997.     double d[4000][2];  // Hz, dB
  998.     double x[4000][2];  // Hz, dB
  999.     double A,B,offset_g;
  1000.     char hz[1024];
  1001.     char db[1024];
  1002.     int  L;
  1003.     FILE *fp_in;
  1004.     FILE *fp_out;
  1005.     int c,i,j;
  1006.     double m;
  1007.     char titles[1024];
  1008.    // if(b_Rx)
  1009.    // {
  1010.    //    // type=RX;
  1011.    //     strcpy(typeS,"Receiving Frequency Response");
  1012.    // }
  1013.    // else
  1014.    // {
  1015.    //   // type=SEND;
  1016.    //    strcpy(typeS,"Sending Frequency Response");
  1017.    // }
  1018.     // Read input data
  1019.     fp_in=fopen(i_filename, "r");
  1020.     if( NULL == fp_in )  return false;
  1021.     //Write output to file
  1022.     AnsiString asPath;
  1023.     AnsiString asStr(i_filename);
  1024.     AnsiString asInputFile;
  1025.     if ( getPathFromStr(Application->ExeName, asPath) && getFilenameFromStr( asStr, asInputFile ) )
  1026.     {
  1027.         AnsiString asOutputFile = asPath + asInputFile + ".trc";
  1028.         strcpy( o_filename, asOutputFile.c_str() );
  1029.     }
  1030.     else
  1031.     {
  1032.         return false;
  1033.     }
  1034.     //strcpy(out_fn,args[2]);
  1035.     //strcat(out_fn,".trc");
  1036. //#ifdef LINEAR_INPUT
  1037. // printf("nProcess Gain Compensation of %s with Linear Magnituden",typeS);
  1038. //#else
  1039. // printf("nProcess Gain Compensation of %s with dB Magnituden",typeS);
  1040. //#endif
  1041. // printf("Input: %sn",args[2]);
  1042. // printf("Output: %sn",out_fn);
  1043.    // strcpy(titles,"");
  1044.    // if( fgets( titles, 100, fp_in ) == NULL)
  1045.    // {  return false;
  1046.    // }
  1047.    // if(strcmp(titles,"Microtronix Test Systemn")==0)
  1048.     bool b_match = false;
  1049.     while(!feof(fp_in))
  1050.     {
  1051.         fscanf( fp_in, "%s", &titles);
  1052.         AnsiString as_titles(titles);
  1053.         if( as_titles.AnsiPos( "Microtronix" ) != 0 )
  1054.         {
  1055.             b_match = true;
  1056.             break;
  1057.         }
  1058.     }
  1059.     if( ! b_match )
  1060.     {
  1061.         if(fp_in) fclose(fp_in);
  1062.         return false;
  1063.     }
  1064.     {
  1065.        // for(i=0;i<15;i++)
  1066.        // {
  1067.        //     fgets( titles, 100, fp_in );
  1068.        // }
  1069.         b_match = false;
  1070.         while(!feof(fp_in))
  1071.         {
  1072.             fgets( titles, 100, fp_in );
  1073.             AnsiString as_titles(titles);
  1074.             if( b_Rx )
  1075.             {
  1076.                 if( as_titles.AnsiCompareIC( "Freq      Receiven" ) == 0 )
  1077.                 {
  1078.                     b_match = true;
  1079.                     break;
  1080.                 }
  1081.             }
  1082.             else
  1083.             {
  1084.                 if( as_titles.AnsiCompareIC( "Freq      Sendn" ) == 0 )
  1085.                 {
  1086.                         b_match = true;
  1087.                         break;
  1088.                 }
  1089.             }
  1090.         }
  1091.         if( ! b_match )
  1092.         {
  1093.             if(fp_in) fclose(fp_in);
  1094.             return false;
  1095.         }
  1096.         fgets( titles, 100, fp_in );
  1097.         L=0;
  1098.         do{
  1099. //           fgets( titles, 100, fp_in );
  1100. //    strcpy(titles,"%s %s",&hz,&db);
  1101.             c=fscanf(fp_in,"%s",&hz);
  1102.             c=fscanf(fp_in,"%s",&db);
  1103.             fgets( titles, 100, fp_in );
  1104.             if( atof(hz)>90.0 )
  1105.             {
  1106.                 if(L>=0)
  1107.                 {
  1108.                     in[L][0]=atof(hz);
  1109.                     if (b_LinearFormat)
  1110.                     {
  1111.           in[L][1]=20*log10(atof(db)+LOG_FLOOR); //Linear_INPUT
  1112.                     }
  1113.                     else
  1114.                     {
  1115.        in[L][1]=atof(db); //LOG_DB_INPUT
  1116.                     }
  1117.                     if(in[L][0]>=3971) break;
  1118.                 }
  1119.                 L++;
  1120.                 if(L>=65) break;
  1121.             }
  1122.         }while(c!=EOF);
  1123.     }
  1124.     //else
  1125.     //{
  1126.     //    return false;
  1127.     //}
  1128.     if(fp_in) fclose(fp_in);
  1129.     //Caculate Target Curve using the Hz given by input file
  1130.     if(b_Rx)
  1131.     {
  1132.         fit=&RX_data[0][0];
  1133.         fit_seg=RX_SEG_NUM;
  1134.     }
  1135.     else
  1136.     {
  1137.         fit=&SEND_data[0][0];
  1138. fit_seg=TX_SEG_NUM;
  1139.     }
  1140.     c=0;
  1141.     for(i=0;i<L;i++)
  1142.     {
  1143.         for(j=0;j<fit_seg-1;j++)
  1144.         {
  1145.             if(in[i][0]>=fit[j*4+0] && in[i][0]<=fit[(j+1)*4+0])
  1146.             {
  1147.                 x[c][0]=in[i][0];  //Hz
  1148.                 x[c][1]=in[i][1];  //dB
  1149.                 d[c][0]=in[i][0];  //Hz
  1150.                 m=(fit[(j+1)*4+3]-fit[j*4+3])/(fit[(j+1)*4+0]-fit[j*4+0]);
  1151.                 d[c][1]=m*(in[i][0]-fit[j*4+0])+fit[j*4+3];
  1152.                 c++;
  1153.                 break;
  1154.             }
  1155.         }//end of for(j
  1156.     }//end of for(i
  1157.     //Compute the Offset
  1158.     for(i=0;i<c;i++) x[i][1]=pow(10.0,x[i][1]/20);
  1159.     for(i=0;i<c;i++) d[i][1]=pow(10.0,d[i][1]/20);
  1160.     A=0; B=0;
  1161.     for(i=0;i<c;i++) A+=x[i][1]*x[i][1];
  1162.     for(i=0;i<c;i++) B+=x[i][1]*d[i][1];
  1163.     if(A!=0)
  1164.     {
  1165.         offset_g=fabs(B/A);
  1166.     }
  1167.     else
  1168.     {
  1169.         offset_g=1;
  1170.     }
  1171.     offset_g=20*log10(offset_g);
  1172. //Apply the Offset to input data to obtain output
  1173.     for(i=0;i<L;i++)
  1174.     {
  1175.         out[i][0]=in[i][0]; //Hz
  1176.         out[i][1]=in[i][1]+offset_g; //dB
  1177.         out[i][1]=pow(10.0,out[i][1]/20); //to linear scale in TRC file
  1178.     }
  1179.     //Write output to file
  1180.     fp_out=fopen(o_filename, "w");
  1181.     fprintf(fp_out,"213n");
  1182.     fprintf(fp_out,"2n");
  1183.     fprintf(fp_out,"10n");
  1184.     fprintf(fp_out,"1n");
  1185.     fprintf(fp_out,"%dn",L);
  1186.     fprintf(fp_out,"1n");
  1187.     fprintf(fp_out,"0n");
  1188.     fprintf(fp_out,"#----X-------------Y---------n");
  1189.     for(i=0;i<L;i++)
  1190.     {
  1191.         fprintf(fp_out,"%4.0f  %6.5f n",out[i][0],out[i][1]);
  1192.     }
  1193.     fprintf(fp_out,"0n");
  1194.     fprintf(fp_out,"373n");
  1195.     fprintf(fp_out,"0n");
  1196.     fprintf(fp_out,"4n");
  1197.     fprintf(fp_out,"1000n");
  1198.     fprintf(fp_out,"0n");
  1199.     fprintf(fp_out,"3n");
  1200.     fprintf(fp_out,"1n");
  1201.     fprintf(fp_out,"4000n");
  1202.     fprintf(fp_out,"1n");
  1203.     fprintf(fp_out,"4n");
  1204.     fprintf(fp_out,"100n");
  1205.     fprintf(fp_out,"0n");
  1206.     fprintf(fp_out,"4n");
  1207.     fprintf(fp_out,"13n");
  1208.     fprintf(fp_out,"20n");
  1209.     fprintf(fp_out,"1.0n");  // useful
  1210.     fprintf(fp_out,"0n");
  1211.     fprintf(fp_out,"14n");
  1212.     fprintf(fp_out,"0n");
  1213.     fprintf(fp_out,"0.252982n");
  1214.     fprintf(fp_out,"15n");
  1215.     fprintf(fp_out,"32n");
  1216.     fprintf(fp_out,"0.008n");
  1217.     fprintf(fp_out,"15n");
  1218.     fprintf(fp_out,"32n");
  1219.     fprintf(fp_out,"0n");
  1220.     fprintf(fp_out,"0n");
  1221.     fprintf(fp_out,"0n");
  1222.     fprintf(fp_out,"0n");
  1223.     fprintf(fp_out,"0n");
  1224.     fprintf(fp_out,"0n");
  1225.     fprintf(fp_out,"0n");
  1226.     fprintf(fp_out,"0n");
  1227.     fprintf(fp_out,"0n");
  1228.     fprintf(fp_out,"0n");
  1229.     fprintf(fp_out,"0n");
  1230.     fprintf(fp_out,"0n");
  1231.     fprintf(fp_out,"  Hz     GEN FREQ  n");
  1232.     fprintf(fp_out,"dBr  RMS(FFT) CH2 n");
  1233.     fprintf(fp_out,"??   Not avail.   n");
  1234.     fprintf(fp_out,"1n");
  1235.     fprintf(fp_out,"0n");
  1236.     if (fp_out)
  1237.     {
  1238.         fclose(fp_out);
  1239.     }
  1240.     return true;
  1241. }
  1242. //===========================================================================
  1243. ////////////////////////////////////   UPV   ///////////////////////////////
  1244. //===========================================================================
  1245. bool CSPCOEFCAL::UpvFile_To_UplFile(char *i_filename, char *o_filename)
  1246. {
  1247.     if (!TraceConversion(i_filename, o_filename))
  1248.     {
  1249.         return false;
  1250.     }
  1251.     return true;    
  1252. }
  1253. //===========================================================================
  1254. ////////////////////////////////////   Vita   ///////////////////////////////
  1255. //===========================================================================
  1256. bool CSPCOEFCAL::VitaFile_To_UplFile(char *i_filename, bool b_Rx, bool b_LinearFormat, char *o_filename)
  1257. {
  1258. //#define RX   0
  1259. //#define SEND 1
  1260. const int TX_SEG_NUM = 9;
  1261. const int RX_SEG_NUM = 9;
  1262. double SEND_data[TX_SEG_NUM][4] =
  1263. {
  1264. {100, -10,-40,-25},  /*Hz, upper, lower, mean*/
  1265. {200,  0, -35,-17.5},  /*Hz, upper, lower, mean*/
  1266. {300,  0,-14,-7},  /*Hz, upper, lower, mean*/
  1267. {500,  0, -8,-4},  /*Hz, upper, lower, mean*/
  1268. {1000, 4,-8,-2},  /*Hz, upper, lower, mean*/
  1269. {3000, 4, -8,-2},  /*Hz, upper, lower, mean*/
  1270. {3400, 4, -11,-3.5},  /*Hz, upper, lower, mean*/
  1271. {4000, 0,-15,-7.5},  /*Hz, upper, lower, mean*/
  1272. };
  1273. double RX_data[RX_SEG_NUM][4] =
  1274. {
  1275. {100, -6,-40,-23},  /*Hz, upper, lower, mean*/
  1276. {200,  0, -20,-10},  /*Hz, upper, lower, mean*/
  1277. {300,  2,-9,-3.5},  /*Hz, upper, lower, mean*/
  1278. {500,  2, -7,-2.5},  /*Hz, upper, lower, mean*/
  1279. {1000, 0,-7,-3.5},  /*Hz, upper, lower, mean*/
  1280. {3000, 4, -7,-1.5},  /*Hz, upper, lower, mean*/
  1281. {3400, 4, -12,-4},  /*Hz, upper, lower, mean*/
  1282. {4000, 4, -40,-18},  /*Hz, upper, lower, mean*/
  1283. };
  1284.  //int type;
  1285.  //char typeS[1024];
  1286.  double *fit;
  1287.  int fit_seg;
  1288.  char out_fn[1024];
  1289.  double in[4000][2];   // Hz, dB
  1290.  double out[4000][2];  // Hz, dB
  1291.  double d[4000][2];  // Hz, dB
  1292.  double x[4000][2];  // Hz, dB
  1293.  double A,B,offset_g;
  1294.  char hz[1024];
  1295.  char db[1024],ln[50];
  1296.  float db_f;
  1297.  int ln_f;
  1298.  int  L;
  1299.   FILE *fp_in;
  1300.   FILE *fp_out;
  1301.   int c,i,j;
  1302.   double m;
  1303.   char titles[1024];
  1304.   //if(argc<3) Usage();
  1305.  // if(strcmp(args[1],"RX")==0){
  1306.  //   type=RX;
  1307.  //   strcpy(typeS,"Receiving Frequency Response");
  1308.  // }else  if(strcmp(args[1],"SEND")==0){
  1309.  //   type=SEND;
  1310.  //   strcpy(typeS,"Sending Frequency Response");
  1311.  // }else{
  1312.  //   Usage();
  1313.  // }
  1314. // Read input data
  1315.   //fp_in=FOPEN(args[2], "r");
  1316.   fp_in = fopen(i_filename, "r");
  1317.   if (NULL == fp_in)
  1318.   {
  1319.       return false;
  1320.       //  printf("nCannot open file - %s", fn);
  1321.       //  printf("n Space in filename is incorrect.");
  1322.       //  exit(-1);
  1323.   }
  1324.   //Write output to file
  1325.     AnsiString asPath;
  1326.     AnsiString asStr(i_filename);
  1327.     AnsiString asInputFile;
  1328.     if ( getPathFromStr(Application->ExeName, asPath) && getFilenameFromStr( asStr, asInputFile ) )
  1329.     {
  1330.         AnsiString asOutputFile = asPath + asInputFile + ".trc";
  1331.         strcpy( o_filename, asOutputFile.c_str() );
  1332.     }
  1333.     else
  1334.     {
  1335.         return false;
  1336.     }
  1337.  // strcpy(out_fn,args[2]);
  1338.   //strcat(out_fn,".trc");
  1339. //#ifdef LINEAR_INPUT
  1340. // printf("nProcess Gain Compensation of %s with Linear Magnituden",typeS);
  1341. //#else
  1342. // printf("nProcess Gain Compensation of %s with dB Magnituden",typeS);
  1343. //#endif
  1344. // printf("Input: %sn",args[2]);
  1345. // printf("Output: %sn",out_fn);
  1346. //   strcpy(titles,"");
  1347. //   if( fgets( titles, 100, fp_in ) == NULL)
  1348. //   {  printf( "fgets errorn" );
  1349. //      exit(0);
  1350. //   }
  1351. //   if(1)
  1352. //   {
  1353. //    for(i=0;i<15;i++)
  1354. //    {
  1355. //    fgets( titles, 100, fp_in );
  1356. //    }
  1357.    // bool b_match = false;
  1358.     L=0;
  1359.     do
  1360.     {
  1361. //      fgets( titles, 100, fp_in );
  1362. // strcpy(titles,"%s %s",&hz,&db);
  1363.         c = fscanf(fp_in,"%s",&hz);
  1364.         c = fscanf(fp_in,"%f",&db_f);
  1365. // fgets( titles, 100, fp_in );
  1366.         if (atof(hz) > 23)
  1367.         {
  1368.             if (L >= 0)
  1369.             {
  1370.                 in[L][0] = atof(hz);
  1371. //#ifdef  LINEAR_INPUT
  1372.                 if (b_LinearFormat)
  1373.                 {
  1374.                     in[L][1]=20*log10(db_f+LOG_FLOOR); //Linear_INPUT
  1375.                 }
  1376. //#else
  1377.                 else
  1378.                 {
  1379.                     in[L][1]=db_f; //LOG_DB_INPUT
  1380.                 }
  1381. //#endif
  1382.                 if (in[L][0] >= 4000)
  1383.                 {
  1384.                     break;
  1385.                 }
  1386.             }
  1387.             L++;
  1388.             if (L>=95)
  1389.             {
  1390.                 break;
  1391.             }
  1392.         }
  1393.     }while(c!=EOF);
  1394. //   }
  1395. //   else
  1396. //   {
  1397. //      printf("NOT Microtronix Format!! TRY AGAIN!!n");
  1398. //   }
  1399.     if (fp_in)
  1400.     {
  1401.         fclose(fp_in);
  1402.     }
  1403. //Caculate Target Curve using the Hz given by input file
  1404.     //if(type==RX){
  1405.     if (b_Rx)
  1406.     {
  1407.         fit = &RX_data[0][0];
  1408. fit_seg = RX_SEG_NUM;
  1409.     }
  1410.     else
  1411.     {
  1412.         fit = &SEND_data[0][0];
  1413.         fit_seg = TX_SEG_NUM;
  1414.     }
  1415.     c=0;
  1416.     for (i=0; i<L; i++)
  1417.     {
  1418.         for (j=0;j<fit_seg-1;j++)
  1419.         {
  1420.             if (in[i][0]>=fit[j*4+0] && in[i][0]<=fit[(j+1)*4+0])
  1421.             {
  1422.                 x[c][0]=in[i][0];  //Hz
  1423.                 x[c][1]=in[i][1];  //dB
  1424.                 d[c][0]=in[i][0];  //Hz
  1425.                 m = (fit[(j+1)*4+3]-fit[j*4+3])/(fit[(j+1)*4+0]-fit[j*4+0]);
  1426.                 d[c][1] = m*(in[i][0]-fit[j*4+0])+fit[j*4+3];
  1427.                 c++;
  1428.                 break;
  1429.             }
  1430.         }//end of for(j
  1431.     }//end of for(i
  1432. //Compute the Offset
  1433.     for (i=0;i<c;i++)
  1434.     {
  1435.         x[i][1] = pow(10.0,x[i][1]/20);
  1436.     }
  1437.     for (i=0;i<c;i++)
  1438.     {
  1439.         d[i][1] = pow(10.0,d[i][1]/20);
  1440.     }
  1441.     A=0; B=0;
  1442.     for (i=0;i<c;i++)
  1443.     {
  1444.         A += x[i][1]*x[i][1];
  1445.     }
  1446.     for (i=0;i<c;i++)
  1447.     {
  1448.         B += x[i][1]*d[i][1];
  1449.     }
  1450.     if (A != 0)
  1451.     {
  1452.         offset_g = fabs(B/A);
  1453.     }
  1454.     else
  1455.     {
  1456.         offset_g=1;
  1457.     }
  1458.     offset_g = 20*log10(offset_g);
  1459.     //Apply the Offset to input data to obtain output
  1460.     for (i=0; i<L; i++)
  1461.     {
  1462.         out[i][0] = in[i][0]; //Hz
  1463.         out[i][1] = in[i][1]+offset_g; //dB
  1464.         out[i][1] = pow(10.0,out[i][1]/20); //to linear scale in TRC file
  1465.     }
  1466. //Write output to file
  1467.   //fp_out=FOPEN(out_fn, "wt");
  1468.     fp_out = fopen(o_filename, "w");
  1469.     if (NULL == fp_out)
  1470.     {
  1471. // printf("nCannot open file - %s", fn);
  1472. // printf("n Space in filename is incorrect.");
  1473. // exit(-1);
  1474.         return false;
  1475.     }
  1476.     fprintf(fp_out,"213n");
  1477.     fprintf(fp_out,"2n");
  1478.     fprintf(fp_out,"10n");
  1479.     fprintf(fp_out,"1n");
  1480.     fprintf(fp_out,"%dn",L);
  1481.     fprintf(fp_out,"1n");
  1482.     fprintf(fp_out,"0n");
  1483.     fprintf(fp_out,"#----X-------------Y---------n");
  1484.     for (i=0;i<L;i++)
  1485.     {
  1486.         fprintf(fp_out,"%4.0f  %6.5f n",out[i][0],out[i][1]);
  1487. //   printf("%4.0f  %6.5f n",out[i][0],out[i][1]);
  1488.     }
  1489.     fprintf(fp_out,"0n");
  1490.     fprintf(fp_out,"373n");
  1491.     fprintf(fp_out,"0n");
  1492.     fprintf(fp_out,"4n");
  1493.     fprintf(fp_out,"1000n");
  1494.     fprintf(fp_out,"0n");
  1495.     fprintf(fp_out,"3n");
  1496.     fprintf(fp_out,"1n");
  1497.     fprintf(fp_out,"4000n");
  1498.     fprintf(fp_out,"1n");
  1499.     fprintf(fp_out,"4n");
  1500.     fprintf(fp_out,"100n");
  1501.     fprintf(fp_out,"0n");
  1502.     fprintf(fp_out,"4n");
  1503.     fprintf(fp_out,"13n");
  1504.     fprintf(fp_out,"20n");
  1505.     fprintf(fp_out,"1.0n");  // useful
  1506.     fprintf(fp_out,"0n");
  1507.     fprintf(fp_out,"14n");
  1508.     fprintf(fp_out,"0n");
  1509.     fprintf(fp_out,"0.252982n");
  1510.     fprintf(fp_out,"15n");
  1511.     fprintf(fp_out,"32n");
  1512.     fprintf(fp_out,"0.008n");
  1513.     fprintf(fp_out,"15n");
  1514.     fprintf(fp_out,"32n");
  1515.     fprintf(fp_out,"0n");
  1516.     fprintf(fp_out,"0n");
  1517.     fprintf(fp_out,"0n");
  1518.     fprintf(fp_out,"0n");
  1519.     fprintf(fp_out,"0n");
  1520.     fprintf(fp_out,"0n");
  1521.     fprintf(fp_out,"0n");
  1522.     fprintf(fp_out,"0n");
  1523.     fprintf(fp_out,"0n");
  1524.     fprintf(fp_out,"0n");
  1525.     fprintf(fp_out,"0n");
  1526.     fprintf(fp_out,"0n");
  1527.     fprintf(fp_out,"  Hz     GEN FREQ  n");
  1528.     fprintf(fp_out,"dBr  RMS(FFT) CH2 n");
  1529.     fprintf(fp_out,"??   Not avail.   n");
  1530.     fprintf(fp_out,"1n");
  1531.     fprintf(fp_out,"0n");
  1532.     if (fp_out)
  1533.     {
  1534.         fclose(fp_out);
  1535.     }
  1536.     return true;
  1537. }
  1538. //===========================================================================
  1539. ////////////////////////////  Global information  ///////////////////////////
  1540. //===========================================================================
  1541. int  CSPCOEFCAL::Get_ConfirmState( void )
  1542. {
  1543.     return  ConfirmState;
  1544. }