[PYTHON] Dessinez la réponse en fréquence sur un plan complexe avec Matplotlib et NumPy, et dessinez également les caractéristiques d'amplitude / phase

J'ai eu l'occasion de visualiser la réponse en fréquence du filtre numérique, alors prenez-en note.

import

import numpy as np
import matplotlib.pyplot as plt

Dessiner sur un plan complexe

Je veux dessiner une fonction complexe sur un plan complexe comme un manuel de mathématiques au lycée!

def plot_cp(func,theta): #Dessiner sur un plan complexe
    #Dessiner une figure et des axes
    fig, ax = plt.subplots(figsize = (5, 5))
    ax.grid()

    #Réglez la plage d'affichage et jouez avec elle si nécessaire
    lim = [-2.5, 2.5]
    ax.set_xlim(lim)
    ax.set_ylim(lim)

    #Axe réel
    plt.quiver(lim[0],0,lim[1]-lim[0],0,angles='xy',scale_units='xy',width=0.005,headwidth=10,headlength=10,headaxislength=5,scale=1)
    plt.text(1.05*lim[1],0.02*lim[0], 'Re')
    #Axe imaginaire
    plt.quiver(0,lim[0],0,lim[1]-lim[0],angles='xy',scale_units='xy',width=0.005,headwidth=10,headlength=10,headaxislength=5,scale=1)
    plt.text(0.03*lim[0],1.05*lim[1], 'Im')
    #origine
    plt.text(0.1*lim[0],0.1*lim[0], '$O$')

    #Supprimer le tartre supplémentaire
    xt=list(ax.get_xticks())
    for i in [0,np.floor(lim[0]),np.ceil(lim[1])]:
        xt.remove(i)
    ax.set_xticks(xt)
    ax.set_yticks(xt)

    #L'échelle de l'axe imaginaire"n j"changer en
    imlabel=[]
    for ticks in ax.get_yticks():
        imlabel.append(str(ticks)+" j")
    ax.set_yticklabels(imlabel) 

    #Déplacer l'axe au centre
    ax.spines['bottom'].set_position('center')
    ax.spines['left'].set_position('center')
    ax.spines['right'].set_visible(False)
    ax.spines['top'].set_visible(False)

    plt.plot(np.real(func),np.imag(func))

    #production
    plt.show()

Exemple)

contribution

f(\omega)=1+\exp(-2\mathrm{j}\omega T)\quad \left(\omega \in \left[-\frac{\pi}{T},\frac{\pi}{T}\right]\right)

theta=np.linspace(-np.pi,np.pi,1000) # theta=omega*T
func=1+np.exp(-2j*theta)
plot_cp(func,theta) #Dessiner sur un plan complexe

production

4d_cp.png

Ça fait du bien.

Dessinez côte à côte la caractéristique d'amplitude et la caractéristique de phase

def plot_ap(func,theta): #Dessinez les caractéristiques d'amplitude et de phase
    # Figure
    fig=plt.figure(figsize = (10, 5))

    #caractéristique d'amplitude ax1
    ax1=fig.add_subplot(121)
    ax1.grid()

    gain=abs(func)

    #Définir la plage d'affichage
    lim=[-np.pi, np.pi]
    ax1.set_xlim(lim)
    ax1.set_ylim(0,1.05*np.max(gain))

    #Définir l'étiquette de l'axe x
    ax1.set_xlabel("$\omega$")
    #Définir le titre
    ax1.set_title("amplitude characteristic")

    #échelle de l'axe des x[-pi/T,pi/T]Aux spécifications
    xt=[-np.pi,-np.pi/2,0,np.pi/2,np.pi]
    ax1.set_xticks(xt)
    xl=["$-\pi/T$","$-\pi/2T$",0,"$\pi/2T$","$\pi/T$"]
    ax1.set_xticklabels(xl)

    ax1.plot(theta,gain)

    #caractéristiques de phase ax2
    ax2=fig.add_subplot(122)
    ax2.grid()

    #Définir la plage d'affichage
    ax2.set_xlim(lim)
    ax2.set_ylim(lim)

    #Définir l'étiquette de l'axe x
    ax2.set_xlabel("$\omega$")
    #Définir le titre
    ax2.set_title("phase characteristic")

    #échelle de l'axe des x[-pi/T,pi/T]Aux spécifications
    ax2.set_xticks(xt)
    ax2.set_xticklabels(xl)

    #échelle de l'axe y[-pi,pi]Aux spécifications
    ax2.set_yticks(xt)
    yl=["$-\pi$","$-\pi/2$",0,"$\pi/2$","$\pi$"]
    ax2.set_yticklabels(yl)

    ax2.plot(theta,np.arctan2(np.imag(func),np.real(func)))

    #production
    plt.show()

Exemple)

contribution

f(\omega)=1+\exp(-2\mathrm{j}\omega T)\quad \left(\omega \in \left[-\frac{\pi}{T},\frac{\pi}{T}\right]\right)

theta=np.linspace(-np.pi,np.pi,1000) # theta=omega*T
func=1+np.exp(-2j*theta)
plot_ap(func,theta) #Dessinez côte à côte la caractéristique d'amplitude et la caractéristique de phase

production

4d_ap.png Ça ressemble à ça.

Recommended Posts

Dessinez la réponse en fréquence sur un plan complexe avec Matplotlib et NumPy, et dessinez également les caractéristiques d'amplitude / phase
Dessinez le japonais avec matplotlib sur Ubuntu
Graphiques de fonctions triangulaires avec numpy et matplotlib
Dessinez une ligne de pliage / diagramme de dispersion avec python matplotlib pour fichier CSV (2 colonnes)
Conseils de dessin avec matplotlib côté serveur
Mettez Scipy + Matplotlib dans Ubuntu sur Vagrant et affichez le graphique avec X11 Forwarding