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

FIRSR

对源矢量执行单速率FIR滤波,单速率基本FIR滤波器IP核是单速率(输入采样率=输出采样率)有限脉冲响应滤波器。

计算taps向量(长度为tapsLen)和src向量(长度为len)、dlySrc向量(长度为tapsLen-1)的线性点积运算,目标向量存储到dst向量中,延迟线向量存储在dlyDst中。

计算公式为:

其中,x(0)...x(numIters)是源向量;h(0)...h( tapsLen -1)是FIR滤波器系数。要计算y(0)...y(tapsLen -1)目标向量,该函数使用延迟线的dly向量。

举例如下:

y(0)= h(tapsLen-1)* d(0)+h(tapsLen-2)* d(1)+...+h(1)*d(tapsLen -2)+h(0)*x(0)

y(1)= h(tapsLen-1)* d(1)+h(tapsLen-2)* d(2)+... +h(2)*d(tapsLen -2)+h(1)*x(0)+h(0)*x(1)

y(tapsLen-1)= h(tapsLen-1)* x(0)+...+h(1)* x(tapsLen-2)+h(0)* x(tapsLen-1)

其中,

  • d(0)、d(1)、d(2)和d(tapsLen -2)是dlySrc向量的元素。
  • dlySrc向量和dlyDst支持空值:
    • 如果dlySrc为空,该函数使用全零值的延迟线。
    • 如果dlyDst为空,该函数不会将任何数据复制到目标延迟线。

该函数调用流程如下:

  1. 调用Init初始化FIRPolicy结构体。
  2. 调用主函数。
  3. 最后调用Release释放FIRPolicy函数所包含内存(16s、16sc使用32f、32fc初始化及释放)。

函数接口声明如下:

  • 初始化操作:

    HmppResult HMPPS_FIRSRInit_32f(const float *taps, int32_t tapsLen, int32_t len, HmppAlgMode algType, HmppsFIRPolicy_32f **policy);

    HmppResult HMPPS_FIRSRInit_64f(const double *taps, int32_t tapsLen, int32_t len, HmppAlgMode algType, HmppsFIRPolicy_64f **policy);

    HmppResult HMPPS_FIRSRInit_32fc(const Hmpp32fc *taps, int32_t tapsLen, int32_t len, HmppAlgMode algType, HmppsFIRPolicy_32fc **policy);

    HmppResult HMPPS_FIRSRInit_64fc(const Hmpp64fc *taps, int32_t tapsLen, int32_t len, HmppAlgMode algType, HmppsFIRPolicy_64fc **policy);

    HmppResult HMPPS_FIRSRInit32f_32fc(const float *taps, int32_t tapsLen, int32_t len, HmppAlgMode algType, HmppsFIRPolicy_32f **policy);

  • 主函数操作:

    HmppResult HMPPS_FIRSR_16s(const int16_t *src, int16_t *dst, int32_t len, HmppsFIRPolicy_32f *policy, const int16_t *dlySrc, int16_t *dlyDst);

    HmppResult HMPPS_FIRSR_32f(const float *src, float *dst, int32_t len, HmppsFIRPolicy_32f *policy, const float *dlySrc, float *dlyDst);

    HmppResult HMPPS_FIRSR_64f(const double *src, double *dst, int32_t len, HmppsFIRPolicy_64f *policy, const double *dlySrc, double *dlyDst);

    HmppResult HMPPS_FIRSR_16sc(const Hmpp16sc *src, Hmpp16sc *dst, int32_t len, HmppsFIRPolicy_32fc *policy, const Hmpp16sc *dlySrc, Hmpp16sc *dlyDst);

    HmppResult HMPPS_FIRSR_32fc(const Hmpp32fc *src, Hmpp32fc *dst, int32_t len, HmppsFIRPolicy_32fc *policy, const Hmpp32fc *dlySrc, Hmpp32fc *dlyDst);

    HmppResult HMPPS_FIRSR_64fc(const Hmpp64fc *src, Hmpp64fc *dst, int32_t len, HmppsFIRPolicy_64fc *policy, const Hmpp64fc *dlySrc, Hmpp64fc *dlyDst);

    HmppResult HMPPS_FIRSR32f_32fc(const Hmpp32fc *src, Hmpp32fc *dst, int32_t len, HmppsFIRPolicy_32f *policy, const Hmpp32fc *dlySrc, Hmpp32fc *dlyDst);

  • 释放内存操作

    HmppResult HMPPS_FIRSRRelease_32f(HmppsFIRPolicy_32f *policy);

    HmppResult HMPPS_FIRSRRelease_64f(HmppsFIRPolicy_64f *policy);

    HmppResult HMPPS_FIRSRRelease_32fc(HmppsFIRPolicy_32fc *policy);

    HmppResult HMPPS_FIRSRRelease_64fc(HmppsFIRPolicy_64fc *policy);

    HmppResult HMPPS_FIRSRRelease32f_32fc(HmppsFIRPolicy_32f *policy);

参数

参数名

描述

取值范围

输入/输出

taps

指向滤波器系数的指针。

非空

输入

tapsLen

FIR滤波器系数的长度。

(0, INT_MAX]

输入

src

指向源向量的指针。

非空

输入

len

源向量中的元素长度。

(0, INT_MAX]

输入

dst

指向目标向量的指针。

非空

输出

algMode

计算使用的算法模型,可能的值是:HMPP_ALG_AUTO、HMPP_ALG_DEFAULT、HMPP_ALG_FFT。

HMPP_ALG_AUTO

HMPP_ALG_DEFAULT

HMPP_ALG_FFT

输入

dlySrc

指向包含源延迟线值向量的指针。

向量可以为NULL,如果为非NULL,则数组长度定义为tapsLen - 1

输入

dlyDst

指向包含目标延迟线值向量的指针。

向量可以为NULL,如果为非NULL,则数组长度定义为tapsLen - 1

输出

policy

(init函数中)

指向内存存储FIRPolicy的指针的指针。

非空

输出

policy(主函数中和release函数中)

指向FIRPolicy结构体的指针。

非空

输入

返回值

  • 成功:返回HMPP_STS_NO_ERR
  • 失败:返回错误码。

错误码

错误码

描述

HMPP_STS_NO_ERR

表示没有错误。

HMPP_STS_NULL_PTR_ERR

当任何指定的指针为空时指示错误。

HMPP_STS_SIZE_ERR

当tapsLen或len小于或等于0时指示错误。

HMPP_STS_ALG_TYPE_ERR

指示algMode数值不支持时错误。

HMPP_STS_OVERFLOW

指示计算溢出时错误。

HMPP_STS_MALLOC_FAILED

Init函数中进行算法模型所需内存申请失败。

注意

  • 调用该接口计算之前,必须调用Init接口初始化FIRPolicy规范结构。
  • FIRPolicy结构体初始化需在Init函数中进行申请的,用户无法自己进行该结构体申请定义。
  • FIRPolicy结构体初始化成功后,如果执行主函数失败,必须使用Release函数释放结构体。
  • src不能和dst是同一数组,否则结果正确性无法保证。

示例

#define TPAS_SIZE_S 8
#define SRC_SIZE_S 7
void FIRSRExample(void)
{
    float taps[TPAS_SIZE_S] = { -0.023, -3.1463, 35.5304, -0.0622, 0.2213, 0.0127, 0.0183, 59.8159 };
    float src[SRC_SIZE_S] = { 0.3065, -1.8737, -58.7455, 155.8426, -0.0294, 4.3917, -195.6575 };
    float dlySrc[TPAS_SIZE_S - 1] = { 0.2107, -40.6842, 17.1776, -15.6654, -2.407, -0.8981, 0.2883 };
    float dst[SRC_SIZE_S] = { 0.0f };
    float dlyDst[TPAS_SIZE_S - 1] = { 0.0f };
    int32_t tapsLen = TPAS_SIZE_S;
    int32_t len = SRC_SIZE_S;
    HmppAlgMode algType = HMPP_ALG_AUTO;
    HmppsFIRPolicy_32f *policy = NULL;
    HmppResult result;

    result = HMPPS_FIRSRInit_32f(taps, tapsLen, len, HMPP_ALG_AUTO, &policy);
    printf("HMPPS_FIRSRInit_32f result = %d\n", result);
    if (result != HMPP_STS_NO_ERR) {
        return;
    }
    result = HMPPS_FIRSR_32f(src, dst, len, policy, dlySrc, dlyDst);
    printf("HMPPS_FIRSR_32f result = %d\n", result);
    HMPPS_FIRSRRelease_32f(policy);
    policy = NULL;
    if (result != HMPP_STS_NO_ERR) {
        return;
    }
    int32_t i;
    printf("dstLen = %d\ndst =", len);
    for(i = 0; i < len; ++i){
        printf(" %f", dst[i]);
    }
    printf("\ndlyDstLen = %d\ndst2 =", TPAS_SIZE_S - 1);
    for(i = 0; i < TPAS_SIZE_S - 1; ++i){
        printf(" %f", dlyDst[i]);
    }
    printf("\n");
}

运行结果:

HMPPS_FIRSRInit_32f result = 0
HMPPS_FIRSR_32f result = 0
dstLen = 7
dst = -24.064171 -2424.601318 1045.096069 -822.377380 -2721.383057 5486.669434 -15.829129
dlyDstLen = 7
dst2 = 0.306500 -1.873700 -58.745499 155.842606 -0.029400 4.391700 -195.657501