|  2.それでも、simpleなプログラムです。
 //AGC
 if(DATA->AGC)
 {
 if(DATA->count >=
 
       DATA->hold_time || DATA->peak_output > 
      DATA->prev_output)
 {
 DATA->count=DATA->hold_time;
     if(DATA->peak_output 
      !=0.0f)DATA->diff=DATA->peak_output/(float)DATA->hold_time; //DATA->hold_timeは、一定の値。 CW、 SSBで、異なる。sampling周波数でも異なる。
 }
    DATA->prev_output=DATA->diff*(float)DATA->count;
 DATA->gain=0.25f/DATA->prev_output;
 
 //limit upper 
      gain
 if(DATA->gain>DATA->hold_lower_value)
 DATA->gain=DATA->hold_lower_value;
    DATA->count--;    if(DATA->count<=0)DATA->count=DATA->hold_time;
 
 }
 else
 {
 //non 
      AGC
 .....
 
 私が、AGCについて、勘違いしていたのは
 
 一定の時間 holdした後、attack 
      time 
      と、同じ速さで、decayしなければならないと、思っていたのです。
 
 これは、明らかに間違いで、
 
 attack 
      timeで、速やかに、ある値をholdして、そこから、ゆっくり、落ちて行くのです。
 
 quick attack , slow 
      decay(decrease)なのです。
 
 私は、attack time 
      を ゼロmSに、採りました。
 
 何故なら、私のプログラムでは、
 
 この前段で、peak_outputを検知して、この値を使って
 
 出力の振幅の大きさは、ある一定の値以上にならないように、作ってあるからです。
 
 DATA->peak_output=0.0f;
   //peak 
      detectfor(i=0;i<Capture_Data_Length;i++)
 DATA->peak_output=max(DATA->peak_output,DATA->output[i]);
 ..........
 
 DATA->prev_output=DATA->diff*(float)DATA->count;
 
 DATA->gain=0.25f/DATA->prev_output;
 
 ですので、所謂、attack 
      timeは、私のプログラムでは、なくてもいいと、思うんです。
 
 
 これが、cwを受信した時の画像です。
 
 
  CWの始まり
 
  
 
 
 
  CWの終わり
 
 これが、よいかどうか、私には、解りませんのです。
 
 attack time 
      が1mS位では、聴覚上、ゼロmSとの違いを、感じられないからです。
 
 このAGCの動きは、
 
 ぜんまいを巻いて、手を離した時の、ぜんまいの動きと、よく似ています。
 
 所が、強信号が新たに来ると、 ぜんまいが、まだ動いている間に、又、ぜんまいを、巻きなおす必要があります。
 
 ここん所が
 
 if(DATA->count>=DATA->hold_time 
      || 
      DATA->peak_output>DATA->prev_output)
 
 と、なる理由です。
 
 
 |