import numpy as np

from ejemplos.filtros.ruido.generador_ruido import generar_pico_de_ruido
from ejemplos.practica_2.funciones import generar_senoide
from matplotlib import pyplot as plt

fs = 44100

t, senal = generar_senoide(0, 4, 2, 440, 0, fs)
N = len(senal)
espectro = np.abs(np.fft.fft(senal))[0:int(N / 2)]

ruido = generar_pico_de_ruido(senal, fs, 16000, 20)
espectro_ruido = np.abs(np.fft.fft(ruido))[0:int(N / 2)]

senal_ruidosa = senal + ruido
espectro_ruidoso = np.abs(np.fft.fft(senal_ruidosa))[0:int(N / 2)]

f = np.linspace(0, fs / 2, len(espectro), endpoint=None)

fig, axes = plt.subplots(3, 2)

axes[0][0].plot(t, senal)
axes[0][0].set_xlabel("t (seg)")
axes[0][0].set_xlim(left=0, right=50 / 44100)

axes[0][1].plot(f, espectro)
axes[0][1].set_xlabel("f (Hz)")

axes[1][0].plot(t, ruido)
axes[1][0].set_xlabel("t (seg)")
import numpy as np
from matplotlib import pyplot as plt
import scipy.signal as sg

from ejemplos.filtros.filtros_ideales import filtrar_pasa_bajos_ideal
from ejemplos.filtros.ruido.generador_ruido import generar_pico_de_ruido
from ejemplos.practica_4.funciones import generar_senal_cuadrada

# Filtrado pasa bajos de una señal cuadrada con un pico de ruido en 1kHz

fs = 44100
t, senal = generar_senal_cuadrada(0.5, 0, 4, fs)
N = len(senal)
espectro = np.abs(np.fft.fft(senal))[0:int(N / 2)]

ruido = generar_pico_de_ruido(senal, fs, 1000, 10)
senal_ruidosa = senal + ruido
espectro_ruidoso = np.abs(np.fft.fft(senal_ruidosa))[0:int(N / 2)]

fpass = 800
fstop = 950
wpass = 800 / (fs / 2)
wstop = 950 / (fs / 2)

# Las frecuencias angulares fpass y fstop se tienen que normalizar al intervalo (0, 1), donde 1 corresponde
# a la frecuencia de Nyquist (fs / 2). Para eso dividimos por (fs/2)

# wpass: la frecuencia de paso normalizada
# wstop: la frecuencia de corte normalizada
# gpass: máxima atenuación tolerable en la banda de paso (en dB)
# gstop: mínima atenuación tolerable en la banda de rechazo (en dB)