nahue-passano's picture
Update app.py
d66ff1a verified
import streamlit as st
import numpy as np
import matplotlib.pyplot as plt
def main():
st.set_page_config(layout="wide")
st.title(
"Procesamiento Digital de Señales - UNTREF \n ## Spectral Leakage en la DFT"
)
st.divider()
signal_expression, signal_settings = st.columns(2)
with signal_settings:
st.markdown("### Parámetros de la señal")
num_samples = st.slider(
"Cantidad de Muestras", min_value=4, max_value=64, value=8, step=1
)
freq = st.slider(
r"Frecuencia angular $\omega_0$",
min_value=-np.pi,
max_value=np.pi,
value=0.0,
step=np.pi / 64,
)
with signal_expression:
freq_samples = int(np.round(64 * freq / np.pi))
st.markdown("### Señal analizada:")
with st.columns(3)[1]:
st.markdown(f"# $$e^{{j\\frac{{{freq_samples}}}{{64}}\pi n}}$$")
samples = np.arange(num_samples)
signal = np.exp(1j * (freq) * samples)
dtft_samples = 2048
dtft_result = np.fft.fftshift(np.fft.fft(signal, dtft_samples)) / num_samples
dtft_freqs = np.fft.fftshift(np.fft.fftfreq(dtft_samples))
dft_result = np.fft.fftshift(np.fft.fft(signal)) / num_samples
dft_freqs = np.fft.fftshift(np.fft.fftfreq(len(signal)))
dft_freqs_rad = 2 * np.pi * dft_freqs
dtft_freqs_rad = 2 * np.pi * dtft_freqs
# Plot the signals
fig = plt.figure(figsize=(10, 4))
plt.axvline(np.pi, color="black", linestyle="--")
plt.axvline(-np.pi, color="black", linestyle="--")
plt.axvline(freq, color="black", alpha=0.5, linestyle=":", label=r"$\omega_0$")
plt.plot(dtft_freqs_rad, np.abs(dtft_result), color="red", label="DTFT")
plt.stem(dft_freqs_rad, np.abs(dft_result), markerfmt="C0o", label="DFT")
plt.xlabel("Frecuencia angular [rad]")
plt.ylabel("Magnitud de la transformada normalizada")
plt.ylim(0, 1.1)
plt.xlim(-np.pi - 0.1, np.pi + 0.1)
plt.xticks(
np.linspace(-np.pi, np.pi, 9),
[
r"$-\pi$",
r"$-\frac{3}{4}\pi$",
r"$-\frac{\pi}{2}$",
r"$-\frac{\pi}{4}$",
r"0",
r"$\frac{\pi}{4}$",
r"$\frac{\pi}{2}$",
r"$\frac{3}{4}\pi$",
r"$\pi$",
],
)
plt.grid()
plt.legend(loc="upper right", framealpha=1, ncol=3, bbox_to_anchor=(0.65, 1.06))
plt.tight_layout()
st.pyplot(fig, use_container_width=True)
if __name__ == "__main__":
main()