FPGAロックインアンプの精度の改善の限界
昨日の数値計算では、FPGAロックインアンプの精度はSIN/COSの精度のビット数と、信号の精度のビット数によって決まることがなんとなくわかっていました。すべてがdouble型で計算すれば理想通りになるのですが、固定小数点のlong long型などを使うとわずかな誤差(100万分の10程度)が出てきてしまいます。
FPGAの中でのビット数をいろいろ変えて試してみました。
まず、SIN/COSが16bit、信号が16bit、積算が32bitの場合です。途中で符号などが被るのでトータルの演算結果は62bitになります。
10mV振幅の信号を入れて位相を変えていったところ、14μV程度の変動が見られました。ロックインアンプの前にLPFを入れるかどうかで結果が変わるかどうか見て見ましたが、LPFを入れたほうが若干悪い結果となりました。
測定された位相の誤差を見ると、誤差は約0.08度であることがわかります。
次にSIN/COSを24bitにした場合です。トータルの演算精度は70bitになります。LPFの有無による違いはありませんでしたが、最大と最小で約10uVの誤差が出ています。
SIN/COSを32bit信号を16bitにして、トータルで78bitの演算精度の場合。少し傾向は変わったのですが、6uVくらいの変動があります。
ロックインアンプで使うSIN/COSの精度を16bit→32bitに増やしたのに結果が14uV→6uVにしか変わらなかったと言えます。
今回の検証で使ったボードのADCは12bit精度ですが、このADCビット数を高めたらどうなるでしょう?
そこで、ADCの精度は12bitですが、CICフィルタでビット数を増やしたらどうなるかを試してみました。
結果は、
FPGAの設計の問題なのかもしれませんが、驚くべきことに、全く差がありませんでした。
CICフィルタなどのLPFを使ってADCのビット数を増やしたとしても、所詮は足し算と引き算で見かけ上のビット数を増やしているに過ぎないので、ロックインアンプのように長時間積分する系の演算では同じ結果になるということなのかもしれません。
| 固定リンク
コメント