Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

cordicsincos

正弦および余弦の CORDIC ベース近似

説明

[y,x] = cordicsincos(theta) は、CORDIC アルゴリズム近似を使用して theta の正弦および余弦を計算します。y には、近似された正弦の結果が含まれ、x には近似された余弦の結果が含まれます。

[y,x] = cordicsincos(theta,niters) は、CORDIC アルゴリズムの反復を niters で指定された回数だけ実行します。

すべて折りたたむ

正弦および余弦の CORDIC 近似の結果に対する反復回数の影響を確認します。

wordlength = 8;
theta = fi(pi/2,1,wordlength);

fprintf('\n\nNITERS\t\tY (SIN)\t ERROR\t LSBs\t\tX (COS)\t ERROR\t LSBs\n');
fprintf('------\t\t-------\t ------\t ----\t\t-------\t ------\t ----\n');

for niters = 1:(wordlength - 1)
  [y,x] = cordicsincos(theta,niters);
  y_FL   = y.FractionLength;
  y_dbl  = double(y);
  x_dbl  = double(x);
  y_err  = abs(y_dbl - sin(double(theta)));
  x_err  = abs(x_dbl - cos(double(theta)));
  fprintf(' %d\t\t%1.4f\t %1.4f\t %1.1f\t\t%1.4f\t %1.4f\t %1.1f\n', ...
      niters,y_dbl,y_err,(y_err*pow2(y_FL)),x_dbl,x_err, ...
      (x_err*pow2(y_FL)));
end

fprintf('\n');

NITERS		Y (SIN)	 ERROR	 LSBs		X (COS)	 ERROR	 LSBs
------		-------	 ------	 ----		-------	 ------	 ----
 1		0.7031	 0.2968	 19.0		-0.7031	 0.6958	 44.5
 2		0.9375	 0.0625	 4.0		-0.3125	 0.3052	 19.5
 3		0.9688	 0.0312	 2.0		-0.0625	 0.0552	 3.5
 4		0.9688	 0.0312	 2.0		0.0625	 0.0698	 4.5
 5		0.9844	 0.0156	 1.0		0.0000	 0.0073	 0.5
 6		0.9844	 0.0156	 1.0		0.0312	 0.0386	 2.5
 7		1.0000	 0.0000	 0.0		0.0156	 0.0230	 1.5

入力引数

すべて折りたたむ

入力角度 (ラジアン単位)。スカラー、ベクトル、行列、または多次元配列として指定します。theta のすべての値は範囲 [-2*pi,2*pi) になければなりません。theta が固定小数点データ型をもつ場合は、符号付きでなければなりません。

CORDIC アルゴリズムを実行する反復回数。正の整数値スカラーとして指定します。

niters を指定しない場合や指定した値が大きすぎた場合は、アルゴリズムでは最大値が使用されます。固定小数点の演算では、反復の最大回数は theta の語長よりも 1 回少なくなります。浮動小数点の演算では、最大値は double で 52、single で 23 です。

反復数を増やすと、結果の精度が高まりますが、計算量も増加しレイテンシも増えます。

出力引数

すべて折りたたむ

theta の CORDIC ベースの近似された正弦。スカラー、ベクトル、行列、または多次元配列として返されます。関数への入力が浮動小数点である場合、出力のデータ型は入力のデータ型と同じです。入力が固定小数点である場合、出力の語長は入力と同じで、小数部の長さは Wordlength - 2 と等しくなります。

theta の CORDIC ベースの近似された余弦。スカラー、ベクトル、行列、または多次元配列として返されます。関数への入力が浮動小数点である場合、出力のデータ型は入力のデータ型と同じです。入力が固定小数点である場合、出力の語長は入力と同じで、小数部の長さは Wordlength - 2 と等しくなります。

詳細

すべて折りたたむ

CORDIC

CORDIC は、COordinate Rotation DIgital Computer の略語です。ギブンス回転に基づく CORDIC アルゴリズムは、Shift-Add 反復演算のみを必要とするため、ハードウェア効率が最も優れたアルゴリズムの 1 つです (参照を参照)。CORDIC アルゴリズムは、明示的な乗数を必要としません。CORDIC を使用すると、正弦関数、余弦関数、逆正弦関数、逆余弦関数、逆正接関数、ベクトル振幅関数などのさまざまな関数を計算できます。また、このアルゴリズムは除算、平方根、双曲線、対数などの関数にも使用できます。

CORDIC の反復数を増やすと、結果の精度が高まりますが、計算量も増加しレイテンシも増えます。

アルゴリズム

すべて折りたたむ

信号の流れ図

CORDIC 回転モード カーネル

X は正弦を表し、Y は余弦を表し、Z は theta を表します。CORDIC 回転モード カーネルの精度は X、Y および Z の初期値の選択に依存します。このアルゴリズムは以下の初期値を使用します。

z0 is initialized to the θ input argument valuex0 is initialized to 1ANy0 is initialized to 0

fimath の伝播ルール

CORDIC 関数は、入力に追加されたすべてのローカル fimath を破棄します。

CORDIC 関数は、計算の実行時に独自の内部 fimath を使用します。

  • OverflowActionWrap

  • RoundingMethodFloor

出力には fimath が追加されていません。

参照

[1] Volder, Jack E. “The CORDIC Trigonometric Computing Technique.” IRE Transactions on Electronic Computers. EC-8, no. 3 (Sept. 1959): 330–334.

[2] Andraka, Ray. “A Survey of CORDIC Algorithm for FPGA Based Computers.” In Proceedings of the 1998 ACM/SIGDA Sixth International Symposium on Field Programmable Gate Arrays, 191-200. https://dl.acm.org/doi/10.1145/275107.275139.

[3] Walther, J.S. “A Unified Algorithm for Elementary Functions.” In Proceedings of the May 18-20, 1971 Spring Joint Computer Conference, 379-386. https://dl.acm.org/doi/10.1145/1478786.1478840.

[4] Schelin, Charles W. “Calculator Function Approximation.” The American Mathematical Monthly, no. 5 (May 1983): 317-325. https://doi.org/10.2307/2975781.

拡張機能

バージョン履歴

R2010a で導入