一般的な伝達関数を FIR フィルタで実現しようとするとどうなるか、ということで考えはじめましたが、そもそも FIR フィルタ自体は直線位相(周波数に比例して位相が遅れていく=全周波数に対して一定の遅れがあるということ)なので、その特性を満たさないフィルタ、伝達関数は実現できないようです。まあ確かにブロック図を見ていると、入力に係数を掛けているとはいえ、一ステップずつ遅らせて合成しているだけで振幅特性は変わるものの、出力は一定の遅れを持っているだろう、というのは想像できます。
なのでバタワース特性とかチェビシェフ特性は実現不可能できてベッセル特性というところでしょう。

ものは試しと一次の LPF(一次の場合はベッセル特性です。一般的にそうは云わないようですが)を組んでみます。
といっても参考文献があるわけでもなし(そのうち買うかな)、手探りになります。
前回の理想フィルタ特性を実現するのに、インパルス応答を調べてその応答通りの振幅推移を係数に当てはめるという方法をやってみました。ですので今回もその方法を使ってみることにします。

スクリプトはこうしてみました。

s=poly(0,'s')

dires=[]
cutoffrate=1/1000
// LPF のカットオフ周波数をサンプリング周波数の 1000分の1 にする。

fc=1/dt*cutoffrate
wc=2*%pi*fc

LPF=fc/(fc+s/2/%pi)
// 連続領域での LPF の特性

disp(LPF)

LPFsys=syslin('c',LPF);

clf(3);scf(3);clf;bode(LPFsys,0.01,1e4);

// ボード線図表示

z=poly(0,'z')

dt=1d-4
//サンプリング周期

t=0:dt:dt*100
//100ステップまで計算してみる。
//↑ ここを変える。

scf(4);clf

dires=[csim('impuls',t,LPFsys)]
plot(t,dires)
//インパルス応答を計算して、dires に入れる。

DLPF=0
a=[]
param=dires'
n=size(param,'r')

for i=0:n-1
    DLPF=DLPF+z^(-i)*param(i+1)*dt
end
//インパルス応答列から係数列を生成。

disp(DLPF)

DLPFsys=syslin(dt,DLPF);

scf(5);clf;bode(DLPFsys,1e-2,4990)

結果ですが、まずは連続領域でのボーデ線図はこうです。

イメージ 1
応答はこうです。

イメージ 2
離散領域でのボーデ線図は以下のようです。

イメージ 3
あれあれ、離散領域でのボーデ線図は変ですね。で、フィルタのタップ段数をえいやで 100 にしましたが、連続領域での応答を見るとその時間では応答が完全に終了していないようです。ですのでボーデ線図上で奇妙な特性を示していると思われます。
そこで スクリプト中程の↑ ここを変える、というところを LPF のカットオフ周波数がサンプリング周波数の 1 / 1000 であることから、1000 にしてみましょう。つまりディレイ 1000 段です。

応答はこうです。1000 段分の時間があれば応答も収束しているようです。(実際には無限応答です)

イメージ 4
ボーデ線図はこうなりました。

イメージ 5
これだともっとももらしいですね。
ところが、位相特性を見ると周波数が上がるに従ってどんどん遅れていきます。つまり一定量のディレイをもっているということです。
そこで離散領域での式をみると(長いので省略)、分母は z^1000 だけですが、分子は多項式になっていて最大項は z^999 です。ということは、もともとの FIR の式は分母が 1 で、分子は z^0 から始まる多項式なのですが、ここでは z^(-1) から始まる多項式になっていて、z^(-1) が一つ余分に掛けられています。そのため一ディレイ分の時間遅れを持つためにサンプリング周波数の半分の周波数で 180°遅れになっています。こうなってしまう背景には、インパルス応答の最初の値が 0 なためです。z^0 に対して係数がゼロなため一ディレイ分遅れた特性になってしまうわけです。これだとサンプリング周波数の半分のところでちょうど 180°遅れるはずなのであっていますね。

ちなみに離散領域で係数が決まって多項式が出来たところに無理矢理 z を掛けて位相遅れを回避させるとこうなります。

イメージ 6
今度はサンプリング周波数の手前で位相が戻りはじめました。
要は上手くいかないというわけですね。少なくとも今回の手法ではダメだと云うことです。さらにいうとサンプリング周波数に対してある程度低い周波数を扱おうとするとタップ段数がどんどん増えます。どんどん実用的ではなくなります。乗算器も大忙しになります。

ここで分かった範囲でまとめると、

FIR フィルタは位相直線なので一般的な伝達関数を作れない。
LPF を作ってもカットオフ周波数が低ければタップ段数が増えてしまう。
LPF はインパルス応答に対して時刻ゼロの時に応答がないので、一ディレイ分遅れた特性になる。


ということでいわゆるデジタルフィルタの教科書になんて書いてあるかは知りませんが(そこら中のサイトを見ても具体的に何が出来るか分からない)、かなり制限された応用向けのように見えます。

上の3つの分かったことから使えそうなものとして、波形等化回路が考えられます。
サンプリング周波数に近い周波数での処理、応答遅れは気にしない、位相直線でないといけない。

次回は波形等化回路でどんなことができるか調べてみようと思います。