---
title: IIRIIR
description: "初始化一个无限脉冲响应（IIR）滤波器并对输入进行零相位数字滤波（zero-phase digital filtering）。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengboostkithistory/251RC1/accel/kunpengaccel_hmpp_06_0286.html
sourcePath: /source/zh/kunpengboostkithistory/251RC1/accel/kunpengaccel_hmpp_06_0286.html
indexId: d56e3329f1547628d7e36be4953d482c068685a52433c128f8f506bd0d698e2e77
---
# IIRIIR

初始化一个无限脉冲响应（IIR）滤波器并对输入进行零相位数字滤波（zero-phase digital filtering）。

滤波过程分为正向滤波和反向滤波。x(n)将被存储在src中，滤波输出y(n)存储在dst中。下面简单解释零相位数字滤波器的原理。

数字信号的时域表示：


其中，h(n)为对应数字滤波器的冲激响应，y4(n)去掉首尾L个信号点即为对应输出序列。

频域表示：


由此可以推出：


即输出序列与输入序列之间没有相位偏移。

正向滤波器和反向滤波器的阶数由order指定。系数向量长度为2*(order+1)，元素排列如下：


IIRIIRInit接受长度为order的延迟线向量，允许为空。若为空，将会用生成一个初始条件填充延迟线。

IIRIIR函数调用流程如下：

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

函数接口声明如下：

- 初始化操作：

HmppResult HMPPS_IIRIIRInit_32f(HmppsIIRPolicy_32f **policy, const float *taps, int order, const float *dlyLine);

HmppResult HMPPS_IIRIIRInit_64f(HmppsIIRPolicy_64f **policy, const double *taps, int order, const double *dlyLine);

- 获取延迟线操作：

HmppResult HMPPS_IIRIIRGetDlyLine_32f(const HmppsIIRPolicy_32f *policy, float *dlyLine);

HmppResult HMPPS_IIRIIRGetDlyLine_64f(const HmppsIIRPolicy_64f *policy, double *dlyLine);

- 设置延迟线操作：

HmppResult HMPPS_IIRIIRSetDlyLine_32f(HmppsIIRPolicy_32f *policy, const float *dlyLine);

HmppResult HMPPS_IIRIIRSetDlyLine_64f(HmppsIIRPolicy_64f *policy, const double *dlyLine);

- 滤波操作：

HmppResult HMPPS_IIRIIR_32f(const float *src, float *dst, int len, HmppsIIRPolicy_32f *policy);

HmppResult HMPPS_IIRIIR_64f(const double *src, double *dst, int len, HmppsIIRPolicy_64f *policy);

- 释放内存操作：

HmppResult HMPPS_IIRIIRRelease_32f(HmppsIIRPolicy_32f *policy);

HmppResult HMPPS_IIRIIRRelease_64f(HmppsIIRPolicy_64f *policy);

#### 参数

| 参数名 | 描述 | 取值范围 | 输入/输出 |
| --- | --- | --- | --- |
| taps | 指向滤波器系数的指针。 | 非空 | 输入 |
| order | IIR滤波器的阶数。 | (0, INT\_MAX] | 输入 |
| src | 指向源向量指针。 | 非空 | 输入 |
| dst | 指向目标向量的指针。 | 非空 | 输出 |
| len | 源向量和目标向量长度。 | [3 \* order, INT\_MAX] | 输入 |
| dlyLine（init和setDly函数中） | 指向包含延迟线向量的指针。 | 向量可以为NULL，如果为NULL，则用初始条件填充延迟线。 | 输入 |
| dlyLine（getDly函数中） | 指向延迟线值的指针。 | 非空 | 输出 |
| policy（init函数中） | 指向内存存储IIRIIRPolicy的指针的指针。 | 非空 | 输出 |
| policy（setDly函数中） | 指向IIRIIRPolicy结构体的指针。 | 非空 | 输入 |
| policy（滤波函数中和release函数中） | 指向IIRIIRPolicy结构体的指针。 | 非空 | 输入 |


#### 返回值

- 成功：返回HMPP_STS_NO_ERR。
- 失败：返回错误码。


#### 错误码

| 错误码 | 描述 |
| --- | --- |
| HMPP\_STS\_NO\_ERR | 表示没有错误。 |
| HMPP\_STS\_NULL\_PTR\_ERR | 任何指定的指针为空时错误。 |
| HMPP\_STS\_LENGTh\_ERR | len小于或等于0时错误、或len<3\*order。 |
| HMPP\_STS\_DIV\_BY\_ZERO\_ERR | 除0错误，不能为0。 |
| HMPP\_STS\_CONTEXT\_MATCH\_ERR | 表示Policy状态不正确时出错（使用了错误的Init函数）。 |
| HMPP\_STS\_MALLOC\_FAILED | Init函数中进行算法模型所需内存申请失败。 |


- 调用该接口计算之前，必须调用Init接口初始化IIRIIRPolicy规范结构。
- IIRIIRPolicy结构体初始化需在Init函数中进行申请的，用户无法自己进行该结构体申请定义。
- IIRIIRPolicy结构体初始化成功后，如果执行滤波失败，必须使用Release函数释放结构体。
- IIRIIR对滤波器输入数据长度有要求，要求len≥3*order。


#### 示例

```
#define ORDER 4
#define TAPS_LEN ( (ORDER + 1) * 2)
#define SRC_LEN 12
#define DLY_LEN ORDER
void IIRIIRExample(void) {
float taps[TAPS_LEN] = {0.0390, -0.1560, 0.2340, -0.1560, 0.0390, 1.0000, 0.9532, 0.7746, 0.2338, 0.0366};
float src[SRC_LEN] = {186, 431, 689, 206, 716, 90, 695, -153, 289, 291, 482, -21};
float dlySrc[DLY_LEN] = {123, 312, 781, 249};
float dlyDst[DLY_LEN];
float dst[SRC_LEN];
HmppsIIRPolicy_32f *policy = NULL;
HmppResult result;
result = HMPPS_IIRIIRInit_32f(&policy, taps, ORDER, dlySrc);
printf("HMPPS_IIRIIRInit_32f result = %d\n", result);
if (result != HMPP_STS_NO_ERR) {
return;
}
result = HMPPS_IIRIIR_32f(src, dst, SRC_LEN, policy);
printf("HMPPS_IIRIIR_32f result = %d\n", result);
if (result != HMPP_STS_NO_ERR) {
return;
}
int32_t i;
printf("dstLen = %d\ndst =", SRC_LEN);
for (i = 0; i < SRC_LEN; ++i) {
printf(" %f", dst[i]);
}
HMPPS_IIRIIRGetDlyLine_32f(policy, dlyDst);
printf("\ndlyDstLen = %d\ndlyDst =", DLY_LEN);
for (i = 0; i < DLY_LEN; ++i) {
printf(" %f", dlyDst[i]);
}
printf("\n");
HMPPS_IIRIIRRelease_32f(policy);
policy = NULL;
}
```

运行结果：

```
HMPPS_IIRIIRInit_32f result = 0
HMPPS_IIRIIR_32f result = 0
dstLen = 12
dst = 1265.131836 330.548798 -677.644104 32.452599 557.080872 -618.195129 370.672546 -161.901367 103.654419 -112.175522 88.226212 -16.978725
dlyDstLen = 4
dlyDst = -0.039000 0.117000 -0.117000 0.039000
```
