音频滤波笔记之高低通滤波器

音频滤波

数字滤波器设计

一阶IIR数字滤波器的设计

最简单的低通滤波器
  • 传递函数

H ( s ) = 1 1 + s H(s) = \frac{1}{1 + s} H(s)=1+s1

  • 傅氏变换

H ( j Ω ) = 1 1 + j Ω H(j \Omega) = \frac{1}{1+ j \Omega} H(jΩ)=1+jΩ1

  • 改造后的公式

H ( s ) = Ω c Ω c + s H(s) = \frac{\Omega_c}{\Omega_c + s} H(s)=Ωc+sΩc

其中 Ω c = 2 ∗ π ∗ f c \Omega_c = 2 * \pi * f_c Ωc=2πfc f c f_c fc​ 为截止频率

高通滤波器

将低通滤波器的的 s = 1 s s=\frac{1}{s} s=s1 就得到高通滤波器了
H ( s ) = Ω c s Ω c s + 1 H(s) = \frac{\Omega_c s}{\Omega_c s + 1} H(s)=Ωcs+1Ωcs

截止角频率 Ω h = 1 Ω c \Omega_h = \frac{1}{\Omega_c} Ωh=Ωc1 得到
H ( s ) = s s + Ω h H(s) = \frac{s}{s + \Omega_h} H(s)=s+Ωhs
截止频率为$f_n = \frac{1}{2 \pi \Omega_h} $

带通滤波器

公式
s = s 2 + Ω m 2 B W s s = \frac{s^2 + \Omega^2_m}{BW_s} s=BWss2+Ωm2

带入最原始的低通滤波器得到传递函数:
H ( s ) = B W s s 2 + Ω m 2 + B W s H(s) = \frac{BW_s}{s^2 + \Omega^2_m + BW_s} H(s)=s2+Ωm2+BWsBWs

带阻滤波器

公式:
s = s 2 + Ω c 2 B W s s= \frac{s^2 +\Omega^2_c}{BW_s} s=BWss2+Ωc2

带入初始的高通滤波器得到传递函数:
H ( s ) = s 2 + Ω m 2 s 2 + Ω m 2 + B W s H(s) = \frac{s^2 + \Omega_m^2}{s^2 + \Omega^2_m + BW_s} H(s)=s2+Ωm2+BWss2+Ωm2

算法

高通滤波

  1. 基本公式
  • 经典模拟高通滤波器

H ( s ) = ω c s + ω c H(s) = \frac{\omega_c}{s + \omega_c} H(s)=s+ωcωc

H ( s ) H(s) H(s) 是拉普拉斯域中的传递函数

ω c \omega_c ωc 是截止频率的角频率 ω c = 2 ∗ π ∗ f c \omega_c = 2 * \pi * f_c ωc=2πfc f c f_c fc​ 是截止频率

  • 无限冲击响应 ( IIR ) 高通滤波器(简单版本)

y [ n ] = − α ∗ y [ n − 1 ] + x [ n ] y[n] = -\alpha * y[n-1] +x[n] y[n]=αy[n1]+x[n]

y [ n ] y[n] y[n] 当前计算后的输出信号

x [ n ] x[n] x[n] 是当前的输入信号

y [ n − 1 ] y[n-1] y[n1] 上次一计算后的输出信号

α \alpha α 衰减系数

  • 有限冲击响应 ( FIR ) 高通滤波器(常用查分方程

y [ n ] = ∑ k = 0 M − 1 b [ k ] ∗ x [ n − k ] y[n] = \sum_{k=0}^{M-1} b[k] * x[n-k] y[n]=k=0M1b[k]x[nk]

y [ n ] y[n] y[n] 计算后的输出信号

b [ k ] b[k] b[k] 滤波器系数

x [ n − k ] x[n-k] x[nk] 过去第 k k k 个输入样本

M M M 滤波器阶数

  1. 源码(whisper.cpp 中给出的代码)
void high_pass_filter(std::vector<float> & data, float cutoff, float sample_rate) {
    const float rc = 1.0f / (2.0f * M_PI * cutoff);
    const float dt = 1.0f / sample_rate;
    const float alpha = dt / (rc + dt);

    float y = data[0];

    for (size_t i = 1; i < data.size(); i++) {
        y = alpha * (y + data[i] - data[i - 1]);
        data[i] = y;
    }
}
  1. 源码公式解析

这段代码中包含的数学公式是针对高通滤波器的设计和应用。以下是公式及其功能:

  • 时间常数 (RC Constant) 的计算:

r c = 1.0 2.0 ∗ π ∗ c u t o f f rc = \frac{1.0} {2.0 * \pi * cutoff} rc=2.0πcutoff1.0

这个公式计算了基于截止频率(cutoff)和圆周率(π)的时间常数 rc

  • 时间步长 (Sample Step) 的计算:

d t = 1.0 s a m p l e _ r a t e dt = \frac{1.0}{sample\_rate} dt=sample_rate1.0

这个公式基于采样率 sample_rate 计算了时间步长 dt,是每次采样之间的时间间隔。

  • 滤波器系数 (Alpha) 的计算:

α = d t r c + d t \alpha = \frac{dt}{rc + dt} α=rc+dtdt

这个公式计算了滤波器的系数 α \alpha α,它是构成滤波器整合公式的关键参数。

  • 高通滤波器的递推公式:

y = α ∗ ( y + d a t a [ i ] − d a t a [ i − 1 ] ) y = \alpha * (y + data[i] - data[i - 1]) y=α(y+data[i]data[i1])

这个公式是高通滤波器的核心,它定义了如何根据输入信号样本 d a t a [ i ] data[i] data[i] ,之前的结果 y y y 和两个连续样本之间的差 ( d a t a [ i ] − d a t a [ i − 1 ] ) (data[i] - data[i - 1]) (data[i]data[i1]) 来计算每个时间步长的输出值 y y y

这些数学公式一起用于实现高通滤波器的数字模型,该模型以特定频率以上的声音为主,而忽略低频声音,通常用于音频处理中以去除低频噪声或重低音中的无用成分。

参考文档

一阶IIR数字滤波器的设计
whisper.cpp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值