CSI-DSP  Version 1.0.0
CSI DSP Software Library
函数
相关分析

函数

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] 分别是长度为 srcALensrcBLen 样本序列. 两个信号的卷积表示为:
                  c[n] = a[n] * b[n]
相关则让其中一个信号翻转:
                  c[n] = a[n] * b[-n]
下面是数学定义
CorrelateEquation.gif
pSrcA 指向第一个输入序列,序列长度是 srcALenpSrcB 指向第二个输入序列,序列长度是 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版本。设计使用临时缓存来获取更好的优化效果。 这些版本优化了速度,但是相对的消耗了更多的内存(临时缓存)。

函数说明

void csky_correlate_f32 ( float32_t pSrcA,
uint32_t  srcALen,
float32_t pSrcB,
uint32_t  srcBLen,
float32_t pDst 
)
参数
[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() 是这个函数的一个快速版本