13

私はダブルスを使用するCコードを持っています。私は、DSP(TMS320)でコードを実行できるようにしたい。しかしDSPは倍精度をサポートしておらず、固定小数点数しかサポートしていません。コードを固定小数点に変換する最善の方法は何ですか?固定小数点数(整数として実装されている)に適したCライブラリがありますか?浮動小数点Cコードを固定小数点に変換するにはどうすればよいですか?

+3

これはかなり大きなトピックです。このSOの質問には素晴らしい議論があります:http://stackoverflow.com/questions/79677/whats-the-best-way-to-do-fixed-point-mathちょうどすべての答えにいくつかの役に立つナゲットがありました。 – mtrw

+1

DSPのコンパイラはどのように固定小数点を表していますか? 2つの整数として?たとえば、2つの固定小数点数を一緒に追加する方法はありますか? – chrisaycock

+0

これらは32ビットの値( 'long')で表され、型に暗黙のシフトがあります。たとえば、ポイント( '_iq16')の後に16ビットがある場合、固定小数点数1.0を基になる型の整数65536で表します。同じタイプの固定小数点数を加算したり減算したりするには、標準の整数演算を使用できます。乗算にはスケーリングを修正するために余分なシフトが必要です。 – starblue

答えて

8

TIは「IQmath」と呼ばれる固定小数点ライブラリを提供します:変換

http://focus.ti.com/lit/sw/sprc990/sprc990.pdf

は、あなたの現在のコードを分析する必要 - 各変数のためにあなたはそれが保持できる範囲かを知る必要があり、どのような精度は必要。次に、どのタイプを格納するかを決めることができます。IQMathはq30から+/- 2の範囲と0.0000000001〜q1の精度を持ち、範囲は〜+/- 100万で精度は0.5です。おそらく変数の範囲をオーバーフローすることができます操作について

、あなたがオーバーフローのためのチェックを追加し、それを処理する方法を決定する必要がある - など、最大でそれをピン、異なるスケールで保存し、エラーを発生させる

実際には、プロセスのデータフローを深く理解することなく、固定小数点に変換する方法はありません。

5

ほとんどのDSPツールチェーンには、ソフトウェアの浮動小数点エミュレーション用ライブラリが含まれています。これは遅くなりますが、最初に浮動小数点サポートでコードを構築してから、十分な性能を得るために固定小数点に変換する必要がある場所がいくつかあるかどうかを調べるプロファイルを作成する必要があります。また、処理中に何かを失っていないことを確認するために、固定小数点に移植する際の比較を提供するために浮動小数点演算を実行する必要があります。

0

あなたのためにこれを行うライブラリがいくつかあります。あなたのデバイス用のPSPには、数種類の数学ライブラリが含まれているはずです。それは文書化されるべきです。 PSPで提供されているAPIを使用すると、プリミティブベースの浮動小数点演算を行う際に使用するコントロール構造が意味をなさないことがあるため、コードを書き直す必要があります。

例えば - Cのコードがまばらに、そしてあなたが浮動小数点エミュレーションライブラリを使用することができるかもしれない非常にまれ/ダブルスを使用しない場合は、この

double arraysum = 0.0; 
for (int i = 0; i < arraylen; i++) 
{ 
    arraysum += array[i]; 
} 

この

psp_decimal_t arraysum; 
if (0 != psp_sum_elements(&array, arraylen, &arraysum)) 
{ 
    printf("error!"); 
} 
+0

リンクが壊れています。正しいものを入力してください。 – Danijel

+0

悲しいことに、私はどこにいてもそのコンテンツを見つけることができず、投稿した個人も見つけられませんでした。 –

2

に変換するかもしれませんあなたのCコードが10Xから100Xまで遅く実行されることはありません。パフォーマンスが低下したくない浮動小数点演算が多く、現実的な入力ごとに算術演算とストア演算で必要なスケールと精度が分かっている場合は、各算術演算を手動でスケーリングされた整数データ型と操作を使用しました。しかし、一般に、精度の要件を分析することは、DSP型コードにとっては重要ではありません。多くのDSPと数値メソッドの教科書の章があります。

+0

...最後の文を精巧にしてください。これが参考になるためです。 – jpinto3912

12

次のコードは、整数を内部表現として使用する固定型を定義しています。加算と減算は、+-の演算子で簡単に実行されます。乗算は定義されたMULTマクロを使用して実行されます。

#include <stdio.h> 
typedef int Fixed; 

#define FRACT_BITS 16 
#define FRACT_BITS_D2 8 
#define FIXED_ONE (1 << FRACT_BITS) 
#define INT2FIXED(x) ((x) << FRACT_BITS) 
#define FLOAT2FIXED(x) ((int)((x) * (1 << FRACT_BITS))) 
#define FIXED2INT(x) ((x) >> FRACT_BITS) 
#define FIXED2DOUBLE(x) (((double)(x))/(1 << FRACT_BITS)) 
#define MULT(x, y) (((x) >> FRACT_BITS_D2) * ((y)>> FRACT_BITS_D2)) 

私の画像処理アルゴリズムでは、上記のコードを使用して分数を表していました。ダブルスを使用していたバージョンよりも速く、結果はほぼ同じでした。

+0

このライブラリもチェックしてください:[http://www.sf.net/projects/fixedptc](http://www.sf.net/projects/fixedptc) –

関連する問題