3

特定の組み込みシステムのlibmathには、 fp操作単位がないなどの機能がsinありません。cos

ルックアップテーブルを介して関数を提供するライブラリはありますか?実際には100%信頼できる値は必要ありません。

4

5 に答える 5

2

ハードウェア浮動小数点のないターゲットのより良い方法は、おそらく固定小数点とCORDICアルゴリズムを使用することです。

Anthony Williamsの固定小数点数学ライブラリは、同じターゲット上のソフトウェア浮動小数点fixedよりも通常約5倍高速なデータ型の標準数学ライブラリの完全な類似物を提供します。これはC++ライブラリですが、コンパイラがC ++をサポートしている限り、コードの残りの部分でC++固有の機能が使用されていなくても問題はありません。ほとんどの場合、このライブラリを使用するためにコードを移植するために必要なのは、math.hをfixed.hppに置き換え、typeキーワードとtypeを置き換えることだけです。floatdoublefixed

于 2013-02-08T09:28:10.893 に答える
2

速度と精度に必要な要件に応じて、ルックアップテーブルを作成するプログラムを作成することにより、単純なルックアップテーブルに必要な関数を作成できます。または、CORDICを使用します。

于 2013-02-08T07:48:27.237 に答える
1

sin / cos関数を提供するシステム用のライブラリ、またはメモリ内のルックアップテーブルがない場合は、非常に簡単に作成できます。

次のmatlab関数はsin(x)、acヘッダーで([0,2*pi]範囲と2*pi / 100ステップ)を提供しますmyheader.h

step=2*pi/100;
x=[0:step:2*pi];
y=floor(0.5 * 65535 * sin(x));

fd=fopen('myheader.h','wt');
fprintf(fd,'int16_t y[%d]={%g',length(y),y(1));
fprintf(fd,',\n %.9g',y(2:end));
fprintf(fd,'};\n');
fclose(fd);

ヘッダーは次のようになります。

int16_t y[101]={0,
 2057,
 4107,
 6140,
 8149,
 10126,
 12063,
 13952,
 15786,
 17558,
 19260,
 20887,
 22431,
 23886,
 25248,
 26509,
 27667,
 28714,
 29649,
 30466,
 31164,
 31738,
 32187,
 32509,
 32703,
 32767,
 32703,
 32509,
 32187,
 31738,
 31164,
 30466,
 29649,
 28714,
 27667,
 26509,
 25248,
 23886,
 22431,
 20887,
 19260,
 17558,
 15786,
 13952,
 12063,
 10126,
 8149,
 6140,
 4107,
 2057,
 -0,
 -2057,
 -4107,
 -6140,
 -8149,
 -10126,
 -12063,
 -13952,
 -15786,
 -17558,
 -19260,
 -20887,
 -22431,
 -23886,
 -25248,
 -26509,
 -27667,
 -28714,
 -29649,
 -30466,
 -31164,
 -31738,
 -32187,
 -32509,
 -32703,
 -32768,
 -32703,
 -32509,
 -32187,
 -31738,
 -31164,
 -30466,
 -29649,
 -28714,
 -27667,
 -26509,
 -25248,
 -23886,
 -22431,
 -20887,
 -19260,
 -17558,
 -15786,
 -13952,
 -12063,
 -10126,
 -8149,
 -6140,
 -4107,
 -2057,
 -0};
于 2013-02-08T08:20:13.207 に答える
0

Jack Ganssleには、組み込みシステムのトリガーの最適化に関する優れた記事があります。

http://www.ganssle.com/approx/approx.pdf

于 2013-02-08T12:00:28.583 に答える
0

独自のライブラリを作成することの難しさに比べて、デザインの選択肢やパラメータ化が多すぎるため、このようなライブラリを提供することは意味がないと思います。つまり、これらはどれも非常に難しいことではありませんが、万能のソリューションとして提供することはできません。

  • パラメータ:

    • sin / cosの引数==(符号なし)vs(符号付き)
    • short、int、float、fixed point
    • 範囲:制限付き(mod pi、mod 2pi)
    • 引数のラジアン、度、またはその他のものです(例:2pi == 65536 == 0)
  • その価値

    • 浮動小数点vs.固定小数点vs.スケーリングされた整数
    • 第1象限のみ、完全または拡張範囲(引数のモジュロ削減は不要)
    • サインとコサインの両方、または単にサイン
  • 要件

    • コードサイズ
    • データサイズ
    • 実行速度
      • 「一定」対。
      • 多くのバリエーションが許可されています
    • 精度
      • 最小二乗メトリックを最小化する
      • 最大誤差を最小限に抑える
      • 最小化1-sin(x)^ 2-cos(x)^2エラー
  • 方法

    • 直接a=LUT [b]
    • 象限に応じたミラーリング:a = sign(b)* LUT [b ^ mirror(b)]; //概念式
    • コーディック
    • 3次または5次のテイラー多項式
    • 2つのLUTテーブルを使用して(角度)精度を追加LUTA(x)= sin(x); LUTB(x)= sin(x / 256)および角度の合計の式
于 2013-02-08T12:40:01.397 に答える