|
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型结构的双二阶滤波器如下:
单转置直接II型
系数 b0, b1, 和 b2
与输入信号 x[n]
相乘,并且被称为前馈系数。 系数 a1
和 a2
与输出信号 y[n]
相乘,并且被称为反馈系数。 需要注意反馈系数的符号。 有些设计工具使用差分方程:
y[n] = b0 * x[n] + d1;
d1 = b1 * x[n] - a1 * y[n] + d2;
d2 = b2 * x[n] - a2 * y[n];
这种情况下,反馈系数 a1
和 a2
在使用CSI DSP库的时候,必须取反。
- 高阶滤波器通过级联的二阶单元实现。
numStages
指定使用了多少二阶阶段。 比如,第8阶滤波器是numStages=4
的二阶阶段。 第9阶滤波器可以看做 numStages=5
的二阶阶段,系数配置为第一阶 (b2=0
和 a2=0
).
pState
指向状态变量数组。 每个二阶阶段有2个状态变量 d1
和 d2
. 状态变量被排列在 pState
如下:
{d11, d12, d21, d22, ...}
其中 d1x
是第一个二阶阶段的状态变量, d2x
是第二个二阶阶段的变量, 状态变量数组总共有 2*numStages
个值. 每个块数据处理会更新状态变量,不会更新系数。
- CSI 库里面包括了直接I型和转置直接II型。 直接I型的优点是,对于定点数据类型会更加稳定。 这也是为什么直接I型提供了Q15和Q31数据类型的函数。 另一方面,转置直接II型结构,需要更广的动态范围状态变量
d1
和 d2
. 因此,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型结构的双二阶滤波器如下:
单转置直接II型
系数 b0, b1, 和 b2
与输入信号 x[n]
相乘,并且被称为前馈系数。 系数 a1
和 a2
与输出信号 y[n]
相乘,并且被称为反馈系数。 需要注意反馈系数的符号。 有些设计工具使用差分方程:
y[n] = b0 * x[n] + d1;
d1 = b1 * x[n] - a1 * y[n] + d2;
d2 = b2 * x[n] - a2 * y[n];
这种情况下,反馈系数 a1
和 a2
在使用CSI DSP库的时候,必须取反。
- 高阶滤波器通过级联的二阶单元实现。
numStages
指定使用了多少二阶阶段。 比如,第8阶滤波器是numStages=4
的二阶阶段。 第9阶滤波器可以看做 numStages=5
的二阶阶段,系数配置为第一阶 (b2=0
和 a2=0
).
pState
指向状态变量数组。. 每个二阶阶段有2个状态变量 d1
和 d2
. 状态变量被排列在 pState
如下:
{d11, d12, d21, d22, ...}
其中 d1x
是第一个二阶阶段的状态变量, d2x
是第二个二阶阶段的变量, 状态变量数组总共有 2*numStages
个值. 每个块数据处理会更新状态变量,不会更新系数。
- CSI 库里面包括了直接I型和转置直接II型。 直接I型的优点是,对于定点数据类型会更加稳定。 这也是为什么直接I型提供了Q15和Q31数据类型的函数。 另一方面,转置直接II型结构,需要更广的动态范围状态变量
d1
和 d2
. 因此,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的地址。
- 参数
-
[in] | *S | 指向滤波器数据结构体实例 |
[in] | *pSrc | 指向输入数据块 |
[out] | *pDst | 指向输出数据块 |
[in] | blockSize | 处理的样本数量 |
- 返回
- none.
- 参数
-
[in] | *S | 指向滤波器数据结构体实例 |
[in] | *pSrc | 指向输入数据块 |
[out] | *pDst | 指向输出数据块 |
[in] | blockSize | 处理的样本数量 |
- 返回
- none.
- 参数
-
[in,out] | *S | 指向滤波器数据结构体实例 |
[in] | numStages | 滤波器中二阶阶段的数量 |
[in] | *pCoeffs | 指向滤波器系数 |
[in] | *pState | 指向状态buffer |
- 返回
- none
系数和状态顺序:
- 保存在数组
pCoeffs
中的系数,按下列顺序排列:
{b10, b11, b12, a11, a12, b20, b21, b22, a21, a22, ...}
- 其中
b1x
和 a1x
是第一阶段的系数, b2x
和 a2x
是第二阶段的系数,依次类推。 pCoeffs
数组总共有 5*numStages
个数.
pState
是指向状态数组的指针。 每个二阶阶段有2个状态变量 d1,
和 d2
. 阶段1使用最开始的2个状态变量,阶段2使用接下来的2个状态变量,依次类推。 状态数组总共有 2*numStages
个值. 每个块数据处理会更新状态变量,不会更新系数。
- 参数
-
[in,out] | *S | 指向滤波器数据结构体实例 |
[in] | numStages | 滤波器中二阶阶段的数量 |
[in] | *pCoeffs | 指向滤波器系数 |
[in] | *pState | 指向状态buffer |
- 返回
- none
系数和状态顺序:
- 保存在数组
pCoeffs
中的系数,按下列顺序排列:
{b10, b11, b12, a11, a12, b20, b21, b22, a21, a22, ...}
- 其中
b1x
和 a1x
是第一阶段的系数, b2x
和 a2x
是第二阶段的系数,依次类推。 pCoeffs
数组总共有 5*numStages
个数.
pState
是指向状态数组的指针。 每个二阶阶段有2个状态变量 d1,
和 d2
. 阶段1使用最开始的2个状态变量,阶段2使用接下来的2个状态变量,依次类推。 状态数组总共有 2*numStages
个值. 每个块数据处理会更新状态变量,不会更新系数
- 参数
-
[in] | *S | 指向滤波器数据结构体实例 |
[in] | *pSrc | 指向输入数据块 |
[out] | *pDst | 指向输出数据块 |
[in] | blockSize | 处理的样本数量 |
- 返回
- none.
- 参数
-
[in,out] | *S | 指向滤波器数据结构体实例 |
[in] | numStages | 滤波器中二阶阶段的数量 |
[in] | *pCoeffs | 指向滤波器系数 |
[in] | *pState | 指向状态buffer |
- 返回
- none
系数和状态顺序:
- 保存在数组
pCoeffs
中的系数,按下列顺序排列:
{b10, b11, b12, a11, a12, b20, b21, b22, a21, a22, ...}
- 其中
b1x
和 a1x
是第一阶段的系数, b2x
和 a2x
是第二阶段的系数,依次类推。 pCoeffs
数组总共有 5*numStages
个数.
pState
是指向状态数组的指针。 每个二阶阶段有2个状态变量 d1,
和 d2
. 阶段1使用最开始的2个状态变量,阶段2使用接下来的2个状态变量,依次类推。 状态数组总共有 2*numStages
个值. 每个块数据处理会更新状态变量,不会更新系数。