EN
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

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

  1. rollf小于或等于0或者大于1。
  2. alpha小于1。
  3. window小于2/step。
  4. 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