ディジタルフィルタの設計ソフト

bpf3650_3
昨日も、ビーコンモニタ関連の作業をしていました。目的は、48kHz サンプリング I/Q で保管されているデータをコンパクトにするソフトを書くことです。48kHz サンプリング I/Q だと、一日分のデータが 15G バイト以上になってしまい、到底長時間は保管できないのです。まだ、検出アルゴリズムをいろいろいじろうと思っているので、できたらデータを長期間保管できるとグーです。
48kHz サンプリングという仕様は、単にサウンドカードから来ているのであって、検出そのものには 16kHz もあれば十分なのですが。さらにいうと、ビーコンの中心周波数に対して 500Hz 程度の帯域でしか情報を見ていないので、エイリアシングを気にしなければ 1kHz 標本化(非 I/Q)でも大丈夫なのです。
ところで、この変換をするには(私の少ない知識では)、フィルタリングと、周波数シフトと、ダウンサンプリングを繰り返す必要があります。このうちフィルタリングに関しては、Octave の fir1() と窓関数を使うだけだと、かなりの難作業が伴います。ああ、何かディジタルフィルタ設計のツールがないかなあ、と探していました。
結論から言うと、次の 2つが有用に思えました。

他には METEOR というソフトが知られていて、Pascal のソースが付いているのですが、次数の高いフィルタの設計をしようと思うと、私にはうまく使いこなせませんでした。
ScopeFIR は商用ソフトで、もし、仕事で使うなら良い選択肢かも知れません。Windows の綺麗な GUI でフィルタの設計ができます。所望のスペックを指定すると、必要な次数を求めてくれます。語長制限(有限語長化)もしてくれます。しかし、ちょっと趣味で使うには US$300 は痛いなあ、と思ってました。
そこでもう少し調べたところ、DISPRO というソフトを見つけました。DOS 時代の設計なのですが、GUI が凝っていて、なかなか便利に使えます。FIR も IIR も設計できますし、次数の最適化まではできませんが、必要なおおよその次数の推測くらいはしてくれます。実際に 512 次のバンドパスフィルタを設計して、その係数を Octave の freqz() にかけて見てみましたが、きちんとスペックを満足したフィルタ係数が得られていました。素晴らしい。ぜひ、有効活用しようと思います。

ちなみに GNU Octave

Octave には remez() という関数があって、Parks-McClellan の手法を使ってフィルタを設計することができるようです。今度、調べてみます。

Octave 後記

Octave の remez() ですが、次数が小さい(数十次くらい)と結果が求まるのですが、100次を超えたあたりから変な結果になります。うーむ。