Spaces:
Runtime error
Runtime error
nahue-passano
commited on
Commit
•
9438940
1
Parent(s):
ad3bdee
Create app.py
Browse files
app.py
ADDED
@@ -0,0 +1,83 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import streamlit as st
|
2 |
+
import numpy as np
|
3 |
+
import matplotlib.pyplot as plt
|
4 |
+
|
5 |
+
|
6 |
+
def main():
|
7 |
+
st.set_page_config(layout="wide")
|
8 |
+
st.title(
|
9 |
+
"Procesamiento Digital de Señales - UNTREF \n ## Spectral Leakage en la DFT"
|
10 |
+
)
|
11 |
+
st.divider()
|
12 |
+
signal_expression, signal_settings = st.columns(2)
|
13 |
+
|
14 |
+
with signal_settings:
|
15 |
+
st.markdown("### Parámetros de la señal")
|
16 |
+
num_samples = st.slider(
|
17 |
+
"Cantidad de Muestras", min_value=4, max_value=64, value=8, step=1
|
18 |
+
)
|
19 |
+
|
20 |
+
freq = st.slider(
|
21 |
+
r"$\omega_0$",
|
22 |
+
min_value=-np.pi,
|
23 |
+
max_value=np.pi,
|
24 |
+
value=0.0,
|
25 |
+
step=np.pi / 64,
|
26 |
+
)
|
27 |
+
with signal_expression:
|
28 |
+
freq_samples = int(np.round(64 * freq / np.pi))
|
29 |
+
st.markdown("### Señal analizada:")
|
30 |
+
with st.columns(3)[1]:
|
31 |
+
st.markdown(f"# $$e^{{j\\frac{{{freq_samples}}}{{64}}\pi}}$$")
|
32 |
+
|
33 |
+
samples = np.arange(num_samples)
|
34 |
+
signal = np.exp(1j * (freq) * samples)
|
35 |
+
|
36 |
+
dft_result = np.fft.fftshift(np.fft.fft(signal))
|
37 |
+
dft_result = dft_result / np.max(np.abs(dft_result))
|
38 |
+
dft_freqs = np.fft.fftshift(np.fft.fftfreq(len(signal)))
|
39 |
+
|
40 |
+
dtft_samples = 2048
|
41 |
+
dtft_result = np.fft.fftshift(np.fft.fft(signal, dtft_samples))
|
42 |
+
dtft_result = dtft_result / np.max(np.abs(dtft_result))
|
43 |
+
dtft_freqs = np.fft.fftshift(np.fft.fftfreq(dtft_samples))
|
44 |
+
|
45 |
+
dft_freqs_rad = 2 * np.pi * dft_freqs
|
46 |
+
dtft_freqs_rad = 2 * np.pi * dtft_freqs
|
47 |
+
|
48 |
+
# Plot the signals
|
49 |
+
fig = plt.figure(figsize=(10, 4))
|
50 |
+
plt.axvline(freq, color="black", alpha=0.5, linestyle=":", label=r"$\omega_0$")
|
51 |
+
plt.plot(dtft_freqs_rad, np.abs(dtft_result), color="red", label="DTFT")
|
52 |
+
plt.stem(dft_freqs_rad, np.abs(dft_result), markerfmt="C0o", label="DFT")
|
53 |
+
plt.axvline(np.pi, color="black", linestyle="--")
|
54 |
+
plt.axvline(-np.pi, color="black", linestyle="--")
|
55 |
+
|
56 |
+
plt.xlabel("Frecuencia angular [rad]")
|
57 |
+
plt.ylabel("Magnitud de la transformada normalizada")
|
58 |
+
plt.ylim(0, 1.1)
|
59 |
+
plt.xlim(-np.pi - 0.1, np.pi + 0.1)
|
60 |
+
plt.xticks(
|
61 |
+
np.linspace(-np.pi, np.pi, 9),
|
62 |
+
[
|
63 |
+
r"$-\pi$",
|
64 |
+
r"$-\frac{3}{4}\pi$",
|
65 |
+
r"$-\frac{\pi}{2}$",
|
66 |
+
r"$-\frac{\pi}{4}$",
|
67 |
+
r"0",
|
68 |
+
r"$\frac{\pi}{4}$",
|
69 |
+
r"$\frac{\pi}{2}$",
|
70 |
+
r"$\frac{3}{4}\pi$",
|
71 |
+
r"$\pi$",
|
72 |
+
],
|
73 |
+
)
|
74 |
+
plt.grid()
|
75 |
+
plt.legend(loc="upper right", framealpha=1, ncol=3, bbox_to_anchor=(0.65, 1.06))
|
76 |
+
|
77 |
+
plt.tight_layout()
|
78 |
+
|
79 |
+
st.pyplot(fig, use_container_width=True)
|
80 |
+
|
81 |
+
|
82 |
+
if __name__ == "__main__":
|
83 |
+
main()
|