Main Content

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

cordicpol2cart

極座標から直交座標への変換の CORDIC ベースの近似

構文

[x,y] = cordicpol2cart(theta,r)
[x,y] = cordicpol2cart(theta,r,niters)
[x,y] = cordicpol2cart(theta,r,Name,Value)
[x,y] = cordicpol2cart(theta,r,niters,Name,Value)

説明

[x,y] = cordicpol2cart(theta,r) では、CORDIC アルゴリズム近似を使用して、r* e^(j*theta) の直交座標の xy 座標が返されます。

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

[x,y] = cordicpol2cart(theta,r,Name,Value) では、b のブール値に基づいて、出力がスケールされます。

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

入力引数

theta

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

r

r は入力ゲイン値を含み、スカラーとなることができ、theta と同じ次元をもちます。r は実数の値をもたなければなりません。

niters

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

名前と値のペアの引数

オプションのコンマ区切りの Name,Value の引数ペア。ここで、Name は引数名で、Value は対応する値です。Name は一重引用符 ('') で囲まなければなりません。

ScaleOutput

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

既定値: true

出力引数

[x,y]

[x,y] には、近似された直交座標が含まれています。入力 r が浮動小数点である場合、出力 [x,y] は入力と同じデータ型をもちます。

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

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

次のコードを実行して、CORDIC ベースの極座標から直交座標への変換の精度を評価します。

wrdLn = 16;
theta = fi(pi/3, 1, wrdLn);
u     = fi( 2.0, 1, wrdLn);

fprintf('\n\nNITERS\tX\t\t ERROR\t LSBs\t\tY\t\t ERROR\t LSBs\n');
fprintf('------\t-------\t ------\t ----\t\t-------\t ------\t ----\n');
for niters = 1:(wrdLn - 1)
 [x_ref, y_ref] = pol2cart(double(theta),double(u));
 [x_fi,  y_fi] = cordicpol2cart(theta, u, niters);
 x_dbl  = double(x_fi);
 y_dbl  = double(y_fi);
 x_err  = abs(x_dbl - x_ref);
 y_err  = abs(y_dbl - y_ref);
 fprintf('%d\t%1.4f\t %1.4f\t %1.1f\t\t%1.4f\t %1.4f\t %1.1f\n',...
   niters,x_dbl,x_err,(x_err * pow2(x_fi.FractionLength)),...
   y_dbl,y_err,(y_err * pow2(y_fi.FractionLength)));
end
fprintf('\n');

NITERS  X        ERROR    LSBs      Y      ERROR   LSBs
------	-------	 ------	 ----		-------	 ------	 ----
   1	   1.4142   0.4142   3392.8  1.4142   0.3178   2603.8
   2	   0.6324   0.3676   3011.2  1.8973   0.1653   1354.2
   3	   1.0737   0.0737   603.8   1.6873   0.0448   366.8
   4	   0.8561   0.1440   1179.2  1.8074   0.0753   617.2
   5	   0.9672   0.0329   269.2   1.7505   0.0185   151.2
   6	   1.0214   0.0213   174.8   1.7195   0.0126   102.8
   7	   0.9944   0.0056   46.2    1.7351   0.0031   25.2
   8	   1.0079   0.0079   64.8    1.7274   0.0046   37.8
   9	   1.0011   0.0011   8.8     1.7313   0.0007   5.8
   10   0.9978   0.0022   18.2    1.7333   0.0012   10.2
   11   0.9994   0.0006   5.2     1.7323   0.0003   2.2
   12   1.0002   0.0002   1.8     1.7318   0.0002   1.8
   13   0.9999   0.0002   1.2     1.7321   0.0000   0.2
   14   0.9996   0.0004   3.2     1.7321   0.0000   0.2
   15   0.9998   0.0003   2.2     1.7321   0.0000   0.2

詳細

すべて折りたたむ

CORDIC

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

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

アルゴリズム

すべて折りたたむ

信号の流れ図

CORDIC 回転モード カーネル

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

fimath の伝播ルール

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

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

  • OverflowActionWrap

  • RoundingMethodFloor

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

拡張機能

R2011a で導入