---
title: CrossCorrNorm
description: "计算src1向量（长度为src1Len）和src2向量（长度为src2Len）的归一化互相关，结果存储到dst向量中。归一化支持正常、有偏和无偏自相关三种模式，计算公式如下："
url: https://www.hikunpeng.com/document/detail/zh/kunpengboostkithistory/2200/accel/kunpengaccel_hmpp_06_0129.html
sourcePath: /source/zh/kunpengboostkithistory/2200/accel/kunpengaccel_hmpp_06_0129.html
indexId: ec767dd7e6099d5312ac668de8fee4ee4850e12c8b6a938bee5ca5ab3f530a8b75
---
# CrossCorrNorm

计算src1向量（长度为src1Len）和src2向量（长度为src2Len）的归一化互相关，结果存储到dst向量中。归一化支持正常、有偏和无偏自相关三种模式，计算公式如下：


该函数调用流程如下：

1. 调用Init初始化HmppsCorrPolicy_32f结构体。
2. 调用主函数。
3. 调用Release释放HmppsCorrPolicy_32f函数所包含内存。

函数接口声明如下：

- 初始化操作：
  HmppResult HMPPS_CrossCorrInit_32f(int32_t src1Len, int32_t src2Len, int32_t dstLen, int32_t lowLag, HmppCalcMode calcMode, HmppsCorrPolicy_32f **policy);

  HmppResult HMPPS_CrossCorrInit_64f(int32_t src1Len, int32_t src2Len, int32_t dstLen, int32_t lowLag, HmppCalcMode calcMode, HmppsCorrPolicy_64f **policy);

  HmppResult HMPPS_CrossCorrInit_32fc(int32_t src1Len, int32_t src2Len, int32_t dstLen, int32_t lowLag, HmppCalcMode calcMode, HmppsCorrPolicy_32fc **policy);

  HmppResult HMPPS_CrossCorrInit_64fc(int32_t src1Len, int32_t src2Len, int32_t dstLen, int32_t lowLag, HmppCalcMode calcMode, HmppsCorrPolicy_64fc **policy);

- 主函数操作：
  HmppResult HMPPS_CrossCorrNorm_32f(const float *src1, int32_t src1Len, const float *src2, int32_t src2Len, float *dst, int32_t dstLen, int32_t lowLag, HmppNormMode normMode, HmppsCorrPolicy_32f *policy);

  HmppResult HMPPS_CrossCorrNorm_64f(const double *src1, int32_t src1Len, const double *src2, int32_t src2Len, double *dst, int32_t dstLen, int32_t lowLag, HmppNormMode normMode, HmppsCorrPolicy_64f *policy);

  HmppResult HMPPS_CrossCorrNorm_32fc(const Hmpp32fc *src1, int32_t src1Len, const Hmpp32fc *src2, int32_t src2Len, Hmpp32fc *dst, int32_t dstLen, int32_t lowLag, HmppNormMode normMode, HmppsCorrPolicy_32fc *policy);

  HmppResult HMPPS_CrossCorrNorm_64fc(const Hmpp64fc *src1, int32_t src1Len, const Hmpp64fc *src2, int32_t src2Len, Hmpp64fc *dst, int32_t dstLen, int32_t lowLag, HmppNormMode normMode, HmppsCorrPolicy_64fc *policy);

- 释放内存操作：
  HmppResult HMPPS_CorrRelease_32f(HmppsCorrPolicy_32f *policy);

  HmppResult HMPPS_CorrRelease_64f(HmppsCorrPolicy_64f *policy);

  HmppResult HMPPS_CorrRelease_32fc(HmppsCorrPolicy_32fc *policy);

  HmppResult HMPPS_CorrRelease_64fc(HmppsCorrPolicy_64fc *policy);


#### 参数

| 参数名 | 描述 | 取值范围 | 输入/输出 |
| --- | --- | --- | --- |
| src1 | 指向第一个源向量的指针。 | 非空 | 输入 |
| src1Len | 第一个源向量长度。 | (0, INT\_MAX] | 输入 |
| scr2 | 指向第二个源向量的指针。 | 非空 | 输入 |
| src2Len | 第二个源向量长度。 | (0, INT\_MAX] | 输入 |
| dst | 指向目的向量的指针。 | 非空 | 输出 |
| dstLen | 目标向量长度。 | (0, INT\_MAX] | 输入 |
| lowLag | 互相关最小滞后。 | [INT\_MIN,INT\_MAX] | 输入 |
| algMode | 计算使用的算法模型，可能的值是：HMPP\_ALG\_AUTO、HMPP\_ALG\_DEFAULT、HMPP\_ALG\_FFT。 | HMPP\_ALG\_AUTO HMPP\_ALG\_DEFAULT HMPP\_ALG\_FFT | 输入 |
| normMode | 数据归一化模式，可能的值是：HMPP\_NORM\_NORMAL、HMPP\_NORM\_BIASED、HMPP\_NORM\_UNBIASED。 | HMPP\_NORM\_NORMAL HMPP\_NORM\_BIASED HMPP\_NORM\_UNBIASED | 输入 |
| policy （init函数中） | 指向内存存储CorrPolicy的指针。 | 非空 | 输出 |
| policy （主函数中和release函数中） | 指向CorrPolicy结构体的指针。 | 非空 | 输入 |


#### 返回值

- 成功：返回HMPP_STS_NO_ERR。
- 失败：返回错误码。


#### 错误码

| 错误码 | 描述 |
| --- | --- |
| HMPP\_STS\_NO\_ERR | 表示没有错误。 |
| HMPP\_STS\_NULL\_PTR\_ERR | 当任何指定的指针为空时指示错误。 |
| HMPP\_STS\_SIZE\_ERR | 当src1Len、src2Len或dstLen ≤ 0时指示错误。 |
| HMPP\_STS\_MISMATCH | Init函数申请内存的问题规模和主函数中实际计算的问题规模不匹配。 |
| HMPP\_STS\_OVERFLOW\_ERR | FFT加速模型的问题规模过大。 |
| HMPP\_STS\_MALLOC\_FAILED | Init函数中进行算法模型所需内存申请失败。 |


#### 注意

- 调用该接口计算之前，必须调用Init接口初始化HmppsCorrPolicy_32f规范结构。
- HmppsCorrPolicy_32f结构体初始化需在Init函数中进行申请的，用户无法自己进行该结构体申请定义。
- src1、src2不能和dst是同一数组，否则可能导致结果错误。
- 使用HMPP_ALG_AUTO或HMPP_ALG_FFT模式时，当src1Len、src2Len、dstLen较大时会出现OVERFLOW错误提示。


#### 示例

```
void CrossCorrNorm_Example()
{
const int src1Len = 10;
const int src2Len = 5;
const int dstLen = 10;
float src1[src1Len];
float src2[src2Len];
float dst[dstLen];
HmppsCorrPolicy_32f *policy = NULL;
for (int i = 0; i < src1Len; ++i) src1[i] = 1;
for (int i = 0; i < src2Len; ++i) src2[i] = 1;
int lowLag = -1;
HmppResult result = HMPPS_CrossCorrInit_32f(src1Len, src2Len, dstLen, lowLag, HMPP_ALG_AUTO, &policy);
if (result != HMPP_STS_NO_ERR) {
printf("Init failed");
return;
}
result = HMPPS_CrossCorrNorm_32f(src1, src1Len, src2, src2Len, dst, dstLen, lowLag, HMPP_NORM_NORMAL, policy);
if (result != HMPP_STS_NO_ERR) {
printf("CrossCorr failed");
return;
}
for (int i = 0; i < dstLen; ++i) {
printf("%.2f ", dst[i]);
}
HMPPS_CorrRelease_32f(policy);
}
```

运行结果：

```
5 5 4 3 2 1 0 0 0 0
```
