y(n)=32677Sin(45/1024•n)
を計算したいのですが、y
は整数で、n
の範囲は0〜2048です。このプロセスをより迅速かつ正確に行うにはどうすればよいですか?ここで、参照回答をお見せしたいと思います。Sin(a+b)=Sin(a)Cos(b)+Cos(a)Sin(b)
およびCos(a+b)=Cos(a)Cos(b)-Sin(a)Cos(b)
からです。したがって、Sin(45/1024•1)
とCos(45/1024•1)
のみを保存できます。次に、次の式を使用します。
Sin(45/1024•2)=Sin(45/1024•1+45/1024•1)
、Cos(45/1024•2)=Cos(45/1024•1+45/1024•1)
、Sin(45/1024•n)=Sin(45/1024•(n-1)+45/1024•1)
、Cos(45/1024•n)=Cos(45/1024•(n-1)+45/1024•1)
、この方法は、大きな配列を格納せずに高速化できます。
n
の範囲が0〜2048の場合、値を事前に計算して、配列に格納できます。 y(n)
はvalues[n]
になります。
実行時ではなくコンパイル時にテーブルを計算します。
あなたは、16ビットのスケーリングされた整数値の2048要素のテーブルを実行しています。
安価なMatlabスクリプトを作成し、最終的なプログラミング言語に適したデータ行を提供する印刷物を作成します。結果を定数データテーブルとしてソースコードにカットアンドペーストし、実行時にテーブルルックアップを実行します。これにより、プログラムの起動時間ではなく、初期計算時間がビルドサイクルに組み込まれます。
関数の形式を考えると、自然な答えは CORDICアルゴリズム です。これは、質問の内訳よりもはるかにクリーンなアプローチです。一方、必要なテーブルは、他の人が提案したテーブルよりもはるかに小さくなっています。