Main Content

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

cordicsqrt

平方根の CORDIC ベースの近似

説明

y=cordicsqrt(u) は CORDIC アルゴリズムの実装を使用して u の平方根を計算します。

y=cordicsqrt(u, niters) は CORDIC アルゴリズムの niters 反復を実行して u の平方根を計算します。

y=cordicsqrt(___, 'ScaleOutput', B) では、B のブール値に基づいて、出力がスケールされます。

すべて折りたたむ

CORDIC の実装を使用して fi オブジェクト x の平方根を計算します。

x = fi(1.6,1,12);
y = cordicsqrt(x)
y = 
    1.2646

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 12
        FractionLength: 10

niters を指定しなかったので、関数は最大の反復回数 x.WordLength - 1 を実行します。

関数 cordicsqrt と倍精度の関数 sqrt の結果の差分を計算します。

err = abs(sqrt(double(x))-double(y))
err = 1.0821e-04

CORDIC カーネルの 3 回の反復により x の平方根を計算します。

x = fi(1.6,1,12);
y = cordicsqrt(x,3)
y = 
    1.2646

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 12
        FractionLength: 10

関数 cordicsqrt と倍精度の関数 sqrt の結果の差分を計算します。

err = abs(sqrt(double(x))-double(y))
err = 1.0821e-04
x = fi(1.6,1,12);
y = cordicsqrt(x, 'ScaleOutput', 0)
y = 
    1.0479

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 12
        FractionLength: 10

出力 y は逆 CORDIC ゲイン係数によってスケーリングされませんでした。

cordicsqrt アルゴリズムの 10 回の反復の計算結果を、倍精度の関数 sqrt の結果と比較します。

% Create 500 points between [0, 2)
stepSize = 2/500;
XDbl = 0:stepSize:2;
XFxp = fi(XDbl, 1, 12);    % signed, 12-bit fixed-point
sqrtXRef = sqrt(double(XFxp));   % reference results

% Use 12-bit quantized inputs and set the number
% of iterations to 10.
% Compare the  fixed-point CORDIC results to the
% double-precision sqrt function results.

niters = 10;
cdcSqrtX  = cordicsqrt(XFxp,  niters);
errCdcRef = sqrtXRef - double(cdcSqrtX);
figure
hold on
axis([0 2 -.5 1.5])
plot(XFxp, sqrtXRef,  'b')
plot(XFxp, cdcSqrtX,  'g')
plot(XFxp, errCdcRef, 'r')
ylabel('Sqrt(x)')
gca.XTick = 0:0.25:2;
gca.XTickLabel = {'0','0.25','0.5','0.75','1','1.25','1.5','1.75','2'};
gca.YTick = -.5:.25:1.5;
gca.YTickLabel = {'-0.5','-0.25','0','0.25','0.5','0.75','1','1.25','1.5'};
ref_str = 'Reference: sqrt(double(X))';
cdc_str = sprintf('12-bit CORDIC square root; N = %d', niters);
err_str = sprintf('Error (max = %f)', max(abs(errCdcRef)));
legend(ref_str, cdc_str, err_str, 'Location', 'southeast')

Figure contains an axes object. The axes object with ylabel Sqrt(x) contains 3 objects of type line. These objects represent Reference: sqrt(double(X)), 12-bit CORDIC square root; N = 10, Error (max = 0.002009).

入力引数

すべて折りたたむ

データ入力配列。正のスカラー、ベクトル、行列、あるいは固定小数点または組み込みデータ型の多次元配列として指定します。入力配列が 0.5 ~ 2 の値を含む場合に、このアルゴリズムは最も正確になります。事前正規化と事後正規化プロセスは、この範囲外の入力値に対して実行されます。このプロセスの詳細は、事前正規化と事後正規化を参照してください。

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

CORDIC アルゴリズムを実行する反復回数。正の整数値スカラーとして指定します。niters を指定しない場合、アルゴリズムは既定値を使用します。固定小数点入力では、niters の既定値は u.WordLength - 1 です。浮動小数点入力では、niters の既定値は倍精度では 52、単精度では 23 です。

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

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

データ型: logical

出力引数

すべて折りたたむ

出力配列。スカラー、ベクトル、行列または多次元配列として返されます。

詳細

すべて折りたたむ

CORDIC

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

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

アルゴリズム

すべて折りたたむ

信号の流れ図

事前正規化および事後正規化プロセスの詳細は、事前正規化と事後正規化を参照してください。

CORDIC 双曲線カーネル

X は u'+.25 に初期化され、Y は u'-.25 に初期化されます。ここで、u' は正規化された関数入力です。

CORDIC 双曲線カーネルを繰り返し反復することで、X は ANu' に近づきます。ここで、AN は CORDIC ゲインを表します。Y は 0 に近づきます。

事前正規化と事後正規化

[0.5, 2) の範囲外の入力値には、事前および事後正規化プロセスが発生します。このプロセスでは、入力配列に対してビットシフトを実行し、その後 CORDIC カーネルに渡します。その後、事後正規化段階中に結果が正しい出力範囲に戻ります。このプロセスの詳細については、CORDIC を使用した平方根の計算の「アルゴリズム入力範囲制限の回避」を参照してください。

fimath の伝播ルール

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

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

  • OverflowActionWrap

  • RoundingMethodFloor

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

参照

[1] Volder, JE. “The CORDIC Trigonometric Computing Technique.” IRE Transactions on Electronic Computers. Vol. EC-8, September 1959, pp. 330–334.

[2] Andraka, R. “A survey of CORDIC algorithm for FPGA based computers.” Proceedings of the 1998 ACM/SIGDA sixth international symposium on Field programmable gate arrays. Feb. 22–24, 1998, pp. 191–200.

[3] Walther, J.S. “A Unified Algorithm for Elementary Functions.” Hewlett-Packard Company, Palo Alto. Spring Joint Computer Conference, 1971, pp. 379–386. (from the collection of the Computer History Museum). www.computer.org/csdl/proceedings/afips/1971/5077/00/50770379.pdf

[4] Schelin, Charles W. “Calculator Function Approximation.” The American Mathematical Monthly. Vol. 90, No. 5, May 1983, pp. 317–325.

拡張機能

バージョン履歴

R2014a で導入