DirectX EmptyProjectを使う その19 ( simple AGC )



 1.Simple AGC

      前々節の「AGCを考える」では、色々試してみました。

      結論として、

        最大出力振幅を一定にする事

        小さい入力信号を増幅するためのgainを、可変できるようにする事

      の、2点に止めました。

     入力信号の強弱に伴い、gainにステップを付ける事は、止めました。

     従いまして、めちゃくちゃ簡単なプログラムに、なりました。

  DATA->peak_output=0.0f;

  //peak detect
  for(i=0;i<Capture_Data_Length;i++)
   DATA->peak_output=max(DATA->peak_output,DATA->output[i]);
  
//AGC
  if(DATA->AGC)
  {
  
   if(DATA->peak_output !=0.0f)
   {
    DATA->gain=0.27f/DATA->peak_output;
     
    //limit upper gain
    if(DATA->gain>DATA->hold_lower_value)
     DATA->gain=DATA->hold_lower_value;
   }
   else
    DATA->gain=1.0f;
  }
 
 else
  ........
     これで、実用上、私の主観でございますが、不都合を感じませんでした。

     ここまで、simpleになりましたのは、 

     S_meter用のプログラムを、別スレッドに、置いたからです。
     
        S_meterは、やはり、peak_outputの移動平均を採っています。
  
     但し、今回は、Buttonを、一つ増やしまして、その都度のpeak値を表示できるように、していますが

     少し、メータの動きが激しすぎます。.なんせ、40fps(frames per second)以上ですから.....

       
 
//S_mterを制御するthread
DWORD WINAPI myThread_s_meter(LPVOID x)
{
  paTestData* DATA_S=(paTestData*)x;
  while(1)
  {
   if(DATA_S->peak_output!=0.0f)
    DATA_S->s_value=0.191/(double)DATA_S->peak_output;
   else
    DATA_S->s_value=0.1;

   if(DATA_S->show_ave)
   {
    DATA_S->s_array[DATA_S->s_count]=DATA_S->s_value;
  
    for(i=0;i<DATA_S->ave_s_count;i++)//移動平均
    DATA_S->s_value +=DATA_S->s_array[i];
     
   DATA_S->s_value /=(double)DATA_S->ave_s_count;
   }
  
   DATA_S->s_count--;

   if(DATA_S->s_count<0)
       DATA_S->s_count=DATA_S->ave_s_count-1;

    DATA_S->dBu=20.0*log10(0.2/DATA_S->s_value)+58.0;

   if(DATA_S->dBu<=40.0)
    DATA_S->dBu_pos=(float)(903.0+DATA_S->dBu*1.3334);
   else
   {
    DATA_S->dBu_pos=(FLOAT)(903.0+39.938*1.3334+(DATA_S->dBu-39.938)*0.8);
    }
   //limit dBu_pos
   if(DATA_S->dBu_pos<894.0)
    DATA_S->dBu_pos=894.0;
   if(DATA_S->dBu_pos>1008.0)
    DATA_S->dBu_pos=1010.0;

   ::Sleep(1);
   }
} 

 2.サウンドカードの性能差

     今回、はじめて、サウンドカードの性能差を、実感いたしました。

     私の持っているサウンドカードは、

       Audiotrack Prodigy7.1XT

               Edirol FA-66

          の、2枚です。

             


                  

     表示するフレーム数に、10ほど、差があるのです。

     そう言えば、Edirol FA-66は、192KHz samplingにも、対応しているのでした。

     まだ、試してなかった..... 

     これなら、7MHz帯が、200KHz幅になっても、ほぼ OKですね (^_^)

     私も、Flex Radioで、知ったんやったわ....
  
        *******************************************************************************************
     
           ところが、windows タスクマネージャーを 見て、びっくり

     CPU使用率が、めちゃくちゃ、上がってる!


     Pridigy7.1XT 


           Edirol FA-66


          全く同じプログラムで、これだけ、Edirol FA-66 の、CPU使用率が高いなら、心臓に悪い.....

     あなたなら、どちらを選びます ? 私は、Prodigy7.1XTです。

       *******************************************************************************************

3.Sメータは、よくできてる

     
Sメータの目盛りは、S1つに対して 約6dBの差があります。

     正確な定義は、よく知らんのですが.....

     もし、電圧が1/2になるのを、S目盛りの基準にしているのならば

     電圧dBは

        20 * log10(1/2) =-6.02 dB

          に、なります。

     電圧が1/2になった時、電力Pは

                P=V^2 /R =(1/2)^2 /R=(1/4)/R

           だから、元の電力に比べて 1/4に、なります。
        
     そやから、出力 100Wの信号と比べて、25W 出力では

     S目盛りは、S1つ分しか違わない。

     25W 出力の 1/4 6.25W 出力では、

     100W出力に比べて S目盛り2つ分の差です

     反対に QROして、400W 出力とすると

     100W出力機に比べて、S目盛りは、1つ(6.02dB)の違いです。

     100Wを 奮発して、1KW出力にQROすると

     電力は 10倍ですから

        10*log10(10) = 10dB

          Sにして、 10/6.02 =1.66目盛り

     Sにして 2目盛りも違わないですね

     結局、100W局を基準にすると

     S目盛り1つ上げるのに、電力は 400W

     S目盛り2つあげるには さらに4倍の 1.6KW必要ですね。

     切が無い.... やっぱり、要は、空中線と、効率やな......EHアンテナ、興味あります。

         H.19.11.21