---
title: Resample
description: "使用对理想低通滤波器加Kaiser窗的多项滤波器对数据进行重采样,适用于可变的重采样率。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengboostkithistory/240RC1/accel/kunpengaccel_hmpp_06_0180.html
sourcePath: /source/zh/kunpengboostkithistory/240RC1/accel/kunpengaccel_hmpp_06_0180.html
indexId: 669091e477fa8f8a8621c3d7b24440f604f4ae3bbb83bd3d7a13006f7fbd89e077
---
# Resample

使用对理想低通滤波器加Kaiser窗的多项滤波器对数据进行重采样,适用于可变的重采样率。

函数调用流程如下：

1. 调用Init初始化结构体。
2. 调用重采样主函数。
3. 最后调用Release释放结构体所包含的内存。

输入待重采样数据src的最左边和最右边需包含滤波所需要的延长线数据；滤波器长度filterLen跟factor、step、window关系如下：

filterLen / 2 = window * 0.5 + 1； factor > 1.0

filterLen / 2 = window * 0.5 / factor + 1.0 / (factor * step); factor < 1.0

src左侧延长线数据个数：(filterLen / 2) - time;

src右侧延长线数据个数：time + (filterLen / 2);

即src长度应该为len + filterLen。

函数接口声明如下：

- 初始化操作：
  HmppResult HMPPS_ResamplePolyphaseInit_32f(float window, int32_t step, float rollf, float alpha, HmppHintAlgorithm hint, HmppsResamplingPolyphase_32f **policy);

  HmppResult HMPPS_ResamplePolyphaseInit_16s(float window, int32_t step, float rollf, float alpha, HmppHintAlgorithm hint, HmppsResamplingPolyphase_16s **policy);

- 重采样操作：
  HmppResult HMPPS_ResamplePolyphase_32f(const float *src, int32_t len, float *dst, double factor, float norm, double *time,int32_t *outLen, const HmppsResamplingPolyphase_32f *policy);

  HmppResult HMPPS_ResamplePolyphase_16s(const int16_t *src, int32_t len, int16_t *dst, double factor, float norm, double *time,int32_t *outLen, const HmppsResamplingPolyphase_16s *policy);

- 释放内存操作：
  HmppResult HMPPS_ResamplePolyphaseRelease_32f(HmppsResamplingPolyphase_32f *policy);

  HmppResult HMPPS_ResamplePolyphaseRelease_16s(HmppsResamplingPolyphase_16s *policy);


#### 参数

| 参数名 | 描述 | 取值范围 | 输入/输出 |
| --- | --- | --- | --- |
| window | 理想低通滤波器窗口大小。 | (0, (INT\_MAX \- 0x90) / 4 / step) | 输入 |
| step | 多项滤波器的步长。 | (0, (INT\_MAX \- 0x90) / 4 / window) | 输入 |
| rollf | 滤波器的衰减频率。 | (0, 1.0] | 输入 |
| alpha | Kaiser窗的可调参数。 | (1.0,FLT\_MAX] | 输入 |
| policy | 指向重采样策略结构体的指针或者指针的指针。 | 非空 | 输入、输出 |
| hint | 重采样的模式。 | HMPP\_ALGHINT\_NONE HMPP\_ALGHINT\_FAST HMPP\_ALGHINT\_ACCURATE | 输入 |
| src | 指向输入的待重采样的数据及延迟线。 | 非空 | 输入 |
| dst | 指向输出的已重采样的数据。 | 非空 | 输入、输出 |
| len | 待重采样的数据长度。 | 当factor >= 1.0 : (0,INT\_MAX / factor) 当factor < 1.0 : (0,INT\_MAX) | 输入 |
| factor | 重采样因子。 | (0,DBL\_MAX] | 输入 |
| norm | 重采样数据的归一化系数。 | float任意值 | 输入 |
| time | 指向重采样的开始时间及结束时间。 | 非空 | 输入、输出 |
| outLen | 指向重采样输出的数据长度。 | 非空 | 输入、输出 |


#### 返回值

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


#### 错误码

| 错误码 | 描述 |
| --- | --- |
| HMPP\_STS\_NULL\_PTR\_ERR | src、dst、policy、time、outLen这几个入参中存在空指针。 |
| HMPP\_STS\_SIZE\_ERR | len存在小于或者等于0。 |
| HMPP\_STS\_BAD\_ARG\_ERR | rollf小于或等于0或者大于1。 alpha小于1。 window小于2/step。 factor小于或者等于0。 |
| HMPP\_STS\_MALLOC\_FAILED | 申请内存失败。 |
| HMPP\_STS\_OVER\_FLOW | 所需的内部buffer大小超过INT\_MAX。 |


#### 示例

```
#include <stdio.h>
#include <stdint.h>
#include "hmpps.h"
#include "hmpp_core.h"
#define BUFFER_SIZE_T 10
int main()
{
float src[4 + BUFFER_SIZE_T + 4] = {0, 0, 0, 0, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 0, 0, 0, 0};
float window = 6.0;
int32_t step = 2;
float rollf = 0.95;
float alpha = 9.0f;
double factor = 0.5;
float norm = 1.0;
double time = 4.0;
int32_t outLen;
float dst[BUFFER_SIZE_T/2];
HmppsResamplingPolyphase_32f *policy;
HmppResult result = HMPPS_ResamplePolyphaseInit_32f(window, step, rollf, alpha, HMPP_ALGHINT_FAST, &policy);
if (result != HMPP_STS_NO_ERR) {
return -1;
}
result = HMPPS_ResamplePolyphase_32f(src, BUFFER_SIZE_T, dst, factor, norm, &time, &outLen, policy);
printf("result = %d, outLen = %d\n", result, outLen);
if (result != HMPP_STS_NO_ERR) {
return -1;
}
printf("dst =");
for (int32_t i = 0; i < outLen; i++) {
printf(" %f", dst[i]);
}
printf("\n");
HMPPS_ResamplePolyphaseRelease_32f(policy);
return 0;
}
```

运行结果：

```
result = 0, outLen = 5
dst = 0.761617 1.231306 1.398704 1.602798 1.842311
```
