メインコンテンツ

cordicrotate

入力の回転の CORDIC ベース近似

説明

v = cordicrotate(theta,u) では、CORDIC アルゴリズム近似を使用して、入力 utheta だけ回転されます。この関数では、u .* e^(j*theta) の結果が返されます。

v = cordicrotate(theta,u,niters) では、アルゴリズムの反復が niters 回実行されます。

v = cordicrotate(___,ScaleOutput) は、出力をスケーリングするかどうかを指定します。

すべて折りたたむ

次のコードを実行して、CORDIC ベースの複雑な回転の精度を評価します。

wrdLn = 16;
theta = fi(-pi/3, 1, wrdLn);
u     = fi(0.25 - 7.1i, 1, wrdLn);
uTeTh = double(u) .* exp(1i * double(theta));

fprintf('\n\nNITERS\tReal\t ERROR\t LSBs\t\tImag\tERROR\tLSBs\n');
fprintf('------\t-------\t ------\t ----\t\t-------\t------\t----\n');
for niters = 1:(wrdLn - 1)
 v_fi   = cordicrotate(theta, u, niters);
 v_dbl  = double(v_fi);
 x_err  = abs(real(v_dbl) - real(uTeTh));
  y_err  = abs(imag(v_dbl) - imag(uTeTh));
 fprintf('%d\t%1.4f\t %1.4f\t %1.1f\t\t%1.4f\t %1.4f\t %1.1f\n',...
   niters, real(v_dbl),x_err,(x_err * pow2(v_fi.FractionLength)), ...
   imag(v_dbl),y_err, (y_err * pow2(v_fi.FractionLength)));
end
fprintf('\n');
NITERS  Real      ERROR	 LSBs	Imag	    ERROR	LSBs
------  -------   ------	 ----      -------	------	----
1       -4.8438   1.1800	 4833.5    -5.1973	 1.4306	 5859.8
2       -6.6567   0.6329	 2592.5    -2.4824	 1.2842	 5260.2
3       -5.8560   0.1678	 687.5     -4.0229	 0.2563	 1049.8
4       -6.3096   0.2858	 1170.5    -3.2654	 0.5013	 2053.2
5       -6.0935   0.0697	 285.5     -3.6526	 0.1141	 467.2
6       -5.9766   0.0472	 193.5     -3.8413	 0.0746	 305.8
7       -6.0356   0.0118	 48.5      -3.7473	 0.0193	 79.2
8       -6.0063   0.0175	 71.5      -3.7947	 0.0280	 114.8
9       -6.0212   0.0026	 10.5      -3.7710	 0.0043	 17.8
10      -6.0283   0.0045	 18.5      -3.7590	 0.0076	 31.2
11      -6.0247   0.0009	 3.5       -3.7649	 0.0018	 7.2
12      -6.0227   0.0011	 4.5       -3.7678	 0.0012	 4.8
13      -6.0237   0.0001	 0.5       -3.7664	 0.0003	 1.2
14      -6.0244   0.0006	 2.5       -3.7656	 0.0010	 4.2
15      -6.0239   0.0001	 0.5       -3.7661	 0.0005	 2.2

入力引数

すべて折りたたむ

ラジアン単位の角度値。符号付きまたは符号なしのスカラー、ベクトル、行列、または多次元配列として指定します。theta のすべての値は範囲 [–2π 2π) になければなりません。

入力配列。符号付きまたは符号なしのスカラー、ベクトル、行列、または多次元配列として指定します。u は、スカラー値とするか、theta と同じ次元をもつことができます。u は実数または複素数の値にできます。

CORDIC アルゴリズムを実行する反復回数。正の整数値スカラーとして指定します。この引数はオプションです。niters を指定しない場合や指定した値が大きすぎた場合は、アルゴリズムでは最大値が使用されます。

  • 固定小数点の演算では、反復の最大回数は u の語長、または theta の語長から 1 を引いた数のうち、小さいほうになります。

  • 浮動小数点の演算では、最大値は double で 52、single で 23 です。

逆 CORDIC ゲイン ファクターによって出力をスケーリングするかどうか。ブール値として指定します。この引数はオプションです。ScaleOutputtrue または 1 に設定すると、出力値は定数で乗算され、余分な計算が必要になります。ScaleOutputfalse または 0 に設定した場合は、出力はスケールされません。

出力引数

すべて折りたたむ

出力 v のデータ型は入力 u のデータ型によって異なります。

  • 入力 u が浮動小数点である場合、出力 v は入力と同じデータ型をもちます。

  • 入力 u"符号付き" の整数または固定小数点のデータ型の場合、出力 v は符号付きの fi オブジェクトです。この fi オブジェクトは、u よりも 2 ビット長い語長をもちます。また、小数部の長さは u と同じです。

  • 入力 u が "符号なし" の整数または固定小数点の場合、出力 v は符号付きの fi オブジェクトです。この fi オブジェクトは、u よりも 3 ビット長い語長をもちます。また、小数部の長さは u と同じです。

アルゴリズム

すべて折りたたむ

参照

[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.

拡張機能

すべて展開する

バージョン履歴

R2011a で導入