« 時計のモータ | トップページ | 簡単一次IIRフィルタのステップ応答波形 »

2008年11月17日

簡単一次IIRフィルタのインパルス応答波形

先の記事のおさらい。

1次のIIRのローパスフィルタは、以下の式で、実現できると書いた。

y(nT) = x(nT) - {1-e^(-T/τ)}*y{(n-1)T} + y{(n-1)T}

    (式9)

ここで、例として、係数

 1-e^(-T/τ) =1/16  (式10)

としてみよう。4回右シフトで1/16を実現しようともくろんでいる。

 1 - 1/16 = e^(-T/τ)

両辺のlnをとって、

 -T/τ= ln(1-1/16)

        τ = -T /{ln(1-1/16)}

     =T * 15.4946

となる。サンプリング周期T=1msとすれば、時定数τ=15.49msのディジタルフィルタが実現できる。 (式9)は、(式10)と置いたので

y(nT) = x(nT) - 1/16*y{(n-1)T} + y{(n-1)T}

    (式11)

となる。これを、実際に計算してみよう。

■インパルス応答時間波形(実数計算)

まず、入力x(nT)として、パルスを入力してみよう。

最初の1サンプリングだけ、1。あとは、ずっと0。式にすると、

  x(nT) =  1 (n=0)

  x(nT) =  0 (n=1,2,3,,,)

この場合の出力y(nT)は、以下のグラフになる。1/16の計算で小数点以下が発生するが、実数で計算している。アナログフィルタ出力の理想波形

  y(t) = e^(-t/0.0154946)

と比較している。

1_16_impluse_real_number_2

横軸はサンプリングn。サンプリング周期T=1msの場合は、時間[ms]と考えて良い。アナログ波形とディジタル演算波形に、ほとんど差がない。どのくらい差があるか知りたい方は、追って、エクセルデータをアップロードするのでみてください。

■インパルス応答時間波形(整数計算)

次に整数計算してみる。途中の1/16で桁落ち(小数点以下は無視される)ので、入力x(nT)を大きい値にする。ここでは、127にする。つまり、最初の1サンプリングだけ、127。あとは、ずっと0。式にすると、

  x(nT) =  127 (n=0)

  x(nT) =  0 (n=1,2,3,,,)

この場合の出力y(nT)は、以下のグラフになる。アナログの理想波形と比較している。横軸はサンプリングn。サンプリング周期T=1msの場合は、時間[ms]と考えて良い。

1_16_impluse_integer_3

出力y(nT)が0にならないことがわかる。15で落ち着いてしまう。理由は、途中の1/16演算に15が入力されても、演算結果が0になってしまい、出力に現れないことによる。

つまり、1/16を途中に入れると、16より1少ない15が誤差として残る。

使えるか?

16bit(-32768から+32767)等の有限桁数のデバイスで実装を狙っているので、誤差はやむを得ないという前提である。誤差15が気にならないように16倍したデータをx(nT)に入力すれば、誤差の割合は減る。つまり、精度は上がる。

あとで説明するかもしれないが、1/32を途中に入れると、32より1少ない31が誤差として残る。同様に1/8を途中に入れると、8より1少ない7が誤差として残る。

なお、今は、サンプリング周期T=1msとして、時定数τ=15.49msとなっているが、

サンプリング周期を1/10にして、T=0.1msなら、時定数は、1/10の1.549ms、

サンプリング周期を10倍にして、T=10msなら、時定数は、10倍の154.9ms、

どんなサンプリング周期でも15.49倍である。

次の記事では、ステップ応答の波形を計算する。

Link: 

プライムモーション社(みんなで手軽にWindowsリアルタイムIO制御)

プライムモーション(Windowsで手軽にリアルタイムIO制御)

|

« 時計のモータ | トップページ | 簡単一次IIRフィルタのステップ応答波形 »

技術フィルタ」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック


この記事へのトラックバック一覧です: 簡単一次IIRフィルタのインパルス応答波形:

« 時計のモータ | トップページ | 簡単一次IIRフィルタのステップ応答波形 »