本帖最后由 zengxy3407 于 2022-3-29 23:00 编辑
求助各位路过的大神,我在推导二阶低通滤波的差分方程时碰到以下问题求解答:
大家都知道,二阶低通滤波器的标准传递函数如下:

用反向差分法离散化,代入反向差分公式:

然后简化,过程如下:
=\frac{Y(z)}{X(z)}=\frac{\omega_c^2}{\left(\frac{1-z^{-1}}{T}\right)^2+2\xi\omega_c \frac{1-z^{-1}}{T} +\omega^2_c })
^2+2\xi\omega_c (1-z^{-1})T +\omega^2_c T^2})
+2\xi\omega_c (1-z^{-1})T +\omega^2_c T^2 })
z^{-1}+1+2\xi\omega_cT +\omega^2_c T^2 })
上下同乘以z^2:
=\frac{\omega_c^2 T^2 z^2}{1-(2+2\xi\omega_c T)z+(1+2\xi\omega_cT +\omega^2_c T^2)z^2 })
然后用MATLAB画bode图验证:
- fs = 16000;
- fc = 5000;
- xi = 1/sqrt(2);
- omgc = fc * 2 * pi;
- T = 1/fs;
- omgcT = omgc * T;
- a2 = 1 + 2 * xi * omgcT + omgcT * omgcT;
- a1 = -(2 + 2 * xi *omgcT);
- a0 = 1;
- b2 = omgcT * omgcT;
- b1 = 0;
- b0 = 0;
- N = [b2 b1 b0]
- D = [a2 a1 a0]
- sys = tf(N, D, T)
- bode(sys)
- hold on
- sysc = tf([omgc*omgc], [1 2*xi*omgc, omgc*omgc])
- bode(sysc)
- sysd = c2d(sysc, T)
- bode(sysd)
复制代码
得到的结果跟MATLAB计算的不一样:
- N =
- 3.8553 0 0
- D =
- 7.6321 -4.7768 1.0000
- sys =
-
- 3.855 z^2
- -----------------------
- 7.632 z^2 - 4.777 z + 1
-
- Sample time: 6.25e-05 seconds
- Discrete-time transfer function.
- sysc =
-
- 9.87e08
- --------------------------
- s^2 + 4.443e04 s + 9.87e08
-
- Continuous-time transfer function.
- sysd =
-
- 0.7094 z + 0.2623
- ------------------------
- z^2 - 0.0905 z + 0.06224
-
- Sample time: 6.25e-05 seconds
- Discrete-time transfer function.
复制代码
得到的波特图也完全不对,连截止频率都差很多,这是为什么?
我还试了一下Matlab的zoh,得到的结果如下:
- >> sysc = tf([1],[1,0])
- sysc =
-
- 1
- -
- s
-
- Continuous-time transfer function.
- >> sysd = c2d(sysc, 0.1)
- sysd =
-
- 0.1
- -----
- z - 1
-
- Sample time: 0.1 seconds
- Discrete-time transfer function.
复制代码
其实就是前向差分法, , 我用同样的方法试了也不对:
=\frac{Y(z)}{X(z)}=\frac{\omega_c^2}{\left(\frac{z-1}{T}\right)^2+2\xi\omega_c \frac{z-1}{T} +\omega^2_c })
^2+2\xi\omega_cT (z-1) +\omega^2_c T^2})
+2\xi\omega_cT (z-1) +\omega^2_c T^2 })
z+1-2\xi\omega_cT +\omega^2_c T^2 })
- clear
- fs = 16000;
- fc = 5000;
- xi = 1/sqrt(2);
- omgc = fc * 2 * pi;
- T = 1/fs;
- omgcT = omgc * T;
- %---------continous system-----------------------
- sysc = tf([omgc*omgc], [1 2*xi*omgc, omgc*omgc])
- bode(sysc)
- hold on
- %--------coeff of backward diff method------------------
- a2 = 1 + 2 * xi * omgcT + omgcT * omgcT;
- a1 = -(2 + 2 * xi *omgcT);
- a0 = 1;
- b2 = omgcT * omgcT;
- b1 = 0;
- b0 = 0;
- N = [b2 b1 b0]
- D = [a2 a1 a0]
- sysd_backdiff = tf(N, D, T)
- bode(sysd_backdiff)
- %-------------------------------------------------
- %--------coeff of forward diff method (zoh)------------------
- a0 = 1 - 2 * xi * omgcT + omgcT * omgcT;
- a1 = -(2 - 2 * xi *omgcT);
- a2 = 1;
- b0 = omgcT * omgcT;
- b1 = 0;
- b2 = 0;
- N = [b2 b1 b0]
- D = [a2 a1 a0]
- sysd_forediff = tf(N, D, T)
- bode(sysd_forediff)
- %-------------------------------------------------
- %---------zoh from continous system-----------------
- sysd_zoh = c2d(sysc, T)
- bode(sysd_zoh)
- %--------------------------------------------------
- grid on
复制代码
- sysc =
-
- 9.87e08
- --------------------------
- s^2 + 4.443e04 s + 9.87e08
-
- Continuous-time transfer function.
- N =
- 3.8553 0 0
- D =
- 7.6321 -4.7768 1.0000
- sysd_backdiff =
-
- 3.855 z^2
- -----------------------
- 7.632 z^2 - 4.777 z + 1
-
- Sample time: 6.25e-05 seconds
- Discrete-time transfer function.
- N =
- 0 0 3.8553
- D =
- 1.0000 0.7768 2.0785
- sysd_forediff =
-
- 3.855
- ----------------------
- z^2 + 0.7768 z + 2.079
-
- Sample time: 6.25e-05 seconds
- Discrete-time transfer function.
- sysd_zoh =
-
- 0.7094 z + 0.2623
- ------------------------
- z^2 - 0.0905 z + 0.06224
-
- Sample time: 6.25e-05 seconds
- Discrete-time transfer function.
复制代码 就错得更离谱了,连增益都变成正的了:
求各位大神赐教!!
|