音频滤波
- 音频滤波
- 数字滤波器设计
- 一阶IIR数字滤波器的设计
- 最简单的低通滤波器
- 高通滤波器
- 带通滤波器
- 带阻滤波器
- 算法
- 高通滤波
- 参考文档
音频滤波
数字滤波器设计
一阶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
算法
高通滤波
- 基本公式
- 经典模拟高通滤波器
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[n−1]+x[n]
y [ n ] y[n] y[n] 当前计算后的输出信号
x [ n ] x[n] x[n] 是当前的输入信号
y [ n − 1 ] y[n-1] y[n−1] 上次一计算后的输出信号
α \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=0∑M−1b[k]∗x[n−k]
y [ n ] y[n] y[n] 计算后的输出信号
b [ k ] b[k] b[k] 滤波器系数
x [ n − k ] x[n-k] x[n−k] 过去第 k k k 个输入样本
M M M 滤波器阶数
- 源码(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;}
}
- 源码公式解析
这段代码中包含的数学公式是针对高通滤波器的设计和应用。以下是公式及其功能:
- 时间常数 (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[i−1])
这个公式是高通滤波器的核心,它定义了如何根据输入信号样本 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[i−1]) 来计算每个时间步长的输出值 y y y 。
这些数学公式一起用于实现高通滤波器的数字模型,该模型以特定频率以上的声音为主,而忽略低频声音,通常用于音频处理中以去除低频噪声或重低音中的无用成分。
参考文档
一阶IIR数字滤波器的设计
whisper.cpp