Convolve
计算src1向量(长度为src1Len)和src2向量(长度为src2Len)的线性卷积,结果存储到dst向量中。计算公式如下:
该函数调用流程如下:
- 调用Init初始化HmppsCorrPolicy_32f结构体。
- 调用主函数。
- 最后调用Release释放HmppsCorrPolicy_32f函数所包含内存。
函数接口声明如下:
- 初始化操作:
HmppResult HMPPS_ConvInit_32f(int32_t src1Len, int32_t src2Len, HmppCalcMode calcMode, HmppsConvPolicy_32f **policy);
HmppResult HMPPS_ConvInit_64f(int32_t src1Len, int32_t src2Len, HmppCalcMode calcMode, HmppsConvPolicy_64f **policy);
- 主函数操作:
HmppResult HMPPS_Convolve_32f(const float *src1, int32_t src1Len, const float *src2, int32_t src2Len, float *dst, HmppsConvPolicy_32f *policy);
HmppResult HMPPS_Convolve_64f(const double *src1, int32_t src1Len, const double *src2, int32_t src2Len, double *dst, HmppsConvPolicy_64f *policy);
- 释放内存操作:
HmppResult HMPPS_ConvRelease_32f(HmppsConvPolicy_32f *policy);
HmppResult HMPPS_ConvRelease_64f(HmppsConvPolicy_64f *policy);
参数
参数名 |
描述 |
取值范围 |
输入/输出 |
---|---|---|---|
src1 |
指向第一个源向量的指针。 |
非空 |
输入 |
src1Len |
第一个源向量长度。 |
(0, INT_MAX] |
输入 |
src2 |
指向第二个源向量的指针。 |
非空 |
输入 |
src2Len |
第二个源向量长度。 |
(0, INT_MAX] |
输入 |
dst |
指向目标向量的指针。 |
非空 |
输出 |
algMode |
计算使用的算法模型,可能的值是:HMPP_ALG_AUTO、HMPP_ALG_DEFAULT、HMPP_ALG_FFT。 |
HMPP_ALG_AUTO HMPP_ALG_DEFAULT HMPP_ALG_FFT |
输入 |
policy (init函数中) |
指向内存存储ConvPolicy的指针。 |
非空 |
输出 |
policy (主函数中和release函数中) |
指向ConvPolicy结构体的指针。 |
非空 |
输入 |
返回值
- 成功:返回HMPP_STS_NO_ERR。
- 失败:返回错误码。
错误码
错误码 |
描述 |
---|---|
HMPP_STS_NO_ERR |
表示没有错误。 |
HMPP_STS_NULL_PTR_ERR |
当任何指定的指针为空时指示错误。 |
HMPP_STS_SIZE_ERR |
当src1Len或src2Len小于或等于0时指示错误。 |
HMPP_STS_MISMATCH |
Init函数申请内存的问题规模和主函数中实际计算的问题规模不匹配。 |
HMPP_STS_OVERFLOW_ERR |
FFT加速模型的问题规模过大。 |
HMPP_STS_MALLOC_FAILED |
Init函数中进行算法模型所需内存申请失败。 |
注意
- 调用该接口计算之前,必须调用Init接口初始化HmppsConvPolicy_32f规范结构。
- HmppsConvPolicy_32f结构体初始化需在Init函数中进行申请的,用户无法自己进行该结构体申请定义。
- src1、src2不能和dst是同一数组,否则结果正确性无法保证。
- 使用HMPP_ALG_AUTO或HMPP_ALG_FFT模式时,当src1Len和src2Len较大时会出现OVERFLOW错误提示。
示例
void Convolve_Example() { const int src1Len = 10; const int src2Len = 10; float src1[src1Len]; float src2[src2Len]; float dst[src1Len + src2Len - 1]; for (int i = 0; i < src1Len; ++i) src1[i] = 1; for (int i = 0; i < src2Len; ++i) src2[i] = 1; HmppsConvPolicy_32f *policy = NULL; HmppResult result = HMPPS_ConvInit_32f(src1Len, src2Len, HMPP_ALG_FFT, &policy); if (result != HMPP_STS_NO_ERR) { printf("Init failed"); return; } result = HMPPS_Convolve_32f(src1, src1Len, src2, src2Len, dst, policy); if (result != HMPP_STS_NO_ERR) { printf("Convolve failed"); return; } for (int i = 0; i < src1Len + src2Len - 1; ++i) { printf("%.2f ", dst[i]); } HMPPS_ConvRelease_32f(policy); }
运行结果:
1 2 3 4 5 6 7 8 9 10 9 8 7 6 5 4 3 2 1