Quantcast
Channel: JA1QVM
Viewing all articles
Browse latest Browse all 161

33FJ64GP802/FIRフィルタ・・・その1

$
0
0
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");
当然、上記の設定はメインプログラムの関数として扱います。

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から入力されたデータ
そして Z=b0+b1+b2+++b9+b9+b10です。
此処までが前回の怪しげな特性を示したフィルタ?を縦書きにしたのものです。

今回は1/8の共通係数を各々微妙に変えてみます。
変えるにあたり、又怪しげな特性では何ですから、キチンとした 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
 Z=b0+b1+b2+・・・・・+b8+b9+b10

最終的には、新しい ADCデータが入って来る毎に[Z]値を求めます。
そして DACでアナログに変換して出力します。
実は此の段階で、もう立派な 11tap・FIR/LPFが完成なんです(何だ簡単じゃん)

でも具体的に上記の計算を高速でやろうとすると、正負の小数点/積和演算があり大変ですね。
しかも沢山加算すれば 16bitを軽く超えそうです。
そこで dsPICの ds部分が活躍です。(やっと真打登場)
次回は本人もよく解っていない DSP命令について屁理屈を一席。
by    JA1QVM


Viewing all articles
Browse latest Browse all 161

Trending Articles