ΔΣーADC実験編 その12 自分なりのCICフィルタ、でけました
4 cascaded CIC
filter ( input=16bit [sine] output=43bit [decimated_out4]
)
1.自分なりの 4 cascaded CIC
filter
やっと、出来上がりました。
実用的な、4 cascaded CIC
filter だと思います。
入力:16bit
出力:43bit
decimation比率:64
直流(DC)も、正しく出力される。
積分器の必要最大ビット数:46bit (もう少し、絞れるかも知れません。 ギリギリではありません。)
飽和処理のない、2の補数表現を使った積分器が4つ、そして、微分器が4つです。
そうなんですっ!
ある関数f(x)を積分して、続いて、それを微分すれば、元の関数f(x)に戻る!
入力16ビットを、出力で43bitにするビット変換器と、考えてもいいと思います。
気になる、積分器のビット数ですが、 今のところ、最大で、46bitsに納まっています。
とにかく
直流(DC)でも、正しい波形が出力されるもの
を求めました。
最下段が入力、上に行くに従って、各段の出力。最上段が最終の出力になります。
直流(DC)入力で、最終出力(decimated_out4)も、直流になっています。
失敗作を挙げますと
出力(decimated_out4)が、不自然です。
こんな時は
最初の積分器
yn
のビット数を、大体、2ビット位、上げてやれば、解消します。
2番目、3番目、4番目の積分器は、既に飽和と言いいますか、
バイナリー演算の積分器で、符号が変わってしまっていますので、
元々、影響が少ないようです。(ここのビット数は、もっと減らせるのかも、知れません。)
2.CIC filterの作り方
先ず、飽和しそうにもない程の、沢山のビット数を、おおまかに決めます。
16ビット入力の場合、60ビット位から始めます。
それでも、vnが飽和してしまっていますが、
他はOKであって、出力も正常だから、
60ビットを基点にします。
そんで、例えば
decimated_out2の最大値が HEX値で h'00014875848000 ですから
この上位のゼロを、どこまで削除できるか、少しずつ ビット数を減らしていきます。
以下、同じ作業を繰り返します。(ほんま、人海戦術ですね.....理論を知らないと、こうなります。)
とにかく、出来上がって、うれしいです。
今回のプログラム、置いときます。
H22.7.17