EmptyProjectを使う その13



左: FFT結果を切り取る。filter無し                  右: FFT結果を切り取る。filter有り

 1.この差は 大きい

     前節では、FFT結果を並べ替えて、必要な部分のみを、切り取って、逆FFTしました。

     いい線いってるのですが、雑音が気になります。

     送信時のモニターに、如何でしょう?

     なんせ、filterを通してませんので、その分の遅延が、ありません。

     例えば、96KHz sampling時でしたら、fir filter による遅延は、

     FFTが4096個で、captureしたdata数が2048個で、filterの次数も、2048 だとすると、

     overlap-save法では

          1/96000 *2048 =  21ms位の遅延

     に、なりましょうか....これは、大きい遅延です。

 

 2.Overlap-add 法とは?

     やっと、資料を、みつけました。

    The Scientist and Engineer's Guide to Digital Signal Processing chapter18  By Steven W. Smith, Ph.D. 

    以前も、お世話になったPDFです。 Dr.Steven W. Smith さん、いつも、ありがとうございます。

    以前、私が使った overlap-save法との違いは

     overlap-save法 = captureしたデータを、overlapする。

     overlap-add法 =  outputされたデータを、overlapする。

    プログラミング上では、

     overlap-save 法

       if(DATA->is_overlap_Lower) //simplified double buffer for  overlap save method
       {
   
          for(i=0;i<2048;i++)
          {
            DATA->my_data_Q[i] =DATA->my_data_Q[i+DATA->bank2]=DATA->current_Q[i];
            DATA->my_data_I[i] =DATA->my_data_I[i+DATA->bank2]=DATA->current_I[i];
          }
 
          DATA->myfir->get_CaptureData_FFT_result(
           &DATA->my_data_Q[DATA->bank1],&DATA->my_data_I[DATA->bank1],4096,DATA->capture_fft,work,ip,w);

       }

       else
       {
          for(i=0;i<2048;i++)
          {
            DATA->my_data_Q[i+DATA->bank1] =DATA->my_data_Q[i+DATA->bank3]=DATA->current_Q[i];
            DATA->my_data_I[i+DATA->bank1] =DATA->my_data_I[i+DATA->bank3]=DATA->current_I[i];

          }
          DATA->myfir->get_CaptureData_FFT_result(
           &DATA->my_data_Q[DATA->bank2],&DATA->my_data_I[DATA->bank2],4096,DATA->capture_fft,work,ip,w);

       }
      ..........

     overlap-add 法

       
//FFT
       data_origin.myfir->get_CaptureData_FFT_result(DATA->current_Q,DATA->current_I,2048,DATA->result,work,ip,w);

         「この関数 get_CaptureData_FFT_result の定義は、こうなっています。

           void CFir::get_CaptureData_FFT_result(double* capture_data1,double* capture_data2,int length,double* dest,
                                                                               double* work,int* ip,double* w)
          {
            int i;

            //FFTの準備
            for(i=0;i<length;i++)
            {
              dest[2*i]  =capture_data1[i];//Q
              dest[2*i+1]=capture_data2[i];//I
            }

            for( ;i < number_of_spectrum;i++ )
               dest[2*i] = dest[2*i+1] =0.0;


            //do FFT
            cdft(2*number_of_spectrum,-1,dest,ip,w); //大浦さんのcdft

          }   」

  
    //ここで、tuneで、周波数遷移する
      //DATA->capture_fft の一部分だけを変化して同調する span幅だけ、0Hzへ copyする
      switch(DATA->info_array[selected_mode].usb)
      {
       case 0:

        if(tune>=0)
        {
          if( tune>span )
          {

            for(i=0;i<span;i++)//i=5  under 117Hz cut
            {
  
         .................

      }
      DATA->myfir->multi_FFT_results(DATA->coef_fft,DATA->capture_fft,DATA->result,4096);

 
       

      DATA->myfir->get_data_from_mulit_FFT_result(DATA->result,4096,DATA->output,
                                       DATA->info_array[selected_mode].usb,ip,w);

     //overlap-add method
      for(i=0;i<2048;i++)
        DATA->output[i] +=DATA->out2[i];

       //save current output
        for(i=2048;i<4096;i++)
           DATA->out2[i-2048]=DATA->output[i];

    それから、CPU's performanceも、現在の所、素晴らしいです。

        

    最後に、overlap-add法を使った復調を 聞いて下さい。

    いつも、素晴らしいvoiceを、お聞かせ下さるOMに、感謝致します m(__)m

 
   H.19.9.21