DirectX
EmptyProjectを使う その17 (AGCを考えましょう)
//peak
detect
DATA->gain=0.35f/DATA->peak_output; |
step 2 次は gainを一定の時間間隔だけ、hold するための、仕掛けです。 これには、新しい変数 counterを用意します。 これで、一定の時間間隔の間、gainが一定に保たれます。 今の場合、counterが初期設定値、98の時だけ、gainが計算されて counterがゼロ以下になったら、新たに gainを設定し直します。 時間間隔の計算なのですが 私の場合、samplingは、 2048個のデータを一回で、取り込んでいます。 ですので、 96KHz samplingだと 2048/96 = 21.3mS だけの、データを一回で、取り込んでいます。 この sub routineを一回通り抜けると、21.3mSぶん のデータ ですので (プログラムが、計算に要する時間では、ありませぬ) カウンターを 10にすると、 21.3 * 10 = 213mS ぶん だけのデータを通す事になると思うのです。 これが、hold する時間になると、思います。 先ほどのプログラムでは、カウンターを98にしていますから 21.3 * 98 =2090mS なりますから、これは、hold timeとしては、大きい値ですね。 |
step 3 step 1 では、 ノイズまでも、一定の振幅のしようと、していました。 これを、解決するには、geinが大きくなりすぎるのを、阻止するのです。 //set gain upper limit と、書いてある所です。 これだと、Sにして 6位でしょうか..... 少し、静かになりました。 |
step 4 //peak detect
for(i=0;i<DATA->attack_time;i++)
//limit upper
gain DATA->prev_output=DATA->peak_output; DATA->count--;
if(DATA->count<=0)
DATA->diff=(DATA->prev_output-DATA->peak_output)/(float)DATA->attack_time;
} } |
まだ、改良すべき点は、沢山ありますが、一応なんとか、それらしいものが..... SDR QEX vol.3 を参考にさせていただきました。御礼もうしあげます。 H.19.11.7 |