我在 blackfin533 上找到了一段代码,它的 fract32 来自 -1, 1,格式为 1.31。
我不明白为什么计算复数(re,img)的幅度需要预移位。我知道如果你想将 1.31 乘以 1.31 小数格式,那么你需要右移 31 位。
GO_coil_D[0].re和GO_coil_D[0].im是两个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 到 0x7fffffff 区间或 0x80000000 到 0xc0000000 区间内。换句话说,fract32 x;shl_fr1x32(x,norm_fr1x32(x)); 返回 0x40000000 到 0x7fffffff 范围内的值,或 0x80000000 到 0xc0000000 范围内的值