CSI-DSP  Version 1.0.0
CSI DSP Software Library
函数
直接II型IIR滤波器

函数

void csky_biquad_cascade_df2T_f32 (const csky_biquad_cascade_df2T_instance_f32 *S, float32_t *pSrc, float32_t *pDst, uint32_t blockSize)
 浮点转置直接II型二阶级联滤波器处理函数 更多...
 
void csky_biquad_cascade_df2T_f64 (const csky_biquad_cascade_df2T_instance_f64 *S, float64_t *pSrc, float64_t *pDst, uint32_t blockSize)
 浮点转置直接II型二阶级联滤波器处理函数 更多...
 
void csky_biquad_cascade_df2T_init_f32 (csky_biquad_cascade_df2T_instance_f32 *S, uint8_t numStages, float32_t *pCoeffs, float32_t *pState)
 浮点转置直接II型二阶级联滤波器初始化函数 更多...
 
void csky_biquad_cascade_df2T_init_f64 (csky_biquad_cascade_df2T_instance_f64 *S, uint8_t numStages, float64_t *pCoeffs, float64_t *pState)
 浮点转置直接II型二阶级联滤波器初始化函数 更多...
 
void csky_biquad_cascade_stereo_df2T_f32 (const csky_biquad_cascade_stereo_df2T_instance_f32 *S, float32_t *pSrc, float32_t *pDst, uint32_t blockSize)
 浮点转置直接II型二阶级联滤波器处理函数. 更多...
 
void csky_biquad_cascade_stereo_df2T_init_f32 (csky_biquad_cascade_stereo_df2T_instance_f32 *S, uint8_t numStages, float32_t *pCoeffs, float32_t *pState)
 浮点转置直接II型二阶级联滤波器初始化函数 更多...
 

简要说明

这些函数使用了直接II型转置结构实现了任意阶递归(IIR)滤波器。 滤波器是由二阶单元Biquad级联实现。

与直接I型相比,这些函数稍微节省了一些内存占用。

只支持浮点数据类型。

函数以块单位操作输入输出数据。每次调用函数通过滤波器处理 blockSize 个样本。 pSrc 指向输入数组数据, pDst 指向输出数组数据。 两个数组都包含 blockSize 个数值.

算法
每个二阶阶段都使用差分方程实现一个二阶滤波:
   y[n] = b0 * x[n] + d1
   d1 = b1 * x[n] + a1 * y[n] + d2
   d2 = b2 * x[n] + a2 * y[n]
其中 d1 和 d2 表示两个状态变量.
使用单个转置直接II型结构的双二阶滤波器如下:
BiquadDF2Transposed.gif
单转置直接II型
系数 b0, b1, 和 b2 与输入信号 x[n] 相乘,并且被称为前馈系数。 系数 a1a2 与输出信号 y[n] 相乘,并且被称为反馈系数。 需要注意反馈系数的符号。 有些设计工具使用差分方程:
   y[n] = b0 * x[n] + d1;
   d1 = b1 * x[n] - a1 * y[n] + d2;
   d2 = b2 * x[n] - a2 * y[n];
这种情况下,反馈系数 a1a2 在使用CSI DSP库的时候,必须取反。
高阶滤波器通过级联的二阶单元实现。 numStages 指定使用了多少二阶阶段。 比如,第8阶滤波器是numStages=4 的二阶阶段。 第9阶滤波器可以看做 numStages=5 的二阶阶段,系数配置为第一阶 (b2=0a2=0).
pState 指向状态变量数组。 每个二阶阶段有2个状态变量 d1d2. 状态变量被排列在 pState 如下:
    {d11, d12, d21, d22, ...}
其中 d1x 是第一个二阶阶段的状态变量, d2x 是第二个二阶阶段的变量, 状态变量数组总共有 2*numStages 个值. 每个块数据处理会更新状态变量,不会更新系数。
CSI 库里面包括了直接I型和转置直接II型。 直接I型的优点是,对于定点数据类型会更加稳定。 这也是为什么直接I型提供了Q15和Q31数据类型的函数。 另一方面,转置直接II型结构,需要更广的动态范围状态变量 d1d2. 因此,CSI库只提供浮点版本的直接II型函数。 直接II型的优点是,每个阶段只需要2个状态变量。
结构体实例
滤波器的系数和状态变量都保存在数据结构体实例中。 每个滤波器都需要定义单独的结构体实例。 系数数组可以在几个实例中共享,但是状态变量数组不能共享。
初始化函数
提供一个对应的初始化函数。 初始化函数处理下列操作:
  • 设置结构体内字段的值
  • 清零状态buffer的值 不使用初始化函数,手动处理这些操作,需要设置结构体实例内的以下字段: numStages, pCoeffs, pState. 将pState的所有值置0。
是否使用初始化函数是可选的。 但是,如果使用初始化函数,则结构体实例不能被放在常量数据段。 想要将结构体实例放在常量数据段,则必须手动的初始化结构体实例。 在静态初始化之前,先把状态buffer中的值置0。 比如,静态初始化结构体实例使用:
    csky_biquad_cascade_df2T_instance_f32 S1 = {numStages, pState, pCoeffs};
其中 numStages 是滤波器内二阶阶段的数量; pState 是状态buffer的地址。 pCoeffs 是系数buffer的地址。

这些函数使用了直接II型转置结构实现了任意阶递归(IIR)滤波器。 滤波器是由二阶单元Biquad级联实现。

与直接I型相比,这些函数稍微节省了一些内存占用。 只支持浮点数据类型。

函数以块单位操作输入输出数据。每次调用函数通过滤波器处理 blockSize 个样本。 pSrc 指向输入数组数据, pDst 指向输出数组数据。 两个数组都包含 blockSize 个数值.

算法
每个二阶阶段都使用差分方程实现一个二阶滤波:
   y[n] = b0 * x[n] + d1
   d1 = b1 * x[n] + a1 * y[n] + d2
   d2 = b2 * x[n] + a2 * y[n]
其中 d1 和 d2 表示两个状态变量.
使用单个转置直接II型结构的双二阶滤波器如下:
BiquadDF2Transposed.gif
单转置直接II型
系数 b0, b1, 和 b2 与输入信号 x[n]相乘,并且被称为前馈系数。 系数 a1a2 与输出信号 y[n] 相乘,并且被称为反馈系数。 需要注意反馈系数的符号。 有些设计工具使用差分方程:
   y[n] = b0 * x[n] + d1;
   d1 = b1 * x[n] - a1 * y[n] + d2;
   d2 = b2 * x[n] - a2 * y[n];
这种情况下,反馈系数 a1a2 在使用CSI DSP库的时候,必须取反。
高阶滤波器通过级联的二阶单元实现。 numStages 指定使用了多少二阶阶段。 比如,第8阶滤波器是numStages=4 的二阶阶段。 第9阶滤波器可以看做 numStages=5 的二阶阶段,系数配置为第一阶 (b2=0a2=0).
pState 指向状态变量数组。. 每个二阶阶段有2个状态变量 d1d2. 状态变量被排列在 pState 如下:
    {d11, d12, d21, d22, ...}
其中 d1x 是第一个二阶阶段的状态变量, d2x 是第二个二阶阶段的变量, 状态变量数组总共有 2*numStages 个值. 每个块数据处理会更新状态变量,不会更新系数。
CSI 库里面包括了直接I型和转置直接II型。 直接I型的优点是,对于定点数据类型会更加稳定。 这也是为什么直接I型提供了Q15和Q31数据类型的函数。 另一方面,转置直接II型结构,需要更广的动态范围状态变量 d1d2. 因此,CSI库只提供浮点版本的直接II型函数。 直接II型的优点是,每个阶段只需要2个状态变量。
结构体实例
滤波器的系数和状态变量都保存在数据结构体实例中。 每个滤波器都需要定义单独的结构体实例。 系数数组可以在几个实例中共享,但是状态变量数组不能共享。
初始化函数
提供一个对应的初始化函数。 初始化函数处理下列操作:
  • 设置结构体内字段的值
  • 清零状态buffer的值 不使用初始化函数,手动处理这些操作,需要设置结构体实例内的以下字段: numStages, pCoeffs, pState. 将pState的所有值置0。
是否使用初始化函数是可选的。 但是,如果使用初始化函数,则结构体实例不能被放在常量数据段。 想要将结构体实例放在常量数据段,则必须手动的初始化结构体实例。 在静态初始化之前,先把状态buffer中的值置0。 比如,静态初始化结构体实例使用:
    csky_biquad_cascade_df2T_instance_f64 S1 = {numStages, pState, pCoeffs};
其中 numStages 是滤波器内二阶阶段的数量; pState 是状态buffer的地址。 pCoeffs 是系数buffer的地址。

函数说明

void csky_biquad_cascade_df2T_f32 ( const csky_biquad_cascade_df2T_instance_f32 S,
float32_t pSrc,
float32_t pDst,
uint32_t  blockSize 
)
参数
[in]*S指向滤波器数据结构体实例
[in]*pSrc指向输入数据块
[out]*pDst指向输出数据块
[in]blockSize处理的样本数量
返回
none.
void csky_biquad_cascade_df2T_f64 ( const csky_biquad_cascade_df2T_instance_f64 S,
float64_t pSrc,
float64_t pDst,
uint32_t  blockSize 
)
参数
[in]*S指向滤波器数据结构体实例
[in]*pSrc指向输入数据块
[out]*pDst指向输出数据块
[in]blockSize处理的样本数量
返回
none.
void csky_biquad_cascade_df2T_init_f32 ( csky_biquad_cascade_df2T_instance_f32 S,
uint8_t  numStages,
float32_t pCoeffs,
float32_t pState 
)
参数
[in,out]*S指向滤波器数据结构体实例
[in]numStages滤波器中二阶阶段的数量
[in]*pCoeffs指向滤波器系数
[in]*pState指向状态buffer
返回
none

系数和状态顺序:

保存在数组 pCoeffs 中的系数,按下列顺序排列:
    {b10, b11, b12, a11, a12, b20, b21, b22, a21, a22, ...}
其中 b1xa1x 是第一阶段的系数, b2xa2x 是第二阶段的系数,依次类推。 pCoeffs 数组总共有 5*numStages 个数.
pState 是指向状态数组的指针。 每个二阶阶段有2个状态变量 d1,d2. 阶段1使用最开始的2个状态变量,阶段2使用接下来的2个状态变量,依次类推。 状态数组总共有 2*numStages 个值. 每个块数据处理会更新状态变量,不会更新系数。
void csky_biquad_cascade_df2T_init_f64 ( csky_biquad_cascade_df2T_instance_f64 S,
uint8_t  numStages,
float64_t pCoeffs,
float64_t pState 
)
参数
[in,out]*S指向滤波器数据结构体实例
[in]numStages滤波器中二阶阶段的数量
[in]*pCoeffs指向滤波器系数
[in]*pState指向状态buffer
返回
none

系数和状态顺序:

保存在数组 pCoeffs 中的系数,按下列顺序排列:
    {b10, b11, b12, a11, a12, b20, b21, b22, a21, a22, ...}
其中 b1xa1x 是第一阶段的系数, b2xa2x 是第二阶段的系数,依次类推。 pCoeffs 数组总共有 5*numStages 个数.
pState 是指向状态数组的指针。 每个二阶阶段有2个状态变量 d1,d2. 阶段1使用最开始的2个状态变量,阶段2使用接下来的2个状态变量,依次类推。 状态数组总共有 2*numStages 个值. 每个块数据处理会更新状态变量,不会更新系数
void csky_biquad_cascade_stereo_df2T_f32 ( const csky_biquad_cascade_stereo_df2T_instance_f32 S,
float32_t pSrc,
float32_t pDst,
uint32_t  blockSize 
)
参数
[in]*S指向滤波器数据结构体实例
[in]*pSrc指向输入数据块
[out]*pDst指向输出数据块
[in]blockSize处理的样本数量
返回
none.
void csky_biquad_cascade_stereo_df2T_init_f32 ( csky_biquad_cascade_stereo_df2T_instance_f32 S,
uint8_t  numStages,
float32_t pCoeffs,
float32_t pState 
)
参数
[in,out]*S指向滤波器数据结构体实例
[in]numStages滤波器中二阶阶段的数量
[in]*pCoeffs指向滤波器系数
[in]*pState指向状态buffer
返回
none

系数和状态顺序:

保存在数组 pCoeffs 中的系数,按下列顺序排列:
    {b10, b11, b12, a11, a12, b20, b21, b22, a21, a22, ...}
其中 b1xa1x 是第一阶段的系数, b2xa2x 是第二阶段的系数,依次类推。 pCoeffs 数组总共有 5*numStages 个数.
pState 是指向状态数组的指针。 每个二阶阶段有2个状态变量 d1,d2 . 阶段1使用最开始的2个状态变量,阶段2使用接下来的2个状态变量,依次类推。 状态数组总共有 2*numStages 个值. 每个块数据处理会更新状态变量,不会更新系数。