Main Content

cordiccexp

複素指数の CORDIC ベース近似

説明

y = cordiccexp(theta) は、CORDIC アルゴリズム近似を使用して cos(theta) + j*sin(theta) を計算し、近似された複素数の結果を y で返します。

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

すべて折りたたむ

次の例は、cordiccexp の近似の結果への反復回数の効果を示します。

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

output_type = fi([], 1,wl,wl - 2);
results_array = zeros(wl - 1,1,'like',output_type)';

for niters = 1:(wl - 1)
  cis    = cordiccexp(theta,niters);
  fl     = cis.FractionLength;
  x      = real(cis);
  y      = imag(cis);

  x_dbl  = double(x);
  y_dbl  = double(y);

  x_err  = abs(x_dbl - cos(double(theta)));
  y_err  = abs(y_dbl - sin(double(theta)));

  result = [niters,y_dbl,y_err,(y_err*pow2(fl)),...
      x_dbl,x_err,(x_err*pow2(fl))];
  results_array = [results_array; result];
end

results_table = array2table(results_array,'VariableNames',{'NITERS','Y (SIN)','Y ERROR','Y LSBs','X (COS)','X ERROR','X LSBs'})
results_table =

  8×7 table

    NITERS    Y (SIN)    Y ERROR     Y LSBs    X (COS)     X ERROR     X LSBs 
    ______    _______    ________    ______    ________    ________    _______

         0          0           0         0           0           0          0
         1    0.70312     0.29688    1.9844    -0.70312     0.70312     1.9844
    1.9844     0.9375      0.0625    1.9844     -0.3125      0.3125     1.9844
    1.9844    0.96875     0.03125    1.9844     -0.0625      0.0625     1.9844
    1.9844    0.96875     0.03125    1.9844      0.0625      0.0625     1.9844
    1.9844    0.98438    0.015625         1           0           0    0.46875
    1.9844    0.98438    0.015625         1     0.03125     0.03125     1.9844
    1.9844          1           0         0    0.015625    0.015625     1.4688

入力引数

すべて折りたたむ

入力配列。符号付きまたは符号なしのスカラー、ベクトル、行列、または多次元配列として指定します。theta のすべての値は実数で、範囲 [-2π 2π) 内になければなりません。

入力が fi オブジェクトの場合は、2 進小数点スケーリングを使用する必要があります。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | fi

CORDIC アルゴリズムで実行する反復回数。正のスカラー整数として指定します。反復数を増やすと、結果の精度が高まりますが、計算量も増加しレイテンシも増えます。

niters を指定しない場合や指定した値が大きすぎた場合は、アルゴリズムでは入力のデータ型に基づく最大値が使用されます。

  • 固定小数点入力 — 反復の最大回数は theta の語長よりも 1 少なくなります。

  • 浮動小数点入力 — 最大値は、double の場合は 52single の場合は 23 です。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | fi

出力引数

すべて折りたたむ

近似複素指数 e^(j*theta)。スカラー、ベクトル、行列、または多次元配列として返されます。出力のデータ型は入力によって異なります。

  • 入力 theta が浮動小数点の場合、出力データ型は入力型と同じになります。

  • 入力 theta が固定小数点である場合、出力の語長は入力の語長と等しく、小数部の長さは語長から 2 を引いた長さと等しくなります。

詳細

すべて折りたたむ

CORDIC

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

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

アルゴリズム

すべて折りたたむ

信号の流れ図

CORDIC 回転モード カーネル

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

  • z0 は入力引数値 θ に初期化されます。

  • x01/AN に初期化されます。

  • y0 は 0 に初期化されます。

fimath の伝播ルール

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

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

  • OverflowActionWrap

  • RoundingMethodFloor

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

拡張機能

バージョン履歴

R2010a で導入