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

FIRSparse

滤波器就是对特定的频率或者特定频率以外的频率进行消除的电路,被广泛用于通信系统和信号处理系统中。从功能角度,数字滤波器对输入离散信号的数字代码进行运算处理,以达到滤除频带外信号的目的。而稀疏滤波是针对滤波器中具有较多的0值,只记录非0抽头的类型滤波器并进行信号处理。

滤波目标向量dst(y)通过滤波系数组nzTaps(b)与src(x)向量中采样信号x做卷积运算得。

计算公式如下:

dlyLine向量支持空值:如果dlyLine为空,该函数使用全零值的延迟线。

FIRSparse函数调用流程如下:

  1. 使用对应的FIRSparseInit函数进行初始化。
  2. 使用FIRSparse进行滤波操作。
  3. 再使用FIRSparseGetDlyLine或者FIRSparseSetDlyLine检索设置延迟线。
  4. 最后使用FIRSparseRelease对FIRSparseInit申请的内存进行释放。

函数接口声明如下:

  • 初始化操作:

    HmppResult HMPPS_FIRSparseInit_32f(const float *nzTaps, const int32_t *nzTapsPos, int32_t nzTapsLen, const float *dlyLine, HmppsFIRSparsePolicy_32f **policy);

  • 获取延迟线操作:

    HmppResult HMPPS_FIRSparseGetDlyLine_32f(const HmppsFIRSparsePolicy_32f *policy, float *dlyLine);;

  • 设置延迟线操作:

    HmppResult HMPPS_FIRSparseSetDlyLine_32f(HmppsFIRSparsePolicy_32f *policy, const float *dlyLine);

  • 主函数操作:

    HmppResult HMPPS_FIRSparse_32f(const float *src, float *dst, int32_t len, HmppsFIRSparsePolicy_32f *policy);

  • 释放内存操作:

    HmppResult HMPPS_FIRSparseRelease_32f(HmppsFIRSparsePolicy_32f *policy);

参数

参数名

描述

取值范围

输入/输出

nzTaps

指向包含非零抽头值的指针。

非空

输入

nzTapPos

指向包含非零抽头值位置(从0开始计)的指针。

非空,数组中的数据值需在[0, INT_MAX]范围内,且升序

输入

nzTapsLen

数组中具有非零抽头值的元素的数目。

(0, INT_MAX]

输入

dlyLine(init和setDly函数中)

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

数组中的元素数为nzTapPos[nzTapsLen - 1],当dlyLine为NULL时,使用0填充

输入

dlyLine(getDly函数中)

指向延迟线值的指针。

非空

输出

src

指向源向量的指针。

非空

输入

len

源向量中的元素长度。

(0, INT_MAX]

输入

dst

指向目标向量的指针。

非空

输出

policy(init函数中)

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

非空

输出

policy(setDly函数中)

指向FIRSparsePolicy的指针。

非空

输出

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

指向FIRSparsePolicy结构体的指针。

非空

输入

返回值

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

错误码

错误码

描述

HMPP_STS_NO_ERR

表示没有错误。

HMPP_STS_NULL_PTR_ERR

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

HMPP_STS_SIZE_ERR

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

HMPP_STS_SPARSE_ERR

指示nzTapPos指针指向的数组内数值不是升序排序,或有负数或重复的数值出现。

HMPP_STS_OVERFLOW

指示计算溢出时错误。

HMPP_STS_MALLOC_FAILED

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

注意

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

示例

#define TPAS_LEN_S 5
#define DLYLINE_LEN_S 8
#define SRC_LEN_S 7
void FIRSparseExample(void)
{
    int32_t nzTapsLen = TPAS_LEN_S;
    float nzTaps[TPAS_LEN_S] = { 0.1, 0.2, 0.3, 0.4, 0.5 };
    int32_t nzTapsPos[TPAS_LEN_S] = { 1, 3, 4, 6, DLYLINE_LEN_S };
    float *dlyLine1 = NULL;
    float dlyLine2[DLYLINE_LEN_S] = { 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08 };
    float dlyDst[DLYLINE_LEN_S] = { 0.0f };
    int32_t len = SRC_LEN_S;
    float src[SRC_LEN_S] = { 0.2107, -40.6842, 17.1776, -15.6654, -2.407, -0.8981, 0.2883 };
    float dst[SRC_LEN_S] = { 0.0f };

    HmppsFIRSparsePolicy_32f *policy = NULL;
    HmppResult result;

    result = HMPPS_FIRSparseInit_32f(nzTaps, nzTapsPos, nzTapsLen, dlyLine1, &policy);
    printf("HMPPS_FIRSparseInit_32f result = %d\n", result);
    if (result != HMPP_STS_NO_ERR) {
        return;
    }
    result = HMPPS_FIRSparseSetDlyLine_32f(policy, dlyLine2);
    printf("HMPPS_FIRSparseSetDlyLine_32f result = %d\n", result);
    if (result != HMPP_STS_NO_ERR) {
        HMPPS_FIRSparseRelease_32f(policy);
        return;
    }
    result = HMPPS_FIRSparse_32f(src, dst, len, policy);
    printf("HMPPS_FIRSparse_32f result = %d\n", result);
    if (result != HMPP_STS_NO_ERR) {
        HMPPS_FIRSparseRelease_32f(policy);
        return;
    }
    result = HMPPS_FIRSparseGetDlyLine_32f(policy, dlyDst);
    printf("HMPPS_FIRSparseGetDlyLine_32f result = %d\n", result);
    HMPPS_FIRSparseRelease_32f(policy);
    policy = NULL;
    if (result != HMPP_STS_NO_ERR) {
        return;
    }

    int32_t i;
    printf("len = %d\ndst =", len);
    for(i = 0; i < len; ++i){
        printf(" %f", dst[i]);
    }
    printf("\ndlyDstLen = %d\ndlyDst =", DLYLINE_LEN_S);
    for(i = 0; i < DLYLINE_LEN_S; ++i){
        printf(" %f", dlyDst[i]);
    }
    printf("\n");
}

运行结果:

HMPPS_FIRSparseInit_32f result = 0
HMPPS_FIRSparseSetDlyLine_32f result = 0
HMPPS_FIRSparse_32f result = 0
HMPPS_FIRSparseGetDlyLine_32f result = 0
len = 7
dst = 0.083000 0.089070 -4.014420 1.799900 -9.612170 -8.991440 2.024671
dlyDstLen = 8
dlyDst = 0.288300 -0.898100 -2.407000 -15.665400 17.177601 -40.684200 0.210700 0.010000