源码
const float fr = sample_freq/_cuttof_freq;
const float ohm = tanf(M_PI_F, fr);
const float c = 1.0f + 2.0f * cosf(M_PI_F / 4.0f) * ohm + ohm * ohm;
_b0 = ohm * ohm / c;
_b1 = 2.0f * _b0;
_b2 = _b0;
_a1 = 2.0f * (ohm * ohm - 1.0f) / c;
_a2 = (1.0f - 2.0f * cosf(M_PI_F / 4.0f) * ohm + ohm * ohm) / c;
float LPF_Apply(float sample)
{
//滤波器
float delay_element_0 = sample - delay_element_1 * _a1 - delay_element_2 * _a2;
//判断特殊值
if(/**/)
{
delay_element_0 = sample;
}
const float output = delay_element0 * _b0 + delay_element1 * _b1 + delay_element2 * _b2;
_delay_element_2 = _delay_element_1;
_delay_element_1 = _delay_element_0;
//返回滤波后的值
return output;
}
巴特沃斯数字滤波器归一化
滤波器传递函数:
H
(
s
)
=
1
a
0
+
a
1
s
+
a
2
s
2
+
.
.
.
+
a
N
s
N
H(s) = \frac{1}{a_{0} + a_{1}s + a_{2}s^2 + ... + a_{N}s^N}
H(s)=a0+a1s+a2s2+...+aNsN1
当 N = 2 N=2 N=2时,传递函数为:
H
(
s
)
=
1
1
+
1.414
s
+
s
2
H(s) = \frac{1}{1 + 1.414s +s^2}
H(s)=1+1.414s+s21
在实际使用中,只要用
s
w
a
\frac{s}{w_{a}}
was代替上式中的
s
s
s即可以得到任意截至频率为
w
a
w_{a}
wa弧度的滤波器,即
H
(
s
)
=
1
1
+
1.414
s
w
a
+
(
s
w
a
)
2
H(s)=\frac{1}{1 + 1.414\frac{s}{w_{a}} + (\frac{s}{w_{a}})^2}
H(s)=1+1.414was+(was)21
模拟传递函数离散化,常用方法:双线性变换
s
=
2
T
s
1
−
z
−
1
1
+
z
−
1
=
2
f
s
1
−
z
−
1
1
+
z
−
1
s = \frac{2}{T_{s}}\frac{1-z^-1{}}{1+z^{-1}}=2f_{s} \frac{1-z^{-1}}{1+z^{-1}}
s=Ts21+z−11−z−1=2fs1+z−11−z−1
数字滤波器的截止频率要比模拟滤波器的截止频率要小,下面讨论这两个频率之间的关系:
对于
s
s
s域来说,截止频率
w
a
w_{a}
wa满足的关系式为:
s
=
j
w
a
=
j
2
π
f
a
s = jw_{a}=j2\pi f_{a}
s=jwa=j2πfa
对于
z
z
z域来说,截止频率
w
d
w_{d}
wd满足的关系式为:
z
=
e
s
T
s
s
=
j
w
d
w
d
=
2
π
f
d
z
=
e
j
2
π
f
d
f
s
z=e^{sT_s} \quad s=jw_d \quad w_d =2\pi f_d \\ z=e^{j2\pi \frac{f_d}{f_s}}
z=esTss=jwdwd=2πfdz=ej2πfsfd
将上式代入到双线性变换公式可得:
s
=
2
f
s
1
−
z
−
1
1
+
z
−
1
=
2
f
s
1
−
e
−
j
2
π
f
d
f
s
1
+
e
−
j
2
π
f
d
f
s
=
2
f
s
e
j
2
π
f
d
f
s
−
1
e
j
2
π
f
d
f
s
+
1
=
j
2
f
s
t
a
n
(
π
f
d
f
s
)
s=2f_{s} \frac{1-z^{-1}}{1+z^{-1}}=2f_s \frac{1-e^{-j2\pi \frac{f_d}{f_s}}}{1+e^{-j2\pi \frac{f_d}{f_s}}}=2f_s \frac{e^{j2\pi \frac{f_d}{f_s}}-1}{e^{j2\pi \frac{f_d}{f_s}}+1}=j2f_stan(\frac{\pi f_d}{f_s})
s=2fs1+z−11−z−1=2fs1+e−j2πfsfd1−e−j2πfsfd=2fsej2πfsfd+1ej2πfsfd−1=j2fstan(fsπfd)
计算过程如下:
$$
\begin{array}{c}
e^{i x}=\cos x+i \sin x \
\frac{\mathrm{e}^{j A}-\mathrm{e}^{-j A}}{\mathrm{e}^{j A}+\mathrm{e}^{-j A}}=\frac{\cos (A)+j \sin (A)-(\cos (-A)+j \sin (-A))}{\cos (A)+j \sin (A)+(\cos (-A)+j \sin (-A))}=j \tan (A) \
\frac{e^{j \omega}-1}{e^{j w}+1}=\frac{\mathrm{e}^{j w / 2}}{\mathrm{e}^{\mathrm{j} \omega / 2}} \frac{\left(\mathrm{e}^{\mathrm{j} \omega / 2}-\mathrm{e}^{-\mathrm{j} \omega / 2}\right)}{\left(\mathrm{e}^{\mathrm{j} \omega / 2}+\mathrm{e}^{-\mathrm{j} \omega / 2}\right)}=j \tan \left(\frac{\omega}{2}\right)
\end{array}
$$
将频域的
s
s
s公式代入得:
j
w
a
=
j
2
π
f
a
=
j
2
f
s
t
a
n
(
π
f
d
f
s
)
f
a
=
f
s
π
t
a
n
(
π
f
d
f
s
)
jw_a=j2\pi f_a =j2f_stan(\frac{\pi f_d}{f_s}) \\ f_a = \frac{f_s}{\pi}tan(\frac{\pi f_d}{f_s})
jwa=j2πfa=j2fstan(fsπfd)fa=πfstan(fsπfd)
设计数字滤波器