2008年09月11日 [ColdFire] ColdFire×P2P地震情報(8) 実際どこまで出せるのか
_ [ColdFire] ColdFire×P2P地震情報(8) 実際どこまで出せるのか
Interface 9月号付録基板を使い,P2P地震情報のサービスを作ってしまう勝手な企画です.過去の記事は,タイトルのColdFireカテゴリからどうぞ.
前回のまとめ
- A/Dコンバータへ直接アクセスして,"33.3 Hzの壁"を超えました.
実際どこまで出せるのか
A/Dコンバータへ直接アクセスすることで,どれくらいまでオーバーサンプリング出来るでしょうか.
直接送信
main()
{
char soc;
char *ctr;ctr=0x40190000;
int *dat; dat=0x40190012;
int *sd=MemoryAlloc(8);
soc=CreateSocket(0);if(soc<0){PrStr("Soc!");return;}
Bind(soc,6909,0);sd[3]=3338;
PrStr("START!\r\n");
for(;;) {
if(Getc(0)!=0)break;
*ctr=32;
sd[0]=dat[4]>>3;sd[1]=dat[5]>>3;sd[2]=dat[6]>>3;
SendTo(soc,0xc0a80b69,6909,sd,8);
}
PrStr("GAME OVER\r\n");
CloseSocket(soc);
}

取得値をそのままUDP送信した場合です.表示を見ると,258.56 Hz出ていることが分かります.
フィルタ送信
main(){
char soc; int i,j,index,ind_n;
int *sample=MemoryAlloc(600); long *nr=MemoryAlloc(12); long *offset=MemoryAlloc(12);
int *data=MemoryAlloc(8); char *k; int *a;
k=0x40190000; a=0x40190012;
// init
soc=CreateSocket(0);if(soc<0){PrStr("Soc!");return;}
Bind(soc,6909,0); data[3]=3338;
InitAd(0x70); index=0; ind_n=85;
for(i=0;i<3;i++){offset[i]=0;nr[i]=0;}
for(i=0;i<300;i++)sample[i]=0;
// loop
#stop 0
for(;;) {
if(Getc(0)!=0)break;
*k=32;
index=(index+1)%100;ind_n=(ind_n+1)%100;
for(i=0;i<3;i++){
j=i*100+index;
offset[i]-=sample[j];nr[i]-=sample[i*100+ind_n];
sample[j]=a[i+4] >> 3;
offset[i]+=sample[j];nr[i]+=sample[j];
data[i]=nr[i]/15-offset[i]/100;
}
SendTo(soc,0xc0a80b69,6909,data,8);
}
MemoryFree(sample);MemoryFree(nr);MemoryFree(offset);MemoryFree(data);
CloseSocket(soc);
}

移動平均によるフィルタを掛けてUDP送信した場合です.Unsignedで受け取ったので値が大変なことになっていますが,それよりも問題はサンプリング周波数.41.15 Hzと,先ほどの6分の1くらいしか出ていません.
やはり,インタプリタで行うには限度があるようです.
どうしようか
"あくまでSilentCで"ということで考えると,次のような方法があります.
- 集計サーバに取得値をそのまま送りつけて,震度を計算してもらう
- データ量は 6bytes * 100 Hz = 600bytes/s = 4800bps
- インターネットごしにUDP送信するのか? TCP送信だとこんな速度出るのか?
- LAN内のパソコンに送りつけて,震度を計算.ないときは低いサンプリング周波数で単独動作
- 切り替えをうまくできるだろうか?
- 単独動作時の低いサンプリング周波数によるノイジーな状態を許容できるだろうか?
- 30 Hzや40 Hzくらいで,今までよりはマシにする
- そんなに変わるだろうか?
しばらく悩むことになりそうです.
[ツッコミを入れる]
本日の日記はツッコミ数の制限を越えています。