DSP での固定小数点演算と浮動小数点演算

1. 固定小数点数とそのキャリブレーション
固定小数点 DSP チップでは、固定小数点データの数値演算が使用され、オペランドは一般に整数で表されます。整数の最大表現範囲は、DSP チップのワード長によって決まります。語長が長いほど、表現範囲が広くなり、精度が高くなります。
例 16 ビット語長
16 桁ごとに 1 符号ビットを使用して正または負を示し、0 は正を示し、1 は負を示し、残りの 15 ビットは値を示します。したがって、
2 進数 0010000000000011b は 10 進数の
8195
.必ずしも整数ではないので、DSP チップは小数をどのように処理しますか? そうです、DSP チップ自体ができないということは、チップがさまざまな 10 進数を処理できないということでしょうか。もちろんそうではありません。重要なのは、プログラマーが数値の小数点が 16 桁のどれにあるかを判断し、数値を調整することです。
2 進数を 10 進数に変換する計算方法は次のとおりです。 n+1 個の整数と m 個の 10 進数を含む 2 進数は、次のように表され
ここに画像の説明を挿入ます
ここに画像の説明を挿入ここに画像の説明を挿入
小数点を 16 桁の異なる位置に設定し、異なるサイズと異なる精度の小数を表すことにより、Q 表現と S 表現の 2 種類の数値校正があります。
ここに画像の説明を挿入小数点の位置が異なれば、それが表す数値も異なります。例:
16 進数 2000H=8192、16
進数 2000H=0.25 を Q0 で表し、Q15 で表すと、
Q0 は小数点以下の桁数が 0、整数が 15 ビット、記号が 1 ビットであることを意味し、Q15は、小数点以下の桁数が 15 、整数の場合は 0 ビット、符号の場合は 1 ビットであることを意味します。
しかし、DSPの場合、小数点以下をどこに設定しても処理方法は全く同じで、16ビットの整数とみなし、プログラマが設定したQによって実データを計算します。したがって、固定小数点数の場合、数値範囲と精度は反比例します. 変数が大きな数値範囲を表現したい場合は、精度を犠牲にしなければなりません.
たとえば、Q0 の値の範囲は -32768 から +32767 で精度は 1 ですが、Q15 の値の範囲は -1 から 0.9999695 で精度は 1/32768 = 0.00003051 です。

2. 浮動小数点数 (x) と固定小数点数 (xq) の変換関係
浮動小数点数 (x) は固定小数点数 (xq) に変換されます: xq=(int)x* 2Q
固定小数点数(xq) は浮動小数点数 (x) に変換されます: x=(float)xq 2-Q
たとえば、浮動小数点数 x=0.5、スケーリング Q=15、固定小数点数 xq=L0.5
32768J =16384、ここで LJ は下限の丸めを表します。逆に、Q=15 で表される固定小数点数 16384 は、163*2-15=16384/32768=0.5 の浮動小数点数を持ちます。浮動小数点数を固定小数点数に変換する場合、切り捨て誤差を減らすために、丸めの前に 0.5 を追加できます。

3. 浮動小数点数は、
有理数の特定のサブセットに属する数値のデジタル表現です。固定小数点数の対数キャリブレーションにより、プログラミングが難しくなり、データの精度もある程度影響を受けます。浮動小数点数を使用すると、はるかに簡単で便利になります。
浮動小数点数は 2 つの表現に分けられます。1 つは一般的な形式 (Baidu にも共通) で、もう 1 つは IEEE754 標準形式です。
1. 一般的な表現形式: 注文コードは指数です; 注文記号は指数の符号です; 番号記号は仮数の符号を指し、それぞれが占有するビット数は、式の範囲と精度。たとえば、32 ビット長の浮動小数点数の場合、順序符号と順序符号はそれぞれ 1 ビットを使用し、順序コードは 7 ビットを使用でき、仮数部は 23 ビットです。順序符号と順序コードもを組み合わせて 1 つの 8 ビットで表現すると、一般的な形式は になります。数値記号は中間部分に配置されます。これは、固定小数点表現形式と矛盾しており、コンピューター処理の都合が悪いため、実際には、IEEE754は一般的に形式を表すために使用されます 2、IEEE754標準
形式
N=M×R^E
ここに画像の説明を挿入例: 12.345=1.2345×10^1
このうち、M(仮数)は浮動小数点数Rの仮数と呼ばれます(Radix) を指数の底、E (Exponent) を次数の指数と呼びます。一般に、コンピューターでは R が 2、8、または 16 であると規定されています。これは明確な定数であり、浮動小数点数で明示的に表現する必要はありません。上記は 32 ビットの語長です。

2.1. 仮数 M の値は通常 10 進数形式で表現され、浮動小数点数の精度を決定します. これは 23 ビットですが、実際には 24 ビットです. 1 ビットは「不可視」であり、その値は に固定されています. 1、IEEE 754 を意味します。標準で定義されている浮動小数点数です。有効な桁は 1 から 2 までの 10 進数なので、仮数 m=1.f.
2.2. 指数コード E は通常、8 ビットの浮動小数点数の表現範囲を決定する固定小数点整数で表されます。
2.3. 符号ビット: 1 ビット、0 は正の数、1 は負の数を意味します。

3. 浮動小数点データから 16 進数データへの変換の原理は
、32 ビットのワード長、つまり 4 バイトのデータ レベルに基づいています。 30~23はサブコード 仮数部は残りの小数部(下23桁で決まる)
3.1 データ(10進数、浮動小数点)を2進数に変換
3.2 小数点をnビット左に移動、最後をガイド1 対 1 で停止し、get 左にシフトされた桁数、指数コード 127+ (左にシフトされた桁数) を計算する; 3.3
仮数部 (22~0 の位置の合計 23 ビット) は、小数部分、および残りの埋められていない桁は 0 で埋められます ;
3.4 得られたすべてのバイナリ コードを 16 進数データに変換します。
4. 例: 10 進数の 4.25 をマシンで 4 バイトの 2 進
数形式に表現します。 4.1 最初のステップ: 4.25 を 2 進数として表現します
。小数点を 2 桁左に 1.0001x2^2 とし、指数コード E(Exponent)=2+127=129; 4.3 Step 3
Mantissa=1.0001-1.0=0001 (正規化後、常に小数点の前に Integer 1、前が0ではなく1であることは誰もが知っているので省略、つまり仮数部は整数部を含まない; 4.4 16進数に変換 81010000 例 4.5、小数点を境界
として
分割ここに画像の説明を挿入;
4.6 , 整数部分の変換: 整数から 2 進数への変換: 誰もがよく知っていると思います. 使用法: 2 で割って余りの方法を取る. そして 0.875 の整数部分は 0 です. 操作は必要ありません; 4.7, 小数部分の変換: 変換小数部の数値が整数部と異なる場合に
使用するのが「2倍の四捨五入法」で、
下図のように、
ここに画像の説明を挿入整数部+小数部を合わせた結果、最終的に2進数で0.111となります。
したがって、仮数+指数コードのコンピューターカウント方法によれば、結果は
ここに画像の説明を挿入次のように表すことができます。 is:01111110
仮数部(M):floatを例にとると23bitのはずなので、末尾を埋めると11000000000000000000000となります
。 : 00111111011000000000000000000000
sigmaStudioでfloatをintに変換する例
ここに画像の説明を挿入

5. 浮動小数点型変換 16 進数コードの実装方法
5.1. アドレスポインタを使用する
void flout2int(float src, int *dst)
{ *dst = ((int )(&src)); } 5.2. memcpy を使用する#include " stdio.h ” #include “string.h” void flout2int(float src, int *dst) { memcpy(&dst,&src,sizeof(float)); }








参考元:
https://blog.csdn.net/qq_36915078/article/details/106019023
https://blog.csdn.net/qq_43537721/article/details/107757766
https://blog.csdn.net/qq_36915078/article /details/106019023
https://blog.csdn.net/ADI_OP/article/details/129021375?spm=1001.2014.3001.5502

おすすめ

転載: blog.csdn.net/weixin_48408892/article/details/130054060