CSI-DSP  Version 1.0.0
CSI DSP Software Library
函数
有限冲激响应 (FIR) 稀疏滤波器

函数

void csky_fir_sparse_f32 (csky_fir_sparse_instance_f32 *S, float32_t *pSrc, float32_t *pDst, float32_t *pScratchIn, uint32_t blockSize)
 浮点稀疏FIR滤波器处理函数 更多...
 
void csky_fir_sparse_init_f32 (csky_fir_sparse_instance_f32 *S, uint16_t numTaps, float32_t *pCoeffs, float32_t *pState, int32_t *pTapDelay, uint16_t maxDelay, uint32_t blockSize)
 浮点稀疏FIR滤波器初始化函数 更多...
 
void csky_fir_sparse_init_q15 (csky_fir_sparse_instance_q15 *S, uint16_t numTaps, q15_t *pCoeffs, q15_t *pState, int32_t *pTapDelay, uint16_t maxDelay, uint32_t blockSize)
 Q15稀疏FIR滤波器初始化函数 更多...
 
void csky_fir_sparse_init_q31 (csky_fir_sparse_instance_q31 *S, uint16_t numTaps, q31_t *pCoeffs, q31_t *pState, int32_t *pTapDelay, uint16_t maxDelay, uint32_t blockSize)
 Q31稀疏FIR滤波器初始化函数 更多...
 
void csky_fir_sparse_init_q7 (csky_fir_sparse_instance_q7 *S, uint16_t numTaps, q7_t *pCoeffs, q7_t *pState, int32_t *pTapDelay, uint16_t maxDelay, uint32_t blockSize)
 Q7稀疏FIR滤波器初始化函数 更多...
 
void csky_fir_sparse_q15 (csky_fir_sparse_instance_q15 *S, q15_t *pSrc, q15_t *pDst, q15_t *pScratchIn, q31_t *pScratchOut, uint32_t blockSize)
 Q15 稀疏FIR滤波器处理函数 更多...
 
void csky_fir_sparse_q31 (csky_fir_sparse_instance_q31 *S, q31_t *pSrc, q31_t *pDst, q31_t *pScratchIn, uint32_t blockSize)
 Q31 稀疏FIR滤波器处理函数 更多...
 
void csky_fir_sparse_q7 (csky_fir_sparse_instance_q7 *S, q7_t *pSrc, q7_t *pDst, q7_t *pScratchIn, q31_t *pScratchOut, uint32_t blockSize)
 Q7 稀疏FIR滤波器处理函数 更多...
 

简要说明

这些函数实现了稀疏FIR滤波器。

稀疏FIR滤波器跟标准FIR滤波器相似,只不过它的大多数系数值是0。

稀疏滤波器常用在通信和音频应用中模拟反射。

为Q7,Q15,Q31和浮点数据类型分别提供了不同的函数。

函数以块为单位处理输入输出数据,并且滤波器每次调用处理 blockSize 个样本. pSrcpDst 指向输入输出数组,数组分别包含 blockSize 个值.

算法:
稀疏滤波器结构体实例在系数数组 b 之外,还有一个索引 pTapDelay 来指定非零系数的位置。 算法相比标准FIR效率更高的原因是,在算法实现里面利用了非零系数索引,省略了大多数与0相乘的步骤。
      y[n] = b[0] * x[n-pTapDelay[0]] + b[1] * x[n-pTapDelay[1]] + b[2] * x[n-pTapDelay[2]] + ...+ b[numTaps-1] * x[n-pTapDelay[numTaps-1]]
  
FIRSparse.gif
稀疏FIR滤波器. b[n] 表示滤波器系数
pCoeffs 指向系数数组,数组的大小是 numTaps; pTapDelay 指向非零索引数组,数组的大小也是 numTaps; pState 指向状态数组,数组的大小 maxDelay + blockSize, 其中 maxDelaypTapDelay 数组中最大的可用索引值。 有些处理函数还要求提供一些临时的缓存。
结构体实例
滤波器的系数和状态变量都保存在数据结构的实例中。 每个滤波器都必须有一个单独的结构体实例。 系数数组可能可以在几个实例之间共享,但是状态变量数组不能共享。 为支持的4种数据类型分别提供了不同的结构体实例声明。
初始化函数
为每种支持的数据类型都提供了一个相应的初始化函数。 初始化函数处理以下操作:
  • 设置内部结构体字段的值
  • 清零状态缓存中的值 如果手动初始化,而不调用初始化函数,需要指定结构体实例的以下字段: numTaps, pCoeffs, pTapDelay, maxDelay, stateIndex, pState. pState中的所有值置0.
是否使用初始化函数是可选的。 但是,使用了初始化函数,则不能将结构体实例放在常量数据段。 要将结构体实例放在常量数据段,则必须手动初始化结构体实例。 在静态初始化之前,要确保状态缓存中的值已经清零。 下面的代码,为4种不同的滤波器,静态的初始化了结构体实例。
*csky_fir_sparse_instance_f32 S = {numTaps, 0, pState, pCoeffs, maxDelay, pTapDelay};
*csky_fir_sparse_instance_q31 S = {numTaps, 0, pState, pCoeffs, maxDelay, pTapDelay};
*csky_fir_sparse_instance_q15 S = {numTaps, 0, pState, pCoeffs, maxDelay, pTapDelay};
*csky_fir_sparse_instance_q7 S =  {numTaps, 0, pState, pCoeffs, maxDelay, pTapDelay};
  
定点行为
使用定点稀疏FIR滤波器函数需要注意。 特别是要考虑,在每个函数内使用的累加器的溢出和饱和行为。 具体参考每个函数各自的文档和使用说明。

函数说明

void csky_fir_sparse_f32 ( csky_fir_sparse_instance_f32 S,
float32_t pSrc,
float32_t pDst,
float32_t pScratchIn,
uint32_t  blockSize 
)
参数
[in]*S指向浮点稀疏FIR结构体实例
[in]*pSrc指向输入数据块
[out]*pDst指向输出数据块
[in]*pScratchIn指向临时缓存,大小是 blockSize
[in]blockSize指向处理的输入样本数量
返回
none.
void csky_fir_sparse_init_f32 ( csky_fir_sparse_instance_f32 S,
uint16_t  numTaps,
float32_t pCoeffs,
float32_t pState,
int32_t *  pTapDelay,
uint16_t  maxDelay,
uint32_t  blockSize 
)
参数
[in,out]*S指向浮点稀疏FIR结构体实例
[in]numTaps滤波器中非零系数数量
[in]*pCoeffs指向滤波器系数数组
[in]*pState指向状态数组
[in]*pTapDelay指向偏移数组
[in]maxDelay支持的最大偏移
[in]blockSize处理的样本数量
返回
none

描述说明:

pCoeffs 保存了滤波器系数,长度为 numTaps. pState 保存了滤波器的状态变量,长度为 maxDelay + blockSize, 其中 maxDelay 是偏移支持的最大值。 blockSize 是处理样本的数量,传入给 csky_fir_sparse_f32() .
void csky_fir_sparse_init_q15 ( csky_fir_sparse_instance_q15 S,
uint16_t  numTaps,
q15_t pCoeffs,
q15_t pState,
int32_t *  pTapDelay,
uint16_t  maxDelay,
uint32_t  blockSize 
)
参数
[in,out]*S指向Q15稀疏FIR结构体实例
[in]numTaps滤波器中非零系数数量
[in]*pCoeffs指向滤波器系数数组
[in]*pState指向状态数组
[in]*pTapDelay指向偏移数组
[in]maxDelay支持的最大偏移
[in]blockSize处理的样本数量
返回
none

描述说明:

pCoeffs 保存了滤波器系数,长度为 numTaps. pState 保存了滤波器的状态变量,长度为 maxDelay + blockSize, 其中 maxDelay 是偏移支持的最大值。 blockSize 是处理样本的数量,传入给 csky_fir_sparse_q15().
void csky_fir_sparse_init_q31 ( csky_fir_sparse_instance_q31 S,
uint16_t  numTaps,
q31_t pCoeffs,
q31_t pState,
int32_t *  pTapDelay,
uint16_t  maxDelay,
uint32_t  blockSize 
)
参数
[in,out]*S指向Q31稀疏FIR结构体实例
[in]numTaps滤波器中非零系数数量
[in]*pCoeffs指向滤波器系数数组
[in]*pState指向状态数组
[in]*pTapDelay指向偏移数组
[in]maxDelay支持的最大偏移
[in]blockSize处理的样本数量
返回
none

描述说明:

pCoeffs 保存了滤波器系数,长度为 numTaps. pState 保存了滤波器的状态变量,长度为 maxDelay + blockSize, 其中 maxDelay 是偏移支持的最大值。 blockSize 是处理样本的数量,传入给 csky_fir_sparse_q31().
void csky_fir_sparse_init_q7 ( csky_fir_sparse_instance_q7 S,
uint16_t  numTaps,
q7_t pCoeffs,
q7_t pState,
int32_t *  pTapDelay,
uint16_t  maxDelay,
uint32_t  blockSize 
)
参数
[in,out]*S指向Q7稀疏FIR结构体实例
[in]numTaps滤波器中非零系数数量
[in]*pCoeffs指向滤波器系数数组
[in]*pState指向状态数组
[in]*pTapDelay指向偏移数组
[in]maxDelay支持的最大偏移
[in]blockSize处理的样本数量
返回
none

描述说明:

pCoeffs 保存了滤波器系数,长度为 numTaps. pState 保存了滤波器的状态变量,长度为 maxDelay + blockSize, 其中 maxDelay 是偏移支持的最大值。 blockSize 是处理样本的数量,传入给 csky_fir_sparse_q7() .
void csky_fir_sparse_q15 ( csky_fir_sparse_instance_q15 S,
q15_t pSrc,
q15_t pDst,
q15_t pScratchIn,
q31_t pScratchOut,
uint32_t  blockSize 
)
参数
[in]*S指向Q15稀疏FIR结构体实例
[in]*pSrc指向输入数据块
[out]*pDst指向输出数据块
[in]*pScratchIn指向临时缓存,大小是 blockSize
[in]*pScratchOut指向临时缓存,大小是 blockSize.
[in]blockSize处理的输入样本数量
返回
none.

缩放和溢出行为:

函数实现使用了一个内部32位累加器。 1.15 和 1.15 相乘生成2.30的结果,结果在2.30格式的累加器累加。 因此相乘结果的所有精度都可以保留,但是累加器只有一个保护位。 如果累加器溢出,不会做饱和处理,而是往符号位方向溢出。 处理完所有的乘累加后,2.30累加器截断成2.15格式,然后饱和成1.15格式。 为了防止溢出,输入信号或者系数必须缩小 log2(numTaps) 位.
void csky_fir_sparse_q31 ( csky_fir_sparse_instance_q31 S,
q31_t pSrc,
q31_t pDst,
q31_t pScratchIn,
uint32_t  blockSize 
)
参数
[in]*S指向Q31稀疏FIR结构体实例
[in]*pSrc指向输入数据块
[out]*pDst指向输出数据块
[in]*pScratchIn指向临时缓存,大小是 blockSize.
[in]blockSize处理的输入样本数量
返回
none.

缩放和溢出行为:

函数实现使用了一个内部32位累加器。 1.31 和 1.31 相乘的结果截断为 2.30 格式. 中间乘法的过程丢失了部分精度,并且只有一个保护位 如果累加器溢出,不会做饱和处理,而是往符号位方向溢出。 为了防止溢出,输入信号或者系数必须缩小 log2(numTaps) 位.
void csky_fir_sparse_q7 ( csky_fir_sparse_instance_q7 S,
q7_t pSrc,
q7_t pDst,
q7_t pScratchIn,
q31_t pScratchOut,
uint32_t  blockSize 
)
参数
[in]*S指向Q7稀疏FIR结构体实例
[in]*pSrc指向输入数据块
[out]*pDst指向输出数据块
[in]*pScratchIn指向临时缓存,大小是 blockSize.
[in]*pScratchOut指向临时缓存,大小是 blockSize.
[in]blockSize处理的输入样本数量
返回
none.

缩放和溢出行为:

函数实现使用了一个内部32位累加器。 系数和状态变量都用1.7格式表示,相乘生成2.14结果。 2.14的中间结果在18.14格式的32位累加器累加。 这些操作可以保留所有的精度,并且不会有溢出风险 累加器之后丢弃低7位截断为18.7格式。 最后,结果转换为1.7格式。