Analysera en chirp

Jag har lagt till DFT och vinklarna till chirpen. Bilderna hämtar jag via Visa_DFT.

chirp_test_basic med utförlig kommatering

chirp_test_basic senaste versionen

import numpy as np
from scipy.signal import chirp
import matplotlib.pyplot as plt
import Visa_Bild
import math
# Första delan skapar en chirp.
# Andra delen kör en DFT
# Tredje delen redovisar readel och phase
# SampleRate motsvarar 44100Hz

T = 0.1
n = 4410
t = np.linspace(0, T, n, endpoint=False)
f0 = 5000
f1 = 10000
# linear, quadratic, logarithmic, hyperbolic
y = chirp(t, f0, T, f1, method=’linear’)
Visa_Bild.Visa_Kurva(t, y

x1 = Visa_Bild.DFT(np.asarray(y))
x_normed = (x1 – x1.min(0)) / x1.ptp(0) #normaliseras till 1 – -1
Visa_Bild.Visa_Balkar(x1

N = x1.size
k_f0 =  int((f0*N)/n*.1)
k_f1 = int((f1*N)/n*.1)
bredd = math.floor(N/2)
vinklar1 = []
real = []
for k in range(0, bredd):
    v1 = round(float(np.angle(np.asarray(x1)[k],deg=False)),2)
    a1 = round((np.real(np.asarray(x_normed)[k])), 2)
    vinklar1.append(v1)
    real.append(a1)
Visa_Bild.Visa_Kurva(range(0, bredd), vinklar1)
y = vinklar1[k_f0:k_f1]
x = real[k_f0:k_f1]
Visa_Bild.Visa_Flera(x, y, k_f0, k_f1)

Visa_Bild

import matplotlib.pyplot as plt
import numpy as np
import math

def Visa_Kurva(t, x): 
    fig, (ax1) = plt.subplots()
    ax1.plot(t, x)
    ax1.set(xlabel=’Tid sekund eller k för varje frekvens’, ylabel=’Amplitud eller radian’, title=’Chirp’)
    ax1.grid()
    plt.show()

def Visa_Flera(x, y, k_f0, k_f1):
    f = range(k_f0, k_f1)
    fig, (ax1) = plt.subplots()
    ax1.plot(f, x, ’-b’, label=’k=Realdelen’)
    ax1.plot(f, y, ’-r’, label=’phase’)
    plt.legend(loc=’upper left’)
    ax1.set(xlabel=’Visar k som avgränsar frekvensen’, ylabel=’radianer amplitud’, title=’Chirp realdelen och phase’)
    ax1.grid()
    plt.show()   

def Visa_Balkar(x):  
    N = x.size
    bredd = math.floor(N/2)
    y = np.absolute(x)[:bredd]
    f = np.linspace(0, N, N)
    plt.ylabel(”Amplitude”)
    plt.xlabel(’Visar k för varje frekvens’)
    plt.bar(f[:N//2], y, width=0.8)
    plt.show()
    #plt.pause(0.1)
    #plt.close()

def DFT(x):
    N = x.size
    n = np.arange(N)
    k = n.reshape((N, 1))
    e = np.exp(-2j * np.pi * k * n / N)
    return np.dot(e,x)

Utvärdering

Idag gick det bättre. Nu kan jag jämföra en chirp med avseende på frekvens domain.