75分の生データ、通過した衛星全てに対するダウンサンプリング処理、130分ほどかかった。かなり時間がかかる。ダウンサンプリングの速度自体は、概ね実時間弱、くらいの処理速度。例えば10分のパスであれば7分程度の時間がかかる。(130/75)*(10/7)でだいたい2.5くらいなので、平均して同時に2.5機が仰角0以上を通過している計算。全部のアマチュア衛星を網羅しているわけではないので、実際はもう少し多いだろうけど。
おそらく一番重いのは生データの周波数移動じゃないかな。複素数の掛け算を大量に行う必要がある。これを、構造体とか経由せず、配列対配列で直接処理すれば、少しは早くなる気がする。早くなってほしいな…… 保守性悪くなるだけで効果ない気もする。演算子のオーバーロードは遅いらしいのでそのあたり工夫すると早くなるかな?
SIMDが使えればそこそこ早くなりそうだけど、C#でSIMDは泥沼の予感。というかPCでSIMD使うのがなかなか大変そう。Cortex-M4みたいな、コードの一部でちょこっとSIMD命令使って簡単に少し早くなる、みたいな感じじゃ使えなさそうな気がする。いや、CM4でもだいぶ苦労したような気がするけど。あのときは超音波を1chでサンプリングして複素空間で掛け算してDCに持ってきてダウンサンプリングしつつ相関処理、か。似たようなことやってるなぁ。
ダウンサンプリング処理は、シングルスレッドで行っている。パラレルで回すとCPUリソース食いすぎてWebブラウザとか遅くなる(不定期に走らせる処理でそれは嫌)という理由。コア3個分くらい使う分には問題ないので、呼び出し側で複数を同時に呼ぶ感じにすれば、単純計算で3倍程度は早くなる。まぁ、生データの解析で実時間の数倍の時間かかかってるので、同時に複数ドングルでデータ作ると解析追いつかないわけだが。
ちなみに、13.7GiBの生データから20パスを抽出して2.39GiBくらいになる。衛星のパスが有って周波数が受信範囲内でも、ビーム内を通過しなければ受信できないわけだから、受信できていないデータを捨てれば数分の1くらいには減らせる。幸い、受信できてるか否かは目で見えるように工夫してあるから、取捨選択は簡単。いちいち目で見なきゃいけないのが面倒なだけで。
CIC/FIRで帯域外はかなり落としたはずなんだけど、強い混信は除去しきれてない。これ以上CICタップ数増やしたらさらに計算速度が。。。広帯域CICだとゼロ点を使えないのでタップ数大きくして削らなきゃいけないので、ビット数も考えるとCPU実装だとちょっとキツイかも。かといって、ハードウェア実装だとしてもビット数多い加算器は遅いわけで、FPGA実装でも厳ししそうだが。
ダウンサンプリングした51.2kSPSのIQデータ、追加で周波数を動かすのに2秒程、それをFFTに通すのに3秒程、全体で10秒弱くらいかかる。もうちょっと早いと嬉しいんだけどねぇ。いままでは1-3分程度待ってたのでだいぶ早いんだけど。
全体的に高速化が必要。早いCPU買うべきでは?って気もする。このPC組んだとき、とりあえず最低限不自由しないようにi5積んで、あとでi7に載せ替える、みたいな計画だったんだけどねぇ。いろいろゴタゴタあって流れた。
とりあえず、長時間受信しっぱなし→通過した衛星全部ダウンサンプリングして中間ファイル出力→中間ファイルから詳細画像出力、は動くことを確認できた。正しく動いてるのかは判断が難しいところだけど。もう少しマトモに動くようになってきたらCUTE-Iのパスのデータ入れてみよう。
まずはダウンサンプリングの高速化だなー。総当りやらなければ10分弱で終わるとはいえ、それでも待ち時間かなり長いし、動作確認が面倒。やることは山積み。データも山積み。
***
3月9日受信分
* 27844 / CUTE-1
* 27848 / XI 4
* 28895 / XI 5
* 32785 / CUTE-1.7+APD II
* 32791 / SEEDS
* 33493 / PRISM (HITOMI)
* 35932 / SWISSCUBE
* 41460 / AAUSAT 4
* 42775 / AALTO 1
* 42790 / VZLUSAT 1
* 42792 / ROBUSTA 1B
* 43615 / CP-7 DAVE
* 43743 / REAKTOR HELLO WORLD
* 43933 / ORIGAMISAT-1
* 43937 / NEXUS
* 44330 / RAAVANA1
* 44909 / BREEZE-KM R/B
だいたい毎日同じようなラインナップだなー。
0 件のコメント:
コメントを投稿