2011-11-18 9 views
13

私は、アドホック関数を使用し続けるよりもベクトルやその他の三角法のサポートクラスを構築し始める方が意味があるプロジェクトのポイントに達しました。私はこれのために多くのC++ライブラリがあることを期待していますが、私は慣れていた速度と機能を犠牲にしたくありません。整数三角法のC++ライブラリです。速度はオプションの近似で最適化されていますか?

具体的には、私は整数の角度を使用することができるようにしたい、と私はこのような近似によって与えられるブレイジングスピードを維持したい:

static inline int32_t sin_approx(int32_t angle) 
//Angle is -32768 to 32767: Return -32768 to 32767 
{ 
    return (angle<<1) - ((angle*abs(angle))>>14); 
} 

だから、私は不自分をロールバックする前に、任意のは本当にありますベクトルのようなテンプレートクラスを使ってC++用の高速固定小数点ライブラリを使用します。ここでは、使用する整数の幅を指定することができます。

+0

それはどのように罪の近似ですか? – TonyK

+0

私は正直に分かりません。私は1年前に、浮遊点罪近似に基づいて、私が推測すると、いくつかの放物線関数を使って書いた。それを整数にまとめると、上記の結果が得られました。元の機能を忘れてしまったので、もうどのように動作するのか分かりません。しかし、それはほぼ完全な円を描く。 – porgarmingduod

+2

ああ、私は今それを見る。範囲の各半分を0と2のゼロと最大/最小値+/- 1の放物線として近似します。ニース! – TonyK

答えて

4

いくつかのオーディオフィンガープリンティングコードを浮動小数点から固定小数点に変換しなければならないとき、私は数年前にこの道を辿りました。難しい部分は、DCT(大きなコサインテーブルを使用)と高精度の対数です。私は驚いたことに、既存の図書館の方法ではほとんど見つかりませんでした。それ以来、私は元のソニープレイステーション(PS1)に浮動小数点サポートがないと聞いています。そのために開発フォーラム(fori?)がまだ存在すれば、あなたが探しているものを持っているかもしれません。

NewMatライブラリでは幸いですが、三角法ではなく線形代数に対応していますが、浮動小数点数に焦点を当てているようです。それでも、そのサイトはthis listになります。これはチェックアウトの価値があるようです。また、固定小数点サポートに適している可能性のある信号処理ライブラリであるspucが見つかりました。そして数年前、私はフラウンホーファーからシグナルプロセッシングテンプレートライブラリー(sptl)を見ました。私はそれが独占的だったと思っていますが、何らかの形で利用可能かもしれません。

あなたがすでに持っているものにかなり近いと思います。正弦関数を持つので、入力を適切に変換すれば、基本的にコサイン関数も得られます(cos(x) == sin(x + pi/2))。正接はサインとコサイン(tan(x) = sin(x)/cos(x))の商であるため、基本的には三角法があります。

ベクターに関しては、STLアルゴリズムとSTLベクトルとvalarrayクラスを組み合わせても、かなり近づくことはありませんか?そうでない場合は、常にBoostのmath librariesがあります。

申し訳ありません私はあなたが探している銀色の弾丸を指摘できませんが、あなたがやろうとしていることは、これらの日はむしろ珍しいです。精度を求めている人は、通常、浮動小数点に直進します。これは、現代のプロセッサではまともな性能を備えており、多くのライブラリをサポートしています。リソースが制約されたハードウェアでスピードを望む人は、通常、精度が必要ではなく、ベクトルによってトリグを実行していないし、おそらくC++も行っていないでしょう。私はあなたの最善の選択肢はあなた自身のロールをとることだと思います。それを再考するのではなく、新しいコンテキストでホイールデザインパターンを適用するものと考えるようにしてください。 :)

+0

本当にたくさんの良い情報があります。私はブーストのジオメトリ・ライブラリを見逃してしまったことにショックを受けました(いずれにしても残忍かもしれませんが) – porgarmingduod

関連する問題