我想获得多级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()
在非常低的频率下可以看到意外的响应。 (直流电压应为0dB) 如果nn小于3,我得到正确的结果。
我猜这是数字错误,因为num和den接近于零。
另一方面,Scilab计算正确,即使有10个阶段。
有没有使用python控件库的解决方案?
我的环境是: Windows 10,Python 3.6.1 :: Anaconda 4.4.0(64位), 控制(0.7.0)由pip安装,没有slycot。
答案 0 :(得分:0)
我尝试了以下代码:
#!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()
以下是我得到的结果: