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

MTK

开发平台:

C++ Builder

  1.     if( ! edtdBCheck(Sender) )
  2.     {
  3.         return;
  4.     }
  5.     dB = atof(edt39xxHzdB->Text.c_str());
  6.     
  7.     if( dB !=  UISelectedSpCoef.MagdB[14] )
  8.     {
  9.         UISelectedSpCoef.MagdB[14] = dB;
  10.         Update_dB(&SelectedSpCoef, 14, dB, &WantedSpCoef);
  11.         Update_edtExtraDB( 14, dB );
  12.     }
  13. }
  14. //---------------------------------------------------------------------------
  15. void __fastcall TfrmFIRCoeffCal::edtFIRTapsExit(TObject *Sender)
  16. {
  17.     AnsiString  text;
  18.     short  data;
  19.     int  band;
  20.     TEdit *edit = (TEdit*)Sender;
  21.     char  hint[]= "value shall be 1 ~ 44";
  22.     text = edit->Text;
  23.     if (!IsValidFirTaps(text, data))
  24.     {
  25.         if( m_b45TapSupport )
  26.         {   edit->Text = SPEECH_FIR_44_TAPS_NUM;
  27.         }
  28.         else
  29.         {
  30.             edit->Text = SPEECH_FIR_30_TAPS_NUM;
  31.         }
  32.         m_iWantedTaps = (edit->Text).ToInt();
  33.         ShowHintLabel( edit, hint );
  34.         edit->SetFocus();
  35.         return;
  36.     }
  37.     m_iWantedTaps = data;
  38. }
  39. //---------------------------------------------------------------------------
  40. void  TfrmFIRCoeffCal::ShowHintLabel( TControl *sender, char* hint )
  41. {
  42.    TPoint pt0 = this->ClientOrigin;
  43.    TPoint pt1 = sender->ClientOrigin;
  44.    lblHint->Left = (pt1.x-pt0.x-10);
  45.    lblHint->Top  = (pt1.y-pt0.y)+sender->Height+3;
  46.    lblHint->Caption = hint;
  47.    lblHint->Visible = true;
  48.    HintTimer->Enabled = true;
  49. }
  50. void __fastcall TfrmFIRCoeffCal::FormDragDrop(TObject *Sender,
  51.       TObject *Source, int X, int Y)
  52. {
  53.      // Image1->Left = X;
  54.     //  Image1->Top  = Y;
  55. }
  56. //---------------------------------------------------------------------------
  57. void __fastcall TfrmFIRCoeffCal::FormDockOver(TObject *Sender,
  58.       TDragDockObject *Source, int X, int Y, TDragState State,
  59.       bool &Accept)
  60. {
  61.    //Accept = true;
  62.    //Image1->Left = X;
  63.    //Image1->Top = Y;
  64. }
  65. //---------------------------------------------------------------------------
  66. void __fastcall TfrmFIRCoeffCal::Image1DragDrop(TObject *Sender,
  67.       TObject *Source, int X, int Y)
  68. {
  69.      //Image1->Left = X;
  70.      //Image1->Top = Y;
  71. }
  72. //---------------------------------------------------------------------------
  73. void __fastcall TfrmFIRCoeffCal::FormMouseDown(TObject *Sender,
  74.       TMouseButton Button, TShiftState Shift, int X, int Y)
  75. {
  76.      //char buf[20];
  77.      //sprintf(buf, " (x=%d, y=%d) ", X, Y);
  78.      //sbAudioCal->Panels->Items[0]->Text = (AnsiString) buf;
  79. }
  80. //---------------------------------------------------------------------------
  81. void __fastcall TfrmFIRCoeffCal::imAudioCalMouseDown(TObject *Sender,
  82.       TMouseButton Button, TShiftState Shift, int X, int Y)
  83. {
  84.     char buf[20];
  85.     sprintf(buf, " (x=%d, y=%d) ", X, Y);
  86.     sbAudioCal->Panels->Items[0]->Text = (AnsiString) buf;
  87.     for(int i=0; i<WantedPoint.num; i++)
  88.     {
  89.         if( WantedPoint.x[i]-2<=X && X<=WantedPoint.x[i]+2 &&
  90.             WantedPoint.y[i]-2<=Y && Y<=WantedPoint.y[i]+2 )
  91.         {
  92.             //Application->MessageBox( " Bingo ", "Fail", MB_OK );
  93.             isWantedCircleOnDrag = true;
  94.             break;
  95.         }
  96.     }
  97. }
  98. //---------------------------------------------------------------------------
  99. int  TfrmFIRCoeffCal::getSelectedSpCoefIndex(double Hz, sSelectedParameters *p_SelectedSpCoef)
  100. {
  101.     int index = NOT_FOUND;
  102.     for(int i=0; i<TOTAL_SEL_FREQ_NUM; i++)
  103.     {
  104.         if(p_SelectedSpCoef->Hz[i] == Hz)
  105.         {
  106.             index = i;
  107.             break;
  108.         }
  109.     }
  110.     return  index;
  111. }
  112. //---------------------------------------------------------------------------
  113. int  TfrmFIRCoeffCal::getWantedSpCoefIndex(double Hz, sSpCoefCalParameters *p_SpCoefCal)
  114. {
  115.     int index = NOT_FOUND;
  116.     for (unsigned int i=0; i<p_SpCoefCal->num; i++)
  117.     {
  118.         if( (int) p_SpCoefCal->Hz[i] == Hz)
  119.         {
  120.             index = i;
  121.             break;
  122.         }
  123.     }
  124.     return  index;
  125. }
  126. //------------------------------------------------------------------------------
  127. void __fastcall TfrmFIRCoeffCal::edtExtraDBExit(TObject *Sender)
  128. {
  129.     int index;
  130.     double  MdB, Hz;
  131.     MdB = atof(edtExtraDB->Text.c_str());
  132.    // Mdata = pow( 10.0, MdB/20.0 );
  133.     WantedSpCoef.MagdB[cbExtraFreq->ItemIndex] = MdB;
  134.     WantedSpCoef.Mag[cbExtraFreq->ItemIndex] = pow(10.0, MdB/20.0);
  135.     UIWantedSpCoef.MagdB[cbExtraFreq->ItemIndex] = MdB;
  136.     // update edtxxxHzdB
  137.     if( getHzFromStr( cbExtraFreq->Text, Hz ) )
  138.     {
  139.         index = getSelectedSpCoefIndex(Hz, &SelectedSpCoef);
  140.         if( index == NOT_FOUND )
  141.         {
  142.             // plot curve
  143.             PlotCurve( PLOT_GRID | PLOT_BOUNDARY_CURVE | PLOT_WANTED_CURVE | PLOT_ORG_CURVE );
  144.             return;
  145.         }
  146.         edtHzdB[index]->Text = Double_To_AnsiString(MdB);
  147.         if( MdB !=  UISelectedSpCoef.MagdB[index] )
  148.         {
  149.             UISelectedSpCoef.MagdB[index] = MdB;
  150.             Update_dB(&SelectedSpCoef, index, MdB, &WantedSpCoef);
  151.         }
  152.     }
  153. //
  154.  //   if( index
  155. }
  156. //==============================================================================
  157. void TfrmFIRCoeffCal::Update_edtExtraDB( int select_idx, double dB )
  158. {
  159.     double Hz;
  160.     int wanted_idx;
  161.     getHzFromStr( cbExtraFreq->Text, Hz);
  162.     if( Hz == (int) SelectedSpCoef.Hz[select_idx] )
  163.     {
  164.         edtExtraDB->Text = Double_To_AnsiString( dB );
  165.         wanted_idx = getWantedSpCoefIndex(Hz, &WantedSpCoef);
  166.         if( wanted_idx != NOT_FOUND )
  167.         {
  168.            UIWantedSpCoef.MagdB[wanted_idx] = dB;
  169.         }
  170.     }
  171. }
  172. //---------------------------------------------------------------------------
  173. void __fastcall TfrmFIRCoeffCal::imAudioCalDragOver(TObject *Sender,
  174.       TObject *Source, int X, int Y, TDragState State, bool &Accept)
  175. {
  176.     if( State == dsDragEnter )
  177.     {
  178.         char buf[20];
  179.         sprintf(buf, " (x=%d, y=%d) ", X, Y);
  180.         sbAudioCal->Panels->Items[0]->Text = (AnsiString) buf;
  181.         for(int i=0; i<WantedPoint.num; i++)
  182.         {
  183.             if( WantedPoint.x[i]-2<=X && X<=WantedPoint.x[i]+2 &&
  184.                 WantedPoint.y[i]-2<=Y && Y<=WantedPoint.y[i]+2 )
  185.             {
  186.                 isWantedCircleOnDrag = true;
  187.                 WantedCircleOnDragIndex = i;
  188.                 break;
  189.             }
  190.         }
  191.     }    
  192. }
  193. //---------------------------------------------------------------------------
  194. void __fastcall TfrmFIRCoeffCal::imAudioCalEndDrag(TObject *Sender,
  195.       TObject *Target, int X, int Y)
  196. {
  197.     if( isWantedCircleOnDrag )
  198.     {
  199.         if( X == 0 && Y == 0 ) // outside image
  200.         {
  201.             Application->MessageBox( " Destination coordinates is outside image range", "Warning", MB_OK );
  202.             return;
  203.         }
  204.         WantedPoint.y[WantedCircleOnDragIndex] = Y;
  205.         PointTodB( WantedCircleOnDragIndex );
  206.         PlotCurve( PLOT_GRID | PLOT_BOUNDARY_CURVE | PLOT_WANTED_CURVE | PLOT_ORG_CURVE );
  207.         isWantedCircleOnDrag = false;
  208.         UpdateEditor();
  209.     }
  210. }
  211. //---------------------------------------------------------------------------
  212. void  TfrmFIRCoeffCal::PointTodB( int Wanted_idx )
  213. {
  214.     if( Wanted_idx >= 0 )
  215.     {
  216.         WantedSpCoef.MagdB[Wanted_idx] = (double) max_y_grid - (WantedPoint.y[Wanted_idx]-vStart)*vScale/vDistance;
  217.         WantedSpCoef.Mag[Wanted_idx] = pow(10.0, WantedSpCoef.MagdB[Wanted_idx]/20.0);
  218.     }
  219. }
  220. //---------------------------------------------------------------------------
  221. void __fastcall TfrmFIRCoeffCal::btnSetupOutputTxFileClick(TObject *Sender)
  222. {
  223.     
  224.     bool ok = SaveDialog->Execute();
  225.     if( !ok )
  226.     {
  227.         sbAudioCal->Panels->Items[0]->Text = (AnsiString) "  Setup output TX file fail";
  228.         Application->MessageBox( "Execution Failure : Setup output TX file", "FAILURE", MB_OK );
  229.         return;
  230.     }
  231.     stOutputTxFileName->Caption = SaveDialog->FileName;
  232. }
  233. //---------------------------------------------------------------------------
  234. void __fastcall TfrmFIRCoeffCal::btnSetupOutpuRxFileClick(TObject *Sender)
  235. {
  236.     bool ok = SaveDialog->Execute();
  237.     if( !ok )
  238.     {
  239.         sbAudioCal->Panels->Items[0]->Text = (AnsiString) "  Setup output RX file fail";
  240.         Application->MessageBox( "Execution Failure : Setup output RX file", "FAILURE", MB_OK );
  241.         return;
  242.     }
  243.     stOutputRxFileName->Caption = SaveDialog->FileName;
  244. }
  245. //---------------------------------------------------------------------------
  246. bool TfrmFIRCoeffCal::read_8k_Acoustic_FIR_setup(
  247.                                                    AnsiString asSetupFile,
  248.                                                    AnsiString asExeName
  249.                                                  )
  250.  {
  251.     AnsiString asPath;
  252.     TIniFile *ini;
  253.     if ( getPathFromStr(asExeName, asPath) &&
  254.          withPath( asPath) &&
  255.          !withPath( asSetupFile)
  256.        )
  257.     {
  258.        asSetupFile = asPath + asSetupFile;
  259.     }
  260.     try
  261.     {
  262.         ini = new TIniFile( asSetupFile );
  263.         if(ini == NULL)  return false;
  264.         DisplayDirection();
  265.         DisplayBoundary();
  266.         DisplayEquipment();
  267.         DisplayFileFormat();
  268.         
  269.         stInputFileName->Caption  = ini->ReadString("8k Acoustic FIR Tunning","Input file name", "");
  270.         if (stInputFileName->Caption.AnsiCompareIC("") != 0 )
  271.         {
  272.             if (rbAcqua->Checked)
  273.             {
  274.                 LoadAcquaFile(stInputFileName->Caption.c_str());
  275.             }
  276.             else if (rbMicrotronix->Checked)
  277.             {
  278.                 LoadMicrotronixFile(stInputFileName->Caption.c_str());
  279.             }
  280.             if (rbUPL->Checked)
  281.             {
  282.                 LoadTRCFile(stInputFileName->Caption.c_str());
  283.             }
  284.             else if (m_rbUPV->Checked)
  285.             {
  286.                 LoadUpvFile(stInputFileName->Caption.c_str());
  287.             }
  288.             else
  289.             {
  290.                 LoadVitaFile(stInputFileName->Caption.c_str());
  291.             }
  292.         }    
  293.         stOutputTxFileName->Caption  = ini->ReadString("8k Acoustic FIR Tunning","Output TX file name", "");
  294.         stOutputRxFileName->Caption  = ini->ReadString("8k Acoustic FIR Tunning","Output RX file name", "");
  295.         delete ini;
  296.         ini = NULL;
  297.         return  true;
  298.     }
  299.     catch (...)
  300.     {
  301.        AnsiString as_warning_msg;
  302.        as_warning_msg = " Acoustic FIR tunning : read setup file : " + asSetupFile + " error ";
  303.        Application->MessageBox( as_warning_msg.c_str(), "Warning", MB_OK );
  304.        return  false;
  305.     }
  306. }
  307. //---------------------------------------------------------------------------
  308. bool TfrmFIRCoeffCal::write_8k_Acoustic_FIR_setup(
  309.                                                    AnsiString asSetupFile,
  310.                                                    AnsiString asExeName
  311.                                                  )
  312. {
  313.     AnsiString asPath;
  314.     TIniFile *ini;
  315.     if ( getPathFromStr(asExeName, asPath) &&
  316.          withPath( asPath) &&
  317.          !withPath( asSetupFile)
  318.        )
  319.     {
  320.        asSetupFile = asPath + asSetupFile;
  321.     }
  322.     try
  323.     {
  324.        ini = new TIniFile( asSetupFile );
  325.        if(ini == NULL)  return false;
  326.        ini->WriteString("8k Acoustic FIR Tunning","Input file name", stInputFileName->Caption );
  327.        ini->WriteString("8k Acoustic FIR Tunning","Output TX file name", stOutputTxFileName->Caption );
  328.        ini->WriteString("8k Acoustic FIR Tunning","Output RX file name", stOutputRxFileName->Caption );
  329.        SaveDirection();
  330.        SaveBoundary();
  331.        SaveEquipment();
  332.        SaveFileFormat();
  333.        delete ini;
  334.        ini = NULL;
  335.        return  true;
  336.     }
  337.     catch (...)
  338.     {
  339.         AnsiString as_warning_msg;
  340.         as_warning_msg = " Acoustic FIR tunning : write setup file : " + asSetupFile + " error ";
  341.         Application->MessageBox( as_warning_msg.c_str(), "Warning", MB_OK );
  342.         return  false;
  343.     }
  344. }
  345. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  346. void TfrmFIRCoeffCal::DisplayDirection( void )
  347. {
  348.     AnsiString as_direction = read_AcousticFirDirection( "MF_setup.txt", Application->ExeName );
  349.     if( as_direction.AnsiCompareIC("TX") == 0 )
  350.     {
  351.         rbTx->Checked = true;
  352.     }
  353.     else
  354.     {
  355.         rbRx->Checked = true;
  356.     }
  357. }
  358. //---------------------------------------------------------------------------
  359. void TfrmFIRCoeffCal::SaveDirection( void )
  360. {
  361.     if( rbTx->Checked )
  362.     {
  363.         write_AcousticFirDirection( "MF_setup.txt", Application->ExeName, "Tx" );
  364.     }
  365.     else
  366.     {
  367.         write_AcousticFirDirection( "MF_setup.txt", Application->ExeName, "Rx" );
  368.     }
  369. }
  370. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  371. void TfrmFIRCoeffCal::DisplayBoundary(void)
  372. {
  373.     AnsiString as_boundary = read_AcousticFirBoundary("MF_setup.txt", Application->ExeName);
  374.     if (as_boundary.AnsiCompareIC("Spec") == 0)
  375.     {
  376.         cbBoundary->ItemIndex = ITEMIDX_BOUNDARY_SPEC;
  377.     }
  378.     else if (as_boundary.AnsiCompareIC("Good sound") == 0)
  379.     {
  380.         cbBoundary->ItemIndex = ITEMIDX_BOUNDARY_GOOD_SOUND;
  381.     }
  382.     else if (as_boundary.AnsiCompareIC("3G handset and headset") == 0)
  383.     {
  384.         cbBoundary->ItemIndex = ITEMIDX_BOUNDARY_3G_HANDSET_AND_HEADSET;
  385.     }
  386.     else if (as_boundary.AnsiCompareIC("3G handsfree desktop and vehicle") == 0)
  387.     {
  388.         cbBoundary->ItemIndex = ITEMIDX_BOUNDARY_3G_HANDSFREE_DESKTOP_AND_VEHICLE;
  389.     }
  390.     else if (as_boundary.AnsiCompareIC("3G handsfree handheld") == 0)
  391.     {
  392.         cbBoundary->ItemIndex = ITEMIDX_BOUNDARY_3G_HANDSFREE_HANDHELD;
  393.     }
  394.     else if (as_boundary.AnsiCompareIC("VOIP handset") == 0)
  395.     {
  396.         cbBoundary->ItemIndex = ITEMIDX_BOUNDARY_VOIP_HANDSET;
  397.     }
  398.     else if (as_boundary.AnsiCompareIC("VOIP headset") == 0)
  399.     {
  400.         cbBoundary->ItemIndex = ITEMIDX_BOUNDARY_VOIP_HEADSET;
  401.     }
  402.     else if (as_boundary.AnsiCompareIC("VOIP handsfree") == 0)
  403.     {
  404.         cbBoundary->ItemIndex = ITEMIDX_BOUNDARY_VOIP_HANDSFREE;
  405.     }
  406.     else if (as_boundary.AnsiCompareIC("Type 3.3") == 0)
  407.     {
  408.         cbBoundary->ItemIndex = ITEMIDX_BOUNDARY_TYPE_3_3;
  409.     }
  410.     else
  411.     {
  412.         cbBoundary->ItemIndex = ITEMIDX_BOUNDARY_SPEC;
  413.     }
  414. }
  415. //---------------------------------------------------------------------------
  416. void TfrmFIRCoeffCal::SaveBoundary(void)
  417. {
  418.     if (ITEMIDX_BOUNDARY_SPEC == cbBoundary->ItemIndex)
  419.     {
  420.         write_AcousticFirBoundary("MF_setup.txt", Application->ExeName, "Spec");
  421.     }
  422.     else if (ITEMIDX_BOUNDARY_GOOD_SOUND == cbBoundary->ItemIndex)
  423.     {
  424.         write_AcousticFirBoundary("MF_setup.txt", Application->ExeName, "Good sound");
  425.     }
  426.     else if (ITEMIDX_BOUNDARY_3G_HANDSET_AND_HEADSET == cbBoundary->ItemIndex)
  427.     {
  428.         write_AcousticFirBoundary("MF_setup.txt", Application->ExeName, "3G handset and headset");
  429.     }
  430.     else if (ITEMIDX_BOUNDARY_3G_HANDSFREE_DESKTOP_AND_VEHICLE == cbBoundary->ItemIndex)
  431.     {
  432.         write_AcousticFirBoundary("MF_setup.txt", Application->ExeName, "3G handsfree desktop and vehicle");
  433.     }
  434.     else if (ITEMIDX_BOUNDARY_3G_HANDSFREE_HANDHELD == cbBoundary->ItemIndex)
  435.     {
  436.         write_AcousticFirBoundary("MF_setup.txt", Application->ExeName, "3G handsfree handheld");
  437.     }
  438.     else if (ITEMIDX_BOUNDARY_VOIP_HANDSET == cbBoundary->ItemIndex)
  439.     {
  440.         write_AcousticFirBoundary("MF_setup.txt", Application->ExeName, "VOIP handset");
  441.     }
  442.     else if (ITEMIDX_BOUNDARY_VOIP_HEADSET == cbBoundary->ItemIndex)
  443.     {
  444.         write_AcousticFirBoundary("MF_setup.txt", Application->ExeName, "VOIP headset");
  445.     }
  446.     else if( ITEMIDX_BOUNDARY_VOIP_HANDSFREE == cbBoundary->ItemIndex )
  447.     {
  448.         write_AcousticFirBoundary( "MF_setup.txt", Application->ExeName, "VOIP handsfree");
  449.     }
  450.     else if (ITEMIDX_BOUNDARY_TYPE_3_3 == cbBoundary->ItemIndex)
  451.     {
  452.         write_AcousticFirBoundary("MF_setup.txt", Application->ExeName, "Type 3.3");
  453.     }
  454.     else
  455.     {
  456.         write_AcousticFirBoundary( "MF_setup.txt", Application->ExeName, "Spec" );
  457.     }
  458. }
  459. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  460. void TfrmFIRCoeffCal::DisplayEquipment(void)
  461. {
  462.     AnsiString as_equ = read_AcousticFirEquipment("MF_setup.txt", Application->ExeName);
  463.     if (as_equ.AnsiCompareIC("Acqua") == 0)
  464.     {
  465.         rbAcqua->Checked = true;
  466.         rbAcquaClick(NULL);
  467.     }
  468.     else if (as_equ.AnsiCompareIC("Microtronix") == 0)
  469.     {
  470.         rbMicrotronix->Checked = true;
  471.         rbMicrotronixClick(NULL);
  472.     }
  473.     else if (as_equ.AnsiCompareIC("UPL") == 0)
  474.     {
  475.         rbUPL->Checked = true;
  476.         rbUPLClick(NULL);
  477.     }
  478.     else if (as_equ.AnsiCompareIC("UPV") == 0)
  479.     {
  480.         m_rbUPV->Checked = true;
  481.         m_rbUPVClick(NULL);
  482.     }
  483.     else
  484.     {
  485.         m_rbVita->Checked = true;
  486.         m_rbVitaClick(NULL);
  487.     }
  488. }
  489. //---------------------------------------------------------------------------
  490. void TfrmFIRCoeffCal::SaveEquipment(void)
  491. {
  492.     if (rbAcqua->Checked)
  493.     {
  494.         write_AcousticFirEquipment("MF_setup.txt", Application->ExeName, "Acqua");
  495.     }
  496.     else if (rbMicrotronix->Checked)
  497.     {
  498.         write_AcousticFirEquipment("MF_setup.txt", Application->ExeName, "Microtronix");
  499.     }
  500.     else if (rbUPL->Checked)
  501.     {
  502.         write_AcousticFirEquipment("MF_setup.txt", Application->ExeName, "UPL");
  503.     }
  504.     else if (m_rbUPV->Checked)
  505.     {
  506.         write_AcousticFirEquipment("MF_setup.txt", Application->ExeName, "UPV");
  507.     }
  508.     else
  509.     {
  510.         write_AcousticFirEquipment("MF_setup.txt", Application->ExeName, "Vita");
  511.     }
  512. }
  513. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  514. void TfrmFIRCoeffCal::DisplayFileFormat( void )
  515. {
  516.     AnsiString as_direction = read_AcousticFirFileFormat( "MF_setup.txt", Application->ExeName );
  517.     if( as_direction.AnsiCompareIC("Linear") == 0 )
  518.     {
  519.         rbLinear->Checked = true;
  520.     }
  521.     else
  522.     {
  523.         rbLogdB->Checked = true;
  524.     }
  525.     if (rbUPL->Checked || m_rbUPV->Checked)
  526.     {
  527.         rbLinear->Enabled = false;
  528.         rbLogdB->Enabled = false;
  529.     }
  530.     else
  531.     {
  532.         rbLinear->Enabled = true;
  533.         rbLogdB->Enabled = true;
  534.     }
  535. }
  536. //---------------------------------------------------------------------------
  537. void TfrmFIRCoeffCal::SaveFileFormat( void )
  538. {
  539.     if( rbLinear->Checked )
  540.     {
  541.         write_AcousticFirFileFormat( "MF_setup.txt", Application->ExeName, "Linear" );
  542.     }
  543.     else
  544.     {
  545.         write_AcousticFirFileFormat( "MF_setup.txt", Application->ExeName, "Log dB" );
  546.     }
  547. }
  548. //------------------------------------------------------------------------------
  549. bool TfrmFIRCoeffCal::LoadTRCFile(char *filename)
  550. {
  551.     AnsiString as_FullFileName;
  552.     double min_y, max_y;
  553.     // read TRC file
  554.     if( ! SP_COEF_CAL_Object.REQ_Read_TRC_File( filename, &TrcScale, &OrgSpCoef) )
  555.     {
  556.         isTRCLoadOk = false;
  557.     }
  558.     else
  559.     {
  560.         isTRCLoadOk = true;
  561.     }
  562.     for (unsigned int i=0; i<OrgSpCoef.num; i++)
  563.     {
  564.         if (OrgSpCoef.MagdB[i] < -25)
  565.         {
  566.             OrgSpCoef.MagdB[i] = -25;
  567.             OrgSpCoef.Mag[i] = pow( 10.0, -25.0/20.0 );
  568.         }
  569.     }
  570.     // set to wanted array & UI wanted array
  571.     if( OrgSpCoef.num > TOTAL_TRC_FREQ_NUM )
  572.     {
  573.         return  false;
  574.     }
  575.     WantedSpCoef.num = OrgSpCoef.num;
  576.     for (unsigned int i=0; i<OrgSpCoef.num; i++)
  577.     {
  578.         WantedSpCoef.Hz[i] = OrgSpCoef.Hz[i];
  579.         WantedSpCoef.Mag[i] = OrgSpCoef.Mag[i];
  580.         WantedSpCoef.MagdB[i] = OrgSpCoef.MagdB[i];
  581.         UIWantedSpCoef.MagdB[i] = OrgSpCoef.MagdB[i];
  582.     }
  583.     GetMinMaxY( &OrgSpCoef, &min_y, &max_y );
  584.     if( min_y == max_y || isTRCLoadOk == false || OrgSpCoef.num>TOTAL_TRC_FREQ_NUM)
  585.     {
  586.         PlotGrid(100, 4000, -20, 15);
  587.     }
  588.     else
  589.     {
  590.         PlotGrid( 100, 4000, min_y, max_y);
  591.     }
  592.     PlotBoundaryCurve();
  593.     // Plot original curve
  594.     PlotOrgCurve();
  595.     // update editor
  596.     UpdateEditor();
  597.     UpdateSelectedLabel();
  598.     UpdatecbExtraFreq(&WantedSpCoef);
  599.     #if 0
  600.     Updatecb1xxHz( &WantedSpCoef, SelectedSpCoef.index[0] );
  601.     Updatecb2xxHz( &WantedSpCoef, SelectedSpCoef.index[1] );
  602.     Updatecb3xxHz( &WantedSpCoef, SelectedSpCoef.index[2] );
  603.     Updatecb5xxHz( &WantedSpCoef, SelectedSpCoef.index[3] );
  604.     Updatecb6xxHz( &WantedSpCoef, SelectedSpCoef.index[4] );
  605.     Updatecb7xxHz( &WantedSpCoef, SelectedSpCoef.index[5] );
  606.     Updatecb8xxHz( &WantedSpCoef, SelectedSpCoef.index[6] );
  607.     Updatecb1xxxHz( &WantedSpCoef, SelectedSpCoef.index[7] );
  608.     Updatecb15xxHz( &WantedSpCoef, SelectedSpCoef.index[8] );
  609.     Updatecb18xxHz( &WantedSpCoef, SelectedSpCoef.index[9] );
  610.     Updatecb2xxxHz( &WantedSpCoef, SelectedSpCoef.index[10] );
  611.     Updatecb25xxHz( &WantedSpCoef, SelectedSpCoef.index[11] );
  612.     Updatecb3xxxHz( &WantedSpCoef, SelectedSpCoef.index[12] );
  613.     Updatecb34xxHz( &WantedSpCoef, SelectedSpCoef.index[13] );
  614.     Updatecb39xxHz( &WantedSpCoef, SelectedSpCoef.index[14] );
  615.     #endif
  616.     Updatecb1xxHz( &WantedSpCoef, 0 );
  617.     Updatecb2xxHz( &WantedSpCoef, 0 );
  618.     Updatecb3xxHz( &WantedSpCoef, 0 );
  619.     Updatecb5xxHz( &WantedSpCoef, 0 );
  620.     Updatecb6xxHz( &WantedSpCoef, 0 );
  621.     Updatecb7xxHz( &WantedSpCoef, 0 );
  622.     Updatecb8xxHz( &WantedSpCoef, 0 );
  623.     Updatecb1xxxHz( &WantedSpCoef, 0 );
  624.     Updatecb15xxHz( &WantedSpCoef, 0 );
  625.     Updatecb18xxHz( &WantedSpCoef, 0 );
  626.     Updatecb2xxxHz( &WantedSpCoef, 0 );
  627.     Updatecb25xxHz( &WantedSpCoef, 0 );
  628.     Updatecb3xxxHz( &WantedSpCoef, 0 );
  629.     Updatecb34xxHz( &WantedSpCoef, 0 );
  630.     Updatecb39xxHz( &WantedSpCoef, 0 );
  631.     // old FIR coefficient
  632.     if( rbTx->Checked )
  633.     {
  634.         //SP_COEF_CAL_Object.REQ_Read_FIR_File( "Tx_old_FIR", &Tx_old_FIR );
  635.         as_FullFileName = getFullPathFileName( (AnsiString) "Tx_old_FIR" );
  636.         if( SP_COEF_CAL_Object.REQ_Read_FIR_File( as_FullFileName.c_str(), m_b45TapSupport, &old_FIR ) == false )
  637.         {
  638.              Application->MessageBox( " Read Tx_old_FIR file fail" , "Error", MB_OK );
  639.              return false;
  640.         }
  641.         //SP_COEF_CAL_Object.ReorderFirCoef( &Tx_old_FIR );
  642.         SP_COEF_CAL_Object.ReorderFirCoef( &old_FIR );
  643.     }
  644.     else
  645.     {
  646.        // SP_COEF_CAL_Object.REQ_Read_FIR_File( "Rx_old_FIR", &Rx_old_FIR );
  647.        as_FullFileName = getFullPathFileName( (AnsiString) "Rx_old_FIR" );
  648.        if( SP_COEF_CAL_Object.REQ_Read_FIR_File( as_FullFileName.c_str(), m_b45TapSupport, &old_FIR ) == false )
  649.        {
  650.             Application->MessageBox( " Read Rx_old_FIR file fail" , "Error", MB_OK );
  651.             return false;
  652.        }
  653.        // SP_COEF_CAL_Object.ReorderFirCoef( &Rx_old_FIR );
  654.        SP_COEF_CAL_Object.ReorderFirCoef( &old_FIR );
  655.     }
  656.     // show Hz and dB and store index of Hz to dB's UserData
  657.     // Getting UPL database
  658.    // UPL_database.num = OrgSpCoef.num;
  659.    // for( i=0; i<UPL_database.num; i++ )
  660.    // {
  661.    //     UPL_database.Hz[i] = OrgSpCoef.Hz[i];
  662.    //     UPL_database.Mag[i] = OrgSpCoef.Mag[i];
  663.    //     UPL_database.MagdB[i] = OrgSpCoef.MagdB[i];
  664.    // }
  665.   
  666.     btnIdealize->Enabled = true;
  667.     btnRun->Enabled = true;
  668.     sbAudioCal->Panels->Items[0]->Text = (AnsiString) "  Load TRC file successfully";
  669.     if( rbUPL->Checked )
  670.     {
  671.         stInputFileName->Caption = (AnsiString) filename;
  672.     }
  673.     return true;
  674. }
  675. //------------------------------------------------------------------------------
  676. bool TfrmFIRCoeffCal::LoadAcquaFile(char *i_filename)
  677. {
  678.     char o_filename[1024];
  679.     if (!SP_COEF_CAL_Object.AcquaFile_To_UplFile(i_filename, rbRx->Checked, rbLinear->Checked, o_filename))
  680.     {
  681.         isTRCLoadOk = false;
  682.         return false;
  683.     }
  684.     stInputFileName->Caption = i_filename;
  685.     if (!LoadTRCFile(o_filename))
  686.     {
  687.         return false;
  688.     }
  689.     return true;
  690. }
  691. //------------------------------------------------------------------------------
  692. bool TfrmFIRCoeffCal::LoadMicrotronixFile(char *i_filename)
  693. {
  694.     char o_filename[1024];
  695.     if (!SP_COEF_CAL_Object.MicrotronixFile_To_UplFile(i_filename, rbRx->Checked, rbLinear->Checked, o_filename))
  696.     {
  697.         isTRCLoadOk = false;
  698.         return false;
  699.     }
  700.     stInputFileName->Caption = i_filename;
  701.     if (!LoadTRCFile(o_filename))
  702.     {
  703.         return false;
  704.     }
  705.     return true;
  706. }
  707. //------------------------------------------------------------------------------
  708. bool TfrmFIRCoeffCal::LoadUpvFile(char *i_filename)
  709. {
  710.     //char o_filename[1024];
  711.     AnsiString as_i_filename;
  712.     as_i_filename = (AnsiString) i_filename;
  713.     AnsiString as_o_filename = as_i_filename + ".trc";
  714.     if (!SP_COEF_CAL_Object.UpvFile_To_UplFile(i_filename, as_o_filename.c_str()))
  715.     {
  716.         isTRCLoadOk = false;
  717.         return false;
  718.     }
  719.     stInputFileName->Caption = i_filename;
  720.     if (!LoadTRCFile(as_o_filename.c_str()))
  721.     {
  722.         return false;
  723.     }
  724.     return true;
  725. }
  726. //------------------------------------------------------------------------------
  727. bool TfrmFIRCoeffCal::LoadVitaFile(char *i_filename)
  728. {
  729.     char o_filename[1024];
  730.     if (!SP_COEF_CAL_Object.VitaFile_To_UplFile(i_filename, rbRx->Checked, rbLinear->Checked, o_filename))
  731.     {
  732.         isTRCLoadOk = false;
  733.         return false;
  734.     }
  735.     stInputFileName->Caption = i_filename;
  736.     if (!LoadTRCFile(o_filename))
  737.     {
  738.         return false;
  739.     }
  740.     return true;
  741. }
  742. //--------------------------------------------------------------------------
  743. void __fastcall TfrmFIRCoeffCal::FormShow(TObject *Sender)
  744. {
  745.     if( m_bFirstFormShow )
  746.     {
  747.         m_bFirstFormShow = false;
  748.         read_8k_Acoustic_FIR_setup( "MF_setup.txt", Application->ExeName );
  749.         if( rbTx->Checked )
  750.         {
  751.              btnSetupOutputTxFile->Enabled = true;
  752.              btnSetupOutpuRxFile->Enabled = false;
  753.              stOutputTxFileName->Enabled = true;
  754.              stOutputRxFileName->Enabled = false;
  755.         }
  756.         else
  757.         {
  758.              btnSetupOutputTxFile->Enabled = false;
  759.              btnSetupOutpuRxFile->Enabled = true;
  760.              stOutputTxFileName->Enabled = false;
  761.              stOutputRxFileName->Enabled = true;
  762.         }
  763.        PlotCurve( PLOT_GRID | PLOT_BOUNDARY_CURVE );
  764.     }
  765. }
  766. //---------------------------------------------------------------------------
  767. void __fastcall TfrmFIRCoeffCal::FormClose(TObject *Sender,
  768.       TCloseAction &Action)
  769. {
  770.     write_8k_Acoustic_FIR_setup( "MF_setup.txt", Application->ExeName );
  771. }
  772. //---------------------------------------------------------------------------
  773. void __fastcall TfrmFIRCoeffCal::mTimerTimer(TObject *Sender)
  774. {
  775.     sbAudioCal->Panels->Items[0]->Text = (AnsiString) "  Connect MATLAB timeout";
  776.     Application->MessageBox( "Connect MATLAB timeout" , "Timeout", MB_OK );
  777. }
  778. //---------------------------------------------------------------------------
  779. void __fastcall TfrmFIRCoeffCal::rbSpecClick(TObject *Sender)
  780. {
  781.     double min_y, max_y;
  782.     
  783.     m_iTxLimitFreq[0] =  100;
  784.     m_iTxLimitFreq[1] =  200;
  785.     m_iTxLimitFreq[2] =  300;
  786.     m_iTxLimitFreq[3] = 1000;
  787.     m_iTxLimitFreq[4] = 2000;
  788.     m_iTxLimitFreq[5] = 3000;
  789.     m_iTxLimitFreq[6] = 3400;
  790.     m_iTxLimitFreq[7] = 4000;
  791.     m_dTxUpLimit[0] = -12;    //  100 Hz
  792.     m_dTxUpLimit[1] =   0;    //  200 Hz
  793.     m_dTxUpLimit[2] =   0;    //  300 Hz
  794.     m_dTxUpLimit[3] =   0;    // 1000 Hz
  795.     m_dTxUpLimit[4] =   4;    // 2000 Hz
  796.     m_dTxUpLimit[5] =   4;    // 3000 Hz
  797.     m_dTxUpLimit[6] =   4;    // 3400 Hz
  798.     m_dTxUpLimit[7] =   0;    // 4000 Hz
  799.     m_dTxLowLimit[0] = -100;    //  100 Hz
  800.     m_dTxLowLimit[1] = -100;    //  200 Hz
  801.     m_dTxLowLimit[2] =  -12;    //  300 Hz
  802.     m_dTxLowLimit[3] =   -6;    // 1000 Hz
  803.     m_dTxLowLimit[4] =   -6;    // 2000 Hz
  804.     m_dTxLowLimit[5] =   -6;    // 3000 Hz
  805.     m_dTxLowLimit[6] =   -9;    // 3400 Hz
  806.     m_dTxLowLimit[7] = -100;    // 4000 Hz
  807.     m_iRxLimitFreq[0] =  100;
  808.     m_iRxLimitFreq[1] =  200;
  809.     m_iRxLimitFreq[2] =  300;
  810.     m_iRxLimitFreq[3] =  500;
  811.     m_iRxLimitFreq[4] = 1000;
  812.     m_iRxLimitFreq[5] = 3000;
  813.     m_iRxLimitFreq[6] = 3400;
  814.     m_iRxLimitFreq[7] = 4000;
  815.     m_dRxUpLimit[0] = -12;    //  100 Hz
  816.     m_dRxUpLimit[1] =   0;    //  200 Hz
  817.     m_dRxUpLimit[2] =   2;    //  300 Hz
  818.     m_dRxUpLimit[3] =   2+(20*log10(500)-20*log10(300))*(0-2)/(20*log10(1000)-20*log10(300)); // 500 Hz
  819.     m_dRxUpLimit[4] =   0;    // 1000 Hz
  820.     m_dRxUpLimit[5] =   2;    // 3000 Hz
  821.     m_dRxUpLimit[6] =   2;    // 3400 Hz
  822.     m_dRxUpLimit[7] =   2;    // 4000 Hz
  823.     m_dRxLowLimit[0] = -100;    //  100 Hz
  824.     m_dRxLowLimit[1] = -100;    //  200 Hz
  825.     m_dRxLowLimit[2] =   -7;    //  300 Hz
  826.     m_dRxLowLimit[3] =   -5;    //  500 Hz
  827.     m_dRxLowLimit[4] =   -5;    // 1000 Hz
  828.     m_dRxLowLimit[5] =   -5;    // 3000 Hz
  829.     m_dRxLowLimit[6] =  -10;    // 3400 Hz
  830.     m_dRxLowLimit[7] = -100;    // 4000 Hz
  831.     GetMinMaxY( &OrgSpCoef, &min_y, &max_y );
  832.     if( min_y == max_y || isTRCLoadOk == false || OrgSpCoef.num>TOTAL_TRC_FREQ_NUM)
  833.     {
  834.         PlotGrid(100, 4000, -20, 15);
  835.     }
  836.     else
  837.     {
  838.         PlotGrid( 100, 4000, min_y, max_y);
  839.     }
  840.     PlotBoundaryCurve();
  841.     if( isOrgCurvePlot )
  842.     {
  843.         PlotOrgCurve();
  844.     }
  845.      
  846. }
  847. //---------------------------------------------------------------------------
  848. void __fastcall TfrmFIRCoeffCal::rbGoodSoundClick(TObject *Sender)
  849. {
  850.     double min_y, max_y;
  851.     m_iTxLimitFreq[ 0] =  100;
  852.     m_iTxLimitFreq[ 1] =  200;
  853.     m_iTxLimitFreq[ 2] =  300;
  854.     m_iTxLimitFreq[ 3] =  500;
  855.     m_iTxLimitFreq[ 4] =  600;
  856.     m_iTxLimitFreq[ 5] =  700;
  857.     m_iTxLimitFreq[ 6] =  800;
  858.     m_iTxLimitFreq[ 7] = 1000;
  859.     m_iTxLimitFreq[ 8] = 1300;
  860.     m_iTxLimitFreq[ 9] = 1800;
  861.     m_iTxLimitFreq[10] = 2000;
  862.     m_iTxLimitFreq[11] = 2500;
  863.     m_iTxLimitFreq[12] = 3000;
  864.     m_iTxLimitFreq[13] = 3400;
  865.     m_iTxLimitFreq[14] = 3950;
  866.     m_iRxLimitFreq[ 0] =  100;
  867.     m_iRxLimitFreq[ 1] =  200;
  868.     m_iRxLimitFreq[ 2] =  300;
  869.     m_iRxLimitFreq[ 3] =  500;
  870.     m_iRxLimitFreq[ 4] =  600;
  871.     m_iRxLimitFreq[ 5] =  700;
  872.     m_iRxLimitFreq[ 6] =  800;
  873.     m_iRxLimitFreq[ 7] = 1000;
  874.     m_iRxLimitFreq[ 8] = 1300;
  875.     m_iRxLimitFreq[ 9] = 1800;
  876.     m_iRxLimitFreq[10] = 2000;
  877.     m_iRxLimitFreq[11] = 2500;
  878.     m_iRxLimitFreq[12] = 3000;
  879.     m_iRxLimitFreq[13] = 3400;
  880.     m_iRxLimitFreq[14] = 3950;
  881.     m_dTxUpLimit[0] = -19;      //  100 Hz
  882.     m_dTxUpLimit[1] =  -2;      //  200 Hz
  883.     m_dTxUpLimit[2] =  11;      //  300 Hz
  884.     m_dTxUpLimit[3] =  5;       //  500 Hz
  885.     m_dTxUpLimit[4] =  4;       //  600 Hz
  886.     m_dTxUpLimit[5] =  4;       //  700 Hz
  887.     m_dTxUpLimit[6] =  3;       //  800 Hz
  888.     m_dTxUpLimit[7] =  1;       // 1000 Hz
  889.     m_dTxUpLimit[8] = -5;       // 1300 Hz
  890.     m_dTxUpLimit[9] =  2.8;     // 1800 Hz
  891.     m_dTxUpLimit[10] =  2.8;    // 2000 Hz
  892.     m_dTxUpLimit[11] =  5;      // 2500 Hz
  893.     m_dTxUpLimit[12] =  6;      // 3000 Hz
  894.     m_dTxUpLimit[13] = -1;      // 3400 Hz
  895.     m_dTxUpLimit[14] = -40.2;   // 3950 Hz
  896.     m_dTxLowLimit[0] = -25;     //  100 Hz
  897.     m_dTxLowLimit[1] =  -8;     //  200 Hz
  898.     m_dTxLowLimit[2] =   5;     //  300 Hz
  899.     m_dTxLowLimit[3] =  -1;     //  500 Hz
  900.     m_dTxLowLimit[4] =  -2;     //  600 Hz
  901.     m_dTxLowLimit[5] =  -2;     //  700 Hz
  902.     m_dTxLowLimit[6] =  -3;     //  800 Hz
  903.     m_dTxLowLimit[7] =  -5;     // 1000 Hz
  904.     m_dTxLowLimit[8] = -11;     // 1300 Hz
  905.     m_dTxLowLimit[9] =  -3.2;   // 1800 Hz
  906.     m_dTxLowLimit[10] = -3.2;   // 2000 Hz
  907.     m_dTxLowLimit[11] =  -1;    // 2500 Hz
  908.     m_dTxLowLimit[12] =   0;    // 3000 Hz
  909.     m_dTxLowLimit[13] =  -7;    // 3400 Hz
  910.     m_dTxLowLimit[14] = -46.2;  // 3950 Hz
  911.     m_dRxUpLimit[0] = -19;      //  100 Hz
  912.     m_dRxUpLimit[1] =  -2;      //  200 Hz
  913.     m_dRxUpLimit[2] =  11;      //  300 Hz
  914.     m_dRxUpLimit[3] =  5;       //  500 Hz
  915.     m_dRxUpLimit[4] =  4;       //  600 Hz
  916.     m_dRxUpLimit[5] =  4;       //  700 Hz
  917.     m_dRxUpLimit[6] =  3;       //  800 Hz
  918.     m_dRxUpLimit[7] = -2;       // 1000 Hz
  919.     m_dRxUpLimit[8] = -5;       // 1300 Hz
  920.     m_dRxUpLimit[9] =  2.8;     // 1800 Hz
  921.     m_dRxUpLimit[10] =  2.8;    // 2000 Hz
  922.     m_dRxUpLimit[11] =  5;      // 2500 Hz
  923.     m_dRxUpLimit[12] =  6;      // 3000 Hz
  924.     m_dRxUpLimit[13] = -1;      // 3400 Hz
  925.     m_dRxUpLimit[14] = -40.2;   // 3950 Hz
  926.     m_dRxLowLimit[0] = -25;     //  100 Hz
  927.     m_dRxLowLimit[1] =  -8;     //  200 Hz
  928.     m_dRxLowLimit[2] =   5;     //  300 Hz
  929.     m_dRxLowLimit[3] =  -1;     //  500 Hz
  930.     m_dRxLowLimit[4] =  -2;     //  600 Hz
  931.     m_dRxLowLimit[5] =  -2;     //  700 Hz
  932.     m_dRxLowLimit[6] =  -3;     //  800 Hz
  933.     m_dRxLowLimit[7] =  -5;     // 1000 Hz
  934.     m_dRxLowLimit[8] = -11;     // 1300 Hz
  935.     m_dRxLowLimit[9] =  -3.2;   // 1800 Hz
  936.     m_dRxLowLimit[10] = -3.2;   // 2000 Hz
  937.     m_dRxLowLimit[11] =  -1;    // 2500 Hz
  938.     m_dRxLowLimit[12] =   0;    // 3000 Hz
  939.     m_dRxLowLimit[13] =  -7;    // 3400 Hz
  940.     m_dRxLowLimit[14] = -46.2;  // 3950 Hz
  941.     GetMinMaxY( &OrgSpCoef, &min_y, &max_y );
  942.     if( min_y == max_y || isTRCLoadOk == false || OrgSpCoef.num>TOTAL_TRC_FREQ_NUM)
  943.     {
  944.         PlotGrid(100, 4000, -20, 15);
  945.     }
  946.     else
  947.     {
  948.         PlotGrid( 100, 4000, min_y, max_y);
  949.     }
  950.     PlotBoundaryCurve();
  951.     if( isOrgCurvePlot )
  952.     {
  953.         PlotOrgCurve();
  954.     }
  955.      
  956. }
  957. //---------------------------------------------------------------------------
  958. void  TfrmFIRCoeffCal::Req_freqz( void )
  959. {
  960.      SP_COEF_CAL_Object.freqz( m_b45TapSupport, &old_FIR_norm, &ProcessSpCoef, 8000.0, &OldFirSpCoef );
  961. }
  962. //--------------------------------------------------------------------------
  963. void __fastcall TfrmFIRCoeffCal::edtFirScaleCheck(TObject *Sender)
  964. {
  965.     AnsiString  text;
  966.     float  data;
  967.     int  band;
  968.     TEdit *edit = (TEdit*)Sender;
  969.     char  hint[] = "value shall be 0.5 ~ 1.0";
  970.     text = edit->Text;
  971.     if( !IsValidFirScale( text, data ) )
  972.     {
  973.         edit->Text = 0;
  974.         ShowHintLabel( edit, hint );
  975.         edit->SetFocus();
  976.         return;
  977.     }
  978.     FirScale = data;
  979. }
  980. //---------------------------------------------------------------------------
  981. void __fastcall TfrmFIRCoeffCal::cb1xxHzChange(TObject *Sender)
  982. {
  983.     char str[256];
  984.     int index;
  985.     double  Hz;
  986.     getHzFromStr( cb1xxHz->Text, Hz );
  987.     index = getWantedSpCoefIndex(Hz, &WantedSpCoef);
  988.     SelectedSpCoef.index[0] = index;
  989.     SelectedSpCoef.Hz[0] = WantedSpCoef.Hz[ SelectedSpCoef.index[0] ];
  990.     m_iWantedHz[0] = SelectedSpCoef.Hz[0];
  991.     SelectedSpCoef.MagdB[0] = WantedSpCoef.MagdB[ SelectedSpCoef.index[0] ];
  992.     sprintf(str, "%.3f", SelectedSpCoef.MagdB[0]);
  993.     edt1xxHzdB->Text  = (AnsiString ) str;
  994.     edt1xxHzdBExit( this );
  995. }
  996. //---------------------------------------------------------------------------
  997. void __fastcall TfrmFIRCoeffCal::cb2xxHzChange(TObject *Sender)
  998. {
  999.     char str[256];
  1000.     int index;
  1001.     double  Hz;
  1002.     getHzFromStr( cb2xxHz->Text, Hz );
  1003.     index = getWantedSpCoefIndex(Hz, &WantedSpCoef);
  1004.     SelectedSpCoef.index[1] = index;
  1005.     SelectedSpCoef.Hz[1] = WantedSpCoef.Hz[ SelectedSpCoef.index[1] ];
  1006.     m_iWantedHz[1] = SelectedSpCoef.Hz[1];
  1007.     SelectedSpCoef.MagdB[1] = WantedSpCoef.MagdB[ SelectedSpCoef.index[1] ];
  1008.     sprintf(str, "%.3f", SelectedSpCoef.MagdB[1]);
  1009.     edt2xxHzdB->Text  = (AnsiString ) str;
  1010.     edt2xxHzdBExit( this );
  1011. }
  1012. //---------------------------------------------------------------------------
  1013. void __fastcall TfrmFIRCoeffCal::cb3xxHzChange(TObject *Sender)
  1014. {
  1015.     char str[256];
  1016.     int index;
  1017.     double  Hz;
  1018.     getHzFromStr( cb3xxHz->Text, Hz );
  1019.     index = getWantedSpCoefIndex(Hz, &WantedSpCoef);
  1020.     SelectedSpCoef.index[2] = index;
  1021.     SelectedSpCoef.Hz[2] = WantedSpCoef.Hz[ SelectedSpCoef.index[2] ];
  1022.     m_iWantedHz[2] = SelectedSpCoef.Hz[2];
  1023.     SelectedSpCoef.MagdB[2] = WantedSpCoef.MagdB[ SelectedSpCoef.index[2] ];
  1024.     sprintf(str, "%.3f", SelectedSpCoef.MagdB[2]);
  1025.     edt3xxHzdB->Text  = (AnsiString ) str;
  1026.     edt3xxHzdBExit( this );
  1027. }
  1028. //---------------------------------------------------------------------------
  1029. void __fastcall TfrmFIRCoeffCal::cb5xxHzChange(TObject *Sender)
  1030. {
  1031.     char str[256];
  1032.     int index;
  1033.     double  Hz;
  1034.     getHzFromStr( cb5xxHz->Text, Hz );
  1035.     index = getWantedSpCoefIndex(Hz, &WantedSpCoef);
  1036.     SelectedSpCoef.index[3] = index;
  1037.     SelectedSpCoef.Hz[3] = WantedSpCoef.Hz[ SelectedSpCoef.index[3] ];
  1038.     m_iWantedHz[3] = SelectedSpCoef.Hz[3];
  1039.     SelectedSpCoef.MagdB[3] = WantedSpCoef.MagdB[ SelectedSpCoef.index[3] ];
  1040.     sprintf(str, "%.3f", SelectedSpCoef.MagdB[3]);
  1041.     edt5xxHzdB->Text  = (AnsiString ) str;
  1042.     edt5xxHzdBExit( this );
  1043. }
  1044. //---------------------------------------------------------------------------
  1045. void __fastcall TfrmFIRCoeffCal::cb6xxHzChange(TObject *Sender)
  1046. {
  1047.     char str[256];
  1048.     int index;
  1049.     double  Hz;
  1050.     getHzFromStr( cb6xxHz->Text, Hz );
  1051.     index = getWantedSpCoefIndex(Hz, &WantedSpCoef);
  1052.     SelectedSpCoef.index[4] = index;
  1053.     SelectedSpCoef.Hz[4] = WantedSpCoef.Hz[ SelectedSpCoef.index[4] ];
  1054.     m_iWantedHz[4] = SelectedSpCoef.Hz[4];
  1055.     SelectedSpCoef.MagdB[4] = WantedSpCoef.MagdB[ SelectedSpCoef.index[4] ];
  1056.     sprintf(str, "%.3f", SelectedSpCoef.MagdB[4]);
  1057.     edt6xxHzdB->Text  = (AnsiString ) str;
  1058.     edt6xxHzdBExit( this );
  1059. }
  1060. //---------------------------------------------------------------------------
  1061. void __fastcall TfrmFIRCoeffCal::cb7xxHzChange(TObject *Sender)
  1062. {
  1063.     char str[256];
  1064.     int index;
  1065.     double  Hz;
  1066.     getHzFromStr( cb7xxHz->Text, Hz );
  1067.     index = getWantedSpCoefIndex(Hz, &WantedSpCoef);
  1068.     SelectedSpCoef.index[5] = index;
  1069.     SelectedSpCoef.Hz[5] = WantedSpCoef.Hz[ SelectedSpCoef.index[5] ];
  1070.     m_iWantedHz[5] = SelectedSpCoef.Hz[5];
  1071.     SelectedSpCoef.MagdB[5] = WantedSpCoef.MagdB[ SelectedSpCoef.index[5] ];
  1072.     sprintf(str, "%.3f", SelectedSpCoef.MagdB[5]);
  1073.     edt7xxHzdB->Text  = (AnsiString ) str;
  1074.     edt7xxHzdBExit( this );
  1075. }
  1076. //---------------------------------------------------------------------------
  1077. void __fastcall TfrmFIRCoeffCal::cb8xxHzChange(TObject *Sender)
  1078. {
  1079.     char str[256];
  1080.     int index;
  1081.     double  Hz;
  1082.     getHzFromStr( cb8xxHz->Text, Hz );
  1083.     index = getWantedSpCoefIndex(Hz, &WantedSpCoef);
  1084.     SelectedSpCoef.index[6] = index;
  1085.     SelectedSpCoef.Hz[6] = WantedSpCoef.Hz[ SelectedSpCoef.index[6] ];
  1086.     m_iWantedHz[6] = SelectedSpCoef.Hz[6];
  1087.     SelectedSpCoef.MagdB[6] = WantedSpCoef.MagdB[ SelectedSpCoef.index[6] ];
  1088.     sprintf(str, "%.3f", SelectedSpCoef.MagdB[6]);
  1089.     edt8xxHzdB->Text  = (AnsiString ) str;
  1090.     edt8xxHzdBExit( this );
  1091. }
  1092. //---------------------------------------------------------------------------
  1093. void __fastcall TfrmFIRCoeffCal::cb1xxxHzChange(TObject *Sender)
  1094. {
  1095.     char str[256];
  1096.     int index;
  1097.     double  Hz;
  1098.     getHzFromStr( cb1xxxHz->Text, Hz );
  1099.     index = getWantedSpCoefIndex(Hz, &WantedSpCoef);
  1100.     SelectedSpCoef.index[7] = index;
  1101.     SelectedSpCoef.Hz[7] = WantedSpCoef.Hz[ SelectedSpCoef.index[7] ];
  1102.     m_iWantedHz[7] = SelectedSpCoef.Hz[7];
  1103.     SelectedSpCoef.MagdB[7] = WantedSpCoef.MagdB[ SelectedSpCoef.index[7] ];
  1104.     sprintf(str, "%.3f", SelectedSpCoef.MagdB[7]);
  1105.     edt1xxxHzdB->Text  = (AnsiString ) str;
  1106.     edt1xxxHzdBExit( this );
  1107. }
  1108. //---------------------------------------------------------------------------
  1109. void __fastcall TfrmFIRCoeffCal::cb13xxHzChange(TObject *Sender)
  1110. {
  1111.     char str[256];
  1112.     int index;
  1113.     double  Hz;
  1114.     getHzFromStr( cb13xxHz->Text, Hz );
  1115.     index = getWantedSpCoefIndex(Hz, &WantedSpCoef);
  1116.     SelectedSpCoef.index[8] = index;
  1117.     SelectedSpCoef.Hz[8] = WantedSpCoef.Hz[ SelectedSpCoef.index[8] ];
  1118.     m_iWantedHz[8] = SelectedSpCoef.Hz[8];
  1119.     SelectedSpCoef.MagdB[8] = WantedSpCoef.MagdB[ SelectedSpCoef.index[8] ];
  1120.     sprintf(str, "%.3f", SelectedSpCoef.MagdB[8]);
  1121.     edt13xxHzdB->Text  = (AnsiString ) str;
  1122.     edt13xxHzdBExit( this );
  1123. }
  1124. //---------------------------------------------------------------------------
  1125. void __fastcall TfrmFIRCoeffCal::cb18xxHzChange(TObject *Sender)
  1126. {
  1127.     char str[256];
  1128.     int index;
  1129.     double  Hz;
  1130.     getHzFromStr( cb18xxHz->Text, Hz );
  1131.     index = getWantedSpCoefIndex(Hz, &WantedSpCoef);
  1132.     SelectedSpCoef.index[9] = index;
  1133.     SelectedSpCoef.Hz[9] = WantedSpCoef.Hz[ SelectedSpCoef.index[9] ];
  1134.     m_iWantedHz[9] = SelectedSpCoef.Hz[9];
  1135.     SelectedSpCoef.MagdB[9] = WantedSpCoef.MagdB[ SelectedSpCoef.index[9] ];
  1136.     sprintf(str, "%.3f", SelectedSpCoef.MagdB[9]);
  1137.     edt18xxHzdB->Text  = (AnsiString ) str;
  1138.     edt18xxHzdBExit( this );
  1139. }
  1140. //---------------------------------------------------------------------------
  1141. void __fastcall TfrmFIRCoeffCal::cb2xxxHzChange(TObject *Sender)
  1142. {
  1143.     char str[256];
  1144.     int index;
  1145.     double  Hz;
  1146.     getHzFromStr( cb2xxxHz->Text, Hz );
  1147.     index = getWantedSpCoefIndex(Hz, &WantedSpCoef);
  1148.     SelectedSpCoef.index[10] = index;
  1149.     SelectedSpCoef.Hz[10] = WantedSpCoef.Hz[ SelectedSpCoef.index[10] ];
  1150.     m_iWantedHz[10] = SelectedSpCoef.Hz[10];
  1151.     SelectedSpCoef.MagdB[10] = WantedSpCoef.MagdB[ SelectedSpCoef.index[10] ];
  1152.     sprintf(str, "%.3f", SelectedSpCoef.MagdB[10]);
  1153.     edt2xxxHzdB->Text  = (AnsiString ) str;
  1154.     edt2xxxHzdBExit( this );
  1155. }
  1156. //---------------------------------------------------------------------------
  1157. void __fastcall TfrmFIRCoeffCal::cb25xxHzChange(TObject *Sender)
  1158. {
  1159.     char str[256];
  1160.     int index;
  1161.     double  Hz;
  1162.     getHzFromStr( cb25xxHz->Text, Hz );
  1163.     index = getWantedSpCoefIndex(Hz, &WantedSpCoef);
  1164.     SelectedSpCoef.index[11] = index;
  1165.     SelectedSpCoef.Hz[11] = WantedSpCoef.Hz[ SelectedSpCoef.index[11] ];
  1166.     m_iWantedHz[11] = SelectedSpCoef.Hz[11];
  1167.     SelectedSpCoef.MagdB[11] = WantedSpCoef.MagdB[ SelectedSpCoef.index[11] ];
  1168.     sprintf(str, "%.3f", SelectedSpCoef.MagdB[11]);
  1169.     edt25xxHzdB->Text  = (AnsiString ) str;
  1170.     edt25xxHzdBExit( this );
  1171. }
  1172. //---------------------------------------------------------------------------
  1173. void __fastcall TfrmFIRCoeffCal::cb3xxxHzChange(TObject *Sender)
  1174. {
  1175.     char str[256];
  1176.     int index;
  1177.     double  Hz;
  1178.     getHzFromStr( cb3xxxHz->Text, Hz );
  1179.     index = getWantedSpCoefIndex(Hz, &WantedSpCoef);
  1180.     SelectedSpCoef.index[12] = index;
  1181.     SelectedSpCoef.Hz[12] = WantedSpCoef.Hz[ SelectedSpCoef.index[12] ];
  1182.     m_iWantedHz[12] = SelectedSpCoef.Hz[12];
  1183.     SelectedSpCoef.MagdB[12] = WantedSpCoef.MagdB[ SelectedSpCoef.index[12] ];
  1184.     sprintf(str, "%.3f", SelectedSpCoef.MagdB[12]);
  1185.     edt3xxxHzdB->Text  = (AnsiString ) str;
  1186.     edt3xxxHzdBExit( this );
  1187. }
  1188. //---------------------------------------------------------------------------
  1189. void __fastcall TfrmFIRCoeffCal::cb34xxHzChange(TObject *Sender)
  1190. {
  1191.     char str[256];
  1192.     int index;
  1193.     double  Hz;
  1194.     getHzFromStr( cb34xxHz->Text, Hz );
  1195.     index = getWantedSpCoefIndex(Hz, &WantedSpCoef);
  1196.     SelectedSpCoef.index[13] = index;
  1197.     SelectedSpCoef.Hz[13] = WantedSpCoef.Hz[ SelectedSpCoef.index[13] ];
  1198.     m_iWantedHz[13] = SelectedSpCoef.Hz[13];
  1199.     SelectedSpCoef.MagdB[13] = WantedSpCoef.MagdB[ SelectedSpCoef.index[13] ];
  1200.     sprintf(str, "%.3f", SelectedSpCoef.MagdB[13]);
  1201.     edt34xxHzdB->Text  = (AnsiString ) str;
  1202.     edt34xxHzdBExit( this );
  1203. }
  1204. //---------------------------------------------------------------------------
  1205. void __fastcall TfrmFIRCoeffCal::cb39xxHzChange(TObject *Sender)
  1206. {
  1207.     char str[256];
  1208.     int index;
  1209.     double  Hz;
  1210.     getHzFromStr( cb39xxHz->Text, Hz );
  1211.     index = getWantedSpCoefIndex(Hz, &WantedSpCoef);
  1212.     SelectedSpCoef.index[14] = index;
  1213.     SelectedSpCoef.Hz[14] = WantedSpCoef.Hz[ SelectedSpCoef.index[14] ];
  1214.     m_iWantedHz[14] = SelectedSpCoef.Hz[14];
  1215.     SelectedSpCoef.MagdB[14] = WantedSpCoef.MagdB[ SelectedSpCoef.index[14] ];
  1216.     sprintf(str, "%.3f", SelectedSpCoef.MagdB[14]);
  1217.     edt39xxHzdB->Text  = (AnsiString ) str;
  1218.     edt39xxHzdBExit( this );
  1219. }
  1220. void __fastcall TfrmFIRCoeffCal::HintTimerTimer(TObject *Sender)
  1221. {
  1222.     HintTimer->Enabled = false;
  1223.     lblHint->Visible = false;      
  1224. }
  1225. //---------------------------------------------------------------------------
  1226. void __fastcall TfrmFIRCoeffCal::rbUPLClick(TObject *Sender)
  1227. {
  1228.     gbFileFormat->Visible = false;
  1229. }
  1230. //---------------------------------------------------------------------------
  1231. void __fastcall TfrmFIRCoeffCal::m_rbUPVClick(TObject *Sender)
  1232. {
  1233.     gbFileFormat->Visible = false;
  1234. }
  1235. //---------------------------------------------------------------------------
  1236. void __fastcall TfrmFIRCoeffCal::rbAcquaClick(TObject *Sender)
  1237. {
  1238.     gbFileFormat->Visible = true;
  1239.     rbLinear->Enabled = true;
  1240.     rbLogdB->Enabled = true;
  1241. }
  1242. //---------------------------------------------------------------------------
  1243. void TfrmFIRCoeffCal::Set_Boundary(void)
  1244. {
  1245.     switch (cbBoundary->ItemIndex)
  1246.     {
  1247.         case ITEMIDX_BOUNDARY_SPEC:
  1248.         {
  1249.             m_iTxLimitNum = 8;
  1250.             m_iRxLimitNum = 8;
  1251.             m_iTxLimitFreq[0] =  100;
  1252.             m_iTxLimitFreq[1] =  200;
  1253.             m_iTxLimitFreq[2] =  300;
  1254.             m_iTxLimitFreq[3] = 1000;
  1255.             m_iTxLimitFreq[4] = 2000;
  1256.             m_iTxLimitFreq[5] = 3000;
  1257.             m_iTxLimitFreq[6] = 3400;
  1258.             m_iTxLimitFreq[7] = 4000;
  1259.             m_dTxUpLimit[0] = -12;    //  100 Hz
  1260.             m_dTxUpLimit[1] =   0;    //  200 Hz
  1261.             m_dTxUpLimit[2] =   0;    //  300 Hz
  1262.             m_dTxUpLimit[3] =   0;    // 1000 Hz
  1263.             m_dTxUpLimit[4] =   4;    // 2000 Hz
  1264.             m_dTxUpLimit[5] =   4;    // 3000 Hz
  1265.             m_dTxUpLimit[6] =   4;    // 3400 Hz
  1266.             m_dTxUpLimit[7] =   0;    // 4000 Hz
  1267.             m_dTxLowLimit[0] = -100;    //  100 Hz
  1268.             m_dTxLowLimit[1] = -100;    //  200 Hz
  1269.             m_dTxLowLimit[2] =  -12;    //  300 Hz
  1270.             m_dTxLowLimit[3] =   -6;    // 1000 Hz
  1271.             m_dTxLowLimit[4] =   -6;    // 2000 Hz
  1272.             m_dTxLowLimit[5] =   -6;    // 3000 Hz
  1273.             m_dTxLowLimit[6] =   -9;    // 3400 Hz
  1274.             m_dTxLowLimit[7] = -100;    // 4000 Hz
  1275.             m_iRxLimitFreq[0] =  100;
  1276.             m_iRxLimitFreq[1] =  200;
  1277.             m_iRxLimitFreq[2] =  300;
  1278.             m_iRxLimitFreq[3] =  500;
  1279.             m_iRxLimitFreq[4] = 1000;
  1280.             m_iRxLimitFreq[5] = 3000;
  1281.             m_iRxLimitFreq[6] = 3400;
  1282.             m_iRxLimitFreq[7] = 4000;
  1283.             m_dRxUpLimit[0] = -12;    //  100 Hz
  1284.             m_dRxUpLimit[1] =   0;    //  200 Hz
  1285.             m_dRxUpLimit[2] =   2;    //  300 Hz
  1286.             m_dRxUpLimit[3] =   2+(20*log10(500)-20*log10(300))*(0-2)/(20*log10(1000)-20*log10(300)); // 500 Hz
  1287.             m_dRxUpLimit[4] =   0;    // 1000 Hz
  1288.             m_dRxUpLimit[5] =   2;    // 3000 Hz
  1289.             m_dRxUpLimit[6] =   2;    // 3400 Hz
  1290.             m_dRxUpLimit[7] =   2;    // 4000 Hz
  1291.             m_dRxLowLimit[0] = -100;    //  100 Hz
  1292.             m_dRxLowLimit[1] = -100;    //  200 Hz
  1293.             m_dRxLowLimit[2] =   -7;    //  300 Hz
  1294.             m_dRxLowLimit[3] =   -5;    //  500 Hz
  1295.             m_dRxLowLimit[4] =   -5;    // 1000 Hz
  1296.             m_dRxLowLimit[5] =   -5;    // 3000 Hz
  1297.             m_dRxLowLimit[6] =  -10;    // 3400 Hz
  1298.             m_dRxLowLimit[7] = -100;    // 4000 Hz
  1299.         }
  1300.         break;
  1301.         case ITEMIDX_BOUNDARY_GOOD_SOUND:
  1302.         {
  1303.             m_iTxLimitNum = 15;
  1304.             m_iRxLimitNum = 15;
  1305.             m_iTxLimitFreq[ 0] =  100;
  1306.             m_iTxLimitFreq[ 1] =  200;
  1307.             m_iTxLimitFreq[ 2] =  300;
  1308.             m_iTxLimitFreq[ 3] =  500;
  1309.             m_iTxLimitFreq[ 4] =  600;
  1310.             m_iTxLimitFreq[ 5] =  700;
  1311.             m_iTxLimitFreq[ 6] =  800;
  1312.             m_iTxLimitFreq[ 7] = 1000;
  1313.             m_iTxLimitFreq[ 8] = 1300;
  1314.             m_iTxLimitFreq[ 9] = 1800;
  1315.             m_iTxLimitFreq[10] = 2000;
  1316.             m_iTxLimitFreq[11] = 2500;
  1317.             m_iTxLimitFreq[12] = 3000;
  1318.             m_iTxLimitFreq[13] = 3400;
  1319.             m_iTxLimitFreq[14] = 3950;
  1320.             m_iRxLimitFreq[ 0] =  100;
  1321.             m_iRxLimitFreq[ 1] =  200;
  1322.             m_iRxLimitFreq[ 2] =  300;
  1323.             m_iRxLimitFreq[ 3] =  500;
  1324.             m_iRxLimitFreq[ 4] =  600;
  1325.             m_iRxLimitFreq[ 5] =  700;
  1326.             m_iRxLimitFreq[ 6] =  800;
  1327.             m_iRxLimitFreq[ 7] = 1000;
  1328.             m_iRxLimitFreq[ 8] = 1300;
  1329.             m_iRxLimitFreq[ 9] = 1800;
  1330.             m_iRxLimitFreq[10] = 2000;
  1331.             m_iRxLimitFreq[11] = 2500;
  1332.             m_iRxLimitFreq[12] = 3000;
  1333.             m_iRxLimitFreq[13] = 3400;
  1334.             m_iRxLimitFreq[14] = 3950;
  1335.             m_dTxUpLimit[0] = -19;      //  100 Hz
  1336.             m_dTxUpLimit[1] =  -2;      //  200 Hz
  1337.             m_dTxUpLimit[2] =  11;      //  300 Hz
  1338.             m_dTxUpLimit[3] =  5;       //  500 Hz
  1339.             m_dTxUpLimit[4] =  4;       //  600 Hz
  1340.             m_dTxUpLimit[5] =  4;       //  700 Hz
  1341.             m_dTxUpLimit[6] =  3;       //  800 Hz
  1342.             m_dTxUpLimit[7] =  1;       // 1000 Hz
  1343.             m_dTxUpLimit[8] = -5;       // 1300 Hz
  1344.             m_dTxUpLimit[9] =  2.8;     // 1800 Hz
  1345.             m_dTxUpLimit[10] =  2.8;    // 2000 Hz
  1346.             m_dTxUpLimit[11] =  5;      // 2500 Hz
  1347.             m_dTxUpLimit[12] =  6;      // 3000 Hz
  1348.             m_dTxUpLimit[13] = -1;      // 3400 Hz
  1349.             m_dTxUpLimit[14] = -40.2;   // 3950 Hz
  1350.             m_dTxLowLimit[0] = -25;     //  100 Hz
  1351.             m_dTxLowLimit[1] =  -8;     //  200 Hz
  1352.             m_dTxLowLimit[2] =   5;     //  300 Hz
  1353.             m_dTxLowLimit[3] =  -1;     //  500 Hz
  1354.             m_dTxLowLimit[4] =  -2;     //  600 Hz
  1355.             m_dTxLowLimit[5] =  -2;     //  700 Hz
  1356.             m_dTxLowLimit[6] =  -3;     //  800 Hz
  1357.             m_dTxLowLimit[7] =  -5;     // 1000 Hz
  1358.             m_dTxLowLimit[8] = -11;     // 1300 Hz
  1359.             m_dTxLowLimit[9] =  -3.2;   // 1800 Hz
  1360.             m_dTxLowLimit[10] = -3.2;   // 2000 Hz
  1361.             m_dTxLowLimit[11] =  -1;    // 2500 Hz
  1362.             m_dTxLowLimit[12] =   0;    // 3000 Hz
  1363.             m_dTxLowLimit[13] =  -7;    // 3400 Hz
  1364.             m_dTxLowLimit[14] = -46.2;  // 3950 Hz
  1365.             m_dRxUpLimit[0] = -19;      //  100 Hz
  1366.             m_dRxUpLimit[1] =  -2;      //  200 Hz
  1367.             m_dRxUpLimit[2] =  11;      //  300 Hz
  1368.             m_dRxUpLimit[3] =  5;       //  500 Hz
  1369.             m_dRxUpLimit[4] =  4;       //  600 Hz
  1370.             m_dRxUpLimit[5] =  4;       //  700 Hz
  1371.             m_dRxUpLimit[6] =  3;       //  800 Hz
  1372.             m_dRxUpLimit[7] = -2;       // 1000 Hz
  1373.             m_dRxUpLimit[8] = -5;       // 1300 Hz
  1374.             m_dRxUpLimit[9] =  2.8;     // 1800 Hz
  1375.             m_dRxUpLimit[10] =  2.8;    // 2000 Hz
  1376.             m_dRxUpLimit[11] =  5;      // 2500 Hz
  1377.             m_dRxUpLimit[12] =  6;      // 3000 Hz
  1378.             m_dRxUpLimit[13] = -1;      // 3400 Hz
  1379.             m_dRxUpLimit[14] = -40.2;   // 3950 Hz
  1380.             m_dRxLowLimit[0] = -25;     //  100 Hz
  1381.             m_dRxLowLimit[1] =  -8;     //  200 Hz
  1382.             m_dRxLowLimit[2] =   5;     //  300 Hz
  1383.             m_dRxLowLimit[3] =  -1;     //  500 Hz
  1384.             m_dRxLowLimit[4] =  -2;     //  600 Hz
  1385.             m_dRxLowLimit[5] =  -2;     //  700 Hz
  1386.             m_dRxLowLimit[6] =  -3;     //  800 Hz
  1387.             m_dRxLowLimit[7] =  -5;     // 1000 Hz
  1388.             m_dRxLowLimit[8] = -11;     // 1300 Hz
  1389.             m_dRxLowLimit[9] =  -3.2;   // 1800 Hz
  1390.             m_dRxLowLimit[10] = -3.2;   // 2000 Hz
  1391.             m_dRxLowLimit[11] =  -1;    // 2500 Hz
  1392.             m_dRxLowLimit[12] =   0;    // 3000 Hz
  1393.             m_dRxLowLimit[13] =  -7;    // 3400 Hz
  1394.             m_dRxLowLimit[14] = -46.2;  // 3950 Hz
  1395.         }
  1396.         break;
  1397.         case ITEMIDX_BOUNDARY_3G_HANDSET_AND_HEADSET:
  1398.         {
  1399.             m_iTxLimitNum = 8;
  1400.             m_iRxLimitNum = 8;
  1401.             m_iTxLimitFreq[0] =  100;
  1402.             m_iTxLimitFreq[1] =  200;
  1403.             m_iTxLimitFreq[2] =  300;
  1404.             m_iTxLimitFreq[3] = 1000;
  1405.             m_iTxLimitFreq[4] = 2000;
  1406.             m_iTxLimitFreq[5] = 3000;
  1407.             m_iTxLimitFreq[6] = 3400;
  1408.             m_iTxLimitFreq[7] = 4000;
  1409.             m_dTxUpLimit[0] = -12;    //  100 Hz
  1410.             m_dTxUpLimit[1] =   0;    //  200 Hz
  1411.             m_dTxUpLimit[2] =   0;    //  300 Hz
  1412.             m_dTxUpLimit[3] =   0;    // 1000 Hz
  1413.             m_dTxUpLimit[4] =   4;    // 2000 Hz
  1414.             m_dTxUpLimit[5] =   4;    // 3000 Hz
  1415.             m_dTxUpLimit[6] =   4;    // 3400 Hz
  1416.             m_dTxUpLimit[7] =   0;    // 4000 Hz
  1417.             m_dTxLowLimit[0] = -100;    //  100 Hz
  1418.             m_dTxLowLimit[1] = -100;    //  200 Hz
  1419.             m_dTxLowLimit[2] =  -12;    //  300 Hz
  1420.             m_dTxLowLimit[3] =   -6;    // 1000 Hz
  1421.             m_dTxLowLimit[4] =   -6;    // 2000 Hz
  1422.             m_dTxLowLimit[5] =   -6;    // 3000 Hz
  1423.             m_dTxLowLimit[6] =   -9;    // 3400 Hz
  1424.             m_dTxLowLimit[7] = -100;    // 4000 Hz
  1425.             m_iRxLimitFreq[0] =   70;
  1426.             m_iRxLimitFreq[1] =  200;
  1427.             m_iRxLimitFreq[2] =  300;
  1428.             m_iRxLimitFreq[3] =  500;
  1429.             m_iRxLimitFreq[4] = 1000;
  1430.             m_iRxLimitFreq[5] = 3000;
  1431.             m_iRxLimitFreq[6] = 3400;
  1432.             m_iRxLimitFreq[7] = 4000;
  1433.             m_dRxUpLimit[0] =  -10;    //   70 Hz
  1434.             m_dRxUpLimit[1] =    2;    //  200 Hz
  1435.             m_dRxUpLimit[2] =    2;    //  300 Hz
  1436.             m_dRxUpLimit[3] =    2;    //  500 Hz
  1437.             m_dRxUpLimit[4] =    2;    // 1000 Hz
  1438.             m_dRxUpLimit[5] =    2;    // 3000 Hz
  1439.             m_dRxUpLimit[6] =    2;    // 3400 Hz
  1440.             m_dRxUpLimit[7] =    2;    // 4000 Hz
  1441.             m_dRxLowLimit[0] = -100;    //   70 Hz
  1442.             m_dRxLowLimit[1] = -100;    //  200 Hz
  1443.             m_dRxLowLimit[2] =   -9;    //  300 Hz
  1444.             m_dRxLowLimit[3] = -8.15;    //  500 Hz
  1445.             m_dRxLowLimit[4] =   -7;    // 1000 Hz
  1446.             m_dRxLowLimit[5] = -11.49;    // 3000 Hz
  1447.             m_dRxLowLimit[6] =  -12;    // 3400 Hz
  1448.             m_dRxLowLimit[7] = -100;    // 4000 Hz
  1449.         }
  1450.         break;
  1451.         case ITEMIDX_BOUNDARY_3G_HANDSFREE_DESKTOP_AND_VEHICLE:
  1452.         {
  1453.             m_iTxLimitNum = 14;
  1454.             m_iRxLimitNum = 14;
  1455.             m_iTxLimitFreq[0]  =  200;
  1456.             m_iTxLimitFreq[1]  =  250;
  1457.             m_iTxLimitFreq[2]  =  315;
  1458.             m_iTxLimitFreq[3]  =  400;
  1459.             m_iTxLimitFreq[4]  =  500;
  1460.             m_iTxLimitFreq[5]  =  630;
  1461.             m_iTxLimitFreq[6]  =  800;
  1462.             m_iTxLimitFreq[7]  = 1000;
  1463.             m_iTxLimitFreq[8]  = 1300;
  1464.             m_iTxLimitFreq[9]  = 1600;
  1465.             m_iTxLimitFreq[10] = 2000;
  1466.             m_iTxLimitFreq[11] = 2500;
  1467.             m_iTxLimitFreq[12] = 3100;
  1468.             m_iTxLimitFreq[13] = 4000;
  1469.             m_dTxUpLimit[0]  =   0;    //  200 Hz
  1470.             m_dTxUpLimit[1]  =   0;    //  250 Hz
  1471.             m_dTxUpLimit[2]  =   0;    //  315 Hz
  1472.             m_dTxUpLimit[3]  =   0;    //  400 Hz
  1473.             m_dTxUpLimit[4]  =   0;    //  500 Hz
  1474.             m_dTxUpLimit[5]  =   0;    //  630 Hz
  1475.             m_dTxUpLimit[6]  =   0;    //  800 Hz
  1476.             m_dTxUpLimit[7]  =   0;    // 1000 Hz
  1477.             m_dTxUpLimit[8]  =   2;    // 1300 Hz
  1478.             m_dTxUpLimit[9]  =   3;    // 1600 Hz
  1479.             m_dTxUpLimit[10] =   4;   // 2000 Hz
  1480.             m_dTxUpLimit[11] =   4;   // 2500 Hz
  1481.             m_dTxUpLimit[12] =   4;   // 3100 Hz
  1482.             m_dTxUpLimit[13] =   0;   // 4000 Hz
  1483.             m_dTxLowLimit[0]  = -100;    //  200 Hz
  1484.             m_dTxLowLimit[1]  = -100;    //  250 Hz
  1485.             m_dTxLowLimit[2]  =  -14;    //  315 Hz
  1486.             m_dTxLowLimit[3]  =  -13;    //  400 Hz
  1487.             m_dTxLowLimit[4]  =  -12;    //  500 Hz
  1488.             m_dTxLowLimit[5]  =  -11;    //  630 Hz
  1489.             m_dTxLowLimit[6]  =  -10;    //  800 Hz
  1490.             m_dTxLowLimit[7]  =   -8;    // 1000 Hz
  1491.             m_dTxLowLimit[8]  =   -8;    // 1300 Hz
  1492.             m_dTxLowLimit[9]  =   -8;    // 1600 Hz
  1493.             m_dTxLowLimit[10] =   -8;    // 2000 Hz
  1494.             m_dTxLowLimit[11] =   -8;    // 2500 Hz
  1495.             m_dTxLowLimit[12] =   -8;    // 3100 Hz
  1496.             m_dTxLowLimit[13] = -100;    // 4000 Hz
  1497.             m_iRxLimitFreq[0]  =  200;
  1498.             m_iRxLimitFreq[1]  =  250;
  1499.             m_iRxLimitFreq[2]  =  315;
  1500.             m_iRxLimitFreq[3]  =  400;
  1501.             m_iRxLimitFreq[4]  =  500;
  1502.             m_iRxLimitFreq[5]  =  630;
  1503.             m_iRxLimitFreq[6]  =  800;
  1504.             m_iRxLimitFreq[7]  = 1000;
  1505.             m_iRxLimitFreq[8]  = 1300;
  1506.             m_iRxLimitFreq[9]  = 1600;
  1507.             m_iRxLimitFreq[10] = 2000;
  1508.             m_iRxLimitFreq[11] = 2500;
  1509.             m_iRxLimitFreq[12] = 3100;
  1510.             m_iRxLimitFreq[13] = 4000;
  1511.             m_dRxUpLimit[0]  =    0;    //  200 Hz
  1512.             m_dRxUpLimit[1]  =    0;    //  250 Hz
  1513.             m_dRxUpLimit[2]  =    0;    //  315 Hz
  1514.             m_dRxUpLimit[3]  =    0;    //  400 Hz
  1515.             m_dRxUpLimit[4]  =    0;    //  500 Hz
  1516.             m_dRxUpLimit[5]  =    0;    //  630 Hz
  1517.             m_dRxUpLimit[6]  =    0;    //  800 Hz
  1518.             m_dRxUpLimit[7]  =    0;    // 1000 Hz
  1519.             m_dRxUpLimit[8]  =    0;    // 1300 Hz
  1520.             m_dRxUpLimit[9]  =    0;    // 1600 Hz
  1521.             m_dRxUpLimit[10] =    0;    // 2000 Hz
  1522.             m_dRxUpLimit[11] =    0;    // 2500 Hz
  1523.             m_dRxUpLimit[12] =    0;    // 3100 Hz
  1524.             m_dRxUpLimit[13] =    0;    // 4000 Hz
  1525.             m_dRxLowLimit[0] = -100;    //  200 Hz
  1526.             m_dRxLowLimit[1] = -100;    //  250 Hz
  1527.             m_dRxLowLimit[2] =  -15;    //  315 Hz
  1528.             m_dRxLowLimit[3] =  -12;    //  400 Hz
  1529.             m_dRxLowLimit[4] =  -12;    //  500 Hz
  1530.             m_dRxLowLimit[5] =  -12;    //  630 Hz
  1531.             m_dRxLowLimit[6] =  -12;    //  800 Hz
  1532.             m_dRxLowLimit[7] =  -12;    // 1000 Hz
  1533.             m_dRxLowLimit[8] =  -12;    // 1300 Hz
  1534.             m_dRxLowLimit[9] =  -12;    // 1600 Hz
  1535.             m_dRxLowLimit[10] = -12;    // 2000 Hz
  1536.             m_dRxLowLimit[11] = -12;    // 2500 Hz
  1537.             m_dRxLowLimit[12] = -12;    // 3100 Hz
  1538.             m_dRxLowLimit[13] = -100;   // 4000 Hz
  1539.         }
  1540.         break;
  1541.         case ITEMIDX_BOUNDARY_3G_HANDSFREE_HANDHELD:
  1542.         {
  1543.             m_iTxLimitNum = 14;
  1544.             m_iRxLimitNum = 14;
  1545.             m_iTxLimitFreq[0]  =  200;
  1546.             m_iTxLimitFreq[1]  =  250;
  1547.             m_iTxLimitFreq[2]  =  315;
  1548.             m_iTxLimitFreq[3]  =  400;
  1549.             m_iTxLimitFreq[4]  =  500;
  1550.             m_iTxLimitFreq[5]  =  630;
  1551.             m_iTxLimitFreq[6]  =  800;
  1552.             m_iTxLimitFreq[7]  = 1000;
  1553.             m_iTxLimitFreq[8]  = 1300;
  1554.             m_iTxLimitFreq[9]  = 1600;
  1555.             m_iTxLimitFreq[10] = 2000;
  1556.             m_iTxLimitFreq[11] = 2500;
  1557.             m_iTxLimitFreq[12] = 3100;
  1558.             m_iTxLimitFreq[13] = 4000;
  1559.             m_dTxUpLimit[0]  =   0;    //  200 Hz
  1560.             m_dTxUpLimit[1]  =   0;    //  250 Hz
  1561.             m_dTxUpLimit[2]  =   0;    //  315 Hz
  1562.             m_dTxUpLimit[3]  =   0;    //  400 Hz
  1563.             m_dTxUpLimit[4]  =   0;    //  500 Hz
  1564.             m_dTxUpLimit[5]  =   0;    //  630 Hz
  1565.             m_dTxUpLimit[6]  =   0;    //  800 Hz
  1566.             m_dTxUpLimit[7]  =   0;    // 1000 Hz
  1567.             m_dTxUpLimit[8]  =   2;    // 1300 Hz
  1568.             m_dTxUpLimit[9]  =   3;    // 1600 Hz
  1569.             m_dTxUpLimit[10] =   4;   // 2000 Hz
  1570.             m_dTxUpLimit[11] =   4;   // 2500 Hz
  1571.             m_dTxUpLimit[12] =   4;   // 3100 Hz
  1572.             m_dTxUpLimit[13] =   0;   // 4000 Hz
  1573.             m_dTxLowLimit[0]  = -100;    //  200 Hz
  1574.             m_dTxLowLimit[1]  = -100;    //  250 Hz
  1575.             m_dTxLowLimit[2]  =  -14;    //  315 Hz
  1576.             m_dTxLowLimit[3]  =  -13;    //  400 Hz
  1577.             m_dTxLowLimit[4]  =  -12;    //  500 Hz
  1578.             m_dTxLowLimit[5]  =  -11;    //  630 Hz
  1579.             m_dTxLowLimit[6]  =  -10;    //  800 Hz
  1580.             m_dTxLowLimit[7]  =   -8;    // 1000 Hz
  1581.             m_dTxLowLimit[8]  =   -8;    // 1300 Hz
  1582.             m_dTxLowLimit[9]  =   -8;    // 1600 Hz
  1583.             m_dTxLowLimit[10] =   -8;    // 2000 Hz
  1584.             m_dTxLowLimit[11] =   -8;    // 2500 Hz
  1585.             m_dTxLowLimit[12] =   -8;    // 3100 Hz
  1586.             m_dTxLowLimit[13] = -100;    // 4000 Hz
  1587.             m_iRxLimitFreq[0]  =  200;
  1588.             m_iRxLimitFreq[1]  =  250;
  1589.             m_iRxLimitFreq[2]  =  315;
  1590.             m_iRxLimitFreq[3]  =  400;
  1591.             m_iRxLimitFreq[4]  =  500;
  1592.             m_iRxLimitFreq[5]  =  630;
  1593.             m_iRxLimitFreq[6]  =  800;
  1594.             m_iRxLimitFreq[7]  = 1000;
  1595.             m_iRxLimitFreq[8]  = 1300;
  1596.             m_iRxLimitFreq[9]  = 1600;
  1597.             m_iRxLimitFreq[10] = 2000;
  1598.             m_iRxLimitFreq[11] = 2500;
  1599.             m_iRxLimitFreq[12] = 3100;
  1600.             m_iRxLimitFreq[13] = 4000;
  1601.             m_dRxUpLimit[0]  =    0;    //  200 Hz
  1602.             m_dRxUpLimit[1]  =    0;    //  250 Hz
  1603.             m_dRxUpLimit[2]  =    0;    //  315 Hz
  1604.             m_dRxUpLimit[3]  =    0;    //  400 Hz
  1605.             m_dRxUpLimit[4]  =    0;    //  500 Hz
  1606.             m_dRxUpLimit[5]  =    0;    //  630 Hz
  1607.             m_dRxUpLimit[6]  =    0;    //  800 Hz
  1608.             m_dRxUpLimit[7]  =    0;    // 1000 Hz
  1609.             m_dRxUpLimit[8]  =    0;    // 1300 Hz
  1610.             m_dRxUpLimit[9]  =    0;    // 1600 Hz
  1611.             m_dRxUpLimit[10] =    0;    // 2000 Hz
  1612.             m_dRxUpLimit[11] =    0;    // 2500 Hz
  1613.             m_dRxUpLimit[12] =    0;    // 3100 Hz
  1614.             m_dRxUpLimit[13] =    0;    // 4000 Hz
  1615.             m_dRxLowLimit[0] = -100;    //  200 Hz
  1616.             m_dRxLowLimit[1] = -100;    //  250 Hz
  1617.             m_dRxLowLimit[2] = -100;    //  315 Hz
  1618.             m_dRxLowLimit[3] = -100;    //  400 Hz
  1619.             m_dRxLowLimit[4] = -100;    //  500 Hz
  1620.             m_dRxLowLimit[5] = -100;    //  630 Hz
  1621.             m_dRxLowLimit[6] =  -12;    //  800 Hz
  1622.             m_dRxLowLimit[7] =  -12;    // 1000 Hz
  1623.             m_dRxLowLimit[8] =  -12;    // 1300 Hz
  1624.             m_dRxLowLimit[9] =  -12;    // 1600 Hz
  1625.             m_dRxLowLimit[10] = -12;    // 2000 Hz
  1626.             m_dRxLowLimit[11] = -12;    // 2500 Hz
  1627.             m_dRxLowLimit[12] = -12;    // 3100 Hz
  1628.             m_dRxLowLimit[13] = -100;   // 4000 Hz
  1629.         }
  1630.         break;
  1631.         case ITEMIDX_BOUNDARY_VOIP_HANDSET:
  1632.         {
  1633.             m_iTxLimitNum = 9;
  1634.             m_iRxLimitNum = 9;
  1635.             m_iTxLimitFreq[0]  =  100;
  1636.             m_iTxLimitFreq[1]  =  150;
  1637.             m_iTxLimitFreq[2]  =  300;
  1638.             m_iTxLimitFreq[3]  =  500;
  1639.             m_iTxLimitFreq[4]  = 1000;
  1640.             m_iTxLimitFreq[5]  = 2000;
  1641.             m_iTxLimitFreq[6]  = 3000;
  1642.             m_iTxLimitFreq[7]  = 3400;
  1643.             m_iTxLimitFreq[8]  = 4000;
  1644.             m_dTxUpLimit[0]  =  -7;    //  100 Hz
  1645.             m_dTxUpLimit[1]  =   0;    //  150 Hz
  1646.             m_dTxUpLimit[2]  =   0;    //  300 Hz
  1647.             m_dTxUpLimit[3]  =   0;    //  500 Hz
  1648.             m_dTxUpLimit[4]  =   0;    // 1000 Hz
  1649.             m_dTxUpLimit[5]  =   5;    // 2000 Hz
  1650.             m_dTxUpLimit[6]  =   5;    // 3000 Hz
  1651.             m_dTxUpLimit[7]  =   5;    // 3400 Hz
  1652.             m_dTxUpLimit[8]  =   0;    // 4000 Hz
  1653.             m_dTxLowLimit[0]  = -100;    //  100 Hz
  1654.             m_dTxLowLimit[1]  = -100;    //  150 Hz
  1655.             m_dTxLowLimit[2]  =   -8;    //  300 Hz
  1656.             m_dTxLowLimit[3]  =   -6;    //  500 Hz
  1657.             m_dTxLowLimit[4]  =   -6;    // 1000 Hz
  1658.             m_dTxLowLimit[5]  =   -6;    // 2000 Hz
  1659.             m_dTxLowLimit[6]  =   -6;    // 3000 Hz
  1660.             m_dTxLowLimit[7]  =   -9;    // 3400 Hz
  1661.             m_dTxLowLimit[8]  = -100;    // 4000 Hz
  1662.             m_iRxLimitFreq[0]  =  100;
  1663.             m_iRxLimitFreq[1]  =  170;
  1664.             m_iRxLimitFreq[2]  =  300;
  1665.             m_iRxLimitFreq[3]  =  500;
  1666.             m_iRxLimitFreq[4]  = 1000;
  1667.             m_iRxLimitFreq[5]  = 3000;
  1668.             m_iRxLimitFreq[6]  = 3400;
  1669.             m_iRxLimitFreq[7]  = 4000;
  1670.             m_iRxLimitFreq[8]  = 8000;
  1671.             m_dRxUpLimit[0]  =    -7;    //  100 Hz
  1672.             m_dRxUpLimit[1]  =     2;    //  170 Hz
  1673.             m_dRxUpLimit[2]  =     2;    //  300 Hz
  1674.             m_dRxUpLimit[3]  =  1.15;    //  500 Hz
  1675.             m_dRxUpLimit[4]  =     0;    // 1000 Hz
  1676.             m_dRxUpLimit[5]  =     2;    // 3000 Hz
  1677.             m_dRxUpLimit[6]  =     2;    // 3400 Hz
  1678.             m_dRxUpLimit[7]  =     2;    // 4000 Hz
  1679.             m_dRxUpLimit[8]  =   -18;    // 8000 Hz
  1680.             m_dRxLowLimit[0] = -100;    //  100 Hz
  1681.             m_dRxLowLimit[1] = -100;    //  170 Hz
  1682.             m_dRxLowLimit[2] =   -7;    //  300 Hz
  1683.             m_dRxLowLimit[3] =   -5;    //  500 Hz
  1684.             m_dRxLowLimit[4] =   -5;    // 1000 Hz
  1685.             m_dRxLowLimit[5] =   -5;    // 3000 Hz
  1686.             m_dRxLowLimit[6] =   -8;    // 3400 Hz
  1687.             m_dRxLowLimit[7] = -100;    // 4000 Hz
  1688.             m_dRxLowLimit[8] = -100;    // 8000 Hz
  1689.         }
  1690.         break;
  1691.         case ITEMIDX_BOUNDARY_VOIP_HEADSET:
  1692.         {
  1693.             m_iTxLimitNum =  9;
  1694.             m_iRxLimitNum = 10;
  1695.             m_iTxLimitFreq[0]  =  100;
  1696.             m_iTxLimitFreq[1]  =  150;
  1697.             m_iTxLimitFreq[2]  =  300;
  1698.             m_iTxLimitFreq[3]  =  500;
  1699.             m_iTxLimitFreq[4]  = 1000;
  1700.             m_iTxLimitFreq[5]  = 2000;
  1701.             m_iTxLimitFreq[6]  = 3000;
  1702.             m_iTxLimitFreq[7]  = 3400;
  1703.             m_iTxLimitFreq[8]  = 4000;
  1704.             m_dTxUpLimit[0]  =  -7;    //  100 Hz
  1705.             m_dTxUpLimit[1]  =   0;    //  150 Hz
  1706.             m_dTxUpLimit[2]  =   0;    //  300 Hz
  1707.             m_dTxUpLimit[3]  =   0;    //  500 Hz
  1708.             m_dTxUpLimit[4]  =   0;    // 1000 Hz
  1709.             m_dTxUpLimit[5]  =   5;    // 2000 Hz
  1710.             m_dTxUpLimit[6]  =   5;    // 3000 Hz
  1711.             m_dTxUpLimit[7]  =   5;    // 3400 Hz
  1712.             m_dTxUpLimit[8]  =   0;    // 4000 Hz
  1713.             m_dTxLowLimit[0]  = -100;    //  100 Hz
  1714.             m_dTxLowLimit[1]  = -100;    //  150 Hz
  1715.             m_dTxLowLimit[2]  =  -12;    //  300 Hz
  1716.             m_dTxLowLimit[3]  =   -6;    //  500 Hz
  1717.             m_dTxLowLimit[4]  =   -6;    // 1000 Hz
  1718.             m_dTxLowLimit[5]  =   -6;    // 2000 Hz
  1719.             m_dTxLowLimit[6]  =   -6;    // 3000 Hz
  1720.             m_dTxLowLimit[7]  =   -9;    // 3400 Hz
  1721.             m_dTxLowLimit[8]  = -100;    // 4000 Hz
  1722.             m_iRxLimitFreq[0]  =  100;
  1723.             m_iRxLimitFreq[1]  =  150;
  1724.             m_iRxLimitFreq[2]  =  300;
  1725.             m_iRxLimitFreq[3]  =  600;
  1726.             m_iRxLimitFreq[4]  = 1000;
  1727.             m_iRxLimitFreq[5]  = 2000;
  1728.             m_iRxLimitFreq[6]  = 3000;
  1729.             m_iRxLimitFreq[7]  = 3400;
  1730.             m_iRxLimitFreq[8]  = 4000;
  1731.             m_iRxLimitFreq[9]  = 8000;
  1732.             m_dRxUpLimit[0]  =    -7;    //  100 Hz
  1733.             m_dRxUpLimit[1]  =     0;    //  150 Hz
  1734.             m_dRxUpLimit[2]  =     0;    //  300 Hz
  1735.             m_dRxUpLimit[3]  =     0;    //  600 Hz
  1736.             m_dRxUpLimit[4]  =     0;    // 1000 Hz
  1737.             m_dRxUpLimit[5]  =     5;    // 2000 Hz
  1738.             m_dRxUpLimit[6]  =     5;    // 3000 Hz
  1739.             m_dRxUpLimit[7]  =     5;    // 3400 Hz
  1740.             m_dRxUpLimit[8]  =  0.63;    // 4000 Hz
  1741.             m_dRxUpLimit[9]  =   -18;    // 8000 Hz
  1742.             m_dRxLowLimit[0] = -100;    //  100 Hz
  1743.             m_dRxLowLimit[1] = -100;    //  150 Hz
  1744.             m_dRxLowLimit[2] =  -11;    //  300 Hz
  1745.             m_dRxLowLimit[3] =   -8;    //  600 Hz
  1746.             m_dRxLowLimit[4] =   -8;    // 1000 Hz
  1747.             m_dRxLowLimit[5] =   -8;    // 2000 Hz
  1748.             m_dRxLowLimit[6] =   -8;    // 3000 Hz
  1749.             m_dRxLowLimit[7] =  -11;    // 3400 Hz
  1750.             m_dRxLowLimit[8] = -100;    // 4000 Hz
  1751.             m_dRxLowLimit[9] = -100;    // 8000 Hz
  1752.         }
  1753.         break;
  1754.         case ITEMIDX_BOUNDARY_TYPE_3_3:
  1755.         {
  1756.             m_iTxLimitNum = 13;
  1757.             m_iRxLimitNum = 13;
  1758.             m_iTxLimitFreq[0]  =  100;
  1759.             m_iTxLimitFreq[1]  =  150;
  1760.             m_iTxLimitFreq[2]  =  250;
  1761.             m_iTxLimitFreq[3]  =  450;
  1762.             m_iTxLimitFreq[4]  =  750;
  1763.             m_iTxLimitFreq[5]  =  850;
  1764.             m_iTxLimitFreq[6]  = 1000;
  1765.             m_iTxLimitFreq[7]  = 1320;
  1766.             m_iTxLimitFreq[8]  = 1500;
  1767.             m_iTxLimitFreq[9]  = 2360;
  1768.             m_iTxLimitFreq[10] = 2800;
  1769.             m_iTxLimitFreq[11] = 3550;
  1770.             m_iTxLimitFreq[12] = 4000;
  1771.             m_dTxUpLimit[0]  = -30.8;    //  100 Hz
  1772.             m_dTxUpLimit[1]  = -23.6;    //  150 Hz
  1773.             m_dTxUpLimit[2]  = -12.2;    //  250 Hz
  1774.             m_dTxUpLimit[3]  =  -7.5;    //  450 Hz
  1775.             m_dTxUpLimit[4]  = -12.2;    //  750 Hz
  1776.             m_dTxUpLimit[5]  = -12.6;    //  850 Hz
  1777.             m_dTxUpLimit[6]  = -11;      // 1000 Hz
  1778.             m_dTxUpLimit[7]  = -1.5;     // 1320 Hz
  1779.             m_dTxUpLimit[8]  =  2.8;     // 1500 Hz
  1780.             m_dTxUpLimit[9]  =  7.1;     // 2360 Hz
  1781.             m_dTxUpLimit[10] =  6.0;     // 2800 Hz
  1782.             m_dTxUpLimit[11] = -1.1;     // 3550 Hz
  1783.             m_dTxUpLimit[12] = -33.9;    // 4000 Hz
  1784.             m_dTxLowLimit[0]  = -33.8;   //  100 Hz
  1785.             m_dTxLowLimit[1]  = -26.6;   //  150 Hz
  1786.             m_dTxLowLimit[2]  = -15.2;   //  250 Hz
  1787.             m_dTxLowLimit[3]  = -10.5;   //  450 Hz
  1788.             m_dTxLowLimit[4]  = -15.2;   //  750 Hz
  1789.             m_dTxLowLimit[5]  = -15.6;   //  850 Hz
  1790.             m_dTxLowLimit[6]  = -14;     // 1000 Hz
  1791.             m_dTxLowLimit[7]  = -4.5;    // 1320 Hz
  1792.             m_dTxLowLimit[8]  = -0.2;    // 1500 Hz
  1793.             m_dTxLowLimit[9]  =  4.1;    // 2360 Hz
  1794.             m_dTxLowLimit[10] =  3.0;    // 2800 Hz
  1795.             m_dTxLowLimit[11] = -4.1;    // 3550 Hz
  1796.             m_dTxLowLimit[12] = -36.9;   // 4000 Hz
  1797.             // RX
  1798.             m_iRxLimitFreq[0]  =  100;
  1799.             m_iRxLimitFreq[1]  =  150;
  1800.             m_iRxLimitFreq[2]  =  250;
  1801.             m_iRxLimitFreq[3]  =  450;
  1802.             m_iRxLimitFreq[4]  =  750;
  1803.             m_iRxLimitFreq[5]  =  850;
  1804.             m_iRxLimitFreq[6]  = 1000;
  1805.             m_iRxLimitFreq[7]  = 1320;
  1806.             m_iRxLimitFreq[8]  = 1500;
  1807.             m_iRxLimitFreq[9]  = 2360;
  1808.             m_iRxLimitFreq[10] = 2800;
  1809.             m_iRxLimitFreq[11] = 3550;
  1810.             m_iRxLimitFreq[12] = 4000;
  1811.             m_dRxUpLimit[0]  = -30.8;    //  100 Hz
  1812.             m_dRxUpLimit[1]  = -23.6;    //  150 Hz
  1813.             m_dRxUpLimit[2]  = -12.2;    //  250 Hz
  1814.             m_dRxUpLimit[3]  =  -7.5;    //  450 Hz
  1815.             m_dRxUpLimit[4]  = -12.2;    //  750 Hz
  1816.             m_dRxUpLimit[5]  = -12.6;    //  850 Hz
  1817.             m_dRxUpLimit[6]  = -11;      // 1000 Hz
  1818.             m_dRxUpLimit[7]  = -1.5;     // 1320 Hz
  1819.             m_dRxUpLimit[8]  =  2.8;     // 1500 Hz
  1820.             m_dRxUpLimit[9]  =  7.1;     // 2360 Hz
  1821.             m_dRxUpLimit[10] =  6.0;     // 2800 Hz
  1822.             m_dRxUpLimit[11] = -1.1;     // 3550 Hz
  1823.             m_dRxUpLimit[12] = -33.9;    // 4000 Hz
  1824.             m_dRxLowLimit[0]  = -33.8;   //  100 Hz
  1825.             m_dRxLowLimit[1]  = -26.6;   //  150 Hz
  1826.             m_dRxLowLimit[2]  = -15.2;   //  250 Hz
  1827.             m_dRxLowLimit[3]  = -10.5;   //  450 Hz
  1828.             m_dRxLowLimit[4]  = -15.2;   //  750 Hz
  1829.             m_dRxLowLimit[5]  = -15.6;   //  850 Hz
  1830.             m_dRxLowLimit[6]  = -14;     // 1000 Hz
  1831.             m_dRxLowLimit[7]  = -4.5;    // 1320 Hz
  1832.             m_dRxLowLimit[8]  = -0.2;    // 1500 Hz
  1833.             m_dRxLowLimit[9]  =  4.1;    // 2360 Hz
  1834.             m_dRxLowLimit[10] =  3.0;    // 2800 Hz
  1835.             m_dRxLowLimit[11] = -4.1;    // 3550 Hz
  1836.             m_dRxLowLimit[12] = -36.9;   // 4000 Hz
  1837.         }
  1838.         break;
  1839.         case ITEMIDX_BOUNDARY_VOIP_HANDSFREE:
  1840.         {
  1841.             m_iTxLimitNum = 17;
  1842.             m_iRxLimitNum = 14;
  1843.             m_iTxLimitFreq[0]   =  100;
  1844.             m_iTxLimitFreq[1]   =  125;
  1845.             m_iTxLimitFreq[2]   =  160;
  1846.             m_iTxLimitFreq[3]   =  200;
  1847.             m_iTxLimitFreq[4]   =  250;
  1848.             m_iTxLimitFreq[5]   =  315;
  1849.             m_iTxLimitFreq[6]   =  400;
  1850.             m_iTxLimitFreq[7]   =  500;
  1851.             m_iTxLimitFreq[8]   =  630;
  1852.             m_iTxLimitFreq[9]   =  800;
  1853.             m_iTxLimitFreq[10]  = 1000;
  1854.             m_iTxLimitFreq[11]  = 1250;
  1855.             m_iTxLimitFreq[12]  = 1600;
  1856.             m_iTxLimitFreq[13]  = 2000;
  1857.             m_iTxLimitFreq[14]  = 2500;
  1858.             m_iTxLimitFreq[15]  = 3150;
  1859.             m_iTxLimitFreq[16]  = 4000;
  1860.             m_dTxUpLimit[0]   =  -7;    //  100 Hz
  1861.             m_dTxUpLimit[1]   =  -3;    //  125 Hz
  1862.             m_dTxUpLimit[2]   =   0;    //  160 Hz
  1863.             m_dTxUpLimit[3]   =   0;    //  200 Hz
  1864.             m_dTxUpLimit[4]   =   0;    //  250 Hz
  1865.             m_dTxUpLimit[5]   =   0;    //  315 Hz
  1866.             m_dTxUpLimit[6]   =   0;    //  400 Hz
  1867.             m_dTxUpLimit[7]   =   0;    //  500 Hz
  1868.             m_dTxUpLimit[8]   =   0;    //  630 Hz
  1869.             m_dTxUpLimit[9]   =   0;    //  800 Hz
  1870.             m_dTxUpLimit[10]  =   0;    // 1000 Hz
  1871.             m_dTxUpLimit[11]  =   2;    // 1250 Hz
  1872.             m_dTxUpLimit[12]  =   4;    // 1600 Hz
  1873.             m_dTxUpLimit[13]  =   5;    // 2000 Hz
  1874.             m_dTxUpLimit[14]  =   5;    // 2500 Hz
  1875.             m_dTxUpLimit[15]  =   5;    // 3150 Hz
  1876.             m_dTxUpLimit[16]  =   0;    // 4000 Hz
  1877.             m_dTxLowLimit[0]   = -100;    //  100 Hz
  1878.             m_dTxLowLimit[1]   = -100;    //  125 Hz
  1879.             m_dTxLowLimit[2]   = -100;    //  160 Hz
  1880.             m_dTxLowLimit[3]   = -100;    //  200 Hz
  1881.             m_dTxLowLimit[4]   = -100;    //  250 Hz
  1882.             m_dTxLowLimit[5]   =  -13;    //  315 Hz
  1883.             m_dTxLowLimit[6]   =  -12;    //  400 Hz
  1884.             m_dTxLowLimit[7]   =  -11;    //  500 Hz
  1885.             m_dTxLowLimit[8]   =  -10;    //  630 Hz
  1886.             m_dTxLowLimit[9]   =   -9;    //  800 Hz
  1887.             m_dTxLowLimit[10]  =   -7;   // 1000 Hz
  1888.             m_dTxLowLimit[11]  =   -7;   // 12500 Hz
  1889.             m_dTxLowLimit[12]  =   -7;   // 1600 Hz
  1890.             m_dTxLowLimit[13]  =   -7;   // 2000 Hz
  1891.             m_dTxLowLimit[14]  =   -7;   // 2500 Hz
  1892.             m_dTxLowLimit[15]  =  -10;   // 3150 Hz
  1893.             m_dTxLowLimit[16]  = -100;   // 4000 Hz
  1894.             m_iRxLimitFreq[0]   =  100;
  1895.             m_iRxLimitFreq[1]   =  125;
  1896.             m_iRxLimitFreq[2]   =  160;
  1897.             m_iRxLimitFreq[3]   =  200;
  1898.             m_iRxLimitFreq[4]   =  250;
  1899.             m_iRxLimitFreq[5]   =  315;
  1900.             m_iRxLimitFreq[6]   =  400;
  1901.             m_iRxLimitFreq[7]   =  500;
  1902.             m_iRxLimitFreq[8]   = 2500;
  1903.             m_iRxLimitFreq[9]   = 3150;
  1904.             m_iRxLimitFreq[10]  = 4000;
  1905.             m_iRxLimitFreq[11]  = 5000;
  1906.             m_iRxLimitFreq[12]  = 6300;
  1907.             m_iRxLimitFreq[13]  = 8000;
  1908.             m_dRxUpLimit[0]   =    -9;    //  100 Hz
  1909.             m_dRxUpLimit[1]   =    -6;    //  125 Hz
  1910.             m_dRxUpLimit[2]   =    -3;    //  160 Hz
  1911.             m_dRxUpLimit[3]   =     0;    //  200 Hz
  1912.             m_dRxUpLimit[4]   =     0;    //  250 Hz
  1913.             m_dRxUpLimit[5]   =     0;    //  315 Hz
  1914.             m_dRxUpLimit[6]   =     0;    //  400 Hz
  1915.             m_dRxUpLimit[7]   =     0;    //  500 Hz
  1916.             m_dRxUpLimit[8]   =     0;    // 2500 Hz
  1917.             m_dRxUpLimit[9]   =     0;    // 3150 Hz
  1918.             m_dRxUpLimit[10]  =     0;    // 4000 Hz
  1919.             m_dRxUpLimit[11]  =    -7;   // 5000 Hz
  1920.             m_dRxUpLimit[12]  =   -14;   // 6300 Hz
  1921.             m_dRxUpLimit[13]  =   -20;   // 8000 Hz
  1922.             m_dRxLowLimit[0]  = -100;    //  100 Hz
  1923.             m_dRxLowLimit[1]  = -100;    //  125 Hz
  1924.             m_dRxLowLimit[2]  = -100;    //  160 Hz
  1925.             m_dRxLowLimit[3]  = -100;    //  200 Hz
  1926.             m_dRxLowLimit[4]  = -100;    //  250 Hz
  1927.             m_dRxLowLimit[5]  =  -12;    //  315 Hz
  1928.             m_dRxLowLimit[6]  =  -11;    //  400 Hz
  1929.             m_dRxLowLimit[7]  =  -10;    //  500 Hz
  1930.             m_dRxLowLimit[8]  =  -10;    // 2500 Hz
  1931.             m_dRxLowLimit[9]  =  -13;    // 3150 Hz
  1932.             m_dRxLowLimit[10] = -100;    // 4000 Hz
  1933.             m_dRxLowLimit[11] = -100;    // 5000 Hz
  1934.             m_dRxLowLimit[12] = -100;    // 6300 Hz
  1935.             m_dRxLowLimit[13] = -100;    // 8000 Hz
  1936.         }
  1937.         break;
  1938.     }
  1939. }
  1940. //---------------------------------------------------------------------------
  1941. void __fastcall TfrmFIRCoeffCal::cbBoundaryChange(TObject *Sender)
  1942. {
  1943.     Set_Boundary();
  1944.     double min_y, max_y;
  1945.     GetMinMaxY( &OrgSpCoef, &min_y, &max_y );
  1946.     if( min_y == max_y || isTRCLoadOk == false || OrgSpCoef.num>TOTAL_TRC_FREQ_NUM)
  1947.     {
  1948.         PlotGrid(100, 4000, -20, 15);
  1949.     }
  1950.     else
  1951.     {
  1952.         PlotGrid( 100, 4000, min_y, max_y);
  1953.     }
  1954.     PlotBoundaryCurve();
  1955.     if( isOrgCurvePlot )
  1956.     {
  1957.         PlotOrgCurve();
  1958.     }
  1959. }
  1960. //---------------------------------------------------------------------------
  1961. void __fastcall TfrmFIRCoeffCal::FormActivate(TObject *Sender)
  1962. {
  1963.     if (m_bInit)
  1964.     {
  1965.         m_bInit = false;
  1966.         CSPCOEF SP_COEF_Obj;
  1967.         m_b45TapSupport = SP_COEF_Obj.Query_AudioParam45Tap_Start();
  1968.         if (m_b45TapSupport)
  1969.         {
  1970.             edtFIRTaps->Text = SPEECH_FIR_44_TAPS_NUM;
  1971.         }
  1972.         else
  1973.         {
  1974.             edtFIRTaps->Text = SPEECH_FIR_30_TAPS_NUM;
  1975.         }
  1976.     }
  1977. }
  1978. //---------------------------------------------------------------------------
  1979. void __fastcall TfrmFIRCoeffCal::rbMicrotronixClick(TObject *Sender)
  1980. {
  1981.     gbFileFormat->Visible = true;
  1982.     rbLinear->Enabled = true;
  1983.     rbLogdB->Enabled = true;  
  1984. }
  1985. //---------------------------------------------------------------------------
  1986. void __fastcall TfrmFIRCoeffCal::m_rbVitaClick(TObject *Sender)
  1987. {
  1988.     gbFileFormat->Visible = true;
  1989.     rbLinear->Enabled = true;
  1990.     rbLogdB->Enabled = true;      
  1991. }
  1992. //---------------------------------------------------------------------------