Resample
使用对理想低通滤波器加Kaiser窗的多项滤波器对数据进行重采样,适用于可变的重采样率。
函数调用流程如下:
- 调用Init初始化结构体。
- 调用重采样主函数。
- 最后调用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 |
|
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