[PYTHON] Zeichnen Sie mit Matplotlib und NumPy den Frequenzgang auf einer komplexen Ebene und zeichnen Sie auch die Amplituden- / Phaseneigenschaften

Ich hatte die Möglichkeit, den Frequenzgang des Digitalfilters zu visualisieren. Notieren Sie sich dies.

import

import numpy as np
import matplotlib.pyplot as plt

Zeichnen Sie auf einer komplexen Ebene

Ich möchte eine komplexe Funktion auf einer komplexen Ebene zeichnen, wie ein Mathematiklehrbuch der High School!

def plot_cp(func,theta): #Zeichnen Sie auf einer komplexen Ebene
    #Zeichne Figur und Achsen
    fig, ax = plt.subplots(figsize = (5, 5))
    ax.grid()

    #Stellen Sie den Anzeigebereich ein und spielen Sie entsprechend damit
    lim = [-2.5, 2.5]
    ax.set_xlim(lim)
    ax.set_ylim(lim)

    #Reale Achse
    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')
    #Imaginäre Achse
    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')
    #Ursprung
    plt.text(0.1*lim[0],0.1*lim[0], '$O$')

    #Entfernen Sie die zusätzliche Skala
    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)

    #Die Skala der imaginären Achse"n j"ändern
    imlabel=[]
    for ticks in ax.get_yticks():
        imlabel.append(str(ticks)+" j")
    ax.set_yticklabels(imlabel) 

    #Achse in die Mitte bewegen
    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))

    #Ausgabe
    plt.show()

Beispiel)

Eingang

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) #Zeichnen Sie auf einer komplexen Ebene

Ausgabe

4d_cp.png

Es fühlt sich gut an.

Zeichnen Sie die Amplitudenkennlinie und die Phasenkennlinie nebeneinander

def plot_ap(func,theta): #Zeichnen Sie Amplituden- und Phaseneigenschaften
    # Figure
    fig=plt.figure(figsize = (10, 5))

    #Amplitudenkennlinie ax1
    ax1=fig.add_subplot(121)
    ax1.grid()

    gain=abs(func)

    #Anzeigebereich einstellen
    lim=[-np.pi, np.pi]
    ax1.set_xlim(lim)
    ax1.set_ylim(0,1.05*np.max(gain))

    #Stellen Sie die Beschriftung der x-Achse ein
    ax1.set_xlabel("$\omega$")
    #Titel einstellen
    ax1.set_title("amplitude characteristic")

    #x-Achsenskala[-pi/T,pi/T]Nach Spezifikationen
    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)

    #ax2 Phaseneigenschaften
    ax2=fig.add_subplot(122)
    ax2.grid()

    #Anzeigebereich einstellen
    ax2.set_xlim(lim)
    ax2.set_ylim(lim)

    #Stellen Sie die Beschriftung der x-Achse ein
    ax2.set_xlabel("$\omega$")
    #Titel einstellen
    ax2.set_title("phase characteristic")

    #x-Achsenskala[-pi/T,pi/T]Nach Spezifikationen
    ax2.set_xticks(xt)
    ax2.set_xticklabels(xl)

    #y-Achsenskala[-pi,pi]Nach Spezifikationen
    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)))

    #Ausgabe
    plt.show()

Beispiel)

Eingang

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) #Zeichnen Sie die Amplitudenkennlinie und die Phasenkennlinie nebeneinander

Ausgabe

4d_ap.png Es sieht so aus.

Recommended Posts

Zeichnen Sie mit Matplotlib und NumPy den Frequenzgang auf einer komplexen Ebene und zeichnen Sie auch die Amplituden- / Phaseneigenschaften
Zeichne Japanisch mit matplotlib auf Ubuntu
Zeichnen Sie Dreiecksfunktionen mit Numpy und Matplotlib
Zeichnen Sie ein Faltlinien- / Streudiagramm mit Python Matplotlib für die CSV-Datei (2 Spalten).
Zeichentipps mit matplotlib auf der Serverseite
Setzen Sie Scipy + Matplotlib in Ubuntu auf Vagrant und zeigen Sie die Grafik mit X11 Forwarding an