使用 python control.matlab 的多级 CIC 仿真
Multi stage CIC simulation using python control.matlab
我想获得多级 CIC 滤波器的频率响应。
import numpy as np
from matplotlib import pyplot as plt
from control.matlab import *
def main():
mm=256
nn=5
dt=True
omega_range=np.linspace(0.00,np.pi,100000)
syscic=tf([1,],[1,],dt)
num=np.zeros(mm+1);num[0]=1;num[-1]=-1
den=np.zeros(mm+1);den[0]=1;den[1]=-1
# print(den)
for n in range(nn):
syscic=syscic*tf(num,den,dt)/mm
bode(syscic, omega_range,dB=True, deg=True)
plt.show()
if __name__=="__main__":
main()
在非常低的频率中出现意外响应。
(DC 时应为 0dB)
如果 nn 小于 3,我会得到正确的结果。
The result, nn=5
我猜这是数字错误,因为 num 和 den 接近于零。
另一方面,Scilab 计算正确,即使有 10 个阶段。
有没有使用python控件库的解决方案?
我的环境是:
Windows 10,Python 3.6.1 :: Anaconda 4.4.0(64 位),
control (0.7.0) 通过 pip 安装,没有 slycot。
我尝试了以下代码:
#!python
# -*- coding:utf-8 -*-
import numpy as np
from matplotlib import pyplot as plt
from control.matlab import *
import control
def main():
mm=256
nn=5
dt=True
omega_range=np.linspace(0.00,np.pi,100000)
#syscic=tf([1.,],[1.,],dt)
num=np.zeros(mm+1);num[0]=1;num[-1]=-1
den=np.zeros(mm+1);den[0]=1;den[1]=-1
tf1=control.tf(num,den,dt)/mm
ss1=control.tf2ss(tf1)
syscic=reduce(lambda x,y:x*y,nn*[ss1,])
bode(syscic, omega_range,dB=True, deg=True)
plt.show()
if __name__=="__main__":
main()
这是我得到的结果:
我想获得多级 CIC 滤波器的频率响应。
import numpy as np
from matplotlib import pyplot as plt
from control.matlab import *
def main():
mm=256
nn=5
dt=True
omega_range=np.linspace(0.00,np.pi,100000)
syscic=tf([1,],[1,],dt)
num=np.zeros(mm+1);num[0]=1;num[-1]=-1
den=np.zeros(mm+1);den[0]=1;den[1]=-1
# print(den)
for n in range(nn):
syscic=syscic*tf(num,den,dt)/mm
bode(syscic, omega_range,dB=True, deg=True)
plt.show()
if __name__=="__main__":
main()
在非常低的频率中出现意外响应。 (DC 时应为 0dB) 如果 nn 小于 3,我会得到正确的结果。
The result, nn=5
我猜这是数字错误,因为 num 和 den 接近于零。
另一方面,Scilab 计算正确,即使有 10 个阶段。
有没有使用python控件库的解决方案?
我的环境是: Windows 10,Python 3.6.1 :: Anaconda 4.4.0(64 位), control (0.7.0) 通过 pip 安装,没有 slycot。
我尝试了以下代码:
#!python
# -*- coding:utf-8 -*-
import numpy as np
from matplotlib import pyplot as plt
from control.matlab import *
import control
def main():
mm=256
nn=5
dt=True
omega_range=np.linspace(0.00,np.pi,100000)
#syscic=tf([1.,],[1.,],dt)
num=np.zeros(mm+1);num[0]=1;num[-1]=-1
den=np.zeros(mm+1);den[0]=1;den[1]=-1
tf1=control.tf(num,den,dt)/mm
ss1=control.tf2ss(tf1)
syscic=reduce(lambda x,y:x*y,nn*[ss1,])
bode(syscic, omega_range,dB=True, deg=True)
plt.show()
if __name__=="__main__":
main()
这是我得到的结果: