使用python control.matlab进行多阶段CIC仿真

时间:2017-09-21 01:49:00

标签: python matlab scilab

我想获得多级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,我得到正确的结果。

The result, nn=5

我猜这是数字错误,因为num和den接近于零。

另一方面,Scilab计算正确,即使有10个阶段。

有没有使用python控件库的解决方案?

我的环境是: Windows 10,Python 3.6.1 :: Anaconda 4.4.0(64位), 控制(0.7.0)由pip安装,没有slycot。

1 个答案:

答案 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()

以下是我得到的结果:

result