---
title: IIRSparse
description: "初始化一个任意阶稀疏IIR滤波器并进行滤波。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengboostkithistory/251RC1/accel/kunpengaccel_hmpp_06_0287.html
sourcePath: /source/zh/kunpengboostkithistory/251RC1/accel/kunpengaccel_hmpp_06_0287.html
indexId: a236f3bb4c8e0ab9985b20d8f3c922923caef991da6046c60e5b2150e2efe7b877
---
# 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
```
