|
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累加器实现二阶级联。