广义数学计算

重要

  • 正确使用数学计算库需要用户具备一定的数学知识,且严格遵循API要求的输入/输出数据格式进行流程设计。

  • 我们鼓励用户在使用数学库前联系我司研发,表述实际需求,共同确认目标场景的可实施性。

工程配置

  • 链接器(Linker)设置:

    ../../_images/kss-math-lib-linker-setting.png
  • 编译器(Compiler)设置:

    ../../_images/kss-math-lib-compiler-setting.png
  • 用户代码设置:

    /* 在.c文件首包含以下头文件:*/
    #include "kss_math.h"
    

科学计算函数

API说明

PI_Q29

圆周率 PI 对应的Q2.29有符号32位定点数表达。

ONE_Q29

浮点数值 “1” 对应的Q2.29有符号32位定点数表达。

ONE_Q31

浮点数值 “1” 对应的Q0.31有符号32位定点数表达。

int32_t kss_cosine(int32_t phase);

余弦函数。

参数
  • phase – 以Q2.29格式表示的弧度值,输入范围限定为[-PI_Q29, PI_Q29]。

返回

Q2.29格式的余弦值,输出范围为[-ONE_Q29, ONE_Q29]。

int32_t kss_sine(int32_t phase);

正弦函数。

参数
  • phase – 以Q2.29格式表示的弧度值,输入范围限定为[-PI_Q29, PI_Q29]。

返回

Q2.29格式的正弦值,输出范围为[-ONE_Q29, ONE_Q29]。

int64_t kss_divlsl(int64_t dividend, int32_t divisor);

64位有符号数除法。

参数
  • dividend – 64位有符号定点数作为被除数。

  • divisor – 32位有符号定点数作为除数,需要确保0不会作为除数进行输入。

返回

64位有符号定点数格式的商。

警告

  • kss_divlsl()旨在为双字除法提供一种快速的近似解计算途径,如果需要精确解的场景,请务必使用编译器的原生除法“/”。

int32_t kss_sqrt(int32_t val, int32_t *exponent);

32位定点数平方根函数。

参数
  • val – 32位非负定点数输入。

  • exponent – 32位定点数指针,用于保存平方根结果的指数部分(以2为底)。

返回

平方根结果的系数部分(mantissa),以Q2.29格式表示,输出范围为[ONE_Q29, 2*ONE_Q29)。

Note
  1. 如果输入为0,输出的系数和指数部分均为0。

  2. 浮点数视角下,

\[sqrt(\mathbf{val}) = \mathbf{mantissa} * 2^\mathbf{exponent} / 2^{29}\]
int32_t kss_ln(int32_t mantissa_in, int32_t exponent_in, int32_t *exponent_out);

Q31格式自然对数函数。

参数
  • mantissa_in – 输入数据的系数部分,Q31格式,范围为[ONE_Q31 / 2, ONE_Q31)。

  • exponent_in – 输入数据的指数部分(以2为底)。

  • exponent_out – 32位定点数指针,用于保存输出数据的指数部分(以2为底)。

返回

输出数据的系数部分,Q31格式,范围为[ONE_Q31 / 2, ONE_Q31)。

Note
  1. 当输入为浮点数意义下的”1”时(mantissa = 0x40000000, exponent = 1),输出系数和指数分别为0和-31。

  2. 推荐配合Q31格式化函数 kss_q31_formatter() 使用,其输出将保证 kss_ln 的输出非负。

  3. 浮点数视角下,

\[ln(\mathbf{mantissa_in} * 2^\mathbf{exponent_in} / 2^{31}) = \mathbf{mantissa_out} * 2^\mathbf{exponent_out} / 2^{31}\]
int32_t kss_smulps29(int32_t rs1, int32_t rs2);

32位有符号数乘法,将64位结果进行算数右移29位后输出低32位数值。

参数
  • rs1 – 被乘数。

  • rs2 – 乘数。

返回

算数右移后的乘积。

Note

类似功能的函数还包括 kss_smulps15/16/27/28/30/31/32()

int32_t kss_q31_formatter(int32_t val, int32_t *exponent);

将32位有符号数转化为Q31格式输出。

参数
  • val – 32位有符号数,必须为正数。

  • exponent – 32位定点数指针,用于保存Q31格式输出数据的指数部分(以2为底)。

返回

Q31格式输出数据的系数部分,范围为[ONE_Q31 / 2, ONE_Q31)。

向量计算函数

API说明

int32_t kss_vec_sum_of_squares(int32_t *vec, int32_t len, int32_t shift);
\[SAT.INT32((\sum_{i=0}^{\mathbf{len}-1}\mathbf{vec}[i]^2)>>\mathbf{shift})\]

向量元素平方求和函数。

参数
  • vec – 32位宽度输入向量vec的首地址。

  • len – 输入向量vec的长度。

  • shift – 原始求得平方和数值右移位数,0~31范围内有效。

返回

平方和经过右移和饱和处理后的结果。

Note
  1. 输入向量vec的长度必须大于0。

  2. 输入向量vec元素的平方和必须落于INT64_MAX范围。

  3. 平方和经过右移后如果超过INT32_MAX范围,函数将输出饱和值 0x7FFFFFFF。

循环冗余校验(CRC)函数

重要

  • 本章节旨在提供一种基于SPV1x指令集,且不依赖静态表的CRC计算途径,请阅读各个函数的说明,充分了解其使用限制。

API说明

uint32_t kss_crc32_aligned(uint8_t *data, int32_t len, uint32_t init);

限定场景的CRC32计算函数。

参数
  • data – 字节数组形式的输入数据序列。

  • len – 输入数据的长度,以字节为单位。

  • init – CRC32初始值。

返回

CRC32计算结果。

Note
  1. 输入数据 data 必须对齐到4字节地址,可以使用预定义宏 __ALIGNED(4) 进行修饰。

  2. 输入数据 data 的字节长度 len 必须大于0。

  3. 此CRC32计算函数固定使用 Poly = 0x04C11DB7 作为生成多项式。

  4. 此函数不支持设置输入/输出数据反转功能(RefIn/RefOut)。

uint16_t kss_crc16_aligned(uint8_t *data, int32_t len, uint16_t init);

限定场景的CRC16计算函数。

参数
  • data – 字节数组形式的输入数据序列。

  • len – 输入数据的长度,以字节为单位。

  • init – CRC16初始值。

返回

CRC16计算结果。

Note
  1. 输入数据 data 必须对齐到4字节地址,可以使用预定义宏 __ALIGNED(4) 进行修饰。

  2. 输入数据 data 的字节长度 len 必须大于0。

  3. 此CRC16计算函数固定使用 Poly = 0x1021 作为生成多项式。

  4. 此函数不支持设置输入/输出数据反转功能(RefIn/RefOut)。