Esercitazione 2
unknown
python
5 months ago
3.6 kB
9
Indexable
import numpy as np import pandas as pd import matplotlib.pyplot as plt class Segnale: # costruttore def __init__(self, start: float, stop: float, campionamento: int, y = None, nome = None): self.nome = nome self.x = np.linspace(start, stop, campionamento) self.y = y # metodi def get_nome(self): return self.nome def calcola_energia_media(self): if self.y is None: raise ValueError("segnale non definito") return np.mean(self.y ** 2) def calcola_valore_medio(self): if self.y is None: raise ValueError("segnale non definito.") return np.mean(self.y) def convoluzione(self, altro_segnale: object, mode='same') -> object: if self.y is None: raise ValueError("segnale non definito.") output = np.convolve(self.y, altro_segnale.y, mode=mode) return Segnale(self.x[0], self.x[-1], 1000, output, f'Convoluzione tra {self.nome} e {altro_segnale.get_nome()}') def visualizza(self) -> None: if self.y is None: raise ValueError("segnale non definito.") plt.plot(self.x, self.y) plt.title('Segnale') plt.grid(True) plt.show() class SegnaleRect(Segnale): # costruttore def __init__(self, start: float, stop: float, campionamento: int, supporto: float): super().__init__(start, stop, campionamento) self.supporto = supporto self.nome = "Rect" self.y = np.where(np.abs(self.x) <= supporto / 2, 1, 0) class SegnaleTri(Segnale): # costruttore def __init__(self, start: float, stop: float, campionamento: int, supporto: float): super().__init__(start, stop, campionamento) self.supporto = supporto self.nome = "Tri" self.y = np.where(np.abs(self.x) <= supporto, 1 - np.abs(self.x) / supporto, 0) # funzioni def visualizza_multi(segnali: list) -> None: n = len(segnali) plt.figure(figsize=(10, 4 * n)) for i in range(len(segnali)): plt.subplot(n, 1, i + 1) plt.plot(segnali[i].x, segnali[i].y) plt.title(f'Segnale {i + 1} -> {segnali[i].get_nome()}') plt.grid(True) plt.tight_layout() plt.show() def visualizza_statistiche(segnale: object) -> None: if segnale.y is None: raise ValueError("segnale non definito") valore_medio = segnale.calcola_valore_medio() energia = segnale.calcola_energia_media() plt.figure(figsize=(10, 6)) plt.plot(segnale.x, segnale.y, label='Segnale') plt.axhline(valore_medio, color='r', linestyle='--', label=f'Valore medio: {valore_medio:.2f}') props = dict(boxstyle='round', facecolor='wheat', alpha=0.5) plt.text(0.05, 0.95, f'Energia: {energia:.2f}', transform=plt.gca().transAxes, fontsize=12, verticalalignment='top', bbox=props) plt.title('Segnale con Valore Medio e Energia') plt.xlabel('Tempo') plt.ylabel('Ampiezza') plt.grid(True) plt.legend() plt.show() def main(): tri = SegnaleTri(-5, 5, 1000, 1) rect = SegnaleRect(-5, 5, 1000, 0.5) conv = tri.convoluzione(rect) visualizza_multi([tri, rect, conv]) visualizza_statistiche(conv) if __name__ == "__main__": main()
Editor is loading...
Leave a Comment