試しにCICフィルタを実装。とりあえず動いてるっぽい。ただ、1bit分計算が合わない。他にも疑問点がいくつか。もうちょっと詳しく調べてみないと。
CICフィルタの最大の疑問点。間引きMのCICフィルタを通すと、サンプリングレートはfs/Mになるが、最初のゼロ点もfs/Mになる。つまり、エイリアシングを発生させるfs/M/2からfs/Mまでの信号を除去できない。はず。
試しにそんな感じのグラフを書いてみた。
青とオレンジがCICフィルタの特性。タップ3、間引き10。赤は入力した信号のスペクトル。上半分は間引いていない(M段シフトレジスタで処理した)信号、下半分はCIC内で間引いた信号。上下で緑の線でつながっているのが間引き前後で対応するスペクトル。
やはり、fs/2を超える信号がエイリアシングを発生させている気がする(もちろん、もっと高い周波数の成分も全部入ってる)。
これってどうやって処理するのが正しいんだろう? CICでM段間引きでなく、M/2段とかM/4段くらいに間引いて、間引きとシフトレジスタの折衷案みたいな感じにして、アンチエイリアスを避けて、後段でFIRに通す、みたいな感じなんだろうか。
あるいは、そもそもやり方が間違ってる可能性もある。ふくそすうめんどくさい……
CICフィルタ「積分器連続で入ってるからDC成分入れると一発で発散するよ。でも発散するままに任せてしまえ!!」という恐ろしいノリで使うらしい。FPGA実装の必要最小限のビット数の加算器で回したりとかするのに都合のいいアルゴリズムっぽい。PCで試してみようと思って気安くComplex32とか使うと一発で発散したまま張り付く。doubleベースだとなんとか動いてる感じ。タップ数増やすとノイズ増えるけど。floatはQuaternionとかでも注意してないと簡単に飛ぶし、積分するような使い方には注意が必要。doubleでも程度の差だろうけども。
今日も進捗ダメだったなぁ。明日は折衷案CIC+FIRの実装をやってみよう。たまり続ける一方のデータを削減できるのはいつになるやら。
なんでこんな苦労してるんだろう。。。GNU Radioとか使うべきでは?
***
3月4日受信分
* 27844 / CUTE-1
* 27848 / XI 4
* 28895 / XI 5
* 32785 / CUTE-1.7+APD II
* 32791 / SEEDS
* 33493 / PRISM (HITOMI)
* 42790 / VZLUSAT 1
* 43615 / CP-7 DAVE
* 43743 / REAKTOR HELLO WORLD
* 43937 / NEXUS
* 44330 / RAAVANA1
* 44909 / BREEZE-KM R/B
ほとんどのビーコンは1文まるごと読めるくらいの明瞭度で受信できてる。そういうデータは八木で受信したやつが大半。やっぱりオムニは感度低い。ただ、VZLUSATだけは無指向でもガンガン入ってくる。
0 件のコメント:
コメントを投稿