32-Bit complex BFP API
void bfp_complex_s32_init()
初始化一个32位复数BFP向量。
该函数初始化了a的每个字段。
与bfp_complex_s16_t不同,32位复数BFP向量使用单个缓冲区来存储每个尾数的实部和虚部,使得第k个元素的虚部在内存中紧随第k个元素的实部之后。data指向用于存储向量元素的内存缓冲区,其长度至少为length * 8字节。
exp是分配给BFP向量的指数。初始化后,第k个复数元素的逻辑值将为 。
如果calc_hr为false,则a->hr被初始化为0。否则,计算BFP向量的头空间(headroom)并用于初始化a->hr。
参数:
bfp_complex_s32_t *a– [out] 要初始化的BFP向量结构体complex_s32_t *data– [in] 用于支持a的complex_s32_t缓冲区const exponent_t exp– [in] BFP向量的指数const unsigned length– [in] BFP向量中的元素数量const unsigned calc_hr– [in] 指示是否应计算BFP向量的头空间的布尔值
参考性能:

bfp_complex_s32_t bfp_complex_s32_alloc()
从堆中动态分配一个32位复数BFP向量。
如果分配不成功,返回的向量的data字段将为NULL,length字段将为零。否则,data将指向分配的内存,length字段将为用户指定的长度。length参数不能为零。
此函数不设置BFP指数、头空间或分配的尾数向量的元素。要将BFP向量的元素设置为已知值,请在返回的BFP向量上使用bfp_complex_s32_set()。
使用此函数分配的BFP向量必须使用bfp_complex_s32_dealloc()进行释放,以避免内存泄漏。
要使用静态内存分配初始化BFP向量,请改用bfp_complex_s32_init()。
参数:
const unsigned length– [in] 要分配的BFP向量的长度(以元素为单位)
返回值:
- 复数32位BFP向量
参考性能:

void bfp_complex_s32_dealloc()
释放由bfp_complex_s32_alloc()分配的32位复数BFP向量。
使用此函数释放bfp_complex_s32_alloc()分配的堆内存。
其尾数缓冲区(成功)动态分配的BFP向量会设置一个标志,表示如此。此函数可安全地应用于任何未手动操作其flags或data的bfp_complex_s32_t,包括:
- 通过成功调用
bfp_complex_s32_alloc()而产生的bfp_complex_s32_t - 通过不成功调用
bfp_complex_s32_alloc()而产生的bfp_complex_s32_t - 通过调用
bfp_complex_s32_init()初始化的bfp_complex_s32_t
在后两种情况下,此函数不执行任何操作。在第一种情况下,将清除vector的data、length和flags字段,使其为零。
参数:
bfp_complex_s32_t* vector– [in] 要释放的BFP向量。
参考性能:

void bfp_complex_s32_set()
将32位复数BFP向量的所有元素设置为指定值。
将a的指数设置为exp,并将每个元素的尾数设置为b。
执行此操作后,所有元素将表示相同的值 。
a必须已经初始化(参见bfp_complex_s32_init())。
参数:
bfp_complex_s32_t* a– [out] 要更新的BFP向量const complex_s32_t b– [in] 每个复数尾数要设置的新值const exponent_t exp– [in] BFP向量的新指数
参考性能:

void bfp_complex_s32_use_exponent()
修改32位复数BFP向量以使用指定的指数。
此函数强制复数BFP向量 使用指定的指数。尾数向量 将进行位移,以补偿指数的变化。
例如,在调用定点算术函数之前,可以使用此函数确保底层的尾数向量具有所需的Q格式。另一个例子是在与外围设备(例如通过I2S)通信时,可以将样本数据设置为指定的格式。
请注意,这设置了_当前_编码,而不是永久地_修复_指数(即,后续操作可能按惯例更改指数)。
如果所需的定点Q格式为 QX.Y,其中 Y 是结果尾数中的小数位数,则关联的指数(以及参数 exp 的值)为 -Y。
a 指向输入BFP向量 ,具有复数尾数向量 和指数 。a 在原地更新,以产生结果BFP向量 ,具有复数尾数向量 和指数 。
exp 是 ,即所需的指数。 是所需的指数变化。
如果 ,则不修改BFP向量。
如果 ,则所需的指数大于当前指数,并且将对尾数 进行 位的算术右移。在进行右移时,通过丢弃 位最低有效位,可能会丢失精度。
如果 ,则所需的指数小于当前指数,并且将对尾数 进行 位的左移。在进行左移时,将应用饱和逻辑,以使任何无法使用新指数准确表示的元素饱和到32位饱和边界。
此函数会更新 a 的指数和头空间(headroom)。
参数:
bfp_complex_s32_t* a– [inout] 输入BFP向量 / 输出BFP向量const exponent_t exp– [in] 所需的指数,
参考性能:

headroom_t bfp_complex_s32_headroom()
获取复数32位BFP向量的头空间(headroom)。
复数向量的头空间是指每个元素的实部和虚部可以左移的位数,而不会丢失任何信息。它传递了向量可能包含的值范围的信息,这对于确定如何在可能有损的块浮点运算中保留精度非常有用。
在BFP的上下文中,头空间仅适用于尾数,而不适用于指数。
特别地,如果复数32位尾数向量 具有 位的头空间,那么对于 的任何元素 ,
和
对于复数BFP向量 的任何元素 ,
和
此函数确定 b 的头空间,并更新 b->hr 的值,然后返回 b->hr。
参数:
bfp_complex_s32_t* b- 要获取头空间的复数BFP向量
返回值:
- 复数BFP向量
b的头空间
参考性能:

void bfp_complex_s32_shl()
对复数32位BFP向量的尾数进行左移。
输入BFP向量 的每个复数尾数左移 b_shl 位,并存储在输出BFP向量 的相应元素中。
此操作可用于向BFP向量添加或删除头空间。
b_shl 是每个尾数的实部和虚部将要左移的位数。这个移位是有符号的算术移位,因此 b_shl 的负值将会对尾数进行右移。
a 和 b 必须已经被初始化(参见 bfp_complex_s32_init()),并且长度必须相同。
此操作可以在 b 上安全地原地执行。
请注意,此操作绕过了保护调用者免受饱和或下溢的逻辑。输出值饱和到对称的32位范围(开区间 )。为了避免饱和,b_shl 不应大于 b 的头空间(b->hr)。
操作:
参数:
bfp_complex_s32_t* a– [out] 输出复数BFP向量const bfp_complex_s32_t* b– [in] 输入复数BFP向量const left_shift_t b_shl– [in] 要应用于 尾数的有符号算术左移。
参考性能:

void bfp_complex_s32_real_mul()
逐元素将复数32位BFP向量与实数的32位BFP向量相乘。
复数输出BFP向量 的每个复数输出元素 被设置为复数输入BFP向量