---
title: IIRGen
description: "生成低通或高通IIR滤波器。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengboostkithistory/251RC1/accel/kunpengaccel_hmpp_06_0285.html
sourcePath: /source/zh/kunpengboostkithistory/251RC1/accel/kunpengaccel_hmpp_06_0285.html
indexId: b4f1a7ff92cee46196e0b5f3f633528fe9755c27c2b5a286d85c7feaeb3293e477
---
# IIRGen

生成低通或高通IIR滤波器。

HMPP支持生成Butterworth和Chebyshev1类型的滤波器。Butterworth滤波器的特点是在通带内平坦，Chebyshev1滤波器的特点在通带内有波纹波动。

函数接口声明如下：

HmppResult HMPPS_IIRGenLowpass_64f(double rFreq, double ripple, int order, double *pTaps, HmppsIIRFilterType filterType);

HmppResult HMPPS_IIRGenHighpass_64f(double rFreq, double ripple, int order, double *pTaps, HmppsIIRFilterType filterType);

#### 参数

| 参数名 | 描述 | 取值范围 | 输入/输出 |
| --- | --- | --- | --- |
| rFreq | 截止频率。 | (0,0.5) | 输入 |
| ripple | 当滤波器类型为HmppChebyshev1时指定波纹。 | (0, INT\_MAX]，滤波器类型为HmppChebyshev1时(0, 28] | 输入 |
| order | 生成滤波器的阶数。 | [1, 12] | 输入 |
| filterType | 生成滤波器的类型。 | HmppButterworth：表示滤波器类型为Butterworth滤波器 HmppChebyshev1：表示滤波器类型为Chebyshev1滤波器 | 输入 |
| pTaps | 生成滤波器的系数。 | 非空 | 输出 |


#### 返回值

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


#### 错误码

| 错误码 | 描述 |
| --- | --- |
| HMPP\_STS\_NO\_ERR | 表示没有错误。 |
| HMPP\_STS\_NULL\_PTR\_ERR | 任何指定的指针为空时错误。 |
| HMPP\_STS\_GEN\_ORDER\_ERR | 生成的order小于1或大于12。 |
| HMPP\_STS\_FILTER\_FREQUENCY\_ERR | 截止频率不在(0, 0.5)范围内。 |


- 滤波器类型仅支持HmppButterworth和HmppChebyshev1，请勿使用其他值，否则结果可能出错。
- IIR滤波器的收敛性对系数a的量化误差敏感，因此将生成double类型的系数用于单精度计算时候需要验证滤波器是否收敛。


#### 示例

以下是用HMPP分别生成一个高通滤波器和一个低通滤波器的示例代码。

高通滤波器的类型为Butterworth，阶数为9，采样频率为1000Hz，截止频率为400Hz。与MatLab等价的代码：[b,a] = butter(9,400/500,'high');。

低通滤波器的类型为Chebyshev1，阶数为9，采样频率为1000Hz，截止频率为400Hz，通带内的波纹为0.4dB。与MatLab等价的代码：[b,a] = cheby1(9, 0.4, 400/500);。

```
#define ORDER 9
#define TAPS_LEN ((ORDER + 1) * 2)
void IIRGenExample() {
HmppResult ret;
double taps[TAPS_LEN];
ret = HMPPS_IIRGenHighpass_64f(400.0 / 1000.0, 0, ORDER, taps, HmppButterworth);
printf("IIRGenHighpass ret=%d\n", ret);
for (int i = 0; i < TAPS_LEN; ++i) {
printf("%lf ", taps[i]);
}
printf("\n");
ret = HMPPS_IIRGenLowpass_64f(400.0 / 1000.0, 0.4, ORDER, taps, HmppChebyshev1);
printf("IIRGenLowpass ret=%d\n", ret);
for (int i = 0; i < TAPS_LEN; ++i) {
printf("%lf ", taps[i]);
}
printf("\n");
}
```

运行结果：

```
IIRGenHighpass ret=0
0.000006 -0.000057 0.000229 -0.000534 0.000800 -0.000800 0.000534 -0.000229 0.000057 -0.000006 1.000000 5.386221 13.378550 19.961682 19.623982 13.137028 5.973215 1.775180 0.312381 0.024765
IIRGenLowpass ret=0
0.080020 0.720182 2.880728 6.721698 10.082547 10.082547 6.721698 2.880728 0.720182 0.080020 1.000000 4.135535 8.510626 10.746179 9.121897 5.230419 1.958336 0.349120 -0.039936 -0.041825
```
