DSPの目的で、固定小数点演算でさまざまな数学関数を実装するための書籍/リソース


8

以下を詳細にカバーする本またはリソースを探しています。

  • DSPの目的で、固定小数点演算で数学関数(対数、指数、正弦、余弦、逆など)を実装する。

  • ルックアップテーブル、テイラーシリーズなどを使用するような手法

私はCプログラミングにかなり精通しており、効率的な方法でさまざまな数学関数を実装する方法についてのアルゴリズムにもっと興味があります。


1
これは1つのトリックにすぎませんが、非常に便利です。これは、atan2関数を計算すること、つまり、実数部と虚数部から複素数の引数を計算することです。
— Matt L.

1
10年以上前に開発した、最適化された有限次のべき級数をいくつか紹介します。最初のクライアント以外はお金をもらっていないので、パブリックドメインにした方がいいと思います。もともとは、クライアントがビルドにstdlibを含めることができない状況での浮動小数点用に開発されました。そして評価は少し完璧ではありません。つまり、エラーがありますが、非常に小さく、評価される特定の関数に対して最適化されています。lemmeがそのファイルを見つけたら、係数を取り出してシリーズを投稿します。
— robert bristow-johnson、2015

@ robertbristow-johnsonシリーズを活用し、それがどうなるかを楽しみにしています!ありがとう!
— RuD、2015

ルチール、以下のシリーズを投稿しました。範囲を広げるには、常識的なことが必要です。お気に入り
2x=2k×2x−k
もし k≤x≤k+1。同様のことlog2⁡()そして周期的な正弦波。expとlogの場合、これには、(expの場合)何が出るか、または(logの場合)何が入るかの算術ビットシフトが必要です。あなたはそれを考え出すことができると思います。そしてもちろん、異なるベースのexpとlog(e)、適切な定数でスケーリングするだけです 2x そして何が出てくる log2⁡(x)。
— robert bristow-johnson、2015

回答:


9

一般的な多項式の形式は次のとおりです。

f(u)=∑n=0N an un=a0+(a1+(a2+(a3+...(aN−2+(aN−1+aNu)u)u ...)u)u)u

後者の形式は、特に単精度浮動小数点でこれを行う場合に強く推奨されるホーナーの方法を使用しています。

次に、いくつかの特定の機能について:

平方根:

f(x−1)≈x1≤x≤2N=4a0=1.0a1=0.49959804148061a2=−0.12047308243453a3=0.04585425015501a4=−0.01076564682800

もし 2≤x≤4、上記を使用して評価します x2 その結果を掛けます 2 取得するため x。と同じようにlog2⁡(x)、の力を適用 2 引数を必要な範囲にスケーリングするスケーリング。

2を底とする対数:

x⋅f(x−1)≈log2⁡(x)1≤x≤2N=5a0=1.44254494359510a1=−0.7181452567504a2=0.45754919692582a3=−0.27790534462866a4=0.121797910687826a5=−0.02584144982967

基数2の指数:

f(x)≈2x0≤x≤1N=4a0=1.0a1=0.69303212081966a2=0.24137976293709a3=0.05203236900844a4=0.01355574723481

正弦:

x⋅f(x2)≈sin⁡(π2x)−1≤x≤1N=4a0=1.57079632679490a1=−0.64596406188166a2=0.07969158490912a3=−0.00467687997706a4=0.00015303015470

コサイン(サインを使用):

cos⁡(πx)=1−2sin2⁡(π2x)

正接:

tan⁡(x)=sin⁡(x)cos⁡(x)

逆正接:

xf(x2)≈arctan⁡(x)−1≤x≤1N=4a0=1.0a1=0.33288950512027a2=−0.08467922817644a3=0.03252232640125a4=−0.00749305860992

arctan⁡(x)=π2−arctan⁡(1x)1≤x

arctan⁡(x)=−π2−arctan⁡(1x)x≤−1

逆正弦:

arcsin⁡(x)=arctan⁡(x1−x2)

逆余弦:

arccos⁡(x)=π2−arcsin⁡(x)=π2−arctan⁡(x1−x2)

それはかなり便利なようです!共有していただきありがとうございます。しかし、それでも最初の参照エントリman soxが最適です;)
— jojek

知りませんsox。マニュアルはそれについて何と言っていますか?
— robert bristow-johnson、2015

2
単に[1] R. Bristow-Johnson, Cookbook formulae for audio EQ biquad filter coefficients, http://musicdsp.org/files/Audio-EQ-Cookbook.txt:)
— jojek

ちなみに、このシリーズは最大の加重誤差を最小限に抑えます。エラーは、関数にとって意味のある方法で重み付けされます。均一な最大誤差log2⁡()。比例最大誤差x そして 2x。比例のようなものsin⁡() の最大誤差がなるように、共振フィルターの係数を計算する必要があります。 log⁡(f0)最小化されます。どの基準を使用したか思い出せないarctan⁡()。どういうわけか私は私に何を教えてくれる私のファイルを見つけることができません、範囲を指定すると、最大エラーがx。MATLABを使用している誰かが知ることができます。
— ロバート・ブリストー・ジョンソン

1
可能であれば、Pythonでエラーをプロットする必要があります。またnp.max(np.abs(sqrt_1px(xp)-np.sqrt(1+xp)))、代わりnp.max(np.abs((sqrt_1px(xp)-np.sqrt(1+xp))/np.sqrt(1+xp))) に同じかもしれませんが2**x 、罪のエラーの重み付けは異なり、私はそれをどのようにしたのかを見つける必要があります。Octaveでの作業に使用していた古いMATLABスクリプトがありますが、今では古いG4 MacラップトップでOctaveをプロットすることすらできません。
— Robert bristow-johnson、2015

2

固定小数点に固有ではありませんが、Jack Crenshawによる「Math Toolkit for Real-Time Programming」の本を強くお勧めします。ソースコード付きのCDが付属しています。


2

TIには、すべての固定小数点マイクロコントローラー用のIQMathライブラリがあります。私は、それらが必ずしもTIチップに限定されない固定小数点演算およびDSP機能の宝庫であることがわかりました。

MSP430 C28X


私は関数の実装よりもアルゴリズムに関心があります
— RuD

1

チェビシェフ近似は、有限範囲で関数を近似するのに最適に近い多項式係数の計算に役立ちます。PCで近似ルーチンを実行して、特定の多項式係数のセットを達成します。これは、好きなプラットフォーム(例えば、組み込み/ DSP)に適用できます。

  • これは、1つの変数の関数に対してのみ機能します。何か機能があればz=f(x,y) そうすれば、チェビシェフ近似は役に立ちません。
  • 近似する関数は「多項式のような」ものでなければなりません。コーナー、鋭い曲がり、および多くの小刻みな動きでは、特定のレベルの精度を達成するために高次多項式が必要になります。
  • 多項式の次数を低く保つことが重要です。5を超えると、数値エラーが発生し始める可能性があります。
  • チェビシェフ近似では、ドメイン[-1,1]で評価されたチェビシェフ多項式を使用するため、関数の入力範囲が大幅に異なる場合は、係数を決定する前、およびそれらを適用する前に、入力を適切にスケーリング/オフセットする必要があります。たとえば、入力範囲の関数に関心がある場合x∈[0,20] それから私は定義するかもしれません u=(x×0.1)−1 そのため u -1から+1の範囲で、多項式を u必要な結果を計算します。このスケーリングがないと、数値エラーが発生しやすくなります。つまり、同じ精度で中間値を計算するにはより長いビット長が必要になる場合があり、これは通常望ましくありません。

ジェイソン、私はチェビシェフ多項式を使用しませんでしたが、重み付きMinMaxエラー(「L∞。、私は考え、Tchebyshev近似と同じであるエラーのノルム」)は、iを使用する方法はレメズ交換アルゴリズムであった。
— ロバート・ブリストウジョンソン

RemezはChebyshevより優れています(ただし、より複雑です)。チェビシェフはミニマックス条件を近似するだけですが、通常はそれで十分です。
— Jason S
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.