CORDIC法でSINとCOSを生成
Cosmo-ZのDACから正弦波を出すため、CORDIC法のIPコアを使って正弦波づくりに再チャレンジしています。
過去にCORDICコアを使ったことは何回かありました。
過去の自分の記事を参考にします。
XILINXのCORDICコアで、位相と出力を16bitにします。
入力の位相はScaled Radiansにします。そうすると符号1bit+整数部2bit+小数点以下13bitになります。Scaled Radiansでは-1~+1が-π~+πに相当するので0xe000~0x1fffまでスキャンすれば[-π,π)の範囲をスキャンできることになります。
出力は16bitにしていますが、SINとCOSで32bit幅で出てきます。なお、AXI Streamは8bit単位なので、位相を18bitにするとバス幅は24bitになります。ほしい精度が14bitなので入力のビット幅をそんなに増やしても意味はないので、16bit入力16bit出力くらいでちょうどよいのではないかと思われます。
こうやって作った正弦波なのですがシミュレーションしてみると、SINとCOSの最大値最小値のところですこしギザギザしているような感じがします。
例えば下の波形は、CORDIC法が出すSINの値に着目したものです。0x3fff(0.999に相当)と0x4000(1.000に相当)をいったりきたりしています。
別のインプリメンテーションでは下1bitは正しく変化していないように見えます。
CORDICは下2bitくらいはブレがあるように見えるので、2~3bit多めに生成して切り捨てるくらいにしたほうがよさそうな感じです。
下の波形はCORDIC法の出力結果に0xffffを乗算して下位ビットを切り捨てて0x8000を足したものです。つまり0x0000~0xffffの正弦波を作っているのですが、最大値の部分(黄色のトリガ)も含め最下位ビット[0]は正しく変化していないように見えます。
というわけで、CORDICで16bitで生成した値を0xffffと乗算して、上14bitだけ切り取ることで、0x0000~0x3fffの綺麗な正弦波が作れました。
下2bitはやはり使えません。2bitくらい多めの精度のCORDICコアを生成して切り捨てるくらいの覚悟で作りましょう。
この正弦波をDACから出してオシロで測ってみました。綺麗なつるつるの正弦波に見えますが・・
オーディオアナライザを使って測ってみるとTHDは-81dBとのこと。
惜しい。
FFTしてみると確かに高調波が-80dBくらいで見えています。
使っているDACのSFDRは10MHzで-84dBcだし、初段の差動アンプは-115dBc、集団のアンプも-89dBcクラスなので、もうすこしいけるはず!
| 固定リンク
コメント