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

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_cal32.cpp
  40.  *
  41.  * Project:
  42.  * --------
  43.  *   Maui META APP
  44.  *
  45.  * Description:
  46.  * ------------
  47.  *  Melody 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 "melody_coef_cal32.h"
  74. #include "math_utils.h"
  75. //===========================================================================
  76. static CMELODYCOEFCAL32*  melody_coef_cal32_ptr;
  77. static bool g_bIsRunning;
  78. //===========================================================================
  79. //===========================================================================
  80. CMELODYCOEFCAL32::CMELODYCOEFCAL32(void)
  81. {
  82.    g_bIsRunning = false;
  83.    m_iConfirmState = 0;
  84.    CoefCalBufSize = 0;
  85.    CoefCalBuf = NULL;
  86. }
  87. //---------------------------------------------------------------------------
  88. CMELODYCOEFCAL32::~CMELODYCOEFCAL32()
  89. {
  90.    g_bIsRunning = false;
  91.    m_iConfirmState = 0;
  92.    if(CoefCalBuf)
  93.    {
  94.       delete [] CoefCalBuf;
  95.       CoefCalBuf = NULL;
  96.    }
  97.    AFT_close();
  98. }
  99. //---------------------------------------------------------------------------
  100. void CMELODYCOEFCAL32::REQ_Finish(void)
  101. {
  102.     if (!g_bIsRunning)
  103.     {
  104.         return;
  105.     }
  106.     Confirm(STATE_COEF_CAL32_OK);
  107.     g_bIsRunning = false;
  108. }
  109. //---------------------------------------------------------------------------
  110. void CMELODYCOEFCAL32::REQ_Stop(void)
  111. {
  112.     if (!g_bIsRunning)
  113.     {
  114.         return;
  115.     }
  116.     META_Cancel_r(m_META_HANDLE_Obj.Get_MainHandle(), MELODYID_COEF_CAL);
  117.     Confirm( STATE_COEF_CAL32_STOP );
  118. }
  119. //---------------------------------------------------------------------------
  120. void CMELODYCOEFCAL32::REQ_TimeOut(void)
  121. {
  122.     if (!g_bIsRunning)
  123.     {
  124.         return;
  125.     }
  126.     META_Cancel_r(m_META_HANDLE_Obj.Get_MainHandle(), MELODYID_COEF_CAL);
  127.     Confirm(STATE_COEF_CAL32_TIMEOUT);
  128. }
  129. //---------------------------------------------------------------------------
  130. void CMELODYCOEFCAL32::Confirm(int confirm_state)
  131. {
  132.     if (!g_bIsRunning)
  133.     {
  134.         return;
  135.     }
  136.     g_bIsRunning = false;
  137.     if (NULL == ConfirmCallback)
  138.     {
  139.         return;
  140.     }
  141.     m_iConfirmState = confirm_state;
  142.     ActiveMan->SetActiveFunction(ConfirmCallback);
  143. }
  144. //---------------------------------------------------------------------------
  145. bool CMELODYCOEFCAL32::getInterpolateFreq( double start_freq, double step_freq, double end_freq, sMelodyInterpolate *p_interpolate )
  146. {
  147.     if( start_freq < 0 || step_freq < 0 || end_freq < 0 || start_freq > end_freq )
  148.     {
  149.         return false;
  150.     }
  151.     for(int i=0; i<TOTAL_MELODY_SAMPLE_NUM; i++)
  152.     {
  153.         p_interpolate->Hz[i] = start_freq + i*step_freq;
  154.     }
  155.     return true;
  156. }
  157. //==============================================================================
  158. bool  CMELODYCOEFCAL32::REQ_Write_FIR_File( char *filename, sMelodyFir *p_MelodyFirCoef )
  159. {
  160.     FILE *fp;
  161.     char str[512];
  162.     AnsiString as_Str;
  163.     if( strcmp(filename, "") == 0 )
  164.         return false;
  165.         
  166.     fp = fopen(filename, "w");
  167.     if(fp == NULL)
  168.         return false;
  169.     fprintf( fp, "%dn", (int) MELODY_FIR_TAPS);
  170.     for( int i=0; i<MELODY_FIR_TAPS; i++ )
  171.     {
  172.         fprintf( fp, "%dn", (int) p_MelodyFirCoef->Mag[i]);
  173.     }
  174.     fclose(fp);
  175.     return  true;
  176. }
  177. //------------------------------------------------------------------------------
  178. bool  CMELODYCOEFCAL32::CheckLicenseDat( void )
  179. {
  180.     FILE *fp;
  181.     AnsiString asPath, asFileName;
  182.     if ( getPathFromStr(Application->ExeName, asPath) &&
  183.          withPath( asPath) &&
  184.          !withPath( asFileName)
  185.        )
  186.     {
  187.        asFileName = asPath + "license.dat";
  188.     }
  189.     fp = fopen(asFileName.c_str(), "r");
  190.     if( fp == NULL )
  191.     {
  192.         fclose(fp);
  193.         return false;
  194.     }
  195.     fclose(fp);    
  196.     return true;
  197. }
  198. //==============================================================================
  199. #if 0
  200. void CMELODYCOEFCAL32::ReorderFirCoef(  sFirCoefParameters *p_FirCoef )
  201. {
  202.     // re-ordering
  203.     int i;
  204.     double temp_old_fir_coeffs[MAX_AUDIO_COEFF_LEN];
  205.     for( i=0; i<p_FirCoef->taps; i++ )
  206.     {
  207.         temp_old_fir_coeffs[i] = p_FirCoef->FirCoef[i];
  208.     }
  209.     for( i=0; i<p_FirCoef->taps; i++ )
  210.     {
  211.         p_FirCoef->FirCoef[i] = temp_old_fir_coeffs[p_FirCoef->taps-1-i];
  212.     }
  213. }
  214. #endif
  215. #if 0
  216. //==============================================================================
  217. void  CMELODYCOEFCAL32::getSelHzIndex(int *p_TplHz, int *p_SelHz, int* p_SelHzIndex)
  218. {
  219.     int k=0;
  220.     for( int i=0; i<TOTAL_TRC_FREQ_NUM; i++ )
  221.     {
  222.         for( int j=0; j<TOTAL_SEL_FREQ_NUM; j++)
  223.         {
  224.             if( *(p_TplHz+i) == *(p_SelHz+j) )
  225.             {
  226.                 p_SelHzIndex[k]=i;
  227.                 k++;
  228.                 break;
  229.             }
  230.         }
  231.     }
  232. }
  233. //-----------------------------------------------------------------------------
  234. void  CMELODYCOEFCAL32::getSeldB( double *p_TpldB, double *p_SeldB, int* p_SelHzIndex)
  235. {
  236.     for(int i=0; i<TOTAL_SEL_FREQ_NUM; i++)
  237.     {
  238.         *(p_SeldB+i) =  *(p_TpldB+*(p_SelHzIndex+i));
  239.     }
  240. }
  241. //==============================================================================
  242. bool  CMELODYCOEFCAL32::CheckEngineExist( void )
  243. {
  244.     // engine test code
  245.     Engine  *mat;
  246.     mat = engOpen( "" );
  247.     if( mat == NULL )
  248.     {
  249.         return  false;
  250.     }
  251. }
  252. #endif
  253. //--------------------------------------------------------------------------
  254. AFT_RESULT  CMELODYCOEFCAL32::freqz( sMelodyFir *p_MelodyFir, int A, int N, double Fs, sMelodyInterpolate *p_MelodyInterpolate)
  255. {
  256.     AFT_RESULT    ret;
  257.     double  Process_Hz[TOTAL_MELODY_SAMPLE_NUM];
  258.     double  d_A[1];
  259.     double  pi = 3.1416;
  260.     int  i;
  261.    // output
  262.     int    nResp;
  263.     double *daRespReal = NULL;
  264.     double *daRespImag = NULL;
  265.     sMelodyInterpolate r_MelodyInterpolate, i_MelodyInterpolate;
  266.     Process_Hz[0] = 0;
  267.     for(i=0; i<TOTAL_MELODY_SAMPLE_NUM-1; i++)
  268.     {
  269.         Process_Hz[i+1] =  p_MelodyInterpolate->Hz[i]/Fs*(2*pi);
  270.     }
  271.     ret = AFT_freqz(
  272. &nResp,
  273. &daRespReal,
  274. &daRespImag,
  275. p_MelodyFir->Mag,
  276. sizeof(p_MelodyFir->Mag)/sizeof(p_MelodyFir->Mag[0]),
  277. p_MelodyInterpolate->Hz,
  278. sizeof(p_MelodyInterpolate->Hz)/sizeof(p_MelodyInterpolate->Hz[0]),
  279. Fs
  280. );
  281.     if( ret )
  282.         return ret;
  283.     for( i=0; i<TOTAL_MELODY_SAMPLE_NUM; i++ )
  284.     {
  285.         r_MelodyInterpolate.Mag[i] = *(daRespReal + i);
  286.         i_MelodyInterpolate.Mag[i] = *(daRespImag + i);
  287.         p_MelodyInterpolate->Mag[i] = sqrt(pow(r_MelodyInterpolate.Mag[i], 2.0) + pow(i_MelodyInterpolate.Mag[i],2.0));
  288.         p_MelodyInterpolate->MagdB[i] = 20.0*log10( Abs_double(p_MelodyInterpolate->Mag[i]) );
  289.     }
  290.     return ret;
  291. }
  292. //------------------------------------------------------------------------------
  293. AFT_RESULT  CMELODYCOEFCAL32::firls( int N, double Fs, sMelodyInterpolate *p_MelodyInterpolate, sMelodyFir *p_MelodyFir)
  294. {
  295.     AFT_RESULT ret;
  296.     double  Fa[TOTAL_MELODY_SAMPLE_NUM], A[TOTAL_MELODY_SAMPLE_NUM];
  297.     double  d_N[1];
  298.     double  *p_mx_N, *p_mx_Fa, *p_mx_A;
  299.     double  *p_mx_MelodyFir;
  300.     int  i;
  301.     int  taps;
  302.     double  *p_weight;
  303.     int  size = sizeof(p_MelodyInterpolate->Mag)/sizeof(p_MelodyInterpolate->Mag[0])/2;
  304.     p_weight = new double[size];
  305.     for( i=0; i<size; i++ )
  306.     {
  307.         *(p_weight + i) = 1.0;
  308.     }
  309.     for( i=0; i<TOTAL_MELODY_SAMPLE_NUM; i++ )
  310.     {
  311.         Fa[i] = p_MelodyInterpolate->Hz[i] / (Fs/2) ;
  312.         A[i] = Abs_double( p_MelodyInterpolate->Mag[i] );
  313.     }
  314.   ret = AFT_firls(
  315. &taps,
  316. &p_mx_MelodyFir,
  317. N,
  318. Fa,
  319. sizeof(Fa)/sizeof(Fa[0]),
  320. p_MelodyInterpolate->Mag,
  321. sizeof(p_MelodyInterpolate->Mag)/sizeof(p_MelodyInterpolate->Mag[0]),
  322. p_weight,
  323. size);
  324.     if( ret )
  325.         return ret;
  326.     for(int i=0; i<MELODY_FIR_TAPS; i++)
  327.     {
  328.         p_MelodyFir->Mag[i] = *(p_mx_MelodyFir + i);
  329.     }
  330.     return ret;
  331. }
  332. //--------------------------------------------------------------------------
  333. const char*  CMELODYCOEFCAL32::Get_ErrorString(AFT_RESULT code)
  334. {
  335.     return AFT_getErrorString(code);
  336. }
  337. #if 0
  338. //------------------------------------------------------------------------------
  339. void  CSPCOEFCAL::firls4input( int wanted_ord, sSpCoefCalParameters  *p_ProcessOddSpCoef, sSpCoefCalParameters *p_NewFirOddSpCoef, sWeightParameters *p_Weight, double Fs, sFirCoefParameters *p_NewFirCoeffF1)
  340. {
  341. //    double  Fs = 8000.0;
  342.     double  d_wanted_ord[1], ProcessOddHz[TOTAL_TRC_FREQ_NUM+2];
  343.     double  *p_mx_wanted_ord, *p_mx_new_fir_mag_odd, *p_mx_process_Hz_odd, *p_mx_weight;
  344.     double  *p_mx_new_fir_coeff_F1;  // output
  345.     sSpCoefCalParameters  process_Hz_odd, new_fir_mag_odd;
  346.     int  i, nlhs, nrhs;
  347.     mxArray  *mx_wanted_ord = NULL, *mx_process_Hz_odd = NULL, *mx_new_fir_mag_odd = NULL, *mx_weight=NULL;
  348.     mxArray  *mx_new_fir_coeff_F1 = NULL; //output
  349.     mxArray *plhs[1], *prhs[4];
  350.     for( i=0; i<p_ProcessOddSpCoef->num; i++ )
  351.     {
  352.         ProcessOddHz[i] = p_ProcessOddSpCoef->Hz[i]/(Fs/2.0);
  353.     }
  354.     for( i=p_ProcessOddSpCoef->num; i<TOTAL_TRC_FREQ_NUM+2; i++ )
  355.     {
  356.         ProcessOddHz[i] = p_ProcessOddSpCoef->Hz[p_ProcessOddSpCoef->num-1]/(Fs/2.0);
  357.     }
  358.     d_wanted_ord[0]=wanted_ord;
  359.     mx_wanted_ord = mxCreateDoubleMatrix(1, 1, mxREAL);
  360.     mx_process_Hz_odd = mxCreateDoubleMatrix( p_ProcessOddSpCoef->num, 1, mxREAL );
  361.     mx_new_fir_mag_odd = mxCreateDoubleMatrix( p_NewFirOddSpCoef->num, 1, mxREAL );
  362.     mx_weight = mxCreateDoubleMatrix( p_Weight->num, 1, mxREAL );
  363.     mx_new_fir_coeff_F1 = mxCreateDoubleMatrix( 1, MAX_AUDIO_COEFF_LEN, mxREAL ); // output
  364.     p_mx_wanted_ord = mxGetPr( mx_wanted_ord );
  365.     p_mx_process_Hz_odd = mxGetPr( mx_process_Hz_odd );
  366.     p_mx_new_fir_mag_odd = mxGetPr( mx_new_fir_mag_odd );
  367.     p_mx_weight = mxGetPr( mx_weight );
  368.     memcpy( (void *) p_mx_wanted_ord, d_wanted_ord, sizeof(d_wanted_ord) );
  369.     memcpy( (void *) p_mx_process_Hz_odd, ProcessOddHz, (p_ProcessOddSpCoef->num)*sizeof(double) );
  370.     memcpy( (void *) p_mx_new_fir_mag_odd, p_NewFirOddSpCoef->Mag, (p_NewFirOddSpCoef->num)*sizeof(double) );
  371.     memcpy( (void *) p_mx_weight, p_Weight->weight, (p_Weight->num)*sizeof(double) );
  372.     nlhs=1, nrhs = 4;
  373.     prhs[0] = mx_wanted_ord;
  374.     prhs[1] = mx_process_Hz_odd;
  375.     prhs[2] = mx_new_fir_mag_odd;
  376.     prhs[3] = mx_weight;
  377.     plhs[0] = mx_new_fir_coeff_F1;
  378.     InitializeModule_firls();
  379.     InitializeModule_signal_private_firchk();
  380.     InitializeModule_sinc();
  381.     mlxFirls(nlhs, plhs, nrhs, prhs);
  382.     p_mx_new_fir_coeff_F1 =  mxGetPr( plhs[0] );
  383.     p_NewFirCoeffF1->taps = wanted_ord + 1;
  384.     for(int i=0; i<p_NewFirCoeffF1->taps; i++)
  385.     {
  386.         p_NewFirCoeffF1->FirCoef[i] = *(p_mx_new_fir_coeff_F1 + i);
  387.     }
  388.     TerminateModule_sinc();
  389.     TerminateModule_signal_private_firchk();
  390.     TerminateModule_firls();
  391.     // free mxArray memory
  392.     mxDestroyArray( mx_wanted_ord );
  393.     mxDestroyArray( mx_process_Hz_odd );
  394.     mxDestroyArray( mx_new_fir_mag_odd );
  395.     mxDestroyArray( mx_weight );
  396.     mxDestroyArray( mx_new_fir_coeff_F1 );
  397. }
  398. #endif
  399. #if 0
  400. //------------------------------------------------------------------------------
  401. void  CMELODYCOEFCAL32::interp1(sMelodySelected *p_mSel, sMelodyInterpolate *p_xi_Coeff )
  402. {
  403.     double  d_mx_X[TOTAL_MELODY_SAMPLE_NUM], d_mx_Y[TOTAL_MELODY_SAMPLE_NUM], d_mx_xi[TOTAL_MELODY_SAMPLE_NUM];
  404.     double  *p_mx_X, *p_mx_Y, *p_mx_xi, *p_mx_method;
  405.     double  *p_mx_a;  // output
  406.     int  i, nlhs, nrhs;
  407.     mxArray  *mx_X = NULL, *mx_Y = NULL, *mx_xi = NULL, *mx_method = NULL;
  408.     mxArray  *mx_a = NULL; //output
  409.     mxArray *plhs[1], *prhs[4];
  410.     char *str_method;
  411.     str_method = "linear";
  412.     mx_X = mxCreateDoubleMatrix(TOTAL_SEL_MELODY_FREQ_NUM, 1, mxREAL);
  413.     mx_Y = mxCreateDoubleMatrix( TOTAL_SEL_MELODY_FREQ_NUM, 1, mxREAL );
  414.     mx_xi = mxCreateDoubleMatrix( TOTAL_MELODY_SAMPLE_NUM, 1, mxREAL );
  415.     mx_method = mxCreateString("linear");
  416.     mx_a = mxCreateDoubleMatrix( TOTAL_MELODY_SAMPLE_NUM, 1, mxREAL );  // output
  417.     p_mx_X = mxGetPr( mx_X );
  418.     p_mx_Y = mxGetPr( mx_Y );
  419.     p_mx_xi = mxGetPr( mx_xi );
  420.     p_mx_method = mxGetPr( mx_method );
  421.     p_mx_a = mxGetPr( mx_a );
  422.     memcpy( (void *) p_mx_X, p_mSel->Hz, sizeof(p_mSel->Hz) );
  423.     memcpy( (void *) p_mx_Y, p_mSel->MagdB, sizeof(p_mSel->MagdB) );
  424.     memcpy( (void *) p_mx_xi, p_xi_Coeff->Hz, sizeof(p_xi_Coeff->Hz) );
  425.     //memcpy( (void *) p_mx_method, p_xi_Coeff->Hz, sizeof(p_xi_Coeff->Hz) );
  426.     nlhs=1, nrhs = 3;
  427.     prhs[0] = mx_X;
  428.     prhs[1] = mx_Y;
  429.     prhs[2] = mx_xi;
  430.    // prhs[3] = mx_method;
  431.     plhs[0] = mx_a;
  432.     libmmfileInitialize();
  433.     //InitializeModule_libmmfile();
  434.     InitializeModule_interp1q_b();
  435.     InitializeModule_interp1b();
  436.     libmatlbmxInitialize();
  437.     libmmfile_defsInitialize();
  438.     //mlxInterp1(nlhs, plhs, nrhs, prhs);
  439.     //mlxInterp1b(nlhs, plhs, nrhs, prhs);
  440.     mlxInterp1q_b(nlhs, plhs, nrhs, prhs);
  441.     //TerminateModule_libmmfile();
  442.      //plhs[0] = mlfInterp1q(mx_X, mx_Y, mx_xi);
  443.     p_mx_a =  mxGetPr( plhs[0] );
  444.     for( i=0; i<TOTAL_MELODY_SAMPLE_NUM; i++)
  445.     {
  446.         p_xi_Coeff->MagdB[i] = *(p_mx_a + i);
  447.     }
  448.    // TerminateModule_libmmfile();
  449.    libmmfile_defsTerminate();
  450.    libmmfileTerminate();
  451.    TerminateModule_interp1b();
  452.    TerminateModule_interp1q_b();
  453.     // free mxArray memory
  454.     mxDestroyArray( mx_X );
  455.     mxDestroyArray( mx_Y );
  456.     mxDestroyArray( mx_xi );
  457.     mxDestroyArray( mx_a );
  458. }
  459. #endif
  460. //------------------------------------------------------------------------------
  461. bool  CMELODYCOEFCAL32::interp1(sMelodySelected *p_mSel, sMelodyInterpolate *p_xi_Coeff )
  462. {
  463.     double interpolate_value[TOTAL_MELODY_SAMPLE_NUM];
  464.     int idx1, idx2;
  465.     for(int i=0; i<TOTAL_MELODY_SAMPLE_NUM; i++)
  466.     {
  467.         if( ! getIndexRange(p_xi_Coeff->Hz[i], p_mSel->Hz, idx1, idx2) )
  468.         {
  469.             return false;
  470.         }
  471.         if( ! getInterpolateValue(p_mSel, idx1, idx2, p_xi_Coeff->Hz[i], interpolate_value[i]) )
  472.         {
  473.             return false;
  474.         }
  475.         p_xi_Coeff->Mag[i] =  interpolate_value[i];
  476.         p_xi_Coeff->MagdB[i] = 20.0*log10(Abs_double(p_xi_Coeff->Mag[i]));
  477.     }
  478.     return true;
  479. }
  480. //------------------------------------------------------------------------------
  481. bool  CMELODYCOEFCAL32::getIndexRange( double source_Hz, double *p_dest_Hz, int &idx1, int &idx2)
  482. {
  483.     for(int j=0; j<TOTAL_SEL_MELODY_FREQ_NUM; j++)
  484.     {
  485.         if(  source_Hz >= *(p_dest_Hz +j) && source_Hz <= *(p_dest_Hz +j+1) )
  486.         {
  487.             idx1 = j;
  488.             idx2 = j+1;
  489.             return true;
  490.         }
  491.     }
  492.     return false;
  493. }
  494. //------------------------------------------------------------------------------
  495. bool CMELODYCOEFCAL32::getInterpolateValue(sMelodySelected *p_mSel, int idx1, int idx2, double source_Hz, double &interpolate_value)
  496. {
  497.     double slope;
  498.     slope = ( p_mSel->Mag[idx2] - p_mSel->Mag[idx1] ) / ( p_mSel->Hz[idx2] - p_mSel->Hz[idx1] );
  499.     interpolate_value = p_mSel->Mag[idx1] + slope * ( source_Hz - p_mSel->Hz[idx1] );
  500.     return true;
  501. }
  502. //===========================================================================
  503. ////////////////////////////  Global information  ///////////////////////////
  504. //===========================================================================
  505. int  CMELODYCOEFCAL32::Get_ConfirmState( void )
  506. {
  507.     return  m_iConfirmState;
  508. }