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或HmppChebyshev1 |
输入 |
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