-1、1、1.31 の形式の fract32 を持つ blackfin533 のコードを見つけました。
複素数 (re、img) の振幅を計算するためにプリシフトが必要な理由がわかりません。1.31 を 1.31 の小数形式で乗算する場合は、右に 31 ビットシフトする必要があることを知っています。
GO_coil_D[0].reとGO_coil_D[0].imは 2 つのfract32です。
次のコードが何をしているのかわかりません:
norm[0] = norm_fr1x32(GO_coil_D[0].re);
norm[1] = norm_fr1x32(GO_coil_D[0].im);
shift = (norm[0] < norm[1]) ? (norm[0] - 1) : (norm[1] - 1);
vectorFundamentalStored.im = shl_fr1x32(GO_coil_D[0].im,shift);
vectorFundamentalStored.re = shl_fr1x32(GO_coil_D[0].re,shift);
vectorFundamentalStored.im = mult_fr1x32x32(vectorFundamentalStored.im, vectorFundamentalStored.im);
vectorFundamentalStored.re = mult_fr1x32x32(vectorFundamentalStored.re, vectorFundamentalStored.re);
amplitudeFundamentalStored = sqrt_fr16(round_fr1x32(add_fr1x32(vectorFundamentalStored.re,vectorFundamentalStored.im))) << 16;
amplitudeFundamentalStored = shr_fr1x32(amplitudeFundamentalStored,shift);
round_
fr1x32` (fract32 f1) fract16 バイアス丸めを使用して、32 ビットの端数を 16 ビットの端数に丸めます。
norm_fr1x32
norm_fr1x32 (fract32) int 入力変数が 0x40000000 から 0x7ffffffff の間隔、または 0x80000000 から 0xc0000000 の間隔になるように正規化するために必要な左シフトの数を返します。つまり、fract32 x; shl_fr1x32(x,norm_fr1x32(x)); 0x40000000 から 0x7ffffffff の範囲、または 0x80000000 から 0xc0000000 の範囲の値を返します