デジタル・フィルター
■村岡如竹
■村岡如竹
デジタル・フィルターの遅延素子であるZ-1素子もCASL87のVer3.00から扱えるようになった。そのため、デジタル・フィルターの周波数特性をまるでアナログ回路図の扱いで解析できるようになった。
上の図の関係を下の図のようにZ-1素子としてのZdと電流源Gzの回路ブロックとして表す。
■FIRの周波数特性を求める
下の図に表すような多タップ構成のFIR(Finite Inpulse Responce )の周波数特性求めてみよう。尚、FIRの係数A0~A29は以下のツール・アプリなどから求めることができる。
●回路図
CASL87の新素子「Z-1」を使用したFIR型の「ローパスフィルタ」の回路図を示す(FIRの場合、この構成でハイパスフィルタも実現できる)。サンプリング周波数=10KHz、タップ数はA0~A29の30タップで構成する。
●CASL87でのソースコード
Z-1素子としてのZdと電流源Gzの回路ブロックをライブラリーとして以下にそのソースコードを示す。Zdの値はサンプリング周波数であり、ここでは10KHz。
/*
Z_Function_Fs_10KHz.LIB
a program of Z function.
*/
Circuit Zfunction ;
{
100 ... Input of Integrator
200 ... Output of Integrator.
}
node 200, e ;
Gz(e>200*100-e) = 1.0 ;
Zd = 10e3 ;
End of Zfunction ;
このライブラリーを’拡張Include文’の形式の記述例として、
Ex Include Z_XX .\LIB\Z_Function_Fs_10KHz.lib ;
で引き込んだ形式で上記の回路図を表すCASL87のソースコードを以下に示す。
/*
FIR_lowpass_30taps_01.CAS
a program of FIR lowpass filter.
*/
//
Circuit Main ;
{
100 ... Input of Integrator
200 ... Output of Integrator.
}
//
Ex Include Z_01 .\LIB\Z_Function_Fs_10KHz.lib ;
Ex Include Z_02 .\LIB\Z_Function_Fs_10KHz.lib ;
Ex Include Z_03 .\LIB\Z_Function_Fs_10KHz.lib ;
Ex Include Z_04 .\LIB\Z_Function_Fs_10KHz.lib ;
Ex Include Z_05 .\LIB\Z_Function_Fs_10KHz.lib ;
Ex Include Z_06 .\LIB\Z_Function_Fs_10KHz.lib ;
Ex Include Z_07 .\LIB\Z_Function_Fs_10KHz.lib ;
Ex Include Z_08 .\LIB\Z_Function_Fs_10KHz.lib ;
Ex Include Z_09 .\LIB\Z_Function_Fs_10KHz.lib ;
Ex Include Z_10 .\LIB\Z_Function_Fs_10KHz.lib ;
Ex Include Z_11 .\LIB\Z_Function_Fs_10KHz.lib ;
Ex Include Z_12 .\LIB\Z_Function_Fs_10KHz.lib ;
Ex Include Z_13 .\LIB\Z_Function_Fs_10KHz.lib ;
Ex Include Z_14 .\LIB\Z_Function_Fs_10KHz.lib ;
Ex Include Z_15 .\LIB\Z_Function_Fs_10KHz.lib ;
Ex Include Z_16 .\LIB\Z_Function_Fs_10KHz.lib ;
Ex Include Z_17 .\LIB\Z_Function_Fs_10KHz.lib ;
Ex Include Z_18 .\LIB\Z_Function_Fs_10KHz.lib ;
Ex Include Z_19 .\LIB\Z_Function_Fs_10KHz.lib ;
Ex Include Z_20 .\LIB\Z_Function_Fs_10KHz.lib ;
Ex Include Z_21 .\LIB\Z_Function_Fs_10KHz.lib ;
Ex Include Z_22 .\LIB\Z_Function_Fs_10KHz.lib ;
Ex Include Z_23 .\LIB\Z_Function_Fs_10KHz.lib ;
Ex Include Z_24 .\LIB\Z_Function_Fs_10KHz.lib ;
Ex Include Z_25 .\LIB\Z_Function_Fs_10KHz.lib ;
Ex Include Z_26 .\LIB\Z_Function_Fs_10KHz.lib ;
Ex Include Z_27 .\LIB\Z_Function_Fs_10KHz.lib ;
Ex Include Z_28 .\LIB\Z_Function_Fs_10KHz.lib ;
Ex Include Z_29 .\LIB\Z_Function_Fs_10KHz.lib ;
node 200, e ; // Adder point of current.
Ga0(e>200*100-e) = -0.000440939713601099980 ;
Ga1(e>200*1-e) = 0.003019147395237144000 ;
Ga2(e>200*2-e) = 0.002716963657404195100 ;
Ga3(e>200*3-e) = -0.005686857748294383100 ;
Ga4(e>200*4-e) = -0.005881182439938400400 ;
Ga5(e>200*5-e) = 0.010928946658392148000 ;
Ga6(e>200*6-e) = 0.011591255909648627000 ;
Ga7(e>200*7-e) = -0.019248622692254618000 ;
Ga8(e>200*8-e) = -0.021311352440475429000 ;
Ga9(e>200*9-e) = 0.033019645904294175000 ;
Ga10(e>200*10-e) = 0.039184030401879781000 ;
Ga11(e>200*11-e) = -0.059958150865893324000 ;
Ga12(e>200*12-e) = -0.082471421949337223000 ;
Ga13(e>200*13-e) = 0.149690577925755350000 ;
Ga14(e>200*14-e) = 0.446432887628742840000 ;
Ga15(e>200*15-e) = 0.446432887628742840000 ;
Ga16(e>200*16-e) = 0.149690577925755350000 ;
Ga17(e>200*17-e) = -0.082471421949337223000 ;
Ga18(e>200*18-e) = -0.059958150865893324000 ;
Ga19(e>200*19-e) = 0.039184030401879781000 ;
Ga20(e>200*20-e) = 0.033019645904294175000 ;
Ga21(e>200*21-e) = -0.021311352440475429000 ;
Ga22(e>200*22-e) = -0.019248622692254618000 ;
Ga23(e>200*23-e) = 0.011591255909648627000 ;
Ga24(e>200*24-e) = 0.010928946658392148000 ;
Ga25(e>200*25-e) =-0.005881182439938400400 ;
Ga26(e>200*26-e) =-0.005686857748294383100 ;
Ga27(e>200*27-e) = 0.002716963657404195100 ;
Ga28(e>200*28-e) = 0.003019147395237144000 ;
Ga29(e>200*29-e) = -0.000440939713601099980 ;
//
Rout = 1.0 ;
Link ;
100 = Z_01.100 ; 1 = Z_01.200 ;
1 = Z_02.100 ; 2 = Z_02.200 ;
2 = Z_03.100 ; 3 = Z_03.200 ;
3 = Z_04.100 ; 4 = Z_04.200 ;
4 = Z_05.100 ; 5 = Z_05.200 ;
5 = Z_06.100 ; 6 = Z_06.200 ;
6 = Z_07.100 ; 7 = Z_07.200 ;
7 = Z_08.100 ; 8 = Z_08.200 ;
8 = Z_09.100 ; 9 = Z_09.200 ;
9 = Z_10.100 ; 10 = Z_10.200 ;
10 = Z_11.100 ; 11 = Z_11.200 ;
11 = Z_12.100 ; 12 = Z_12.200 ;
12 = Z_13.100 ; 13 = Z_13.200 ;
13 = Z_14.100 ; 14 = Z_14.200 ;
14 = Z_15.100 ; 15 = Z_15.200 ;
15 = Z_16.100 ; 16 = Z_16.200 ;
16 = Z_17.100 ; 17 = Z_17.200 ;
17 = Z_18.100 ; 18 = Z_18.200 ;
18 = Z_19.100 ; 19 = Z_19.200 ;
19 = Z_20.100 ; 20 = Z_20.200 ;
20 = Z_21.100 ; 21 = Z_21.200 ;
21 = Z_22.100 ; 22 = Z_22.200 ;
22 = Z_23.100 ; 23 = Z_23.200 ;
23 = Z_24.100 ; 24 = Z_24.200 ;
24 = Z_25.100 ; 25 = Z_25.200 ;
25 = Z_26.100 ; 26 = Z_26.200 ;
26 = Z_27.100 ; 27 = Z_27.200 ;
27 = Z_28.100 ; 28 = Z_28.200 ;
28 = Z_29.100 ; 29 = Z_29.200 ;
End of Main ;
Calculation ;
Input = Main.100 ; Output = Main.200 ;
Start = 100 ; Finish = 10e3 ; Division = 10000 ;
Phase Offset = 0.0 ;
End.
●周波数特性
CASL87でコンパイルし、GR87でグラフ化したものを下図に示す。サンプリング周波数が10KHzなので、非エイリアス領域(斜線部以外)は5KHz以下になる。
デジタル・フィルター固有のリップル(赤枠部)が発生していることが確認できる。グラフからは、リップルのレベルまでの信号のレンジは、約56dB(631ステップ)あるので、正負信号としてのレンジは、62dB(1262ステップ)くらいは必要になる。つまり、マグニチュード型のADやDA変換時のビット数は11ビット(2048ステップ)以上必要であることが判る。
AD変換後では、例えば、10ビット分解能であっても、デジタル・フィルター内では固定小数点、浮動小数点、倍精度型固定小数点などで、さらなる多ビット化がなされて処理される。
ここで、注意しなくてはならないことは、CASL87は非常に高い精度(64ビットCPU版:倍精度型浮動小数点(8byte=64bit)数値範囲:正負1E-160~1E+154、32ビットCPU版:拡張倍精度型浮動小数点[10byte=80bit]))で計算している。
つまり、ユーザーがデジタル・フィルターとして実際に使用するDSP(Digital Signal Processor)、或いは、それに類するデバイス内の計算アルゴリズムが固定小数点や単精度浮動小数点の場合では、非常に高い精度のCASL87での計算結果よりも、実物のデバイスでの精度が悪くなる。
<記: 村岡如竹>