使用 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()

这是我得到的结果: