ΔΣー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