ECG - Display and Analisys

ECG - Display and Analisys in VB - Fernando Cesar Mercado -- 2007

      

      

 Descargar

 

El proyecto es basicamente un software capaz de mostrar archivos de ECG y efectuar algunos análisis básicos, permite determinar la cantidad de QRS´s en un intervalo de tiempo determinado, ademas permite realizar mediciones temporales.

El software es capaz de determinar las ondas QRS y medir los intervalos de tiempo entre cada una de estas brindando al usuario los datos de las mediciones y la media de todos los intervalos entre cada QRS.

Permite realizar zoom sobre la onda ECG, desplazarla y elegir un intervalo de tiempo para su representacion grafica.

Otra funcionalidad es la de superponer graficas de distintos archivos ECG para realizar comparaciones.

 

´.: Código :.´

Dim a(38399) As Double
Dim time As Double
Dim inicio As Double
Dim fin As Double
Dim zoom(2) As Double
Dim b(20) As Long
Dim c(20) As Long
Dim sep_intervalos
Dim last_params(2) As Double


Function Cargar_Archivo(nombre_archivo As String) As Long

Dim temp As String
Dim i As Long

i = 0
Open nombre_archivo For Input As #1

While Not EOF(1)
    Line Input #1, temp$            'Cargo Valor por Valor
    a(i) = Val(temp$)
    i = i + 1
    Wend
Close #1

Cargar_Archivo = i                  'Devuelve Las Lineas Leidas

End Function

Private Sub Command1_Click()
    Dim cargar As String
    cargar = explorador.Path & "\" & explorador.FileName
   
    log_item Cargar_Archivo(cargar) & " datos cargados correctamente"
   
    time = Val(Text1.Text) * 1000
    dibujar_ecg 0, time
End Sub

Sub dibujar_ecg(tiempo_inicial As Double, tiempo_final As Double)
   
    On Error Resume Next
    Skip = Val(skipctl.Text)
    last_params(0) = tiempo_inicial
    last_params(1) = tiempo_final
   
    HScroll1.Value = Round(Abs(tiempo_final - tiempo_inicial) / 1000, 0)
   
    colortrazo = vbRed
   
    menor = 0
   
    If (limpiar) Then
        Picture1.Cls
    Else
        Randomize
        colortrazo = RGB(Round(255 * Rnd(255), 0), Round(255 * Rnd(255), 0), Round(255 * Rnd(255), 0))
    End If
   
    If 0 Then
    If Abs(tiempo_final - tiempo_inicial) < 700 Then
        Picture1.ScaleHeight = -1.6
        Picture1.ScaleTop = 0.8
    Else
        Picture1.ScaleHeight = -2
        Picture1.ScaleTop = 1
    End If
    End If
   
    Picture1.ScaleWidth = tiempo_final - tiempo_inicial

    Picture1.CurrentX = 0

    On Error Resume Next
    For i = tiempo_inicial To tiempo_final
        DoEvents
        'Picture1.CurrentX = i - tiempo_inicial
        'Picture1.CurrentY = a(i)
        'Picture1.Print "."
        Picture1.Line (i - tiempo_inicial, a(i))-(i + 1 + Skip - tiempo_incial, a(i + 1 + Skip)), colortrazo
        i = i + Skip
    Next i
   
    DoEvents
   
    Min = 1000
   
    For i = tiempo_inicial To tiempo_final

        If (a(i) > Max) Then Max = a(i)
        If (a(i) < Min) Then Min = a(i)
       
    Next i
   
    Picture1.ForeColor = vbGreen
    j = 1
   
    For i = tiempo_inicial To tiempo_final
       
        If (Abs((a(i) - Max)) < 0.25) Then
            If (Check2) Then
                Picture1.CurrentX = i - tiempo_inicial
                Picture1.CurrentY = Max + 0.005
                Picture1.Print "(" & j & ")"
            End If
            j = j + 1
            b(j) = i
            i = i + 50                                      'Escapo la sucesion normal
       
        End If

    Next i
   
    log_item j - 1 & " QRS en pantalla"
   
    linecolor = vbYellow
   
    If (Check1.Value) Then
        sep_intervalos = Val(divisiones)
        For i = 2 To j - 1
            If ((i Mod 2) = 0) Then
                linecolor = vbYellow
            Else
                linecolor = vbBlue
            End If
       
            Picture1.Line (b(i) + 15, Max)-(b(i + 1) - 15, Max), linecolor
            Picture1.CurrentX = Abs(b(i) - b(i + 1)) / 2 + b(i) - 28
            Picture1.CurrentY = Max + 0.07
            Picture1.ForeColor = vbGreen
            media = media + Round(Abs(b(i) - b(i + 1)), 0) / 1000
            Picture1.Print Round(Abs(b(i) - b(i + 1)), 0) / 1000 & "s"
            i = i + sep_intervalos
        Next i
    End If
   
            log_item "Media: " & media / (j - 2)
   
    j = 1
   
    For i = tiempo_inicial To tiempo_final
   
            If (Abs((a(i) - Min)) < 0.15) Then
               
                If (Check2) Then
                    Picture1.CurrentX = i - tiempo_incial
                    Picture1.CurrentY = a(i) - 0.15
                    Picture1.Print "(" & j & ")"
                End If
                c(j) = i
                j = j + 1
                i = i + 50                                      'Escapo la sucesion normal
       
            End If
   
    Next i
   

    If (Check1.Value) Then
        sep_intervalos = Val(divisiones)
        For i = 1 To j - 2
            If ((i Mod 2) = 0) Then
                linecolor = vbBlue
            Else
                linecolor = vbYellow
            End If
            Picture1.Line (c(i) + 15, Min - 0.1)-(c(i + 1) - 15, Min - 0.1), linecolor
            Picture1.CurrentX = Abs(c(i) - c(i + 1)) / 2 + c(i)
            Picture1.CurrentY = Min - 0.04
            Picture1.ForeColor = vbGreen
            Picture1.Print Round(Abs(c(i) - c(i + 1)), 0) / 1000 & "s"
            i = i + sep_intervalos
        Next i
    End If
   
    If (Check3) Then
        Picture1.ForeColor = vbYellow
        For i = tiempo_incial To tiempo_final                   'Dibujo las lineas divisorias del dominio
            DoEvents
   
            If ((i Mod (time / 10)) = 0) Then
               
                Picture1.Line (i, -1)-(i, -0.9), vbBlue
                Picture1.CurrentX = i - 35
                Picture1.CurrentY = -0.85
                Picture1.Print i / 1000
            End If
           
        Next i
    End If
           
End Sub

Private Sub Command2_Click()

    time = Val(Text1.Text) * 1000
    dibujar_ecg 0, time
End Sub

Private Sub Command3_Click()

    Picture1.ScaleHeight = Picture1.ScaleHeight + 0.5
    Picture1.ScaleTop = Abs(Picture1.ScaleHeight) / 2
    dibujar_ecg last_params(0), last_params(1)

End Sub

Private Sub Command4_Click()
    Picture1.ScaleHeight = Picture1.ScaleHeight - 0.5
    Picture1.ScaleTop = Abs(Picture1.ScaleHeight) / 2
    dibujar_ecg last_params(0), last_params(1)
End Sub


Private Sub Command6_Click()
    Picture1.ScaleTop = Picture1.ScaleTop - 0.1
    dibujar_ecg last_params(0), last_params(1)
End Sub

Private Sub Command7_Click()
    Picture1.ScaleTop = Picture1.ScaleTop + 0.1
    dibujar_ecg last_params(0), last_params(1)
End Sub

Private Sub explorador_DblClick()
    Dim cargar As String
    cargar = explorador.Path & "\" & explorador.FileName
   
    log_item Cargar_Archivo(cargar) & " datos cargados correctamente"
   
    time = Val(Text1.Text) * 1000
    dibujar_ecg 0, time
End Sub

Private Sub Form_Load()
    explorador.Path = App.Path
    Cargar_Archivo App.Path & "\fer.ecg"
    inicio = -1
    fin = -1
End Sub

Private Sub Form_Resize()
    Picture1.Width = Form1.Width - 50
    HScroll1.Width = Picture1.Width - 200
    time = Val(Text1.Text) * 1000
    DoEvents
    Picture1.Refresh
    dibujar_ecg last_params(0), last_params(1)
End Sub

Private Sub HScroll1_Change()
    Text1.Text = HScroll1.Value
    time = Val(Text1.Text) * 1000
    dibujar_ecg 0, time
End Sub

Private Sub HScroll1_Scroll()
    Text1.Text = HScroll1.Value
End Sub

Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If inicio = -1 Then
        inicio = X
        Exit Sub
    End If
   
    If fin = -1 Then
        fin = X
        log_item "Medicion: " & Round(Abs((fin - inicio) / 1000), 3) & " s"
        Line1.X1 = 0
        Line1.X2 = 0
       
        If fin > inicio Then
            zoom(0) = Round(inicio, 0)
            zoom(1) = Round(X, 0)
        Else
            zoom(0) = Round(X, 0)
            zoom(1) = Round(inicio, 0)
        End If
       
        inicio = -1
        fin = -1
         
            If Button = 2 Then
                dibujar_ecg zoom(0), zoom(1)
                DoEvents
                dibujar_ecg last_params(0), last_params(1)
            End If
    End If
   
End Sub

Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Form1.Caption = "ECG [" & X & " -- " & Y & "]"
    If inicio <> -1 Then
        Line1.X1 = inicio
        Line1.X2 = X
    End If
End Sub

Sub log_item(item As String)

    log.Text = log.Text & item & vbCrLf
    log.SelStart = Len(log.Text)

End Sub

Private Sub salir_Click()
    Unload Me
End Sub