|
void | csky_correlate_f32 (float32_t *pSrcA, uint32_t srcALen, float32_t *pSrcB, uint32_t srcBLen, float32_t *pDst) |
| 浮点序列的相关 更多...
|
|
void | csky_correlate_fast_opt_q15 (q15_t *pSrcA, uint32_t srcALen, q15_t *pSrcB, uint32_t srcBLen, q15_t *pDst, q15_t *pScratch) |
| Q15序列的相关 (快速版本) 更多...
|
|
void | csky_correlate_fast_q15 (q15_t *pSrcA, uint32_t srcALen, q15_t *pSrcB, uint32_t srcBLen, q15_t *pDst) |
| Q15序列的相关 (快速版本) 更多...
|
|
void | csky_correlate_fast_q31 (q31_t *pSrcA, uint32_t srcALen, q31_t *pSrcB, uint32_t srcBLen, q31_t *pDst) |
| Q31序列的相关 (快速版本) 更多...
|
|
void | csky_correlate_opt_q15 (q15_t *pSrcA, uint32_t srcALen, q15_t *pSrcB, uint32_t srcBLen, q15_t *pDst, q15_t *pScratch) |
| Q15序列的相关 更多...
|
|
void | csky_correlate_opt_q7 (q7_t *pSrcA, uint32_t srcALen, q7_t *pSrcB, uint32_t srcBLen, q7_t *pDst, q15_t *pScratch1, q15_t *pScratch2) |
| Q7序列的相关 更多...
|
|
void | csky_correlate_q15 (q15_t *pSrcA, uint32_t srcALen, q15_t *pSrcB, uint32_t srcBLen, q15_t *pDst) |
| Q15序列的相关 更多...
|
|
void | csky_correlate_q31 (q31_t *pSrcA, uint32_t srcALen, q31_t *pSrcB, uint32_t srcBLen, q31_t *pDst) |
| Q31序列的相关. 更多...
|
|
void | csky_correlate_q7 (q7_t *pSrcA, uint32_t srcALen, q7_t *pSrcB, uint32_t srcBLen, q7_t *pDst) |
| Q7序列的相关 更多...
|
|
相关是一种与卷积类似的数学操作。 跟卷积一样,相关用两个信号生成一个新的信号。 相关和卷积中的基本算法是相同的,除了其中一个输入在卷积中被翻转。 相关一般用来测量两个信号的相似性。 广泛应用在模式识别,密码分析和搜索。 CSI库为 Q7, Q15, Q31 和浮点数据类型提供相关函数。 Q15和Q31还提供了快速版本函数。
- 算法
- 令
a[n]
和 b[n]
分别是长度为 srcALen
和 srcBLen
样本序列. 两个信号的卷积表示为:
c[n] = a[n] * b[n]
相关则让其中一个信号翻转:
c[n] = a[n] * b[-n]
- 下面是数学定义
pSrcA
指向第一个输入序列,序列长度是 srcALen
, pSrcB
指向第二个输入序列,序列长度是 srcBLen
. 结果 c[n]
的长度是 2 * max(srcALen, srcBLen) - 1
,所有结果都落在区间 n=0, 1, 2, ..., (2 * max(srcALen, srcBLen) - 2)
中. 输出结果写入到 pDst
,调用函数必须分配好 2 * max(srcALen, srcBLen) - 1
个字保存结果。
注意
pDst
在使用前需要先清零。
定点行为
- 相关会生成大量的中间值。 因此, Q7, Q15, 和 Q31 函数有可能会发生溢出和饱和。 参考具体函数的文档,了解使用特定算法的详细情况。
快速版本
- Q31和Q15支持快速版本。快速版本需要更少的周期数,但是设计为,需要输入信号缩小到不会引起中间结果溢出。
Opt版本
- Q15和Q7支持Opt版本。设计使用临时缓存来获取更好的优化效果。 这些版本优化了速度,但是相对的消耗了更多的内存(临时缓存)。
- 参数
-
[in] | *pSrcA | 指向第一个输入序列 |
[in] | srcALen | 第一个输入序列的长度 |
[in] | *pSrcB | 指向第二个输入序列 |
[in] | srcBLen | 第二个输入序列的长度 |
[out] | *pDst | 指向输出结果的地址,长度是 2 * max(srcALen, srcBLen) - 1. |
- 返回
- none.
void csky_correlate_fast_opt_q15 |
( |
q15_t * |
pSrcA, |
|
|
uint32_t |
srcALen, |
|
|
q15_t * |
pSrcB, |
|
|
uint32_t |
srcBLen, |
|
|
q15_t * |
pDst, |
|
|
q15_t * |
pScratch |
|
) |
| |
- 参数
-
[in] | *pSrcA | 指向第一个输入序列 |
[in] | srcALen | 第一个输入序列的长度 |
[in] | *pSrcB | 指向第二个输入序列 |
[in] | srcBLen | 第二个输入序列的长度 |
[out] | *pDst | 指向输出结果的地址,长度是 2 * max(srcALen, srcBLen) - 1. |
[in] | *pScratch | 指向临时缓存,大小是 max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. |
- 返回
- none.
- 限制
- 如果芯片不支持分对齐访问,则定义宏 UNALIGNED_SUPPORT_DISABLE 同时,输入,输出,临时buffer,都应该是32位对齐。
缩放和溢出行为:
- 这个快速版本使用了一个2.30格式的32位累加器。 累加器维持了中间乘法结果的全部精度,但是只有1个保护位。 累加过程中没有饱和操作。 因此,如果累加器溢出,会扭曲结果。 为了防止中间结果溢出,必须缩小输入信号。 因为加法最多会有min(srcALen, srcBLen)个进位,所以,输入信号需要缩小 1/min(srcALen, srcBLen)防止溢出。 2.30格式累加器右移15位,然后饱和生成1.15的最后结果。
- 函数
csky_correlate_q15()
是这个函数的一个慢速版本,使用了一个64位累加器来防止溢出。
void csky_correlate_fast_q15 |
( |
q15_t * |
pSrcA, |
|
|
uint32_t |
srcALen, |
|
|
q15_t * |
pSrcB, |
|
|
uint32_t |
srcBLen, |
|
|
q15_t * |
pDst |
|
) |
| |
- 参数
-
[in] | *pSrcA | 指向第一个输入序列 |
[in] | srcALen | 第一个输入序列的长度 |
[in] | *pSrcB | 指向第二个输入序列 |
[in] | srcBLen | 第二个输入序列的长度 |
[out] | *pDst | 指向输出结果的地址,长度是 2 * max(srcALen, srcBLen) - 1. |
- 返回
- none.
缩放和溢出行为:
- 这个快速版本使用一个2.30格式的32位累加器。 累加器维持了中间乘法结果的全部精度,但是只有1个保护位。 累加过程中没有饱和操作。 因此,如果累加器溢出,会扭曲结果。 为了防止中间结果溢出,必须缩小输入信号。 因为加法最多会有min(srcALen, srcBLen)个进位,所以,输入信号需要缩小 1/min(srcALen, srcBLen)防止溢出。 2.30格式累加器右移15位,然后饱和生成1.15的最后结果。
- 函数
csky_correlate_q15()
是这个函数的一个慢速版本,使用了一个64位累加器来防止溢出。
void csky_correlate_fast_q31 |
( |
q31_t * |
pSrcA, |
|
|
uint32_t |
srcALen, |
|
|
q31_t * |
pSrcB, |
|
|
uint32_t |
srcBLen, |
|
|
q31_t * |
pDst |
|
) |
| |
- 参数
-
[in] | *pSrcA | 指向第一个输入序列 |
[in] | srcALen | 第一个输入序列的长度 |
[in] | *pSrcB | 指向第二个输入序列 |
[in] | srcBLen | 第二个输入序列的长度 |
[out] | *pDst | 指向输出结果的地址,长度是 2 * max(srcALen, srcBLen) - 1. |
- 返回
- none.
缩放和溢出行为:
- 该函数针对速度进行了优化,牺牲了定点精度和溢出保护。 每个1.31 和 1.31 乘法的结果截断为 2.30 格式. 中间结果在32位寄存器中累加为2.30格式的结果。 最后,累加器饱和转换为1.31的结果。
- 快速版本和标准版本的溢出行为一样,不过,丢弃低32位,导致精度会更低。 为了避免中间结果溢出,输入信号必须缩放。 因为加法最多发生min(srcALen, srcBLen)次进位,所以需要缩小输入 1/min(srcALen, srcBLen)来防止溢出。
- 函数
csky_correlate_q31()
是这个函数的一个慢速版本 ,使用了64位累加器提供更高的精度。
void csky_correlate_opt_q15 |
( |
q15_t * |
pSrcA, |
|
|
uint32_t |
srcALen, |
|
|
q15_t * |
pSrcB, |
|
|
uint32_t |
srcBLen, |
|
|
q15_t * |
pDst, |
|
|
q15_t * |
pScratch |
|
) |
| |
- 参数
-
[in] | *pSrcA | 指向第一个输入序列 |
[in] | srcALen | 第一个输入序列的长度 |
[in] | *pSrcB | 指向第二个输入序列 |
[in] | srcBLen | 第二个输入序列的长度 |
[out] | *pDst | 指向输出结果的地址,长度是 2 * max(srcALen, srcBLen) - 1. |
[in] | *pScratch | 指向临时缓存,大小是 max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. |
- 返回
- none.
- 限制
- 如果芯片不支持分对齐访问,则定义宏 UNALIGNED_SUPPORT_DISABLE 同时,输入,输出,临时buffer,都应该是32位对齐。
缩放和溢出行为:
- 函数实现使用了一个内部64位累加器。 输入都表示为1.15格式,相乘的结果是2.30格式。 2.30的中间结果在34.30格式的64位累加器中累加。 由于有33个守护位,不会有溢出风险。 34.30格式的结果丢弃低15位,截断为34.15格式,然后再饱和成1.15格式。
- 函数
csky_correlate_fast_q15()
是这个函数的一个快速版本,但是更多的精度丢失
void csky_correlate_opt_q7 |
( |
q7_t * |
pSrcA, |
|
|
uint32_t |
srcALen, |
|
|
q7_t * |
pSrcB, |
|
|
uint32_t |
srcBLen, |
|
|
q7_t * |
pDst, |
|
|
q15_t * |
pScratch1, |
|
|
q15_t * |
pScratch2 |
|
) |
| |
- 参数
-
[in] | *pSrcA | 指向第一个输入序列 |
[in] | srcALen | 第一个输入序列的长度 |
[in] | *pSrcB | 指向第二个输入序列 |
[in] | srcBLen | 第二个输入序列的长度 |
[out] | *pDst | 指向输出结果的地址,长度是 2 * max(srcALen, srcBLen) - 1. |
[in] | *pScratch1 | 指向临时buffer,大小是 max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. |
[in] | *pScratch2 | 指向临时buffer,大小是 min(srcALen, srcBLen). |
- 返回
- none.
- 限制
- 如果芯片不支持分对齐访问,则定义宏 UNALIGNED_SUPPORT_DISABLE 同时,输入,输出,临时buffer,都应该是32位对齐。
缩放和溢出行为:
- 函数实现使用了一个内部32位累加器。 输入都表示为1.7格式,相乘的结果是2.14格式。 2.14的中间结果在18.14格式的32位累加器中累加。 由于有17个守护位,除非
max(srcALen, srcBLen)大于131072
,否则不会溢出。 18.14格式的结果丢弃低7位,截断为18.7格式,然后再饱和成1.7格式。
void csky_correlate_q15 |
( |
q15_t * |
pSrcA, |
|
|
uint32_t |
srcALen, |
|
|
q15_t * |
pSrcB, |
|
|
uint32_t |
srcBLen, |
|
|
q15_t * |
pDst |
|
) |
| |
- 参数
-
[in] | *pSrcA | 指向第一个输入序列 |
[in] | srcALen | 第一个输入序列的长度 |
[in] | *pSrcB | 指向第二个输入序列 |
[in] | srcBLen | 第二个输入序列的长度 |
[out] | *pDst | 指向输出结果的地址,长度是 2 * max(srcALen, srcBLen) - 1. |
- 返回
- none.
缩放和溢出行为:
- 函数实现使用了一个64位内部累加器。 输入都是1.15格式,相乘的结果是2.30格式。 2.30格式的结果在34.30格式的64位累加器中累加。 由于有33个守护位,不会有溢出风险。 34.30格式的结果丢弃低15位,截断为34.15格式,然后再饱和成1.15格式。
- 函数
csky_correlate_fast_q15()
是这个函数的一个快速版本,但是丢失了更多的精度
- 函数
csky_correlate_opt_q15()
是这个函数的一个快速版本,但是使用了额外的临时缓存
void csky_correlate_q31 |
( |
q31_t * |
pSrcA, |
|
|
uint32_t |
srcALen, |
|
|
q31_t * |
pSrcB, |
|
|
uint32_t |
srcBLen, |
|
|
q31_t * |
pDst |
|
) |
| |
- 参数
-
[in] | *pSrcA | 指向第一个输入序列 |
[in] | srcALen | 第一个输入序列的长度 |
[in] | *pSrcB | 指向第二个输入序列 |
[in] | srcBLen | 第二个输入序列的长度 |
[out] | *pDst | 指向输出结果的地址,长度是 2 * max(srcALen, srcBLen) - 1. |
- 返回
- none.
缩放和溢出行为:
- 函数实现使用了一个64位内部累加器。 累加器使用 2.62 格式,维持了中间乘法结果的所有精度,但是只有一个保护位。 累加过程中没有饱和操作。 因此,如果累加器溢出,会往符号位溢出,扭曲结果。 输入信号需要缩小来防止中间结果溢出。 因为加法最多发生min(srcALen, srcBLen)次进位,所以需要缩小输入 1/min(srcALen, srcBLen)来防止溢出。 2.62 累加器右移31位,然后饱和生成为1.31格式的结果。
- 函数
csky_correlate_fast_q31()
是这个函数的一个快速版本,但是丢失了更多的精度
void csky_correlate_q7 |
( |
q7_t * |
pSrcA, |
|
|
uint32_t |
srcALen, |
|
|
q7_t * |
pSrcB, |
|
|
uint32_t |
srcBLen, |
|
|
q7_t * |
pDst |
|
) |
| |
- 参数
-
[in] | *pSrcA | 指向第一个输入序列 |
[in] | srcALen | 第一个输入序列的长度 |
[in] | *pSrcB | 指向第二个输入序列 |
[in] | srcBLen | 第二个输入序列的长度 |
[out] | *pDst | 指向输出结果的地址,长度是 2 * max(srcALen, srcBLen) - 1. |
- 返回
- none.
缩放和溢出行为:
- 函数实现使用了一个内部32位累加器。 输入都是1.7格式,相乘的结果是2.14格式。 2.14格式的结果在18.14格式的32位累加器中累加。 由于有17个保护位,除非
max(srcALen, srcBLen)大于131072
,否则不会溢出 18.14 的结果丢弃低7位,截断为18.7格式,最后饱和为1.7格式。
- 函数
csky_correlate_opt_q7()
是这个函数的一个快速版本