DirectX EmptyProjectを使う その19 (
simple AGC ) 1.Simple AGC //peak
detect
if(DATA_S->show_ave)
if(DATA_S->s_count<0)
DATA_S->dBu=20.0*log10(0.2/DATA_S->s_value)+58.0;
if(DATA_S->dBu<=40.0)
::Sleep(1);
前々節の「AGCを考える」では、色々試してみました。
結論として、
最大出力振幅を一定にする事
小さい入力信号を増幅するためのgainを、可変できるようにする事
の、2点に止めました。
入力信号の強弱に伴い、gainにステップを付ける事は、止めました。
従いまして、めちゃくちゃ簡単なプログラムに、なりました。
DATA->peak_output=0.0f;
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;
{
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--;
DATA_S->s_count=DATA_S->ave_s_count-1;
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;
}
}
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