跳到主要内容

双二阶滤波器 (biquad)

双二阶(Biquadratic)IIR 滤波器,支持 8 种常见滤波类型,用于音频和信号处理中的频率响应整形。

原理

双二阶滤波器是二阶 IIR 滤波器的标准实现,其传递函数为:

H(z) = (b0 + b1·z⁻¹ + b2·z⁻²) / (1 + a1·z⁻¹ + a2·z⁻²)

对应的差分方程:

y[n] = b0·x[n] + b1·x[n-1] + b2·x[n-2] - a1·y[n-1] - a2·y[n-2]

系数根据滤波类型由采样率、截止频率、品质因数 Q 和增益计算得出,参考 BiQuadDesigner

滤波类型

枚举值类型说明
BIQUAD_FILTER_TYPE_LOWPASS低通衰减高频,保留低频
BIQUAD_FILTER_TYPE_HIGHPASS高通衰减低频,保留高频
BIQUAD_FILTER_TYPE_BANDPASS带通仅保留中心频率附近频段
BIQUAD_FILTER_TYPE_LOWSHELF低频搁架对低频进行增益或衰减
BIQUAD_FILTER_TYPE_HIGHSHELF高频搁架对高频进行增益或衰减
BIQUAD_FILTER_TYPE_PEAKING峰值对指定频率进行增益或衰减
BIQUAD_FILTER_TYPE_NOTCH陷波衰减指定频率(窄带)
BIQUAD_FILTER_TYPE_ALLPASS全通仅改变相位,不改变幅度

数据结构

struct biquad_filter_t {
float b0, b1, b2; /* 分子系数 */
float a1, a2; /* 分母系数(a0 已归一化为 1) */
float xn1, xn2; /* 输入历史:x[n-1], x[n-2] */
float yn1, yn2; /* 输出历史:y[n-1], y[n-2] */
};

API

struct biquad_filter_t * biquad_alloc(enum biquad_filter_type_t type, float samplerate, float frequency, float quality, float gain);

分配并初始化滤波器。samplerate 为采样率(Hz),frequency 为截止/中心频率(Hz),quality 为品质因数 Q,gain 为增益(dB,仅对搁架和峰值类型有效)。失败返回 NULL

void biquad_free(struct biquad_filter_t * filter);

释放滤波器。

void biquad_init(struct biquad_filter_t * filter, enum biquad_filter_type_t type, float samplerate, float frequency, float quality, float gain);

初始化已有滤波器结构的系数,不分配内存。调用后需手动调用 biquad_clear 清除历史状态。

void biquad_clear(struct biquad_filter_t * filter);

清除滤波器的历史输入输出状态(xn1、xn2、yn1、yn2 置零),不改变系数。

void biquad_process(struct biquad_filter_t * filter, float * input, float * output, int len);

对输入缓冲区 input 中的 len 个采样点执行滤波,结果写入 output。支持块处理,历史状态在调用间自动保持。

使用示例

struct biquad_filter_t * f = biquad_alloc(BIQUAD_FILTER_TYPE_LOWPASS, 44100.0f, 1000.0f, 0.707f, 0.0f);

float in[256], out[256];
while(read_audio(in, 256))
{
biquad_process(f, in, out, 256);
write_audio(out, 256);
}

biquad_free(f);