Main Content

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

cordicrotate

CORDIC ベースの近似を使用して入力を回転

構文

v = cordicrotate(theta,u)
v = cordicrotate(theta,u,niters)
v = cordicrotate(theta,u,Name,Value)
v = cordicrotate(theta,u,niters,Name,Value)

説明

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

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

v = cordicrotate(theta,u,Name,Value) では、ブール値 b に基づいて、出力がスケールされます。

v = cordicrotate(theta,u,niters,Name,Value) では、反復の回数と、出力をスケールするかどうかに関する Name,Value の組の両方が指定されます。

入力引数

theta

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

u

u は、符号付きまたは符号なしのスカラー値とするか、theta と同じ次元をもつことができます。u は実数または複素数の値にできます。

niters

niters は、CORDIC アルゴリズムによって実行される反復の回数です。この引数はオプションです。指定する場合、niters は正の整数で、スカラーでなければなりません。niters を指定しない場合や指定した値が大きすぎた場合は、アルゴリズムでは最大値が使用されます。固定小数点の演算では、反復の最大回数は u の語長、または theta の語長から 1 を引いた数のうち、小さいほうになります。浮動小数点の演算では、最大値は double で 52、single で 23 です。反復数を増やすと、結果の精度が高まりますが、計算量も増加しレイテンシも増えます。

ScaleOutput

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

既定値: true

出力引数

v

v は CORDIC 回転アルゴリズムの近似された結果を含みます。入力 u が浮動小数点である場合、出力 v は入力と同じデータ型をもちます。

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

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

次のコードを実行して、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.0227  0.2560  1048.8
4      -6.3098   0.2860   1171.5  -3.2649  0.5018  2055.2
5      -6.0935   0.0697   285.5   -3.6528  0.1138  466.2
6      -5.9766   0.0472   193.5   -3.8413  0.0746  305.8
7      -6.0359   0.0121   49.5    -3.7476  0.0191  78.2
8      -6.0061   0.0177   72.5    -3.7947  0.0280  114.8
9      -6.0210   0.0028   11.5    -3.7710  0.0043  17.8
10     -6.0286   0.0048   19.5    -3.7590  0.0076  31.2
11     -6.0247   0.0009   3.5   	 -3.7651  0.0015  6.2
12     -6.0227   0.0011   4.5  	  -3.7683  0.0017  6.8
13     -6.0237   0.0001   0.5   	 -3.7666  0.0001  0.2
14     -6.0242   0.0004   1.5   	 -3.7656  0.0010  4.2
15     -6.0239   0.0001   0.5   	 -3.7661  0.0005  2.2

詳細

すべて折りたたむ

CORDIC

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

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

アルゴリズム

すべて折りたたむ

信号の流れ図

CORDIC 回転モード カーネル

X は実数部を表し、Y は虚数部を表し、Z はシータを表します。このアルゴリズムは、X、Y および Z の初期値を入力の utheta から取得します。

fimath の伝播ルール

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

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

  • OverflowActionWrap

  • RoundingMethodFloor

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

拡張機能

バージョン履歴

R2011a で導入