File size: 3,436 Bytes
eeca5d2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import streamlit as st
import numpy as np
import matplotlib.pyplot as plt

# Título do aplicativo
st.title("Processador de Sinais ECG")
st.subheader("Carregue um arquivo de sinal ECG para análise e processamento.")

# Carregar o arquivo de sinal ECG
uploaded_file = st.file_uploader("Envie o arquivo de sinal ECG (formato CSV)", type=["csv"])

if uploaded_file is not None:
    # Carregar os dados do arquivo
    data = np.loadtxt(uploaded_file, delimiter=',')
    time = np.arange(len(data))  # Eixo do tempo baseado na quantidade de amostras

    # Exibir o sinal original
    st.subheader("Sinal ECG Original")
    fig, ax = plt.subplots()
    ax.plot(time, data)
    ax.set_title("Sinal ECG")
    ax.set_xlabel("Tempo")
    ax.set_ylabel("Amplitude")
    st.pyplot(fig)

    # Opções de processamento
    st.sidebar.header("Opções de Processamento")
    process_option = st.sidebar.selectbox("Escolha o processamento:",
                                          ["Filtragem (Passa-Baixa)", 
                                           "Detecção de Picos (R-peaks)", 
                                           "Normalização"])

    if process_option == "Filtragem (Passa-Baixa)":
        # Aplicar filtragem simples (média móvel)
        window_size = st.sidebar.slider("Tamanho da Janela", min_value=3, max_value=101, step=2, value=11)
        filtered_signal = np.convolve(data, np.ones(window_size)/window_size, mode='valid')
        st.subheader("Sinal Filtrado")
        fig, ax = plt.subplots()
        ax.plot(time[:len(filtered_signal)], filtered_signal)
        ax.set_title("Sinal Filtrado")
        ax.set_xlabel("Tempo")
        ax.set_ylabel("Amplitude")
        st.pyplot(fig)

    elif process_option == "Detecção de Picos (R-peaks)":
        # Detecção simples de picos
        threshold = st.sidebar.slider("Limiar de Detecção", min_value=0.1, max_value=float(np.max(data)), step=0.1, value=0.5)
        peaks = [i for i in range(1, len(data)-1) if data[i-1] < data[i] > data[i+1] and data[i] > threshold]
        st.subheader("Sinal com Detecção de Picos")
        fig, ax = plt.subplots()
        ax.plot(time, data)
        ax.plot(peaks, data[peaks], 'ro')  # Marcar os picos detectados
        ax.set_title("Detecção de Picos")
        ax.set_xlabel("Tempo")
        ax.set_ylabel("Amplitude")
        st.pyplot(fig)

    elif process_option == "Normalização":
        # Normalizar o sinal para a faixa [0, 1]
        normalized_signal = (data - np.min(data)) / (np.max(data) - np.min(data))
        st.subheader("Sinal Normalizado")
        fig, ax = plt.subplots()
        ax.plot(time, normalized_signal)
        ax.set_title("Sinal Normalizado")
        ax.set_xlabel("Tempo")
        ax.set_ylabel("Amplitude Normalizada")
        st.pyplot(fig)

    # Botão para salvar o resultado
    if st.button("Salvar Sinal Processado"):
        result_path = "sinal_processado.csv"
        if process_option == "Filtragem (Passa-Baixa)":
            np.savetxt(result_path, filtered_signal, delimiter=',')
        elif process_option == "Detecção de Picos (R-peaks)":
            np.savetxt(result_path, peaks, delimiter=',')
        elif process_option == "Normalização":
            np.savetxt(result_path, normalized_signal, delimiter=',')
        st.success(f"Sinal processado salvo como {result_path}")

else:
    st.info("Por favor, envie um arquivo de sinal ECG para começar.")