IIRIIR
初始化一个无限脉冲响应(IIR)滤波器并对输入进行零相位数字滤波(zero-phase digital filtering)。
滤波过程分为正向滤波和反向滤波。x(n)将被存储在src中,滤波输出y(n)存储在dst中。下面简单解释零相位数字滤波器的原理。
数字信号的时域表示:




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




由此可以推出:

即输出序列与输入序列之间没有相位偏移。
正向滤波器和反向滤波器的阶数由order指定。系数向量长度为2*(order+1),元素排列如下:

IIRIIRInit接受长度为order的延迟线向量,允许为空。若为空,将会用生成一个初始条件填充延迟线。
IIRIIR函数调用流程如下:
- 使用对应的IIRIIRInit函数进行初始化。
 - 使用IIRIIR进行滤波操作。
 - 再使用IIRIIRGetDlyLine或者IIRIIRSetDlyLine检索设置延迟线。
 - 最后再使用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错误,  | 
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
