%matplotlib inline
from pylab import *
from numpy import *
from scipy import *
import math
from ipywidgets import *
#--- Definiujemy sygnal wejsciowy
A = 1 # Amplituda sygnalu
F = 2.0 # Czestotliwosc sygnalu [Hz]
T = 1/F # Okres sygnalu [s]
f = lambda t : A * sin(2*pi*t*F) # Def. analizowanej funkcji (sygnalu)
#--- Probkujemy sygnal
LP = 1 # Liczba analizowanych pełnych okresów sygnalu (okresow)
w = 40 # Częstotliwość probkowania [Hz]
TW = 1/w # Okres probkowania [s] (co ile sekund pobieramy próbkę)
t = np.arange(0, LP*T, TW) # Momenty, w których pobieramy próbki (oś OX)
n = len(t) # Liczba próbek
signal = f(t)
#--- Rysujemy sygnał (niebieskie kółka)
fig = plt.figure(figsize=(15, 6), dpi=80)
ax = fig.add_subplot(121)
ax.plot(t, signal, 'o')
#--- Rysujemy sygnał przed spróbkowaniem (dla wizualizacji)
base_t = np.arange(0, LP * T, 1/200)
base_signal = f(base_t)
ax.plot(base_t, base_signal, linestyle='-', color='red')
ax.set_ylim([min(base_signal), max(base_signal)])
#--- Wykonujemy FFT
signal1 = fft(signal)
signal1 = abs(signal1) # moduł
#--- Rysujemy FFT
ax = fig.add_subplot(122)
ymax = max(signal1)
ax.set_ylim([0.0, max(1.1*ymax, 3.0)])
freqs = range(n)
stem(freqs, signal1, '-*');
UWAGA: do dalszych ćwiczeń warto powyższy skrypt przekształcić na funkcję o wielu argumentach, typu: amplituda, częstotliwość próbkowania, liczba przebiegów. Oczywiście dla wygody, należy nadać wartości domyślne argumentom funkcji.
#Tutaj dla wygody możesz powyższy kod zawrzeć w postaci funkcji wielu parametrów
UWAGA DLA CHĘTNYCH: można wykorzystać 'interact', dzięki któremu można zmieniac parametry danej funkcji i na bieżąco obserwować zmiany. Poniższy kod przedstawia sposób wykorzystania interact:
def prosta(a=2, b=0):
x = linspace(-5, 5, 100, endpoint=False) # punkty na osi OX [s]
f = lambda x : a*x + b
y = f(x)
fig = plt.figure(figsize=(6, 3), dpi=80)
ax = fig.add_subplot(111)
ax.set_xlim(-5, 5)
ax.set_ylim(-5, 5)
ax.plot(x, y)
interact(prosta, a=(-5,5,0.5), b=(-5,5,0.5))
# w=50
# popraw oś OX
# Podpisz osie wykresów
# F=5, w=20, LP=20
# F=21, w=20, LP=20
# F=1, A=1, LP=1
# F=1, A=2, LP=1
# F=1, A=3, LP=1
# F=1, w=50, LP=1
# F=1, w=100, LP=1
# popraw oś OY
Zwróć uwagę, że spektrum jest symetryczne (poza pierwszym elementem).
a) Przy w=100Hz, przeanalizuj widma sygnałów:
i) $sin(F*2\pi t)$, $F=10Hz$
# f=10, w=100, A=1, LP=10
ii) $sin(F*2\pi t)$, $F=20Hz$
# f=20, w=100, A=1, LP=10
iii) $sin(2*pi*t*f)$, $f=30Hz$
# f=30, w=100, A=1, LP=10
iv) $sin(2*pi*t*f)$, $f=40Hz$
# f=40, w=100, A=1, LP=10
# f=50, w=100, A=1, LP=10
Poniższe przypadki skłądają się z złożonych sygnałów. Jeżeli stworzyłeś/aś na początku funkcję odpowiedzialną za rysowanie sygnału i FFT, możesz ją zmodyfikować tak, by jako jej argument podawać funkcję lambda, realizującą sygnał.
a) $sin(2*pi*t*f) + 2*sin(4*pi*t*f)$, T=1s, w=20Hz.
# Wyrysuj sygnał
# Dodaj szum do sygnału
# Wyrysuj sygnał
# faza = 0
# faza = pi/4
# wygeneruj wektor x
# oblicz fft z x
# oblicz ifft z x