Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

cordiccexp

複素指数の CORDIC ベース近似

構文

y = cordiccexp(theta,niters)

説明

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

入力引数

theta

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

niters

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

出力引数

y

y は関数 cordiccexp の近似された複素数の結果です。関数への入力が浮動小数点である場合、出力のデータ型は入力のデータ型と同じです。入力が固定小数点である場合、出力の語長は入力の語長と等しく、小数部の長さは WordLength2 と等しくなります。

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

wrdLn = 8;
theta = fi(pi/2, 1, wrdLn);
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:(wrdLn - 1)
  cis    = cordiccexp(theta, niters);
  fl     = cis.FractionLength;
  x      = real(cis);
  y      = imag(cis);
  x_dbl  = double(x);
  x_err  = abs(x_dbl - cos(double(theta)));
  y_dbl  = double(y);
  y_err  = abs(y_dbl - sin(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(fl)), x_dbl, x_err,(x_err * pow2(fl)));
end
fprintf('\n');

以下のような出力テーブルが表示されます。

NITERS   Y (SIN)  ERROR   LSBs    X (COS)  ERROR   LSBs
------    -------  ------  ----   -------  ------  ----
1         0.7031   0.2968  19.0    0.7031   0.7105  45.5
2         0.9375   0.0625  4.0     0.3125   0.3198  20.5
3         0.9844   0.0156  1.0     0.0938   0.1011  6.5
4         0.9844   0.0156  1.0     -0.0156  0.0083  0.5
5         1.0000   0.0000  0.0     0.0312   0.0386  2.5
6         1.0000   0.0000  0.0     0.0000   0.0073  0.5
7         1.0000   0.0000  0.0     0.0156   0.0230  1.5

詳細

すべて折りたたむ

CORDIC

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

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

アルゴリズム

すべて折りたたむ

信号の流れ図

CORDIC 回転モード カーネル

X は実数部を表し、Y は虚数部を表し、Z はシータを表します。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 が追加されていません。

拡張機能

R2010a で導入