CSI-DSP
Version 1.0.0
CSI DSP Software Library
|
函数 | |
void | csky_biquad_cas_df1_32x64_init_q31 (csky_biquad_cas_df1_32x64_ins_q31 *S, uint8_t numStages, q31_t *pCoeffs, q63_t *pState, uint8_t postShift) |
void | csky_biquad_cas_df1_32x64_q31 (const csky_biquad_cas_df1_32x64_ins_q31 *S, q31_t *pSrc, q31_t *pDst, uint32_t blockSize) |
这个函数为Q31数据类型实现了一个高精度二阶级联滤波器。 滤波器的系数系数是1.31格式,状态变量是1.63格式。 双精度状态变量减少滤波器中的量化噪声,并提供了更清晰的输出。 这些滤波器函数在实现奇点接近单位圆的滤波器时很有用。 常见于截至频率很低的低通或者高通滤波器。
函数以块为单位操作输入输出数据, 每次调用函数处理 blockSize
个样本. pSrc
和 pDst
指向输入和输出数组,包含 blockSize
个Q31数.
y[n] = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2]一个直接I型算法的每个阶段使用5个系数和4个状态变量。
b0, b1, 和 b2
与输入信号 x[n]
相乘,并且被称为前馈系数。 系数 a1
和 a2
与输出信号 y[n]
相乘,并且被称为反馈系数。需要注意反馈系数的符号。 有些设计工具使用差分方程:
y[n] = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] - a1 * y[n-1] - a2 * y[n-2]
这种情况下,反馈系数a1
和 a2
在使用CSI DSP库的时候,必须取反。
numStages
指定使用了多少二阶阶段。 比如,第8阶滤波器是numStages=4
的二阶阶段。 numStages=5
的二阶阶段,系数配置为第一阶(b2=0
和 a2=0
).pState
指向状态变量数组. 每个二阶阶段有4个状态变量x[n-1], x[n-2], y[n-1],
和 y[n-2]
,并且为了提高精度,每个状态变量都是1.63格式. 状态变量在数组中的排列: {x[n-1], x[n-2], y[n-1], y[n-2]}
4*numStages
个1.63格式的值。 每个块数据处理会更新状态变量,不会更新系数。csky_biquad_cas_df1_32x64_ins_q31 S1 = {numStages, pState, pCoeffs, postShift};其中
numStages
是滤波器中二阶阶段的数量; pState
是状态buffer的地址; pCoeffs
是系数buffer的地址; postShift
是移位数。 [-1 +1)
范围之间. 处理函数有一个额外的缩放参数 postShift
用于给滤波器系数放大到超过[+1 -1)
. 滤波器的累加器的输出是一个移位寄存器,结果移动postShift
位. 2^postShift
. 比如,为了表示系数 {1.5, -0.8, 1.2, 1.6, -0.9}可以设置pCoeffs数组为:
{0.75, -0.4, 0.6, 0.8, -0.45}并且设置
postShift=1
void csky_biquad_cas_df1_32x64_init_q31 | ( | csky_biquad_cas_df1_32x64_ins_q31 * | S, |
uint8_t | numStages, | ||
q31_t * | pCoeffs, | ||
q63_t * | pState, | ||
uint8_t | postShift | ||
) |
[in,out] | *S | 指向一个高精度Q31二阶级联滤波器结构体实例 |
[in] | numStages | 滤波器中二阶阶段的数量 |
[in] | *pCoeffs | 指向滤波器的系数 |
[in] | *pState | 指向状态buffer |
[in] | postShift | 累加后的移位,根据系数格式变化 |
系数和状态顺序:
pCoeffs
: {b10, b11, b12, a11, a12, b20, b21, b22, a21, a22, ...}其中
b1x
和 a1x
是第一个阶段的系数, b2x
和 a2x
是第二个阶段的系数,依次类推。 pCoeffs
数组总共有5*numStages
个数值.pState
是指向状态数组的指针,每个状态变量都是1.63的格式. 每个二阶阶段有4个状态变量 x[n-1], x[n-2], y[n-1],
和y[n-2]
. 状态变量排列在数组的顺序如下: {x[n-1], x[n-2], y[n-1], y[n-2]}最前面是第一阶段的4个状态变量, 然后是第二阶段的4个状态变量,依次类推。 状态数组总共有
4*numStages
个数值. 状态变量在数据块处理之后更新,系数不会更新。 void csky_biquad_cas_df1_32x64_q31 | ( | const csky_biquad_cas_df1_32x64_ins_q31 * | S, |
q31_t * | pSrc, | ||
q31_t * | pDst, | ||
uint32_t | blockSize | ||
) |
[in] | *S | 指向高精度Q31二阶级联滤波器实例 |
[in] | *pSrc | 指向输入数据块 |
[out] | *pDst | 指向输出数据块 |
[in] | blockSize | 处理的样本数量 |
postShift
位,并且结果通过丢弃低32位,截断为1.31格式。csky_biquad_cascade_df1_q31()
用32位的系数和状态变量,以及Q63累加器实现二阶级联。 csky_biquad_cascade_df1_fast_q31()
用32位的系数和状态变量,以及Q31累加器实现二阶级联。