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

2009年5月11日

17段移動平均フィルタのゲイン特性

昨日の続きで、17段移動平均フィルタ。

17段移動平均フィルタのゲイン特性を計算する。横軸は周波数[Hz]。1msサンプリングとしている。

縦軸は比率。他の移動平均と比較するために直流でのゲインを1に正規化している。

_17_20

以下は、横軸を拡大。

_17_20_

17回移動平均では、1000[Hz]/17=58.8[Hz]でゲインがゼロになる。

20回移動平均では、1000[Hz]/20=50[Hz]でゲインがゼロになる。

詳しく知りたい方は以下の記事参照。

周波数が異なる場合についての考察:

http://robotcontroller.cocolog-nifty.com/blog/2008/11/post-671a.html

ゲイン特性計算式のまとめ:

http://robotcontroller.cocolog-nifty.com/blog/2008/11/post-7dee.html

Link:

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

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

| | コメント (0)

2009年5月10日

60Hzを除去する1msサンプリング17段移動平均フィルタ

ひさびさに技術の話。

とあるテーマで、センサのアナログ信号を16ビットADカードでパソコンに取り込むことになった。

当然、WindowsリアルタイムIO制御「MOS Bench(モスベンチ)」でサポートされているCONTEC社16bitADカード「AD16-16U(PCI)EV」を使う。

Ad_2 

パラメータ設定で該当チャンネルを許可すれば、勝手に1msサンプリングをしてくれる。(上の画像の「アナログ入力チャネルの有効(1)無効(0)」の部分)

パラメータ設定で入力範囲を-10Vから+10Vの指定をすれば、16bitデータを[V]に変換してくれる。(上の画像の「アナログ入力チャネルの入力レンジの下限値-10.00、および、アナログ入力チャネルの入力レンジの上限値10.00」の部分)

また、パラメータ設定で移動平均回数を指定すれば、勝手に移動平均をしてくれて、平均後のデータを下図の画面表示しながら、ロギングデータファイルに12万行保存できる。 

1stage 

以下は、20回移動平均後の出力。この波形は、ロギングデータのcsvファイルをエクセルに読み込んで、編集したもの。

20

200ms間に12個の波がある。200ms/12=16.7ms。この逆数は、60Hz。ACラインのノイズが入っている。約2.5mVp-p。

1ms、すなわち1000Hzサンプリングなので、1000Hz/60Hz=16.7で、17回の移動平均をしてみる。

ちなみに、1000Hz/17=58.8Hz。

例によって、「MOS Bench」のパラメータ設定画面で、移動平均回数を17回に設定する。(下の画像の「アナログ入力チャネルのフィルタ段数」の部分)

17_2

以下は、17回移動平均後の出力。

ノイズの振幅は約1mVp-p。3LSBにわたって動いている。前述の波形に対して、1/2.5のノイズになった。

目標とする仕様から判断すれば、これで十分。

しかし、200ms間に5個の波がある。200ms/5=40ms。この逆数は、25Hz。

Photo

Link:

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

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

| | コメント (0)

2008年12月 3日

一次IIIRローパスフィルタの簡単実装まとめ

インパルス不変法で一次IIRローパスフィルタを設計して、

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

   (式8)

のフィルタ計算式を得た。

詳細の導出については、以下の記事を参照。

http://robotcontroller.cocolog-nifty.com/blog/2008/11/iir-8a20.html

このブロック図は、以下となる。

1stiir_const1

これを置き換えると、

1stiir_const2_2

となる。係数1-Aを右シフト演算で置き換えると

1stiir_const4_2   

となる。

この右シフト回数nと、時定数τ、最終値の関係を表に示す。この表では、サンプリング周期T=1msとしている。

Motion_oyaji_time_constant

例えば、右シフト回数が4回、したがって、1/2^4=1/16=1-Aのとき、時定数τは約15.5msとなる。

この係数のときのインパルス応答は、0に漸近しないで、15に落ち着いてしまうことに注意したい。これは1/16の整数演算で、15が桁落ちで後段に伝搬しないことによる。詳細は、以下の記事を参照されたい。

http://robotcontroller.cocolog-nifty.com/blog/2008/11/iir-ad59.html

また、右シフト回数が4回、1/16演算をすると、フィルタ出力の最終値が分母の値16になることにも注意したい。

上記表のエクセルはこちら

「motion_oyaji_time_constant_table.xls」をダウンロード

次に、サンプリング周期Tを変えたら、どのような時定数τが得られるか表に示す。

Motion_oyaji_time_constant_vart

右シフト回数n=4にて、サンプリング周期T=2msならば、時定数τ=31msになる。

エクセルのデータはこちら

「motion_oyaji_time_constant_table_varT.xls」をダウンロード

この表の時定数で満足できないときは、以下の計算ブロック図を試してみてほしい。つまり、B=1/8(右シフト3回)、C=1/16(右シフト4回)とすれば、中間の時定数が得られる。、

1stiir_const3_2

Link: 

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

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

| | コメント (0) | トラックバック (0)

2008年12月 2日

係数1/8の一次IIIRフィルタの周波数特性

先の記事に引きつづき、簡単1次IIRローパスフィルタの波形を示す。今回は、周波数特性。

ディジタルフィルタ計算式は、

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

    (式24)

サンプリング周期T=1msとしたとき、時定数は、約7msになります。

周波数特性の計算式導出方法について、知りたい方は、以下の記事を参照願います。

http://robotcontroller.cocolog-nifty.com/blog/2008/11/iirt1ms15ms-7ef.html

周波数特性のグラフは、以下になります。同じ時定数のアナログ一次ローパスフィルタのの周波数特性と比較しています。

振幅特性は似ているけれど、位相特性は違いますね。

■振幅特性(リニア周波数軸)

1_8_freq_linear_amp_comp_200

■振幅特性[dB](リニア周波数軸)

1_8_freq_linear_gain_comp_200

■位相特性[rad](リニア周波数軸)

1_8_freq_linear_phase_rad_comp_200

■位相特性[deg](リニア周波数軸)

1_8_freq_linear_phase_deg_comp_200

エクセルのファイルはこちら

「motion_oyaji_freq_IIIR1st_1_8_linear_comp_081123.xls」をダウンロード

つぎに周波数軸をlog軸にした波形も合わせて示します。

■振幅特性(log周波数軸)

1_8_freq_log_amp_comp

■振幅特性[dB](log周波数軸)

1_8_freq_log_gain_comp

■位相特性[rad](log周波数軸)

1_8_freq_log_phase_rad_comp

■位相特性[deg](log周波数軸)

1_8_freq_linear_phase_deg_comp_20_2

エクセルのデータはこちら

「motion_oyaji_freq_IIIR1st_1_8_log_comp_081123.xls」をダウンロード

Link: 

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

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

| | コメント (0) | トラックバック (0)

2008年12月 1日

係数1/8の一次IIIRフィルタの正弦波入力応答

先の記事に引きつづき、簡単1次IIRローパスフィルタの波形を示す。今回は、正弦波入力に対する応答波形。

ディジタルフィルタ計算式は、

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

    (式24)

時定数は、約7msになる。

以下に示す波形の横軸はサンプリングn。サンプリング周期T=1msなら、横軸は時間[ms]。ディジタルフィルタの入力x(nT)は振幅127の正弦波である。ディジタルフィルタ出力y(nT)とグラフ中で比較するディジタルフィルタ入力は、振幅127正弦波に対して、8倍の振幅、すなわち127*8=1016の振幅にしている。8倍の「8」は、「最終値の定理」によって求められる値である。最終値の定理については、以下の記事を参照してください。

http://robotcontroller.cocolog-nifty.com/blog/2008/11/iirt1ms15ms-820.html

■100ms周期の正弦波に対する出力(整数計算)

1_8_sin_100ms_integer

出力y(nT)の振幅は 918。入力との比は918 /(127*8) = 0.90になっている。

位相は7ms程度遅れているので、 7ms/100ms*360度 = 25度程度の遅れになっている。

■20ms周期の正弦波に対する出力(整数計算)

1_8_sin_20ms_integer

出力y(nT)の振幅は 396。入力との比は396 /(127*8) = 0.39になっている。

位相は約3.5ms程度遅れているので、 3.5ms/100ms*360度 = 63度程度の遅れになっている。

■10ms周期の正弦波に対する出力(整数計算)

1_8_sin_10ms_integer

出力y(nT)の振幅は 212。入力との比は212 /(127*8) = 0.21になっている。

位相は1.5ms程度遅れているので、 1.5ms/10ms*360度 = 54度程度の遅れになっている。

■5ms周期の正弦波に対する出力(整数計算)

1_8_sin_5ms_integer

出力y(nT)の振幅は 105。入力との比は105 /(127*8) = 0.10になっている。

位相は1.5ms程度遅れているので、 1.5ms/5ms*360度 = 108度程度の遅れになっている。

エクセルのデータはこちら

「motion_oyaji_IIR_1_8_time_sin_081128.zip」をダウンロード

Link: 

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

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

| | コメント (0) | トラックバック (0)

2008年11月30日

係数1/8の一次IIIRフィルタのステップ応答、インパルス応答

一次IIIRフィルタの簡単な実装の記事を続ける。以前の

http://robotcontroller.cocolog-nifty.com/blog/2008/11/iir-ecd2.html

の記事から

一次遅れのIIRフィルタの計算式は

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

となることがわかった。この式を変形すると

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

    (式9)

となる。ブロック図で書くと

1stiir_const2

となる。今までの記事では、係数{1-e^(-T/τ)}を

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

すなわち、右シフト演算4回として、実装した場合の各種波形グラフを見てきた。ディジタルフィルタの計算式は、

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

    (式11)

である。このとき、たとえばサンプリング周期T=1msとすると、時定数は約15msになる。

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

http://robotcontroller.cocolog-nifty.com/blog/2008/11/iir-ad59.html

◆ステップ応答の時間波形(整数計算)

http://robotcontroller.cocolog-nifty.com/blog/2008/11/iirt1ms15ms-820.html

◆正弦波入力応答の時間波形(整数計算)

http://robotcontroller.cocolog-nifty.com/blog/2008/11/iirt1ms15ms-c85.html

http://robotcontroller.cocolog-nifty.com/blog/2008/11/iirt1ms15ms2-ac.html

◆周波数応答(リニア周波数軸、整数計算)

http://robotcontroller.cocolog-nifty.com/blog/2008/11/iir-58eb.html

◆周波数応答(ログ周波数軸、整数計算)

http://robotcontroller.cocolog-nifty.com/blog/2008/11/iir-000f.html

今回は、時定数を変えてみよう。たとえばサンプリング周期T=1msのとき、時定数は約7msになるようにする。係数としては、1/16を1/8にする。右シフト3回で実装することを目論んでいる。

   {1-e^(-T/τ)} = 1/8

ディジタルフィルタの計算式は

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

    (式24)

となる。

正確な時定数τは

   e^(-T/τ) = 1-1/8 = -0.875

にて、サンプリング周期T=1msとすれば、時定数

  τ=7.488876[ms]

である。

さて、波形を示す。

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

127のステップ入力の場合の応答である。時定数τ=7.488876[ms]のアナログローパスフィルタの応答と比較している。横軸は、サンプリングn。サンプリング周期T=1msとすれば、横軸は時間[ms]。

1_8_impluse_integer

ディジタルフィルタ出力y(nT)の場合は、ゼロに近づかない。7で飽和する。途中の1/8で7が桁落ちでゼロになってしまい、演算結果に反映されず、残ってしまう。

■ステップ応答の時間波形(整数計算)

ディジタルフィルタは127のステップ入力を入れると、最終値は127*8=1016になる。最終値がなぜ8倍されるかというのは、「最終値の定理」から決まる。最終値の定理については、

http://robotcontroller.cocolog-nifty.com/blog/2008/11/iirt1ms15ms-820.html

の記事を参照。

グラフでは、1016のステップ入力のアナログ1次ローパスフィルタ出力と比較している。

1_8_step_integer

ほぼ同じになる。

エクセルデータはこちら

「motion_oyaji_IIR_1_8_time_step_081121.xls」をダウンロード

Link: 

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

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

| | コメント (0) | トラックバック (0)

2008年11月29日

簡単1次IIRフィルタに連続パルス入力入れた出力波形

超簡単な一次のIIRフィルタ

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

    (式11)

に連続したパルスを入力してみる。計算の簡単化のために、係数1/16を使用している。サンプリング周期T=1msの場合、時定数τは約15msになる。設計の詳細については、前の記事

http://robotcontroller.cocolog-nifty.com/blog/2008/11/iir-8a20.html

および、係数1/16の背景については、

http://robotcontroller.cocolog-nifty.com/blog/2008/11/iir-ad59.html

を参照してほしい。

さて、整数演算のため、途中の1/16で桁落ちするので、パルスは127の大きさのパルスを入力する。横軸はサンプリングn、サンプリング周期T=1msの場合は時間[ms]になる。

■40ms周期でパルスを入力した場合の出力y(nT)

40ms毎に1msの127の値が入力されるので、平均値127*1ms/40msに、最終値16を掛けた値と比較している。

最終値については、記事

http://robotcontroller.cocolog-nifty.com/blog/2008/11/iirt1ms15ms-820.html

の中ほどを参照してほしい。

1_16_conti_pluse_40ms_integer

■20ms周期でパルスを入力した場合の出力y(nT)

平均値127*1ms/20msに対して、最終値16を掛けた値と比較している。

1_16_conti_pluse_20ms_integer

■10ms周期でパルスを入力した場合の出力y(nT)

平均値127*1ms/10msに対して、最終値16を掛けた値と比較している。

1_16_conti_pluse_10ms_integer

■5ms周期でパルスを入力した場合の出力y(nT)

平均値127*1ms/5msに対して、最終値16を掛けた値と比較している。

1_16_conti_pluse_5ms_integer

出力y(nT)は、ローパスフィルタが効いて、連続パルス入力の平均値を得ていることがわかる。読者のみなさん、使えそうですか?

エクセルのデータはこちら

「motion_oyaji_IIR_1_16_time_conti_pulse_081121.xls」をダウンロード

Link: 

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

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

| | コメント (0) | トラックバック (0)

2008年11月26日

簡単一次IIRフィルタに±パルスを入力した応答波形

簡単一次IIRローパスフィルタに±パルスを入力した応答波形を調べてみよう。

モータ制御していて、位置制御でサーボロックをかけたとき、このような現象が起こる。

フィルタの計算式は

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

    (式11)

この式の背景は、

http://robotcontroller.cocolog-nifty.com/blog/2008/11/iir-8a20.html

および

http://robotcontroller.cocolog-nifty.com/blog/2008/11/iir-ecd2.html

の記事を参照してください。

整数演算で1/16を行っているため、桁落ちが発生する。この影響を小さくするために、+127、-127のパルスを入力している。

サンプリング周期T=1msの場合、時定数τは約15msになる。

■40ms毎、+127、-127のパルスを入力した場合の出力(整数演算)

横軸はサンプリング。サンプリング周期T=1msの場合、時間[ms]になる。

1_16_conti_pluse_both_40ms_integer

■80ms毎、+127、-127のパルスを入力した場合の出力(整数演算)

1_16_conti_pluse_both_80ms_integer

飽和している値は15。1/16の整数計算をしているので、15が1/16でゼロになってしまい、残ってしまう。詳細の記事は、インパルス応答の記事

http://robotcontroller.cocolog-nifty.com/blog/2008/11/iir-ad59.html

を参照してください。

エクセルのデータはこちら

「motion_oyaji_IIR_1_16_time_both_pulse_081121.xls」をダウンロード

Link: 

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

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

| | コメント (0) | トラックバック (0)

2008年11月25日

簡単一次IIRフィルタの周波数特性のグラフ(アナログフィルタとの比較) 2

先の記事で一次IIRローパスフィルタとアナログフィルタの周波数特性を比較した。横軸の周波数はリニアであった。

今回は、周波数をlog軸にしてみる。アナログフィルタの周波数特性に慣れている人は、横軸がlogのほうがわかりやすいと思う。

■ゲイン特性(1Hzから1000Hz)

1_16_freq_log_amp_comp

■ゲイン特性[dB](1Hzから1000Hz)

1_16_freq_log_gain_comp

■位相特性[rad](1Hzから1000Hz)

1_16_freq_log_phase_rad_comp

■位相特性[deg](1Hzから1000Hz)

1_16_freq_log_phase_deg_comp

エクセルのデータはこちら

「motion_oyaji_freq_IIIR1st_linear_comp_081123.xls」をダウンロード

Link: 

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

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

| | コメント (0) | トラックバック (0)

2008年11月24日

簡単一次IIRフィルタの周波数特性のグラフ(アナログフィルタとの比較)

先の記事で、インパルス不変法で設計した一次IIRローパスフィルタの振幅特性や位相特性のグラフを紹介した。

ディジタルフィルタの計算式は、

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

    (式11)

で、係数を1/16として、シフト演算を使えるようにしている。

サンプリング周期T=1msの場合、一次IIRフィルタの時定数は、15.4946[ms]となる。詳細は

http://robotcontroller.cocolog-nifty.com/blog/2008/11/iir-ad59.html

を参照。

今日は、そのグラフを同じ時定数のアナログローパスフィルタと比較してみる。さて、一次ローパスフィルタの伝達関数は、時定数をτ[s]として

              1

  G(s) = ------ (式20)

           1+sτ

s=jωを代入して、ωの関数にする。

              1   

G(jω) = -------

           1+jωτ

                1
       = -------------- * e^{jφ(ω)}   (式21)
         √ {1+(wτ)^2}

ここで、位相は

     φ(ω) = - arctan(wτ)     (式22)

絶対値の部分をとって、ゲインは、

                      1

     g(ω) = -----------   (式23)

             √ {1+(wτ)^2}

時定数τは、前述のように

     τ = 15.4946E-3

同じ時定数のアナログローパスフィルタの位相特性(式22)、ゲイン特性(式23)が得られたので、先の記事

http://robotcontroller.cocolog-nifty.com/blog/2008/11/iirt1ms15ms-7ef.html

で導出した一次IIRローパスフィルタの振幅特性や位相特性を比較してみる。

グラフは

・細かい部分がわかるように、0から200Hzのグラフ

・サンプリング周波数1000Hzまでがわかるように、0から1000Hzのグラフ

を示す。

■ゲイン特性(0から200Hz)

比較のため、ディジタルのゲイン特性を正規化して(直流でのゲインの値、16ですべてのゲイン値を割って)いる。

1_16_freq_linear_amp_comp_200_2

200Hzまでは、ほとんど差がない。

■ゲイン特性(0から1000Hz)

サンプリング周期T=1msとしているので、1000Hzはサンプリング周波数である。

1_16_freq_linear_amp_comp_1000_2

サンプリング周波数1000Hzの半分、500Hzからずれてくる。

■ゲイン特性[dB](0から200Hz)

次に縦軸をデシベル[dB]にしてみる。

1_16_freq_linear_gain_comp_200_2

■ゲイン特性[dB](0から1000Hz)

サンプリング周期T=1msとしているので、1000Hzはサンプリング周波数である。

1_16_freq_linear_gain_comp_1000_2

■位相特性[rad](0から200Hz)

次は、位相特性をみてみる。

1_16_freq_linear_phase_rad_comp_2_2

20Hzくらいまでおなじ。ディジタルはアナログより、位相が遅れない。

■位相特性[rad](0から1000Hz)

サンプリング周期T=1msとしているので、1000Hzはサンプリング周波数である。

1_16_freq_linear_phase_rad_comp_1_2

■位相特性[deg](0から200Hz)

次に縦軸を度[deg]にしてみる。

1_16_freq_linear_phase_deg_comp_2_3

■位相特性[deg](0から1000Hz)

サンプリング周期T=1msとしているので、1000Hzはサンプリング周波数である。

1_16_freq_linear_phase_deg_comp_1_2

エクセルのデータはこちら

「motion_oyaji_freq_IIIR1st_linear_comp_081123.xls」をダウンロード

Link: 

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

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

| | コメント (0) | トラックバック (0)

2008年11月23日

簡単一次IIRフィルタの周波数特性のグラフ

今日は、一次のIIRフィルタの周波数特性のグラフを示す。

ゲイン特性の計算式は、先の記事より

                                   1

  g(ω)  = -----------------------------

            √ { (1-AcosωT)^2 +(AsinωT)^2}

     (式18)

位相特性の計算式は、先の記事より

 φ(ω) =  - arctan ( AsinωT / 1-AcosωT)  [rad]

     (式19)

ここで、

  A = e^(-T/τ)         (式13)

Tはサンプリング周期、τは時定数。

以下のグラフでは、

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

としてあります。

http://robotcontroller.cocolog-nifty.com/blog/2008/11/iir-ad59.html

の記事の

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

を意味しています。

ここで、サンプリング周期T=1msとすれば、時定数τは約15msとなります。

■ゲイン特性

周波数が上がるとゲインが小さくなります。周波数が高い正弦波をこのフィルタに入れると、出力波形の振幅が小さくなります。ローパスフィルタを設計したのだから、当然ですね。実際の入力の正弦波と出力の正弦波については、先の記事

http://robotcontroller.cocolog-nifty.com/blog/2008/11/iirt1ms15ms-c85.html

を見てください。

1_16_freq_linear_amp

■ゲイン特性 [dB]

デシベル[dB]に直しました。

1_16_freq_linear_gain

■位相特性 [rad]

1_16_freq_linear_phase_rad

周波数が上がると位相が次第に遅れます。しかし、さらに周波数が上がると位相遅れが小さくなります。おもしろいですね。

■位相特性 [deg]

度で計算しました。

1_16_freq_linear_phase_deg

エクセルのデータは、こちら

「motion_oyaji_freq_IIIR1st_linear_081123.xls」をダウンロード

今回、サンプリング周期T=1msとして、時定数τが約15msになっていますが、

サンプリング周期を長くして、T=10msとすれば、時定数τが約150msとなります。周波数特性のグラフは同じ形になりますが、横軸の周波数最大値は200Hzを20Hzとして考えてください。

逆にサンプリング周期を短くして、T=0.1msとすれば、時定数τが約1.5msとなります。周波数特性のグラフは同じ形になりますが、横軸の周波数最大値は200Hzを2000Hzとして考えてください。

今回のディジタルフィルタの計算式は、

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

    (式11)

です。乗算器や浮動小数点演算を使用しないで、シフト演算だけで一次IIRフィルタを実現しました。これなら、安いマイコンやVHDL、verilogで実現できますよね。

これから、今回のサンプリング周期T=1ms、時定数τ約15ms以外についても考えていきます。

Link: 

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

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

| | コメント (0) | トラックバック (0)

2008年11月22日

簡単一次IIRフィルタの周波数特性の計算式

さて、今回は、インパルス不変法で設計した一次のIIRローパスフィルタの周波数特性計算式を導きます。

本のディジタルフィルタの計算式は、先の記事

http://robotcontroller.cocolog-nifty.com/blog/2008/11/iir-ecd2.html

から

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

    (式9)

である。この式において、サンプリング周期T=1ms、時定数τを約15msとおいて、各種の入力波形に対して、出力波形を計算した。

インパルス入力に対する出力波形

http://robotcontroller.cocolog-nifty.com/blog/2008/11/iir-ad59.html

ステップ入力に対する出力波形

http://robotcontroller.cocolog-nifty.com/blog/2008/11/iirt1ms15ms-820.html

正弦波入力に対する出力波形

http://robotcontroller.cocolog-nifty.com/blog/2008/11/iirt1ms15ms-c85.html

を計算してきた。

さて、(式9)の伝達関数は、先の記事

http://robotcontroller.cocolog-nifty.com/blog/2008/11/iir-8a20.html

から

                1   

 G(z)=------------------  (式5)

         1-e^(-T/τ)*z^(-1)

この式において、z=e^(jωT)、あるいは 、z^(-1)=e^(-jωT)を代入すると、ωTに関わる式

                              1   

 G{e^(jωT)} = ------------------  (式10)

                   1-e^(-T/τ)*e^(-jωT)

が得られる。オイラーの公式

  e^(-jθ) = cosθ - j * sinθ      (式11)

より、

  e^(-jωT) = cos(ωT) - j * sin(ωT)

であるから、

                              1   

 G{e^(jωT)} = ------------------------- 

                1-A*{ cos(ωT) - j * sin(ωT) }

     (式12)

ここで、

  A = e^(-T/τ)         (式13)

と置いた。さらに、分母の実数部と虚数部(jの付いている項)を分けて

                              1   

 G{e^(jωT)} = ------------------------- 

                1-A*cos(ωT) + j *A*sin(ωT)

     (式14)

となる。分母の

    実数部 + j 虚数部

の形を

    絶対値*e^(j位相)

の形に直す。この形を

    Abs * e^(j *Angle)

と置けば

    Abs = √ { (実数部^2) + (虚数部^2) }

    Angle = arctan ( 虚数部 / 実数部 )  [rad]

で得られる。(式14)の分母は

    実数部 = 1-A*cos(ωT)

    虚数部 = A*sin(ωT)

なので

    Abs = √ { (1-AcosωT)^2 +(AsinωT)^2}

       (式15)

         Angle = arctan ( AsinωT / 1-AcosωT)  [rad]

       (式16)

となる。

     1               1

  --------------   =  --- * e^{j(-Angle)}

  Abs * e^(j *Angle)    Abs

なので、(式14)は、

                     1   

 G{e^(jωT)} = --- *  e^{j(-Angle)}

                 Abs

     (式17)

となる。周波数特性のゲイン特性(振幅特性)は、(式17)の絶対値の部分から

              1

  g(ω) = ----

            Abs

                                   1

        = -----------------------------

           √ { (1-AcosωT)^2 +(AsinωT)^2}

     (式18)

デシベル[dB]表示にしたいときは、

   20 * log 10 | g(ω) |    [dB]

を計算する。

次に、位相特性は、(式17)の位相の部分から

 φ(ω) = -Angle

     =  - arctan { AsinωT / (1-AcosωT) }  [rad]

     (式19)

度[deg]の表示にしたいときは

   φ(ω) / (2π) * 360   [deg]

を計算する。

ただし、

  A = e^(-T/τ)         (式13)

次の記事では、周波数特性(ゲイン特性、位相特性)を計算してみよう。

Link: 

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

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

| | コメント (0) | トラックバック (0)

2008年11月21日

簡単一次IIRフィルタの正弦波入力応答波形2

昨日の続きで、一次IIRローパスフィルタに正弦波を入力して、その入力と出力の比較波形をしめす。ディジタルフィルタの計算式は、

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

    (式11)

横軸はサンプリングn、サンプリング周期T=1msなら、時間[ms]となる。サンプリング周期T=1msのとき、時定数が約15msのローパスフィルタになる。細かい条件は、昨日の記事を見てください。

■周期20msの正弦波入力に対する出力(実数演算)

1_16_sin_20ms_real_number

■周期20msの正弦波入力に対する出力(整数演算)

1_16_sin_20ms_integer

出力振幅は2032の期待に対して、408くらいであり、約1/5になっている。また、位相は4msほど遅れている。周期20msに対して、位相遅れを計算すると、4ms/20ms*360°=72°程度になる。

後日、アップロード予定のゲイン特性の50Hz(周期20ms)計算値は、0.20であり、上記の約1/5と一致している。位相特性の50Hz計算値は、-69°で、上記の72°程度と一致している。

■周期10msの正弦波入力に対する出力(実数演算)

1_16_sin_10ms_real_number

■周期10msの正弦波入力に対する出力(整数演算)

1_16_sin_10ms_integer

振幅は2032の期待に対して、313くらいであり、約0.15倍になっている。位相は2msほど遅れている。周期10msに対して、位相遅れを計算すると、2ms/10ms*360°=72°程度になる。

後日、アップロード予定のゲイン特性の100Hz(周期10ms)計算値は、0.10であり、上記の約0.15と一致している。周期が短くなって、波形が粗くなってくるので、これくらいの誤差はある。位相特性の100Hz計算値は、-66°で、上記の72°程度と一致している。

■周期5msの正弦波入力に対する出力(実数演算)

1_16_sin_5ms_real_number

■周期5msの正弦波入力に対する出力(整数演算)

1_16_sin_5ms_integer

周期5msなので、1周期内に5サンプリングしかない状態で、非常に粗い波形になっている。

振幅は2032の期待に対して、104くらいであり、約0.05倍になっている。位相は0.5msほど遅れている。周期5msに対して、位相遅れを計算すると、0.5ms/5ms*360°=36°程度になる。

後日、アップロード予定のゲイン特性の200Hz(周期5ms)計算値は、0.055であり、上記の約0.05倍と一致している。位相特性の200Hz計算値は、-51°で、上記の36°程度に近い。

エクセルの計算データは、こちら

「motion_oyaji_IIR_1_16_time_sin_081119.zip」をダウンロード

圧縮してあります。

Link: 

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

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

| | コメント (0) | トラックバック (0)

2008年11月20日

簡単一次IIRフィルタの正弦波入力応答波形

最近の記事では、一次のIIRフィルタで簡単なローパスフィルタを設計している。計算式は、しばらく前の記事から、

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

    (式9)

である。計算の簡単化のために、係数1/16を使用して、時定数τは約15msである。

インパルス応答、ステップ応答は、先の記事で計算してみた。

今回は、正弦波入力x(nT)を入れた応答出力y(nT)を計算する。いずれも、サンプリング周期T=1ms、横軸は時間[ms]である。実数演算と整数演算を比較して示す。整数演算の場合の正弦波振幅は127として、整数に丸めた入力を使用している。同様に整数演算1/16の出力も整数に丸めている。また、いずれの波形においても、入力を16倍にした出力(理想波形出力)と比較している。16倍の16は、先の記事で書いたように最終値の定理で求められる。

■周期1000msの正弦波入力に対する出力(実数演算)

1_16_sin_1000ms_real_number

■周期1000msの正弦波入力に対する出力(整数演算)

1_16_sin_1000ms_integer

時定数15msのローパスフィルタに対して、1000ms周期を正弦波を入力した場合、出力の振幅、位相ともに入力に対して大きな変化がない。

実数計算、整数計算の大きな差もない。

差異の詳細については、追ってアップロードするエクセルファイルを見てください。

■周期100msの正弦波入力に対する出力(実数演算)

1_16_sin_100ms_real_number

■周期100msの正弦波入力に対する出力(整数演算)

1_16_sin_100ms_integer_3   

出力振幅は2032の期待に対して、実際は1454であり、約0.721になっている。位相は12msほど遅れている。周期100msに対して、位相遅れを計算すると、12ms/100ms*360°=43°程度になる。

後日、アップロード予定のゲイン特性の10Hz(周期100ms)計算値は、0.717であり、上記の約0.721と一致している。また、位相特性の100Hz計算値は、-42°で、上記の43°程度と一致している。

別の周波数の正弦波入力に対する出力波形は、次の記事で。

Link: 

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

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

| | コメント (0) | トラックバック (0)

2008年11月18日

簡単一次IIRフィルタのステップ応答波形

まず、おさらい。

1次にIIRフィルタで、サンプリング周期T=1ms、時定数τ=15ms程度のローパスフィルタを実装しようとしている。

計算式は、さきの記事より、

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

    (式11)

インパルス応答を先の記事で計算したので、今日は、ステップ応答を計算してみよう。

ステップ応答とは、たとえると、スイッチが入ったような応答である。いままでゼロだったのに、突然ある値が入力されたら、どのような出力が出てくるかという波形である。

■ステップ応答(実数計算)

まず、入力x(nT)は、ずっと1。式にすると、

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

これを入力として、(式11)のディジタルフィルタ出力y(nT)を計算すると16に近づく。

 y(nT) → 16

この値は、最終値の定理として知られている計算式からも得られる。

フィルタの伝達関数をG(z)として、値が1のステップ入力を入力したとき、出力y(nT)の最終値は、

                      z

 lim{y(nT)} = lim (z-1) * G(z) *----

  n->∞        z->1               z-1

       = lim z*G(z)

                  z->1      

今計算しているディジタルフィルタの伝達関数は、先の記事の(式5)

http://robotcontroller.cocolog-nifty.com/blog/2008/11/iir-8a20.html

より

                1   

 G(z)=------------------

         1-e^(-T/τ)*z^(-1)

である。これを代入して、y(nT)の最終値は

                                     z

 lim{y(nT)} = lim ------------------------

  n->∞       z->1      1-e^(-T/τ)*z^(-1)

                    1

              = -------

                 1-e^(-T/τ)

先の記事で、簡単な演算を目論んで

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

と置いたので、y(nT)の最終値は、16となる。

グラフの比較波形として、アナログ波形を載せるが、最終値を一致させて比較しやすくするために、値16のステップ入力を入れたアナログ1次ローパスフィルタ出力波形

   y(t) = 16 * {1-e^(-t/15.4946E-3)}

を示している。15.4946E-3は、ディジタルフィルタ設計式から得られた時定数である。約15ms。

1_16_step_real_number

■ステップ応答(整数計算)

計算の途中、1/16で桁落ちするので、x(nT)として、127を入力している。式としては、

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

最終値は、127の入力に変わったので、127*16=2032である。

比較用のアナログ波形は、最終値を合わせるために

   y(t) = 127 * 16 * {1-e^(-t/15.4946E-3)}

を示している。

1_16_step_integer

おおむね同じ波形になる。横軸はサンプリング、T=1msの場合は、時間[ms]。

差異に興味ある方は、エクセルのデータをみてね。データはこちら、

「motion_oyaji_IIR_1_16_time_step_081116.xls」をダウンロード

Photo最終値の定理は、例えば、

横山、佐川、貴家の訳;「ディジタル制御システム 解析と設計」、日刊工業新聞社、1990年、33ページ

に載っている。

Link: 

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

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

| | コメント (0) | トラックバック (0)

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制御)

| | コメント (0) | トラックバック (0)

2008年11月15日

1次IIRフィルタの簡単お手軽な実装

前の記事のおさらいから。

一次遅れのIIRフィルタの計算式は

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

となることがわかった。さて、係数のe^(-T/τ)は、どんな値になるだろうか?たとえば、サンプリング周期T=1ms、設計したいフィルタの時定数τ=10msとすると、e^(-0.1)=0.904837となる。

0.904837をどのように扱うか?

ためしに、この値を1から引いてみよう。

 1 - 0.904837 = 0.095163

約1/10.5。1/16としてしまえば、右シフト演算4回で行ける。割り算よりシフト演算なら格段に速い。VHDLやVerilogでも簡単に記述実装できる。

そうか!

係数をe^(-T/τ)ではなくて、1-e^(-T/τ)の形になるようにすれば簡単な演算になるのだ。(式8)を係数1-e^(-T/τ)になるよう変形してみる。

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

    (式9)

これをブロック図に書くと、

1stiir_const2

実装例、入出力時間波形、周波数特性については、次回以降で説明します。お楽しみに!

Link: 

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

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

| | コメント (0) | トラックバック (0)

2008年11月14日

インパルス不変法による一次IIRフィルタ設計(基本、初歩)

さて、FIRフィルタの次は、IIRフィルタを設計してみる。

 FIR(Finite Impulse Response)フィルタ。有限インパルス応答フィルタ。

 IIR(Infinite Impulse Response)フィルタ。無限インパルス応答フィルタ。

例えば、IIRフィルタの入力に1サンプリングだけ1、その次からずっと0を入力した場合、IIRフィルタ出力は小さな値になっていくが無限に続く。その波形を示す。一次遅れの例である。

Iir

これがIIR(無限のインパルス応答)なる名前のゆえん。

さて、IIRフィルタ設計法にもいろいろあるが、わかりやすい「インパルス不変法」で一次遅れフィルタを設計してみる。

「インパルス不変法」というのは、アナログフィルタ入力に細いパルスを入れた場合のアナログフィルタ出力と上記のように、最初のみ1で、次からずっと0のデータを入力したIIRフィルタ出力波形とを一致させようという方法である。

例えば、アナログフィルタが一次遅れでその入力に細いパルスを入れた時の出力が上記波形のように、指数関数的で減少し、その時定数がτ[s]であるとすれば、出力波形は以下の式になる。

 g(t) = e^(-t/τ)  ( t>=0 )                (式1)

この波形をT[s]ごと、サンプリングした場合、g(t)の値は、上式にt=0, t=T, t=2T, t=3T,,,を代入して、その値は

 1, e^(-T/τ),  e^(-2T/τ), e^(-3T/τ) , , ,

と変化していく。 一般には

 g(nT) = e^(-nT/τ)  ; n=0,1,2,,,  (式2)

と表現できる。(式2)のz変換する。右辺は、1サンプリング遅れるごとにその値にz-1をかけて、その総和を求める。数列のz変換は級数になる。左辺は単純にG(z)とおく。

 G(z) = 1 + e^(-T/τ)*z(-1) + e^(-2T/τ)*z^(-2) + e^(-3T/τ)*z^(-3) + ,,,

     (式3)

これは、公比e^(-T/τ)*z(-1)の等比級数である。(式3)の両辺にe^(-T/τ)*z(-1)をかける。

 G(z)*e^(-T/τ)*z(-1) =

  e^(-T/τ)*z(-1) + e^(-2T/τ)*z^(-2) + e^(-3T/τ)*z^(-3) + ,,,

     (式4)

(式3)の両辺から(式4)の両辺を引くと

 G(z) - G(z)*e^(-T/τ)*z(-1) = 1

G(z)について整理して

         1

 G(z) = -----------------  (式5)

        1 -  e^(-T/τ)*z(-1)

これが、時定数τの一次遅れになるIIRフィルタである。

G(z) = Y(z) / X(z) を代入して、フィルタ入力X(z)とフィルタ出力Y(z)の関係式に変形する。

 Y(z)        1

 --- = -----------------  (式6)

 X(z)       1 -  e^(-T/τ)*z(-1)

これをY(z)=の形に変形すると、

 Y(z) = X(z) + e^(-T/τ)*Y(z)*z(-1) (式7)

これを逆z変換して、実時間の式へ戻す。Y(z) => y(nT) , X(z) => x(nT) , Y(z)*z^(-1) => Y{(n-1)T}と代入して、

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

この計算式で一次遅れのIIRフィルタができる。ブロック図は、

 1stiir_const1

図としては簡単だが、Aの値が1と0.9の間の値になる。実際に、T=1msとして、時定数τ=10msとすると、e^(-0.1)=0.904837となる。これを浮動小数点演算ユニット(FPU)や乗算器(かけ算を行うハードウェア)がない安い16ビットマイコンや32ビットマイコン、あるいはディジタル回路用ハードウェア記述言語のVHDLやverilogでどのように実装したらよいのか、工夫が必要。工夫については、次の記事で。

Link: 

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

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

| | コメント (0) | トラックバック (0)

2008年11月13日

移動平均フィルタによる振動時の速度検出フィルタ効果(周波数検出フィルタ)

モータの軸が振動しているとき、すなわち、ロータリーエンコーダを入力がアップダウンするときの移動平均フィルタによる速度検出フィルタの動きをみてみたい。

・周期40msで、±1の振動をしている場合

40ms

・周期20msで、±1の振動をしている場合

20ms

いずれの周期の振動も、振幅が小さく、入力データx(nT)の値が小さい領域での移動平均フィルタ動作なので、入力x(nT)と移動平均フィルタ出力y(nT)の明確な差異がわからない。

エクセルのデータはこちら「10081112.xls」をダウンロード

シミュレーションのブロック図は、こちら

http://robotcontroller.cocolog-nifty.com/blog/2008/11/post-8678.html

Link: 

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

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

| | コメント (0) | トラックバック (0)

2008年11月12日

移動平均フィルタによる速度検出フィルタ(周波数検出フィルタ)

今回は、移動平均フィルタへの入力を変えてみる。いままでの記事では、正弦波入力波形を示してきた。今回は、周波数検出、速度検出を意識して、パルスを入力してみる。

Photo

一定周波数のパルスをカウントして、一定周期T毎、その差分を取る(引き算をする)。

  x(n) = c(nT) - c{(n-1)T}

これは、周波数検出になる。もし、そのパルス発生源がロータリエンコーダやリニアスケールならば、速度検出になる。このカウンタの差分データを10回移動平均に入力してみる。

サンプリング周期T=1ms、すなわち、サンプリング周波数1000Hzとして、いろいろな周波数を入力し、10回移動平均入力のx(nT)と、移動平均出力のy(nT)を以下に比較する。横軸は時間[ms]、縦軸はx(nT)もしくはy(nT)。

・10010Hzのパルス入力に対するx(nT)とy(nT)

入力x(nT)、出力y(nT)ともの1のずれがある。入力x(nT)では平均10に対して1、出力y(nT)では平均100に対して1、なので、フィルタを通したことによりS/N比(信号とノイズの比)が10倍改善されている。

10010hz

・1010Hzのパルス入力に対するx(nT)とy(nT)

入力x(nT)、出力y(nT)ともの1パルスのずれがある。入力x(nT)では平均1に対して1、出力y(nT)では平均10に対して1、なので、フィルタを通したことによりS/N比(信号とノイズの比)が10倍改善されている。

1010hz

・110Hzのパルス入力に対するx(nT)とy(nT)

入力x(nT)、出力y(nT)ともの1パルスのずれがある。入力x(nT)では0に対してたまに1、出力y(nT)では1に対してたまに1、なので、フィルタを通したことによりS/N比(信号とノイズの比)が改善されている。

110hz

・11Hzのパルス入力に対するx(nT)とy(nT)

入力x(nT)、出力y(nT)ともの1パルスのずれがある。入力x(nT)では0に対してたまに1、出力y(nT)では0に対してたまに1、なので、フィルタを通したことによりS/N比(信号とノイズの比)改善効果は、ない。

11hz

・まとめ

”10回”移動平均にすると、サンプリング周波数1000Hzに対して、その”1/10”の100Hzくらいまで、ノイズ改善の効果がある。”1/100”の10Hz前後になると、効果がない。

エクセルの元データはこちら「10081111.xls」をダウンロード

本記事では、定速時の動作について計算した。+1、-1、+1と振動している場合の動作については、次の記事で。

Link: 

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

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

| | コメント (0) | トラックバック (0)

2008年11月11日

移動平均フィルタ段数増加のメリット、デメリット

移動平均回数をどのように決めたらよいか?

移動平均回数を増やすメリット: 

  データの分解能が増える。

  シャープなローパスフィルタが得られる。

移動平均回数を増やすデメリット: 

  高い周波数の信号(速い動き)を検出できない。

  演算回数が増える。

  必要メモリが増える。

  位相特性が遅れる。(動きが遅れて検出される)。

どのように段数決めるか?

  答えは、バランスですな!

「答えになってない!」と言われそうですが、、、

IIRフィルタについても、別の機会に説明していく予定。期待してね!

Link: 

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

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

| | コメント (0) | トラックバック (0)

2008年11月10日

単純移動平均フィルタ位相特性 まとめ 比較

単純移動平均フィルタ位相特性について、移動平均回数をパラメータとしてまとめる。先の記事の周波数特性の式から、位相部分、すなわち、e^(jφ)の形のφの部分を取り出す。

・2回平均

  φ(ω) = - ωT / 2

・4回平均

  φ(ω) = - ωT 3 / 2

・8回平均

  φ(ω) = - ωT 7 / 2

・10回平均

  φ(ω) = - ωT 9 / 2

これをグラフにして比較する。サンプリング周期T=1msとしている。横軸は、周波数[Hz]。縦軸は[rad]である。

_rad

次に、縦軸を[deg]にした位相特性グラフを示す。上のグラフの縦軸に対して、*360/2πを行っている。横軸は同じように周波数[Hz]。サンプリング周期Tは1ms、すなわち、サンプリング周波数は1000Hzである。

_deg

サンプリング周波数が2倍の2000Hzになる場合は、上図横軸右端の500Hzを1000Hzに置き換えてほしい。逆に、サンプリング周波数が1/2の500Hzになる場合は、上図横軸右端の500Hzを250Hzに置き換える。

エクセルの元データは、こちら「motion_oyaji_freq_MA_Conc_Phase_081107.xls」をダウンロード

移動平均段数増加のメリット、デメリットについては、別の記事で。

Link: 

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

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

| | コメント (0) | トラックバック (0)

2008年11月 9日

単純移動平均処理振幅特性(ゲイン特性) まとめ 比較

単純移動平均ゲイン特性のまとめ

先の記事の周波数特性の式から、振幅の部分を取り出して

・2回平均

  g(ω) = | 2* cos(ωT/2) |

・4回平均

        | sin(2ωT) |

  g(ω) = ------------

                | sin(ωT/2) |

・8回平均

        | sin(4ωT) |

  g(ω) = -----------

               | sin(ωT/2) |

・10回平均

        | sin(5ωT) |

  g(ω) = ----------

              | sin(ωT/2) |

これをグラフにする。サンプリング周期T=1msとしている。横軸は周波数[Hz]。

_

2回平均は、周波数ゼロ、すなわち、直流にて、ゲインは2となる。4回平均は、4。8回平均は、8。10回平均は10。直流でのゲインを1になるように規格化して、比較しやすくする。つまり、2回平均のゲイン特性は、2で割る。4回平均のゲイン特性は、4で割る。他も同様。

規格化したグラフは、

__2

サンプリング周期T=1ms、すなわちサンプリング周波数は1000Hzである。このとき、

2回平均の場合は、サンプリング周波数の1/2の500Hzでゲインゼロ

4回平均の場合は、サンプリング周波数の1/4の250Hzでゲインゼロ

8回平均の場合は、サンプリング周波数の1/8の125Hzでゲインゼロ

10回平均の場合は、サンプリング周波数の1/10の100Hzでゲインゼロ

となる。

例えば、他のサンプリング周波数で、2000Hzにしたら、同様に

2回平均の場合は、サンプリング周波数の1/2の1000Hzでゲインゼロ

4回平均の場合は、サンプリング周波数の1/4の500Hzでゲインゼロ

8回平均の場合は、サンプリング周波数の1/8の250Hzでゲインゼロ

10回平均の場合は、サンプリング周波数の1/10の200Hzでゲインゼロ

となる。1/nも同様。

次に、縦軸の振幅をdB(デシベル)単位にする。つまり、上記グラフの縦軸の10底のlogをとって、20をかける。すると

_db

横軸は、周波数[Hz]。サンプリング周期は1ms。平均回数を増やしたほうが、シャープなローパスフィルタになる。

エクセルの元データはこちら「motion_oyaji_freq_MA_Conc_Amp_081107.xls」をダウンロード

Link: 

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

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

| | コメント (0) | トラックバック (0)

2008年11月 8日

単純移動平均フィルタ周波数特性 まとめ 比較

単純移動平均周波数特性のまとめ

先の記事の伝達関数G(z)のzにz=e^(jωT)を代入して、オイラーの公式を利用して、式を整理する。

・2回平均

  G(ωT) = 2* cos(ωT/2) * e^(-jωT/2)

・4回平均

         sin(2ωT)

  G(ωT) = --------- * e^(-jωT3/2)

                  sin(ωT/2)

・8回平均

         sin(4ωT)

  G(ωT) = --------- * e^(-jωT7/2)

                  sin(ωT/2)

・10回平均

         sin(5ωT)

  G(ωT) = --------- * e^(-jωT9/2)

                  sin(ωT/2)

一般の形のn回平均もわかるよね!

2回移動平均のオイラーの公式を使った変形については、こちらを参照

http://robotcontroller.cocolog-nifty.com/blog/2008/10/post-0e41.html

4回移動平均のオイラーの公式を使った変形については、こちらを参照

http://robotcontroller.cocolog-nifty.com/blog/2008/10/post-2781.html

Link: 

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

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

| | コメント (0) | トラックバック (0)

2008年11月 7日

単純移動平均フィルタ伝達関数 まとめ 比較

単純移動平均の伝達関数のまとめ

移動平均にはローパスフィルタ(LPF)の役目の他に、分解能を増やすという機能もある。そのため、よく使う、情報を1ビット増やすための2回平均、情報を2ビット増やすための4回平均、情報を3ビット増やすための8回平均、情報を10倍にする10回平均について、まとめる。それ以外の平均回数については、本ブログ記事から推測できますよね!

・2回平均

  G(z) = 1 + z^(-1)

・4回平均

              1 - z^(-4)

   G(z) = ----------

              1 - z^(-1)

・8回平均

              1 - z^(-8)

   G(z) = ----------

              1 - z^(-1)

・10回平均

              1 - z^(-10)

   G(z) = ----------

              1 - z^(-1)

単純2回移動平均の伝達関数の求め方はこちら

http://robotcontroller.cocolog-nifty.com/blog/2008/10/post-0e41.html

単純4回移動平均の伝達関数の求め方はこちら

http://robotcontroller.cocolog-nifty.com/blog/2008/10/post-2781.html

Link: 

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

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

| | コメント (0) | トラックバック (0)

2008年11月 6日

単純移動平均の時間波形(4回平均)

Photo

1000Hzサンプリング(制御周期1ms)の4回移動平均フィルタに100Hz,200Hz,250のsin波を入力した場合の、

入力x(nT)、出力y(nT)、内部状態のx{(n-1)T}、x{(n-2)T}、x{(n-3)T}を示す。横軸の単位はms。

x(nT)を正弦波として、

  y(nT) = x(nT) + x{(n-1)T}  + x{(n-2)T}  + x{(n-3)T}          

を計算したグラフである。

サンプリング周波数1000Hzの1/10の100Hzの正弦波を4回移動平均フィルタへ入力すると、出力振幅が入力の約3倍になる。

サンプリング周波数1000Hzの1/5の200Hzでは、出力振幅が入力の約1倍。

サンプリング周波数1000Hzの1/4の250Hzでは、出力はゼロ。フィルタリングされる。

たとえば、サンプリング周波数が2倍の2000Hz(制御周期500us)のとき、やはり、サンプリング周波数2000Hzの”1/4”の500Hzでは、出力がゼロになる。

読者のみなさんのシステムのサンプリング周波数が1000Hzのn倍だったら、特性はn倍の周波数に拡大されると考えてください。1/nでも同様。

”2回”移動平均の場合は、サンプリング周波数の”1/2”の周波数の正弦波を入力すると出力がゼロ。

”4回”移動平均の場合は、サンプリング周波数の”1/4”の周波数の正弦波を入力すると出力がゼロ。

エクセルの元データはこちら「motion_oyaji_wave_MA4_081029.xls」をダウンロード 

”2回”移動平均の時間波形はこちらhttp://robotcontroller.cocolog-nifty.com/blog/2008/10/post-1979.html

Link: 

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

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

| | コメント (0) | トラックバック (0)

2008年10月31日

単純移動平均フィルタのゲイン特性と位相特性(4回平均)

前の記事のおさらいから。

単純4回移動平均の周波数特性は、下式であることがわかった。

                 sin(2ωT) 

       G{e^(jωT)} = -------- * e^(-jωT3/2)   (式7)

            sin(ωT/2)

この式の振幅部分(e^以外の部分)を切りだして、絶対値にして、ゲイン特性(振幅特性)は、

            |sin (2ωT)|  

   g(ω) = -------------   (式8)

            |sin (ωT/2)|  

ω=0のときは、右辺は0/0になるので、その時の値は、分子と分母を各ωで微分して、ω=0を代入して

           2T * cos(2ωT)

  lim     ----------------  = 4 (式9)

  ω→0   T/2 * cos(ωT/2) 

になる。

Photo 詳細は、森口、宇田川、一松:「数学公式Ⅰ-微分積分・平面曲線-」、岩波全書、42ページ(1981年17刷)を参照してください。いまは、新しい版になっています。

あるいは、公式

    sin4θ = 8sinθ(cosθ)^3 - 4sinθcosθ (式10)

を(式8)の分子に用いて、ゲイン特性を

    g(ω)  = 8 * {cos(ωT/2)}^3 - 4 * cos(ωT/2) (式11)

としてもよい。

Photo 上述のsin4θの公式は、森口、宇田川、一松:「数学公式Ⅱ-級数・フーリエ解析-」、岩波全書、186ページ(1979年17刷)を参照してください。いまは、新しい版になっています。

位相特性は、(式7)の位相部を切りだして

  φ(ω) = - 3ωT/2  (式12)

具体的な例として、サンプリング周期1000Hz(制御周期1ms)、横軸周波数のグラフにする。グラフからサンプリング周期の1/4の250Hzでゲインがゼロ、つまり、250Hzの正弦波信号は出力に現れない。フィルタリングされる。サンプリング周期の1/10の100Hzの正弦波信号は入力の約3倍になって、出力現れる。0Hz、すなわち、直流は、4倍になって現れる。

Photo

Photo_2

エクセルの元データはこちら 「motion_oyaji_freq_MA4_081029.xls」をダウンロード

Link: 

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

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

| | コメント (0) | トラックバック (0)

2008年10月30日

単純移動平均周波数特性(4回平均)

Photo_2

次は、4回の単純移動平均をしてみよう。

■図の入出力関係は

   y(nT) = x(nT) + x{(n-1)T} + x{(n-2)T} + x{(n-3)T}      (式1)

■伝達関数を求める。(式1)の両辺をまずZ変換する。y(nT) => Y(z) , x(nT) => X(z) , x{(n-1)T)} => X(z)*z^(-1) ,  x{(n-2)T)} => X(z)*z^(-2) , x{(n-3)T)} => X(z)*z^(-3)と置き換える。すると

   Y(z) = X(z) + X(Z)*z^(-1) + X(Z)*z^(-2) + X(Z)*z^(-3)

            = X(z) * { 1 + z^(-1) + z ^(-2) + z^(-3) }

次に出力Y(z)とX(z)の比の形に変形する。

   Y(z)/X(z) =   1 + z^(-1) + z ^(-2) + z^(-3)                (式2)

これが伝達関数である。簡単のため、Y(z) / X(z) = G(z)とおくと、

   G(z) =   1 + z^(-1) + z ^(-2) + z^(-3)                   (式3)

これは、等比級数である。これをまとまった形に変形する。(式3)の両辺にz^(-1)をかけると、

   G(z)*z^(-1) =    z^(-1) + z ^(-2) + z^(-3) + z^(-4)      (式4)

(式3)の両辺から、(式4)の両辺を引いて

   G(z) - G(z)*z^(-1) = 1 - z^(-4)

G(z)について整理すると、

       1 - z^(-4)

   G(z) = ---------               (式5)

               1 - z^(-1)

■次に周波数特性を求める。伝達関数の式において、z^(-1)をe^(-jωT)に置き換える。左辺のZは、e^(jωT)に置き換える。ωは角周波数。Tはサンプリング周期。

                 1 - e^(-jω4T) 

       G{e^(jωT)} = ------------   (式6)

            1 - e^(-jωT)

(式6)の分子は、オイラーの公式

   sinθ = { e^(jθ) - e^(-jθ) } / 2j

を使って、

  1 - e^(-jω4T)  = e^(-jω2T) * { e^(jωT) - e^(-jωT) }

        = 2j * e^(-jω2T) * { e^(jωT) - e^(-jωT) } / 2j

          = 2j * e^(-jω2T) * sin(2ωT)

となる。

(式6)の分母も同様に、分子に対して4TがTになっただけなので

  1 - e^(-jωT)  = 2j * e^(-jωT/2) * sin(ωT/2)

となる。したがって、(式6)は、

                 sin(2ωT) 

       G{e^(jωT)} = -------- * e^(-jωT3/2)   (式7)

            sin(ωT/2)

これが周波数特性である。

■参考

2回移動平均の周波数特性はこちら

http://robotcontroller.cocolog-nifty.com/blog/2008/10/post-0e41.html

Link: 

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

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

| | コメント (0) | トラックバック (0)

2008年10月29日

単純移動平均の時間波形(2回平均)折り返し現象

Motion_oyaji_wave_ma2_ov

2回移動平均の入出力波形を示す。サンプリング周波数は1000Hz。横軸はms。入力信号は、100Hz、900Hz、1100Hzのsin波である。このとき、入力x(z)、出力y(z)ともに同じ波形になる。

これは、

   900 = 1000 - 100

  1100 = 1000 + 100

のようにサンプリング周波数1000Hzを基準にして、100Hzが±された周波数なので、このような現象が発生する。

1000Hzだけでなく、その整数倍でも発生する。たとえば、1000の2倍の

  1900 = 2000 - 100

  2100 = 2000 + 100

でも同じになる。

この現象は、ここで例に挙げた移動平均処理とは関係なく、信号をサンプリングすることによって発生する一般的な現象である。

エクセルの元データはこちら「motion_oyaji_wave_MA2_ov_081025.xls」をダウンロード

Link: 

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

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

| | コメント (0) | トラックバック (0)

2008年10月28日

単純移動平均の時間波形(2回平均)

Motion_oyaji_wave_ma2

1000Hzサンプリング(制御周期1ms)の2回移動平均フィルタに100Hz,200Hz,333Hz,500Hzのsin波を入力した場合の、

入力x(nT)、出力y(nT)、内部状態のx{(n-1)T}

を示す。横軸の単位はms。

x(nT)を正弦波として、

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

を計算したグラフである。

サンプリング周波数1000Hzの1/10の100Hzの正弦波を2回移動平均フィルタへ入力すると、出力振幅が入力の約2倍になる。

サンプリング周波数1000Hzの1/5の200Hzでは、出力振幅が入力の約1.5倍。

サンプリング周波数1000Hzの1/3の333Hzでは、出力振幅が入力の約1倍。

サンプリング周波数1000Hzの1/2の500Hzでは、出力はゼロ。フィルタリングされる。

たとえば、サンプリング周波数が2倍の2000Hz(制御周期500us)のとき、やはり、サンプリング周波数2000Hzの”1/2”の1000Hzでは、出力がゼロになる。

読者のみなさんのシステムのサンプリング周波数が1000Hzのn倍だったら、特性はn倍の周波数に拡大されると考えてください。1/nでも同様。

エクセルの元データはこちら「motion_oyaji_wave_MA2_081025.xls」をダウンロード

Link: 

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

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

| | コメント (1) | トラックバック (0)

2008年10月26日

単純移動平均のゲイン特性と位相特性(2回平均)

前の記事のおさらいから。

2回移動平均の周波数特性は

    Y{e^(jωT)} / X{e^(jωT)} = 2 * cos(ωT/2 ) *  e^(-jωT/2)               (式3) 

であることがわかった。この式の振幅部分(e^以外の部分)を切りだして、絶対値にして、ゲイン特性(振幅特性)は、

   g(ω) = |2 * cos (ωT/2)|     (式4)

具体的な例として、サンプリング周期1000Hz(制御周期1ms)、横軸周波数のグラフにする。グラフからサンプリング周期の半分500Hzでゲインがゼロ、つまり、500Hzの正弦波信号は出力に現れない。フィルタリングされる。サンプリング周期の1/10の100Hzの正弦波信号は入力の1.9倍になって、出力現れる。また、0Hz、すなわち、直流は、2倍になって現れる。

Motion_oyaji_gain_ma2

同じく位相部分(eのカッコの中のjを除いた部分)を取り出して

   φ(ω) = -ωT/2    [rad]    (式5)

同じく、サンプリング周期1000Hz(制御周期1ms)、横軸周波数のグラフにする。サンプリング周期の1/10の100Hzの信号は位相が18°遅れて、出力に現れる。Motion_oyaji_phase_ma2

エクセルの元データはこちら「motion_oyaji_freq_MA2_081025.xls」をダウンロード

Link: 

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

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

| | コメント (0) | トラックバック (0)

2008年10月25日

単純移動平均周波数特性(2回平均)

Photo_6

仕事で、移動平均の周波数特性の検討書を作ることになったので、昔勉強した本を引っ張りだして、書いている。「移動平均」は、株価の分析にも出てくる。ここでは、ディジタル信号処理のローパスフィルタとして使用する。まず、簡単な2回移動平均から。FIRフィルタのもっとも簡単な形。

FIR: Finite Impulse Response (有限インパルス応答)

■図の入出力関係は

   y(nT) = x(nT) + x{(n-1)T}                (式1)

■伝達関数を求める。(式1)の両辺をまずZ変換する。y(nT)=>Y(z),x(nT)=>X(z),x{(n-1)T)}=>X(z)*z^(-1)と置き換える。すると

   Y(z) = X(z) + X(Z)*z^(-1)

次に出力Y(z)とX(z)の比の形に変形する。

   Y(z)/X(z) = 1 + z^(-1)                                      (式2)

これが伝達関数である。

■次に周波数特性を求める。伝達関数の式において、z^(-1)をe^(-jωT)に置き換える。左辺のZは、e^(jωT)に置き換える。ωは角周波数。Tはサンプリング周期。株式市場なら、1日。速度制御なら1msから数百usあたり。

    Y{e^(jωT)} / X{e^(jωT)} = 1 + e^(-jωT) 

これを振幅と位相の式に変形する。複素数に関わる知識が必要になる。  オイラーの公式

   e^(jθ)  + e^(-jθ) = 2*cosθ

を使えるように、変形する。

    { e^(jωT/2) + e^(-jωT/2)}  * e^(-jωT/2 )

上記のオイラーの公式を使って,

    Y{e^(jωT)} / X{e^(jωT)} = 2 * cos(ωT/2 ) *  e^(-jωT/2)               (式3) 

これが、2回移動平均の周波数特性である。

Link: 

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

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

| | コメント (0) | トラックバック (0)