FIRの具体的意味について調べてみると「有限インパルス応答」だそうで・・・益々解らなくなりそうなのでパスします。
前回の 10個の ADCからのデータを今回は都合により 11個にして(都合が多いぞ)Xリングメモリも 11個(810~824)に設定します。
asm("mov #0x0810,W0");
asm("mov W0,XMODSRT");
asm("mov #0x0825,W0");
asm("mov W0,XMODEND");
asm("mov #0x8008,W0");
asm("mov W0,MODCON");
asm("mov #0x0810,W8");
asm("mov W0,XMODSRT");
asm("mov #0x0825,W0");
asm("mov W0,XMODEND");
asm("mov #0x8008,W0");
asm("mov W0,MODCON");
asm("mov #0x0810,W8");
当然、上記の設定はメインプログラムの関数として扱います。
Xメモリの中身の様子は横書きだとはみ出すので縦書きにしました。
810(a0)*1/8=b0・・・・・一番古いデータ
812(a1)*1/8=b1・・・・・下に行くにしたがって新しくなる
814(a2)*1/8=b2
816(a3)*1/8=b3
818(a4)*1/8=b4
81a(a5)*1/8=b5
81c(a6)*1/8=b6
81e(a7)*1/8=b7
820(a8)*1/8=b8
822(a9)*1/8=b9
824(a10)*1/8=b10・・・たった今 ADCから入力されたデータ
812(a1)*1/8=b1・・・・・下に行くにしたがって新しくなる
814(a2)*1/8=b2
816(a3)*1/8=b3
818(a4)*1/8=b4
81a(a5)*1/8=b5
81c(a6)*1/8=b6
81e(a7)*1/8=b7
820(a8)*1/8=b8
822(a9)*1/8=b9
824(a10)*1/8=b10・・・たった今 ADCから入力されたデータ
そして Z=b0+b1+b2+++b9+b9+b10です。
此処までが前回の怪しげな特性を示したフィルタ?を縦書きにしたのものです。
此処までが前回の怪しげな特性を示したフィルタ?を縦書きにしたのものです。
今回は1/8の共通係数を各々微妙に変えてみます。
変えるにあたり、又怪しげな特性では何ですから、キチンとした LPFになる様に然るべき所から入手した係数データ(k0~k10)を使いました。
tap数が [11]では、マトモな LPFには程遠いですが・・・
[Digital Filter Design Services] 感謝です。
この辺の感覚はオペアンプを使ったアナログフィルタを設計する時の C/R値計算に似ていると思います。(大変難しい計算式が有るようですが、解らないので手抜き?)
変えるにあたり、又怪しげな特性では何ですから、キチンとした LPFになる様に然るべき所から入手した係数データ(k0~k10)を使いました。
tap数が [11]では、マトモな LPFには程遠いですが・・・
[Digital Filter Design Services] 感謝です。
この辺の感覚はオペアンプを使ったアナログフィルタを設計する時の C/R値計算に似ていると思います。(大変難しい計算式が有るようですが、解らないので手抜き?)
k0=-0.005
k1=-0.007
k2=0.015
k3=0.104
k4=0.233
k5=0.296
k6=0.233
k7=0.104
k8=0.015
k9=-0.007
k10=-0.005
上記(k0~k10)値に共通係数 1/8部分を置き換えた式を下に・・・
(a0)*1/8=b0---->(a0)*k0(-0.005) =b0
(a1)*1/8=b1---->(a1)*k1(-0.007) =b1
(a2)*1/8=b2---->(a2)*k2(0.015) =b2
(a3)*1/8=b3---->(a3)*k3(0.104) =b3
(a4)*1/8=b4---->(a4)*k4(0.233) =b4
(a5)*1/8=b5---->(a5)*k5(0.296) =b5
(a6)*1/8=b6---->(a6)*k6(0.233) =b6
(a7)*1/8=b7---->(a7)*k7(0.104) =b7
(a8)*1/8=b8---->(a8)*k8(0.015) =b8
(a9)*1/8=b9---->(a9)*k9(-0.007) =b9
(a10)*1/8=b10->(a10)*k10(-0.005)=b10
(a0)*1/8=b0---->(a0)*k0(-0.005) =b0
(a1)*1/8=b1---->(a1)*k1(-0.007) =b1
(a2)*1/8=b2---->(a2)*k2(0.015) =b2
(a3)*1/8=b3---->(a3)*k3(0.104) =b3
(a4)*1/8=b4---->(a4)*k4(0.233) =b4
(a5)*1/8=b5---->(a5)*k5(0.296) =b5
(a6)*1/8=b6---->(a6)*k6(0.233) =b6
(a7)*1/8=b7---->(a7)*k7(0.104) =b7
(a8)*1/8=b8---->(a8)*k8(0.015) =b8
(a9)*1/8=b9---->(a9)*k9(-0.007) =b9
(a10)*1/8=b10->(a10)*k10(-0.005)=b10
Z=b0+b1+b2+・・・・・+b8+b9+b10
最終的には、新しい ADCデータが入って来る毎に[Z]値を求めます。
そして DACでアナログに変換して出力します。
実は此の段階で、もう立派な 11tap・FIR/LPFが完成なんです!(何だ簡単じゃん)
でも具体的に上記の計算を高速でやろうとすると、正負の小数点/積和演算があり大変ですね。
しかも沢山加算すれば 16bitを軽く超えそうです。
そこで dsPICの ds部分が活躍です。(やっと真打登場)
次回は本人もよく解っていない DSP命令について屁理屈を一席。
by JA1QVM
しかも沢山加算すれば 16bitを軽く超えそうです。
そこで dsPICの ds部分が活躍です。(やっと真打登場)
次回は本人もよく解っていない DSP命令について屁理屈を一席。
by JA1QVM