CSI-DSP  Version 1.0.0
CSI DSP Software Library
函数
无限冲激响应 (IIR) 格型滤波器

函数

void csky_iir_lattice_f32 (const csky_iir_lattice_instance_f32 *S, float32_t *pSrc, float32_t *pDst, uint32_t blockSize)
 浮点IIR格型滤波器处理函数 更多...
 
void csky_iir_lattice_init_f32 (csky_iir_lattice_instance_f32 *S, uint16_t numStages, float32_t *pkCoeffs, float32_t *pvCoeffs, float32_t *pState, uint32_t blockSize)
 浮点IIR格型滤波器初始化函数 更多...
 
void csky_iir_lattice_init_q15 (csky_iir_lattice_instance_q15 *S, uint16_t numStages, q15_t *pkCoeffs, q15_t *pvCoeffs, q15_t *pState, uint32_t blockSize)
 Q15 IIR格型滤波器初始化函数 更多...
 
void csky_iir_lattice_init_q31 (csky_iir_lattice_instance_q31 *S, uint16_t numStages, q31_t *pkCoeffs, q31_t *pvCoeffs, q31_t *pState, uint32_t blockSize)
 Q31 IIR格型滤波器初始化函数 更多...
 
void csky_iir_lattice_q15 (const csky_iir_lattice_instance_q15 *S, q15_t *pSrc, q15_t *pDst, uint32_t blockSize)
 Q15 IIR格型滤波器处理函数 更多...
 
void csky_iir_lattice_q31 (const csky_iir_lattice_instance_q31 *S, q31_t *pSrc, q31_t *pDst, uint32_t blockSize)
 Q31 IIR格型滤波器处理函数 更多...
 

简要说明

这些函数实现了Q15,Q31和浮点的无限冲激响应 (IIR) 格型滤波器. 格型滤波器使用在各种自适应滤波器应用。 滤波器结构具有前馈和反馈分量,并且净脉冲响应是无限长度。 函数以块为单位操作输入输出数据,每次调用滤波器函数处理 blockSize 个样本. pSrcpDst 指向输入输出数组,数组包括 blockSize 个值.

算法:
IIRLattice.gif
无限冲激响应格型滤波器
     fN(n)   =  x(n)
     fm-1(n) = fm(n) - km * gm-1(n-1)   for m = N, N-1, ...1
     gm(n)   = km * fm-1(n) + gm-1(n-1) for m = N, N-1, ...1
     y(n)    = vN * gN(n) + vN-1 * gN-1(n) + ...+ v0 * g0(n)
  
pkCoeffs 指向反射系数数组,数组大小是 numStages. 反射系数保存的顺序如下:
     {kN, kN-1, ....k1}
  
pvCoeffs 指向梯形系数数组,数组大小是 (numStages+1). 梯形系数数组保存的顺序如下:
     {vN, vN-1, ...v0}
  
pState 指向状态数组,数组大小是 numStages + blockSize. 上面提到的状态变量(g值)保存在 pState 数组. 状态变量在每个块数据处理后更新,系数不会被更新。
结构体实例
滤波器的系数和状态变量都保存在数据结构的实例中。 每个滤波器都必须有一个单独的结构体实例。 系数数组可能可以在几个实例之间共享,但是状态变量数组不能共享。 为支持的3种数据类型分别提供了不同的结构体实例声明。
初始化函数
为每种支持的数据类型都提供了一个相应的初始化函数。 初始化函数处理以下操作:
  • 设置内部结构体字段的值
  • 清零状态缓存中的值 如果手动初始化,而不调用初始化函数,需要指定结构体实例的以下字段: numStages, pkCoeffs, pvCoeffs, pState. pState中的所有值置0.
是否使用初始化函数是可选的。 但是,使用了初始化函数,则不能将结构体实例放在常量数据段。 要将结构体实例放在常量数据段,则必须手动初始化结构体实例。 在静态初始化之前,要确保状态缓存中的值已经清零。 下面的代码,为3种不同的滤波器,静态的初始化了结构体实例。
*csky_iir_lattice_instance_f32 S = {numStages, pState, pkCoeffs, pvCoeffs};
*csky_iir_lattice_instance_q31 S = {numStages, pState, pkCoeffs, pvCoeffs};
*csky_iir_lattice_instance_q15 S = {numStages, pState, pkCoeffs, pvCoeffs};
  
其中 numStages 是滤波器阶段的数量; pState 指向状态缓存数组; pkCoeffs 指向反射系数数组; pvCoeffs 指向梯形系数数组.
定点行为
使用定点IIR格型滤波器函数需要注意。 特别是要考虑,在每个函数内使用的累加器的溢出和饱和行为。 具体参考每个函数各自的文档和使用说明。

函数说明

void csky_iir_lattice_f32 ( const csky_iir_lattice_instance_f32 S,
float32_t pSrc,
float32_t pDst,
uint32_t  blockSize 
)
参数
[in]*S指向浮点IIR格型结构体实例
[in]*pSrc指向输入数据块
[out]*pDst指向输出数据块
[in]blockSize处理的样本数量
返回
none.
void csky_iir_lattice_init_f32 ( csky_iir_lattice_instance_f32 S,
uint16_t  numStages,
float32_t pkCoeffs,
float32_t pvCoeffs,
float32_t pState,
uint32_t  blockSize 
)
参数
[in]*S指向一个浮点IIR格型结构体实例
[in]numStages滤波器中的阶段数量
[in]*pkCoeffs指向反射系数缓存,数组的长度是 numStages.
[in]*pvCoeffs指向梯形系数缓存,数组的长度是 numStages+1.
[in]*pState指向状态缓存,数组的长度是 numStages+blockSize.
[in]blockSize处理的样本数量
返回
none.
void csky_iir_lattice_init_q15 ( csky_iir_lattice_instance_q15 S,
uint16_t  numStages,
q15_t pkCoeffs,
q15_t pvCoeffs,
q15_t pState,
uint32_t  blockSize 
)
参数
[in]*S指向Q15 IIR格型滤波器结构体实例
[in]numStages滤波器阶段的数量
[in]*pkCoeffs指向反射系数缓存,数组的长度是 numStages.
[in]*pvCoeffs指向梯形系数缓存,数组的长度是 numStages+1.
[in]*pState指向状态缓存,数组的长度是 numStages+blockSize.
[in]blockSize处理的样本数量
返回
none.
void csky_iir_lattice_init_q31 ( csky_iir_lattice_instance_q31 S,
uint16_t  numStages,
q31_t pkCoeffs,
q31_t pvCoeffs,
q31_t pState,
uint32_t  blockSize 
)
参数
[in]*S指向Q15 IIR格型滤波器结构体实例
[in]numStages滤波器阶段的数量
[in]*pkCoeffs指向反射系数缓存,数组的长度是 numStages.
[in]*pvCoeffs指向梯形系数缓存,数组的长度是 numStages+1.
[in]*pState指向状态缓存,数组的长度是 numStages+blockSize.
[in]blockSize处理的样本数量
返回
none.
void csky_iir_lattice_q15 ( const csky_iir_lattice_instance_q15 S,
q15_t pSrc,
q15_t pDst,
uint32_t  blockSize 
)
参数
[in]*S指向Q15 IIR格型结构体实例
[in]*pSrc指向输入数据块
[out]*pDst指向输出数据块
[in]blockSize处理的样本数量
返回
none.

缩放和溢出行为:

函数实现使用了一个内部64位累加器。 系数和状态变量都表示为1.15格式。 中间乘法生成2.30格式的结果,结果在34.30格式的64位累加器累加。 因为有33位保护位,所以不会有溢出的风险。同时还可以保存所有的中间乘法结果的精度。 最后,34.30格式的丢弃低15位截断为34.15,然后饱和生成1.15格式的结果。
void csky_iir_lattice_q31 ( const csky_iir_lattice_instance_q31 S,
q31_t pSrc,
q31_t pDst,
uint32_t  blockSize 
)
参数
[in]*S指向Q15 IIR格型结构体实例
[in]*pSrc指向输入数据块
[out]*pDst指向输出数据块
[in]blockSize处理的样本数量
返回
none.

缩放和溢出行为:

函数实现使用了一个内部64位累加器。 输入数据表示为1.31格式。 中间乘法生成2.62格式的结果,结果在2.62格式的64位累加器累加。 因为只有一个保护位,所以需要缩小输入信号来防止溢出。 为了防止溢出,必须缩小2*log2(numStages)个位。 最后,2.62格式右移31位,然后饱和生成1.15格式的结果。