« 東工大へ・・ | トップページ | CICフィルタのオーバーフローとビット数 »

2015.04.27

12bitのADCを18bit分解能にする方法

AD変換器の分解能を向上させる方法があります。

このブログで説明する方法を使うと、同じADCを使いながら500kps 24bitにしたり、100MHz 12bitにしたりすることができます。

それは、AD変換でサンプリングしたデータにディジタル信号処理を施して、ローパスフィルタの演算によってビット数を増やすというものです。ローパスフィルタならFIRフィルタを使えばよいのですが、タップ数が増えると非常にたくさんの係数をかけなけなければならないので回路面積や消費電力が増えてしまいます。

そこで、次の図に示すCICフィルタというのが昔から使われてきました。

Cic_1

CICフィルタの仕組みは http://www.dspguru.net/sites/dspguru/files/cic.pdf で紹介されているとおりです。

加算器と減算器、遅延(メモリ)のみで構成されているので、FIRに比べるととてもコンパクトです。

実際にFPGAで動かす前に、このフィルタの動作をC言語で作って試してみました。

まず、横256ポイント、縦8bitで、1周期分の正弦波をC言語で作ります。

Cic_2

ただし、この正弦波にはノイズが乗っています。ノイズは正規分布(σ=1 LSB)にしたがっている一様乱数に、2点の平均化を行って高域を減衰させたものを使っています。だから、ギザギザしています。

Cic_3

ちょっとノイズが多目のADCの波形はこんなものでしょう。ノイズは乗っていますが、ノイズを加えた後の値はもちろん整数です。

これを、3タップのCICフィルタに入れて4分の1にデシメーションすると・・

Cic_4

この緑の線のように滑らかになって、整数の間の値が出てきます。

ADCで高速にサンプリングしてLPFを通せば当たり前だと言われればそのとおりなのですが、いろいろメリットがあるのです。

まず、どの程度の分解能になるかというと、計算に必要なビット数は、以下の式で求められます。

出力ビット数 =  タップ数 × log2(R + M) + 入力ビット数

ここで、Rはデシメーションの比率、Mは微分器の遅延の段数です。

上の構成ではタップ3なので、8bit + 3 * 2 = 14bit となって、計算の結果を保持するのに14bit必要ということになりました。つまり、8bitの入力から14bitの精度を生み出したという非常に胡散臭い結果となるわけです。

※本当に14bitの精度があるかどうかは後で検証します。

実はCICフィルタは昔から使われている手法なので、XILINXのCoreGenのDigital Signal Processing→Filters→CIC Compilerの中に既にあります。

Cic_5

CoreGenでCICフィルタを作ろうとすると、周波数特性まで示してくれるので、それを見てみましょう。

タップ3、デシメーション4だと下の図のような特性なので、それほど急峻ではありません。

Cic_6

タップ5、M=2、デシメーション8にすると、こんなに急峻な特性になります。

Cic_7

計算に28bitの精度が必要になるので、まぁ、実用的ではないですね。本当に28bitの精度があるかどうかは疑わしいです。

急峻な特性を得たいならば、CICの後ろにFIRを組み合わせるのがよいのではないかと思います。

続く

|

« 東工大へ・・ | トップページ | CICフィルタのオーバーフローとビット数 »

コメント

コメントを書く



(ウェブ上には掲載しません)




« 東工大へ・・ | トップページ | CICフィルタのオーバーフローとビット数 »