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くらいで,今までよりはマシにする
- そんなに変わるだろうか?
しばらく悩むことになりそうです.