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
detect
for(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)
と、なる理由です。
|