DHEIVER commited on
Commit
eeca5d2
·
verified ·
1 Parent(s): f82ebf6

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +81 -0
app.py ADDED
@@ -0,0 +1,81 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import numpy as np
3
+ import matplotlib.pyplot as plt
4
+
5
+ # Título do aplicativo
6
+ st.title("Processador de Sinais ECG")
7
+ st.subheader("Carregue um arquivo de sinal ECG para análise e processamento.")
8
+
9
+ # Carregar o arquivo de sinal ECG
10
+ uploaded_file = st.file_uploader("Envie o arquivo de sinal ECG (formato CSV)", type=["csv"])
11
+
12
+ if uploaded_file is not None:
13
+ # Carregar os dados do arquivo
14
+ data = np.loadtxt(uploaded_file, delimiter=',')
15
+ time = np.arange(len(data)) # Eixo do tempo baseado na quantidade de amostras
16
+
17
+ # Exibir o sinal original
18
+ st.subheader("Sinal ECG Original")
19
+ fig, ax = plt.subplots()
20
+ ax.plot(time, data)
21
+ ax.set_title("Sinal ECG")
22
+ ax.set_xlabel("Tempo")
23
+ ax.set_ylabel("Amplitude")
24
+ st.pyplot(fig)
25
+
26
+ # Opções de processamento
27
+ st.sidebar.header("Opções de Processamento")
28
+ process_option = st.sidebar.selectbox("Escolha o processamento:",
29
+ ["Filtragem (Passa-Baixa)",
30
+ "Detecção de Picos (R-peaks)",
31
+ "Normalização"])
32
+
33
+ if process_option == "Filtragem (Passa-Baixa)":
34
+ # Aplicar filtragem simples (média móvel)
35
+ window_size = st.sidebar.slider("Tamanho da Janela", min_value=3, max_value=101, step=2, value=11)
36
+ filtered_signal = np.convolve(data, np.ones(window_size)/window_size, mode='valid')
37
+ st.subheader("Sinal Filtrado")
38
+ fig, ax = plt.subplots()
39
+ ax.plot(time[:len(filtered_signal)], filtered_signal)
40
+ ax.set_title("Sinal Filtrado")
41
+ ax.set_xlabel("Tempo")
42
+ ax.set_ylabel("Amplitude")
43
+ st.pyplot(fig)
44
+
45
+ elif process_option == "Detecção de Picos (R-peaks)":
46
+ # Detecção simples de picos
47
+ threshold = st.sidebar.slider("Limiar de Detecção", min_value=0.1, max_value=float(np.max(data)), step=0.1, value=0.5)
48
+ peaks = [i for i in range(1, len(data)-1) if data[i-1] < data[i] > data[i+1] and data[i] > threshold]
49
+ st.subheader("Sinal com Detecção de Picos")
50
+ fig, ax = plt.subplots()
51
+ ax.plot(time, data)
52
+ ax.plot(peaks, data[peaks], 'ro') # Marcar os picos detectados
53
+ ax.set_title("Detecção de Picos")
54
+ ax.set_xlabel("Tempo")
55
+ ax.set_ylabel("Amplitude")
56
+ st.pyplot(fig)
57
+
58
+ elif process_option == "Normalização":
59
+ # Normalizar o sinal para a faixa [0, 1]
60
+ normalized_signal = (data - np.min(data)) / (np.max(data) - np.min(data))
61
+ st.subheader("Sinal Normalizado")
62
+ fig, ax = plt.subplots()
63
+ ax.plot(time, normalized_signal)
64
+ ax.set_title("Sinal Normalizado")
65
+ ax.set_xlabel("Tempo")
66
+ ax.set_ylabel("Amplitude Normalizada")
67
+ st.pyplot(fig)
68
+
69
+ # Botão para salvar o resultado
70
+ if st.button("Salvar Sinal Processado"):
71
+ result_path = "sinal_processado.csv"
72
+ if process_option == "Filtragem (Passa-Baixa)":
73
+ np.savetxt(result_path, filtered_signal, delimiter=',')
74
+ elif process_option == "Detecção de Picos (R-peaks)":
75
+ np.savetxt(result_path, peaks, delimiter=',')
76
+ elif process_option == "Normalização":
77
+ np.savetxt(result_path, normalized_signal, delimiter=',')
78
+ st.success(f"Sinal processado salvo como {result_path}")
79
+
80
+ else:
81
+ st.info("Por favor, envie um arquivo de sinal ECG para começar.")