|
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
个样本. pSrc
和 pDst
指向输入输出数组,数组分别包含 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]]
稀疏FIR滤波器. b[n] 表示滤波器系数
pCoeffs
指向系数数组,数组的大小是 numTaps
; pTapDelay
指向非零索引数组,数组的大小也是 numTaps
; pState
指向状态数组,数组的大小 maxDelay + blockSize
, 其中 maxDelay
是 pTapDelay
数组中最大的可用索引值。 有些处理函数还要求提供一些临时的缓存。
- 结构体实例
- 滤波器的系数和状态变量都保存在数据结构的实例中。 每个滤波器都必须有一个单独的结构体实例。 系数数组可能可以在几个实例之间共享,但是状态变量数组不能共享。 为支持的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滤波器函数需要注意。 特别是要考虑,在每个函数内使用的累加器的溢出和饱和行为。 具体参考每个函数各自的文档和使用说明。
- 参数
-
[in] | *S | 指向浮点稀疏FIR结构体实例 |
[in] | *pSrc | 指向输入数据块 |
[out] | *pDst | 指向输出数据块 |
[in] | *pScratchIn | 指向临时缓存,大小是 blockSize |
[in] | blockSize | 指向处理的输入样本数量 |
- 返回
- none.
- 参数
-
[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()
.
- 参数
-
[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()
.
- 参数
-
[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()
.
- 参数
-
[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()
.
- 参数
-
[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) 位.
- 参数
-
[in] | *S | 指向Q31稀疏FIR结构体实例 |
[in] | *pSrc | 指向输入数据块 |
[out] | *pDst | 指向输出数据块 |
[in] | *pScratchIn | 指向临时缓存,大小是 blockSize. |
[in] | blockSize | 处理的输入样本数量 |
- 返回
- none.
缩放和溢出行为:
- 函数实现使用了一个内部32位累加器。 1.31 和 1.31 相乘的结果截断为 2.30 格式. 中间乘法的过程丢失了部分精度,并且只有一个保护位 如果累加器溢出,不会做饱和处理,而是往符号位方向溢出。 为了防止溢出,输入信号或者系数必须缩小 log2(numTaps) 位.
- 参数
-
[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格式。