2016-04-16 70 views
1

私のmbed LPC1768には、ポーリング時に16ビットの短い数値が0〜1の浮動小数点値に正規化されたピンにADCがあります。 Document here.32ビットの数値を16ビット以下に変換する

これは浮動小数点数に変換するので、その32ビットを意味するのでしょうか?私の持っている数字は、小数点以下6桁までです。 Data Types here

私は自己相関を実行しており、分析を完了するのにかかる時間を短縮したいと思います。 浮動小数点数が32ビットであるのは正しいのですが、そうであれば、2つの32ビット浮動小数点数を乗算すると2つの16ビットの短い値(非デミカル)を掛け合わせるより時間がかかります。

私はmbedをプログラムするためにCと協力しています。

乾杯。

+0

この権利をお読みになりたいですか?私が見ているのは、「[0x0、0xFFFF]の範囲で符号なしのショートとして表される入力電圧を読み込みます。 –

+2

'read()'はfloatを返しますが、 'read_u16()'は16ビットの整数を返します。どちらを使うかを選択できます。 – Unimportant

+0

したがって、Read()は32ビット浮動小数点数を返し、read_u16()は16ビット整数を返し、16ビット整数は高速/高速を実行します。 – JamesDonnelly

答えて

2

私はこれについて非常に正確にコメントできるはずです。私は、信号/オーディオ/ビデオアルゴリズムを採用し、すべての浮動小数点ロジックを固定小数点演算(すなわち、Q_mn notation, etc)に置き換えることを意味するコードを整数化するDSP処理作業を行っていました。

ほとんどの現代システムでは、浮動小数点演算と比較して、通常、整数演算を使用する方がパフォーマンスが向上します。ただし、複雑なコードを書く必要があります。

使用しているチップ(Cortex M3)にはa dedicated hardware-based FPUがありません。浮動小数点演算だけをエミュレートするため、浮動小数点演算は高価になります(時間がかかる)。

あなたのケースでは、ちょうどread_u16()を介して16ビットの値を読み取って、値を4回右にシフトすると完了です。オーディオデータを扱っている場合は、looking into companding algorithms (a-law, u-law)と考えるとよいでしょう。これは、4ビットの数値から12ビットの数値を得るために、4 LSBsを切り捨てるよりも優れた主観的なパフォーマンスを提供します。

Yes, a float on that system is 32bitであり、おそらくIEEE754 formatで表されます。一対の32ビット値と16ビット値の対を掛け合わせることは、使用するチップおよびFPUおよびALUの存在に依存して、同じ時間量を要する可能性がある。あなたのチップ上で、2つの浮動小数点数を乗算することは、時間の面で恐ろしいほど高価になります。また、2つの32ビット整数を乗算するとオーバーフローする可能性があるため、固定小数点アルゴリズムを実装したくない場合は、浮動小数点ロジックを使用する可能性があります。

+1

深く御礼を申し上げます。私が理解していることは、右にビットシフトすると数字が小さくなるが、数字の関係は同じである(すべてがビットシフトされている場合)。ビットシフトはパフォーマンスが向上しますか?数字が小さいか、無視できるほど小さいので、特に数字の調整にかかる時間を考慮するとパフォーマンスが向上しますか?Cheers – JamesDonnelly

+2

@JamesDonnelly:整数の乗算にかかる時間は、オペランドの値に依存しません。しかし、あなたはオーバーフローの世話をする必要があります。 –

+0

@JamesDonnelly喜んで助けました。コメントがあれば、さらに質問があれば自由にディスカッションを開くことができます。 – DevNull

1

特別なハードウェア(浮動小数点ユニット)がプロセッサに存在しない場合は、2つの32ビット浮動小数点数を掛けることは2つの16ビットのshort値を掛けるよりも時間がかかります。

+1

これはcortex-m3浮動小数点ユニットではありません。 m4にはいくつかの浮動小数点サポートがあります。 –

関連する問題