ΔΣ-ADC実験編 その9 続SINC filter &
Biquad IIR filter
SINC filter = MovingAve
filter
1.「SINCフィルタ」 とは、「俺のことか」と、MovingAve フィルタ 言い (川柳風)
前節では、SINCフィルタ1段を、まねました。
しかし、特性を見てみると、決してSINCフィルタそのものでは、ありませんでした。
赤がSINCフィルタ(M=16)、黒が、積分を8個の移動平均で代用したフィルタ
それで、色々な特性を調べてみる内に、ハタと気付きました。(膝をたたいて、にっこり笑い.....)
SINCフィルタって、移動平均フィルタそのものと、ちゃうやろか?
冒頭のmaximaによる展開式は、
SINCフィルタ (1-z^-M)/16(1-z^-1)
そして、その式を展開してみると、な、なんと! 移動平均フィルタそのものです。
実際、特性を見てみると、ぴったり重なり合います。
CIC(M=16) 16個の移動平均フィルタ
そ、そうやったんか、もっと早く、気付くべきやったわ.....
1bit信号処理では、実は、移動平均フィルタの方が、単純で、扱いやすいのです。
で、16個の移動平均と、それの2段重ねの特性です。
そして、decimation後の16個の移動平均1段の場合の、100KHz出力
1/16にdecimationしても、原型と、ほとんど同じです、凄い!
2.Biquad IIR filter
の FPGAでのプログラミング
Biquad filterの式、そのものをプログラムする事になります。
先ず、Low
pass filterの設計
次に、そのままを verilogHDLにて記述します。
伝達関数の定義から
Yn/Xn=(0.2+0.4*z^-1+0.2z^-2)/(1-0.5*z^-1-0.1*z^-2)
変形して
Yn(1-0.5*z^-1-0.1*z^-2)
=(0.2+0.4*z^-1+0.2*z^-2)*Xn
Yn - 0.5*Yn-1-0.1*Yn-2 =
0.2*Xn+0.4*Xn-1+0.2*Xn-2
Yn - 1/2*Yn-1-1/10*Yn-2 =
2/10*Xn+4/10*Xn-1+2/10*Xn-2
Yn =Yn-1 /2
+ Yn-2 /10 + ( Xn + 2*Xn-1 + Xn-2 )/5
これは、直接型構成のプログラミングです。実に単純で明快ですね....これが一番いいです。
標準型、並列型等のプログラミングは、 「Scilabで学ぶディジタル信号処理 三谷先生 CQ出版 p.246」を参照下さい。
IIRフィルタで、気をつけなければならないのは、そのダイナミックレンジです。
伝達関数の分子、分母、それぞれに分離して、そのダイナミックレンジを探ります。
これから、
このフィルターの場合、入力の3倍のレンジがあれば、飽和しない事になりますね。
入力の最大値が 1023(10bit)だとすると、
その3倍は
だから、入力が 10bit なら、yn、yn-1は、12bit が目安になります。
C電卓の作者様、いつも利用させていただいています、ありがとうございます。
作成したBiquad
IIR filterの simulationです。(sampling=1MHz)
yn,yn-1は、12bitが目安だと、言いましたが、
simulationの結果では、
もっと少ないbit数で作動する場合が、ありますので、
simulationは、必須です。
H22.7.6