初始化一个任意阶稀疏IIR滤波器并进行滤波。
稀疏滤波器仅对系数非零的位置进行计算,适用于高阶非零元素较少的滤波器。输入向量x(n)将被存储在src中,输出向量y(n)存储在dst中。
计算公式如下:
在初始化接受长度为nzTapsLen1 + nzTapsLen2的非零系数向量、非零系数位置向量和延迟线向量,系数向量的排列为:。
系数位置向量的顺序为:
。
计算完成后,存储在Policy内部的延迟线将会被更新。
IIRSparse函数调用流程如下:
函数接口申明如下:
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);
参数名 |
描述 |
取值范围 |
输入/输出 |
---|---|---|---|
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错误, |
HMPP_STS_IIR_ORDER_ERR |
系数位置数组不是升序,或pNZTapPos[nzTapsLen1]为0。 |
HMPP_STS_MALLOC_FAILED |
Init函数中进行算法模型所需内存申请失败。 |
#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