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

IIRSparse

初始化一个任意阶稀疏IIR滤波器并进行滤波。

稀疏滤波器仅对系数非零的位置进行计算,适用于高阶非零元素较少的滤波器。输入向量x(n)将被存储在src中,输出向量y(n)存储在dst中。

计算公式如下:

在初始化接受长度为nzTapsLen1 + nzTapsLen2的非零系数向量、非零系数位置向量和延迟线向量,系数向量的排列为:

系数位置向量的顺序为:

计算完成后,存储在Policy内部的延迟线将会被更新。

IIRSparse函数调用流程如下:

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

函数接口申明如下:

  • 初始化操作

    HmppResult HMPPS_IIRSparseInit_32f(HmppsIIRSparsePolicy_32f **policy, const float *nzTaps, const int32_t *nzTapPos, int32_t nzTapsLen1, int32_t nzTapsLen2, const float *dlyLine);

  • 滤波操作:

    HmppResult HMPPS_IIRSparse_32f(const float *src, float *dst, int len, HmppsIIRSparsePolicy_32f *policy);

  • 释放内存操作:

    HmppResult HMPPS_IIRSparseRelease_32f(HmppsIIRSparsePolicy_32f *policy);

返回值

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

参数

参数名

描述

取值范围

输入/输出

nzTapsLen1

系数向量A的长度。

(0, INT_MAX]

输入

nzTapsLen2

系数向量B的长度。

(0, INT_MAX]

输入

nzTaps

指向系数向量的指针。

非空,所有元素非零

输入

nzTapsPos

指向系数位置向量的指针。

非空升序序列,所有元素非零

输入

src

指向源向量指针

非空

输入

dst

指向目标向量的指针。

非空

输出

dlyLine

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

向量可以为NULL,如果为NULL,则用全零充延迟线。

输入

len

源向量和目标向量长度

(0, INT_MAX]

输入

policy(init函数中)

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

非空

输出

policy(滤波函数中和release函数中)

指向IIRSparsePolicy结构体的指针。

非空

输入

错误码

错误码

描述

HMPP_STS_NO_ERR

表示没有错误。

HMPP_STS_NULL_PTR_ERR

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

HMPP_STS_SIZE_ERR

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

HMPP_STS_SPARSE_ERR

除0错误,不能为0。

HMPP_STS_IIR_ORDER_ERR

系数位置数组不是升序,或pNZTapPos[nzTapsLen1]为0。

HMPP_STS_MALLOC_FAILED

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

  • 调用该接口计算之前,必须调用Init接口初始化IIRSparsePolicy规范结构。
  • IIRSparsePolicy结构体初始化需在Init函数中进行申请的,用户无法自己进行该结构体申请定义。
  • IIRSparsePolicy结构体初始化成功后,如果执行主函数失败,必须使用Release函数释放结构体。
  • IIRSparsePolicy会存储当前的dly,但是暂时不支持用户获取/设置。

示例

#define TAPS_LEN1 3
#define TAPS_LEN2 2
#define SRC_LEN 5

void IIRSparseExample(void) {
    float nzTaps[TAPS_LEN1 + TAPS_LEN2] = {0.11381195, -0.22762391,  0.11381195, -0.8457246 , -0.30097242};
    int nzTapsPos[TAPS_LEN1 + TAPS_LEN2] = {0, 1, 2, 1, 2};
    float src[SRC_LEN] = {-609.13320264, -797.90780797, -654.27805165, -108.74137918, 24.2107372};
    float dly[TAPS_LEN1 + TAPS_LEN2] = {-578.53248547, 282.88755714, 861.85222751, 342.84958675, 769.01355443};
    float dst[SRC_LEN];
    HmppsIIRSparsePolicy_32f *policy = NULL;
    HmppResult result;

    result = HMPPS_IIRSparseInit_32f(&policy, nzTaps, nzTapsPos, TAPS_LEN1, TAPS_LEN2, dly);
    printf("HMPPS_IIRSparseInit_32f result = %d\n", result);
    if (result != HMPP_STS_NO_ERR) {
        return;
    }
    result = HMPPS_IIRSparse_32f(src, dst, SRC_LEN, policy);
    printf("HMPPS_IIR_32f result = %d\n", result);
    if (result != HMPP_STS_NO_ERR) {
        return;
    }
    int32_t i;
    printf("\ndstLen = %d\ndst =", SRC_LEN);
    for (i = 0; i < SRC_LEN; ++i) {
        printf(" %f", dst[i]);
    }
    printf("\n");
    HMPPS_IIRSparseRelease_32f(policy);
    policy = NULL;
}

运行结果:

HMPPS_IIRSparseInit_32f result = 0
HMPPS_IIR_32f result = 0

dstLen = 5
dst = -737.520752 346.343597 -33.106266 -30.499273 -11.198996