複素バンドパス・フィルタ (BPF)

ビーコンモニタ関連の話です。つーか、備忘録です。用語的におかしなところがあるかも知れませんが、その際は御容赦ください*1
IQ 信号(パスバンド信号)の中から、特定の周波数帯域だけを取り出す場合、実係数の FIR フィルタを使うと、周波数 0 (ゼロ)を中心に正負の周波数対称にフィルタがかかってしまいます。たとえば、f_Lf_H までの BPF を通す場合、信号がパスバンドだと -f_H から -f_L も通してしまう訳です。フィルタが実係数しか持っていないので、直感的には当然の帰結なのですが、複素係数の FIR を使って、正負周波数に非対称なフィルタを組めないものでしょうか。実装上は、複素係数を使うとフィルタの演算量が増えてしまうのですが、Octave の filter() はもともと複素信号と複素係数を許しているので、もしかするとメリットがあるかも知れません。
以下のサイトが参考になりました。

つまり、予めローパスフィルタ(LF)を作っておいて、これに複素正弦波(周波数はシフトしたい量)を掛け合わせると、正負周波数のセンターにあった LF が、まるで正負非対称の BPF のように見える訳ですね*2。もちろん実係数だったフィルタは、(複素係数を持つ)複素 FIR に変わっています。
これを使えば、私が昨日書いていたソフトは、もっとエレガントに書けるかも知れません。やってみよう。

後記

Octave の filter() で複素係数をかけたら、少し処理が遅くなりました。どうも、虚部が 0 かどうかの条件処理をしているようです。それでも、2倍も違わないかな? というくらい。

*1:一応ディジタル信号処理を専攻し、ディジタル信号処理関連の仕事をしている身としては、こんなことを書くのはちょっと恥ずかしいが。

*2:直感的には、入力信号を周波数シフトするのではなく、フィルタの応答を周波数シフトしている感じか? 周波数シフトは畳み込みではないので、当然かも知れないけど。