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

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.  *   form_32kFirCoeffCal.cpp
  40.  *
  41.  * Project:
  42.  * --------
  43.  *   Maui META APP
  44.  *
  45.  * Description:
  46.  * ------------
  47.  *  32k 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. //---------------------------------------------------------------------------
  66. #include <vcl.h>
  67. #include <vcl.h>
  68. #include <math.h>
  69. #include <IniFiles.hpp>
  70. //#include "freqz.h"
  71. //#include "psdoptions.h"
  72. //#include "firls.h"
  73. #pragma hdrstop
  74. #include "form_32kFirCoeffCal.h"
  75. #include "form_FirResponse.h"
  76. #include "sp_coef_cal.h"
  77. #include "melody_coef_cal32.h"
  78. #include "meta_utils.h"
  79. // misc
  80. #ifndef  _MISC_AUDIO_H_
  81. #include "misc_audio.h"
  82. #endif
  83. #include "math_utils.h"
  84. #include "man_dll.h"
  85. //---------------------------------------------------------------------------
  86. #pragma package(smart_init)
  87. #pragma resource "*.dfm"
  88. Tfrm32kFirCoefCal *frm32kFirCoefCal;
  89. //---------------------------------------------------------------------------
  90. __fastcall Tfrm32kFirCoefCal::Tfrm32kFirCoefCal(TComponent* Owner)
  91.         : TForm(Owner)
  92. {
  93.     int i;
  94.     // initialization
  95.     Fs = 32000.0;
  96.     DigitalScale = 0.5;
  97.   //  isTRCLoadOk = false;
  98.     isOrgCurvePlot = false;
  99.     isWantedCurvePlot = false;
  100.     isCompensateCurvePlot = false;
  101.     LogFloor = pow(10, -10);
  102.     pi = 3.1416;
  103.     lblVertical[0] = lblVertical0;
  104.     lblVertical[1] = lblVertical1;
  105.     lblVertical[2] = lblVertical2;
  106.     lblVertical[3] = lblVertical3;
  107.     lblVertical[4] = lblVertical4;
  108.     lblVertical[5] = lblVertical5;
  109.     lblVertical[6] = lblVertical6;
  110.     lblVertical[7] = lblVertical7;
  111.     lblVertical[8] = lblVertical8;
  112.     lblHorizotal[0] = lblh0Hz;
  113.     lblHorizotal[1] = lblh2000Hz;
  114.     lblHorizotal[2] = lblh4000Hz;
  115.     lblHorizotal[3] = lblh6000Hz;
  116.     lblHorizotal[4] = lblh8000Hz;
  117.     lblHorizotal[5] = lblh10000Hz;
  118.     lblHorizotal[6] = lblh12000Hz;
  119.     lblHorizotal[7] = lblh14000Hz;
  120.     lblHorizotal[8] = lblh16000Hz;
  121.     
  122.     lblHz[ 0] = lbl0Hz;      edtHzdB[ 0] = edt0HzdB;
  123.     lblHz[ 1] = lbl60Hz;     edtHzdB[ 1] = edt60HzdB;
  124.     lblHz[ 2] = lbl170Hz;    edtHzdB[ 2] = edt170HzdB;
  125.     lblHz[ 3] = lbl310Hz;    edtHzdB[ 3] = edt310HzdB;
  126.     lblHz[ 4] = lbl600Hz;    edtHzdB[ 4] = edt600HzdB;
  127.     lblHz[ 5] = lbl800Hz;    edtHzdB[ 5] = edt800HzdB;
  128.     lblHz[ 6] = lbl1000Hz;   edtHzdB[ 6] = edt1000HzdB;
  129.     lblHz[ 7] = lbl2000Hz;   edtHzdB[ 7] = edt2000HzdB;
  130.     lblHz[ 8] = lbl3000Hz;   edtHzdB[ 8] = edt3000HzdB;
  131.     lblHz[ 9] = lbl4000Hz;   edtHzdB[ 9] = edt4000HzdB;
  132.     lblHz[10] = lbl5000Hz;   edtHzdB[10] = edt5000HzdB;
  133.     lblHz[11] = lbl6000Hz;   edtHzdB[11] = edt6000HzdB;
  134.     lblHz[12] = lbl7000Hz;   edtHzdB[12] = edt7000HzdB;
  135.     lblHz[13] = lbl8000Hz;   edtHzdB[13] = edt8000HzdB;
  136.     lblHz[14] = lbl9000Hz;   edtHzdB[14] = edt9000HzdB;
  137.     lblHz[15] = lbl10000Hz;  edtHzdB[15] = edt10000HzdB;
  138.     lblHz[16] = lbl11000Hz;  edtHzdB[16] = edt11000HzdB;
  139.     lblHz[17] = lbl12000Hz;  edtHzdB[17] = edt12000HzdB;
  140.     lblHz[18] = lbl13000Hz;  edtHzdB[18] = edt13000HzdB;
  141.     lblHz[19] = lbl14000Hz;  edtHzdB[19] = edt14000HzdB;
  142.     lblHz[20] = lbl15000Hz;  edtHzdB[20] = edt15000HzdB;
  143.     lblHz[21] = lbl16000Hz;  edtHzdB[21] = edt16000HzdB;
  144.     vDistance = 40;
  145.     vScale = 10;
  146.     hDistance = imAudioCal->Width / MELODY_HORIZONTAL_LABEL_NUM;
  147.     hScale = 2000;
  148.     //hInScale2 = 50;
  149.     vStart = 10;
  150.     hStart = 0;
  151.     //hStart2 = hOutScale1*log10(100*9/hInScale1);
  152.     
  153.    // PlotGrid(0, 16000, -3, 5);
  154. //    PlotBoundaryCurve();
  155. }
  156. //---------------------------------------------------------------------------
  157. void __fastcall Tfrm32kFirCoefCal::btnSetupOutputFileClick(
  158.       TObject *Sender)
  159. {
  160.     bool ok = SaveDialog->Execute();
  161.     if( !ok )
  162.     {
  163.         sbAudioCal->Panels->Items[0]->Text = (AnsiString) "  Setup FIR file fail";
  164.         Application->MessageBox( "Execution Failure : Setup FIR file", "FAILURE", MB_OK );
  165.         return;
  166.     }
  167.     stOutputFileName->Caption = SaveDialog->FileName;
  168. }
  169. //---------------------------------------------------------------------------
  170. void __fastcall Tfrm32kFirCoefCal::edtdBCheck(TObject *Sender)
  171. {
  172.     double  data;
  173.     AnsiString  text;
  174.     TEdit *edit = (TEdit*)Sender;
  175.     char  hint[] = " character is not valid ";
  176.     text = edit->Text;
  177.     if( !IsValidMagdB( text, data ) )
  178.     {
  179.        ShowHintLabel( edit, hint );
  180.        edit->SetFocus();
  181.        return;
  182.     }
  183.     
  184.     mSel.MagdB[edit->Tag] = atof(edit->Text.c_str());
  185.     mSel.Mag[edit->Tag] = pow(10.0,  mSel.MagdB[edit->Tag]/20.0);
  186.     MELODY_COEF_CAL_Object.getInterpolateFreq( 100.0, 100.0, 16000.0, &xi );
  187.     MELODY_COEF_CAL_Object.interp1( &mSel, &xi );   // output xi.Mag
  188.     PlotCurve(PLOT_MELODY_GRID | PLOT_MELODY_ORG_CURVE);
  189. }
  190. //---------------------------------------------------------------------------
  191. void __fastcall Tfrm32kFirCoefCal::btnRunClick(TObject *Sender)
  192. {
  193.     AFT_RESULT    ret;
  194.     //static bool isMfileDllLoaded = false;
  195.     //static bool isFirstConnectMatlab = true;
  196.     //static bool result = false;
  197.     double min_y, max_y;
  198.     int i;
  199.     // check Matlab license.dat
  200.    // if( !SP_COEF_CAL_Object.CheckLicenseDat() )
  201.    // {
  202.    //     sbAudioCal->Panels->Items[0]->Text = (AnsiString) "  Please put Matlab license.dat under the same folder as Meta2.exe";
  203.    //     Application->MessageBox( "Please put Matlab license.dat under the same folder as Meta2.exe" , "ERROR", MB_OK );
  204.    //     return;
  205.    // }
  206.     // connect with Matlab check
  207.     //if( isFirstConnectMatlab )
  208.     //{
  209.     //    isFirstConnectMatlab = false;
  210.     //    sbAudioCal->Panels->Items[0]->Text = (AnsiString) "  Connect with Matlab progressing";
  211.     //    result = SP_COEF_CAL_Object.CheckEngineExist();
  212.     //}
  213.    // if( result == false )
  214.   //  {
  215.   //      sbAudioCal->Panels->Items[0]->Text = (AnsiString) "  Connect with Matlab fail";
  216.   //      Application->MessageBox( "  Connect with Matlab fail" , "ERROR", MB_OK );
  217.   //      return;
  218.   //  }
  219.    // if( isMfileDllLoaded == false )
  220.    // {
  221.     //
  222.     //    if( DllMan->LoadMfilesDllFunctions( this->Handle ) == false )
  223.     //    {
  224.     //
  225.     //        return;
  226.     //    }
  227.     //    isMfileDllLoaded = true;
  228.    // }
  229.     for(i=0; i<TOTAL_SEL_MELODY_FREQ_NUM; i++ )
  230.     {
  231.         getHzFromStr( lblHz[i]->Caption, mSel.Hz[i]);
  232.         mSel.MagdB[i] = atof(edtHzdB[i]->Text.c_str());
  233.         mSel.Mag[i] = pow(10.0,  mSel.MagdB[i]/20.0);
  234.     }
  235.     MELODY_COEF_CAL_Object.getInterpolateFreq( 100.0, 100.0, 16000.0, &xi );
  236.     MELODY_COEF_CAL_Object.interp1( &mSel, &xi );   // output xi.Mag
  237.     GetMinMaxY( &xi, &min_y, &max_y );
  238.     PlotGrid( 0, 16000, min_y-2, max_y+2);
  239.     PlotOrgCurve( xi.Hz, xi.MagdB ); // fig 1
  240.     ret = MELODY_COEF_CAL_Object.firls( 24, 32000, &xi, &B);
  241.     if( ret )
  242.     {
  243.         char str[256];
  244.         strcpy( str, MELODY_COEF_CAL_Object.Get_ErrorString( ret ) );
  245.         Application->MessageBox( str, "Fail", MB_OK );
  246.         return;
  247.     }
  248.     for(i=0; i<TOTAL_MELODY_SAMPLE_NUM; i++ )
  249.     {
  250.         H.Hz[i] = xi.Hz[i];
  251.     }
  252.     ret = MELODY_COEF_CAL_Object.freqz( &B, 1, TOTAL_MELODY_SAMPLE_NUM, 32000, &H);
  253.     if( ret )
  254.     {
  255.             char str[256];
  256.             strcpy( str, MELODY_COEF_CAL_Object.Get_ErrorString( ret ) );
  257.             Application->MessageBox( str, "Fail", MB_OK );
  258.             return;
  259.     }
  260.     PlotFreqzCurve( H.Hz, H.MagdB ); // fig 1
  261.     // 2nd run
  262.     MaxOfDoubleArray( B.Mag, MELODY_FIR_TAPS, &Bmax );
  263.     for( i=0; i<MELODY_FIR_TAPS; i++ )
  264.     {
  265.         Bnorm.Mag[i] = B.Mag[i] / Bmax;
  266.         BB.Mag[i] = Round_double( Bnorm.Mag[i]*MELODY_FIR_COEFF_SCALE );
  267.     }
  268.     for(i=0; i<TOTAL_MELODY_SAMPLE_NUM; i++ )
  269.     {
  270.         HH.Hz[i] = xi.Hz[i];
  271.     }
  272.     ret = MELODY_COEF_CAL_Object.freqz( &BB, 1, TOTAL_MELODY_SAMPLE_NUM, 32000, &HH);
  273.     if( ret )
  274.     {
  275.         char str[256];
  276.         strcpy( str, MELODY_COEF_CAL_Object.Get_ErrorString( ret ) );
  277.         Application->MessageBox( str, "Fail", MB_OK );
  278.         return;
  279.     }
  280.     // plot fig2
  281.     // 3rd run
  282.     Bsum = SumOfDoubleArray( B.Mag, MELODY_FIR_TAPS );
  283.     for( i=0; i<MELODY_FIR_TAPS; i++ )
  284.     {
  285.         Bsf.Mag[i] = Bnorm.Mag[i];
  286.         BBsum.Mag[i] = Round_double( Bsf.Mag[i]*MELODY_FIR_COEFF_SCALE*DigitalScale );
  287.     }
  288.     for(i=0; i<TOTAL_MELODY_SAMPLE_NUM; i++ )
  289.     {
  290.         HHH.Hz[i] = xi.Hz[i];
  291.     }
  292.     ret = MELODY_COEF_CAL_Object.freqz( &BBsum, 1, TOTAL_MELODY_SAMPLE_NUM, 32000, &HHH);
  293.     if( ret )
  294.     {
  295.             char str[256];
  296.             strcpy( str, MELODY_COEF_CAL_Object.Get_ErrorString( ret ) );
  297.             Application->MessageBox( str, "Fail", MB_OK );
  298.             return;
  299.     }
  300.     if( ! MELODY_COEF_CAL_Object.REQ_Write_FIR_File(stOutputFileName->Caption.c_str(), &BBsum) )
  301.     {
  302.         sbAudioCal->Panels->Items[0]->Text = (AnsiString) "  Write melody FIR coefficient to file fail";
  303.         Application->MessageBox( "Write melody FIR coefficient to file fail" , "FAIL", MB_OK );
  304.         return;
  305.     }
  306.     sbAudioCal->Panels->Items[0]->Text = (AnsiString) "  Run successfully";
  307. }
  308. //==============================================================================
  309. int Tfrm32kFirCoefCal::MapToCoordinatesX( double Hz )
  310. {
  311.     return (hStart + Hz/hScale*hDistance );
  312. }
  313. //--------------------------------------------------------------------------
  314. int Tfrm32kFirCoefCal::MapToCoordinatesY( double dB )
  315. {
  316.      return ( (vStart - dB ) /vScale*vDistance );
  317. }
  318. //==============================================================================
  319. void Tfrm32kFirCoefCal::PlotCurve( int plot_mask )
  320. {
  321.     // plot grid
  322.     double min_y, max_y;
  323.     if( plot_mask & PLOT_MELODY_GRID )
  324.     {
  325.         GetMinMaxY( &xi, &min_y, &max_y );
  326.         if( min_y == max_y )
  327.         {
  328.             PlotGrid(0, 16000, -3, 5);
  329.         }
  330.         else
  331.         {
  332.             PlotGrid( 0, 16000, min_y-2, max_y+2);
  333.         }
  334.     }
  335.     // plot original curve
  336.     if( plot_mask & PLOT_MELODY_ORG_CURVE )
  337.     {
  338.         PlotOrgCurve( xi.Hz, xi.MagdB ); // fig 1
  339.     }
  340.     // plot FREQZ curve
  341.     if( plot_mask & PLOT_MELODY_FREQZ_CURVE )
  342.     {
  343.         PlotFreqzCurve( H.Hz, H.MagdB ); // fig 1
  344.     }
  345. }
  346. //---------------------------------------------------------------------------
  347. void Tfrm32kFirCoefCal::PlotGrid(int min_x, int max_x, int min_y, int max_y)
  348. {
  349.      int i;
  350.      double range;
  351.      ClearImage();
  352.      // set pen color & style
  353.     imAudioCal->Canvas->Pen->Color = clBlack;
  354.     imAudioCal->Canvas->Pen->Width = 1;
  355.     imAudioCal->Canvas->Pen->Style = psDot;
  356.      
  357.     // plot horizotal grid & label
  358.     vStart = max_y;
  359.     vDistance = imAudioCal->Height / 9;
  360.     vScale = (max_y - min_y)/9 + 1;
  361.     if( vScale < 1)
  362.     {
  363.         vScale = 1;
  364.     }
  365.     for(i=0; i<MELODY_VERTICAL_LABEL_NUM; i++)
  366.     {
  367.         lblVertical[i]->Top =  imAudioCal->Top + i*vDistance - 5;
  368.         lblVertical[i]->Left = imAudioCal->Left - 20;
  369.         lblVertical[i]->Caption = IntToStr( max_y - i*vScale );
  370.         imAudioCal->Canvas->MoveTo( 1, i*vDistance );
  371.         imAudioCal->Canvas->LineTo( 1 + imAudioCal->Width, i*vDistance );
  372.     }
  373.     // plot vertical grid & label
  374.     for( i=0; i<MELODY_HORIZONTAL_LABEL_NUM; i++ )
  375.     {
  376.         lblHorizotal[i]->Left = imAudioCal->Left + i*hDistance - 10;
  377.         lblHorizotal[i]->Top = imAudioCal->Top + imAudioCal->Height + 5;
  378.         imAudioCal->Canvas->MoveTo( i*hDistance, 1 );
  379.         imAudioCal->Canvas->LineTo( i*hDistance, imAudioCal->Height );
  380.     }
  381. }
  382. //------------------------------------------------------------------------
  383. void Tfrm32kFirCoefCal::GetMinMaxY( sMelodyInterpolate *p_MelodyInterpolate, double *p_min_y, double *p_max_y )
  384. {
  385.     *p_min_y = 1000000.0;
  386.     *p_max_y =  -1000000.0;
  387.     for( int i=0; i<TOTAL_MELODY_SAMPLE_NUM; i++ )
  388.     {
  389.         if( *(p_MelodyInterpolate->MagdB+i) < *p_min_y )
  390.         {
  391.             *p_min_y = *(p_MelodyInterpolate->MagdB+i);
  392.         }
  393.         if( *(p_MelodyInterpolate->MagdB+i) > *p_max_y )
  394.         {
  395.              *p_max_y = *(p_MelodyInterpolate->MagdB+i);
  396.         }
  397.     }
  398. }
  399. //---------------------------------------------------------------------------
  400. void Tfrm32kFirCoefCal::PlotOrgCurve( double *p_xi, double *p_yi)
  401. {
  402.     // set pen color & style
  403.     imAudioCal->Canvas->Pen->Color = clBlue;
  404.     imAudioCal->Canvas->Pen->Width = 1;
  405.     imAudioCal->Canvas->Pen->Style = psSolid;
  406.     imAudioCal->Canvas->MoveTo( MapToCoordinatesX(p_xi[0]), MapToCoordinatesY(p_yi[0]) );
  407.     for( int i=1; i<TOTAL_MELODY_SAMPLE_NUM; i++ )
  408.     {
  409.         imAudioCal->Canvas->LineTo( MapToCoordinatesX(p_xi[i]), MapToCoordinatesY(p_yi[i]) );
  410.     }
  411. }
  412. //---------------------------------------------------------------------------
  413. void Tfrm32kFirCoefCal::PlotFreqzCurve( double *p_xi, double *p_yi)
  414. {
  415.     // set pen color & style
  416.     imAudioCal->Canvas->Pen->Color = clRed;
  417.     imAudioCal->Canvas->Pen->Width = 1;
  418.     imAudioCal->Canvas->Pen->Style = psDot;
  419.     imAudioCal->Canvas->MoveTo( MapToCoordinatesX(p_xi[0]), MapToCoordinatesY(p_yi[0]) );
  420.     for( int i=1; i<TOTAL_MELODY_SAMPLE_NUM; i++ )
  421.     {
  422.         imAudioCal->Canvas->LineTo( MapToCoordinatesX(p_xi[i]), MapToCoordinatesY(p_yi[i]) );
  423.     }
  424. }
  425. //---------------------------------------------------------------------------
  426. void Tfrm32kFirCoefCal::ClearImage( void )
  427. {
  428.     imAudioCal->Canvas->Brush->Color = clWhite;
  429.     imAudioCal->Canvas->Brush->Style = bsSolid;
  430.     imAudioCal->Canvas->FillRect(Rect(0,0,imAudioCal->Width,imAudioCal->Height));
  431. }
  432. //==============================================================================
  433. bool Tfrm32kFirCoefCal::read_32k_Melody_FIR_setup(
  434.                                                    AnsiString asSetupFile,
  435.                                                    AnsiString asExeName
  436.                                                  )
  437.  {
  438.     AnsiString asPath;
  439.     TIniFile *ini;
  440.     if ( getPathFromStr(asExeName, asPath) &&
  441.          withPath( asPath) &&
  442.          !withPath( asSetupFile)
  443.        )
  444.     {
  445.        asSetupFile = asPath + asSetupFile;
  446.     }
  447.     try
  448.     {
  449.         ini = new TIniFile( asSetupFile );
  450.         if(ini == NULL)  return false;
  451.         stOutputFileName->Caption  = ini->ReadString("32k Melody FIR Tunning","Output file name", "");
  452.         delete ini;
  453.         ini = NULL;
  454.         return  true;
  455.     }
  456.     catch (...)
  457.     {
  458.        AnsiString as_warning_msg;
  459.        as_warning_msg = " Melody FIR tunning : read setup file : " + asSetupFile + " error ";
  460.        Application->MessageBox( as_warning_msg.c_str(), "Warning", MB_OK );
  461.        return  false;
  462.     }
  463. }
  464. //---------------------------------------------------------------------------
  465. bool Tfrm32kFirCoefCal::write_32k_Melody_FIR_setup(
  466.                                                    AnsiString asSetupFile,
  467.                                                    AnsiString asExeName
  468.                                                  )
  469. {
  470.     AnsiString asPath;
  471.     TIniFile *ini;
  472.     if ( getPathFromStr(asExeName, asPath) &&
  473.          withPath( asPath) &&
  474.          !withPath( asSetupFile)
  475.        )
  476.     {
  477.        asSetupFile = asPath + asSetupFile;
  478.     }
  479.     try
  480.     {
  481.        ini = new TIniFile( asSetupFile );
  482.        if(ini == NULL)  return false;
  483.        ini->WriteString("32k Melody FIR Tunning","Output file name", stOutputFileName->Caption );
  484.        delete ini;
  485.        ini = NULL;
  486.        return  true;
  487.     }
  488.     catch (...)
  489.     {
  490.         AnsiString as_warning_msg;
  491.         as_warning_msg = " Melody FIR tunning : write setup file : " + asSetupFile + " error ";
  492.         Application->MessageBox( as_warning_msg.c_str(), "Warning", MB_OK );
  493.         return  false;
  494.     }
  495. }
  496. //==============================================================================
  497. //---------------------------------------------------------------------------
  498. void  Tfrm32kFirCoefCal::ShowHintLabel( TControl *sender, char* hint )
  499. {
  500.    TPoint pt0 = this->ClientOrigin;
  501.    TPoint pt1 = sender->ClientOrigin;
  502.    lblHint->Left = (pt1.x-pt0.x-30);
  503.    lblHint->Top  = (pt1.y-pt0.y)+sender->Height+3;
  504.    lblHint->Caption = hint;
  505.    lblHint->Visible = true;
  506.    HintTimer->Enabled = true;
  507. }
  508. //=============================================================================
  509. void __fastcall Tfrm32kFirCoefCal::FormShow(TObject *Sender)
  510. {
  511.     static bool init = true;
  512.     if( init )
  513.     {
  514.         init = false;
  515.         read_32k_Melody_FIR_setup( "MF_setup.txt", Application->ExeName );
  516.         for(int i=0; i<MELODY_EDIT_HZ_DB_NUM; i++)
  517.         {
  518.             edtdBCheck( edtHzdB[i] );
  519.             getHzFromStr( lblHz[i]->Caption, mSel.Hz[i]);
  520.             mSel.Mag[i] = pow(10.0,  mSel.MagdB[i]/20.0);
  521.         }
  522.         MELODY_COEF_CAL_Object.getInterpolateFreq( 100.0, 100.0, 16000.0, &xi );
  523.         MELODY_COEF_CAL_Object.interp1( &mSel, &xi );   // output xi.Mag
  524.     //GetMinMaxY( &xi, &min_y, &max_y );
  525.     //PlotGrid( 0, 16000, min_y, max_y);
  526.     //PlotOrgCurve( xi.Hz, xi.MagdB ); // fig 1
  527.         PlotCurve(PLOT_MELODY_GRID | PLOT_MELODY_ORG_CURVE);
  528.     }
  529. }
  530. //---------------------------------------------------------------------------
  531. void __fastcall Tfrm32kFirCoefCal::FormClose(TObject *Sender,
  532.       TCloseAction &Action)
  533. {
  534.     write_32k_Melody_FIR_setup( "MF_setup.txt", Application->ExeName );    
  535. }
  536. //---------------------------------------------------------------------------
  537. void __fastcall Tfrm32kFirCoefCal::HintTimerTimer(TObject *Sender)
  538. {
  539.     HintTimer->Enabled = false;
  540.     lblHint->Visible = false;    
  541. }
  542. //---------------------------------------------------------------------------
  543. void __fastcall Tfrm32kFirCoefCal::edtDigitalScaleCheck(TObject *Sender)
  544. {
  545.     AnsiString  text;
  546.     float  data;
  547.     int  band;
  548.     TEdit *edit = (TEdit*)Sender;
  549.     char  hint[] = "value shall be 0 ~ 1.0";
  550.     text = edit->Text;
  551.     if( !IsValidDigitalScale( text, data ) )
  552.     {
  553.         edit->Text = 0;
  554.         ShowHintLabel( edit, hint );
  555.         edit->SetFocus();
  556.         return;
  557.     }
  558.     DigitalScale = data;
  559. }
  560. //---------------------------------------------------------------------------