Dan*_*iel 7 c++ signal-processing
随着,
采样频率:10kHz
截止频率:1kHz
我如何实际计算下面差分方程的系数?
我知道差分方程将采用这种形式,但不知道如何实际计算并得出系数b0,b1,b2,a1,a2的数字
y(n) = b0.x(n) + b1.x(n-1) + b2.x(n-2) + a1.y(n-1) + a2.y(n-2)
Run Code Online (Sandbox Code Playgroud)
我最终将在C++中实现这个LPF,但我需要知道如何在我可以使用它之前先实际计算系数
pen*_*gon 10
干得好.ff是频率比,在你的情况下为0.1:
const double ita =1.0/ tan(M_PI*ff);
const double q=sqrt(2.0);
b0 = 1.0 / (1.0 + q*ita + ita*ita);
b1= 2*b0;
b2= b0;
a1 = 2.0 * (ita*ita - 1.0) * b0;
a2 = -(1.0 - q*ita + ita*ita) * b0;
Run Code Online (Sandbox Code Playgroud)
结果是:
b0 = 0.0674553
b1 = 0.134911
b2 = 0.0674553
a1 = 1.14298
a2 = -0.412802
对于那些想知道其他答案中那些神奇公式从何而来的人,这里有一个遵循此示例的推导。
从巴特沃斯滤波器的传递函数开始
G(s) = wc^2 / (s^2 + s*sqrt(2)*wc + wc^2)
其中wc
是截止频率,应用双线性 z 变换,即替代s = 2/T*(1-z^-1)/(1+z^-1)
:
G(z) = wc^2 / ((2/T*(1-z^-1)/(1+z^-1))^2 + (2/T*(1-z^-1)/(1+z^-1))*sqrt(2)*wc + wc^2)
T
是采样周期 [s]。
截止频率需要预先扭曲以补偿由 z 变换引入的模拟和数字频率之间的非线性关系:
wc = 2/T * tan(wd*T/2)
其中wd
是所需的截止频率 [rad/s]。
让C = tan(wd*T/2)
,为方便起见,使wc = 2/T*C
。
将其代入等式,2/T
因子会消失:
G(z) = C^2 / ((1-z^-1)/(1+z^-1))^2 + (1-z^-1)/(1+z^-1)*sqrt(2)*C + C^2)
将分子和分母乘以(1+z^-1)^2
并展开,得到:
G(z) = C^2*(1 + 2*z^-1 + z^-2) / (1 + sqrt(2)*C + C^2 + 2*(C^2-1)*z^-1 + (1-sqrt(2)*C+C^2)*z^-2')
现在,将分子和分母除以分母中的常数项。为方便起见,让D = 1 + sqrt(2)*C + C^2
:
G(z) = C^2/D*(1 + 2*z^-1 + z^-2) / (1 + 2*(C^2-1)/D*z^-1 + (1-sqrt(2)*C+C^2)/D*z^-2')
这种形式相当于我们正在寻找的形式:
G(z) = (b0 + b1*z^-1 + b2*z^-1) / (1 + a1*z^-1 +a2*z^-2)
所以我们通过将它们相等来得到系数:
a0 = 1
a1 = 2*(C^2-1)/D
a2 = (1-sqrt(2)*C+C^2)/D
b0 = C^2/D
b1 = 2*b0
b2 = b0
其中, D = 1 + sqrt(2)*C + C^2
, C = tan(wd*T/2)
,wd
是所需的截止频率 [rad/s],T
是采样周期 [s]。