DATA PROCESSING FOR SPO2 AND HR

Dependents:   MAX30100_FirstTry MAX30100_V04

Revision:
0:264c403954d8
Child:
1:7e5b24227d0a
Child:
2:2cd93c474a32
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PROCESAMIENTO_SPO2_FC.cpp	Mon Mar 27 09:02:23 2017 +0000
@@ -0,0 +1,167 @@
+/*int muestras_50hz[200];
+int matriz_minimos[30][2], matriz_maximos[30][2],max_min_period[2];
+int pico_pico,cresta, valle, cantidad;
+float frecuencia,periodo;*/
+
+//int index, aux1, nmuestra;
+
+/*EJEMPLO DE UTILIZACION DEL SISTEMA DE PROCESAMIENTO.
+int main(int argc, char *argv[]) {
+    promedio(muestras_100hz, muestras_50hz);
+    periodo = valores(muestras_50hz,matriz_minimos,matriz_maximos,max_min_period);  
+    for(aux1=0;aux1<30;aux1++){
+        printf("%d,%d \n%d,%d \n",matriz_maximos[aux1][0],matriz_maximos[aux1][1],matriz_minimos[aux1][0],matriz_minimos[aux1][1]);
+        //printf("%d , %d \n",matriz_minimos[aux1][0],matriz_minimos[aux1][1]);
+    }*/
+/*    pico_pico=max_min_period[0]-max_min_period[1];
+    frecuencia=60/(periodo*0.02);
+            //printf("el valor medio del maximo es %d\n", pico_pico);
+            printf("el valor medio del pico_pico es %f\n", frecuencia);
+    return 0;
+}*/
+
+float valores(int muestras[200],int min_pos[30][2], int max_pos[30][2],int resultados[2]){//EMITE EL PERIODO, EL VALOR MAXIMO Y EL VALOR MINIMO COMO RESPUESTA.
+    int a,b=0,posibilidad_anteriores=0,posibilidad_sucesores=0,indice=0;
+    int posicion=0,Vpp,minimos=4194303, prom_max=0, prom_min=0, periodo_max=0, periodo_min=0,maximos=-4194303, magnitud=4194303, copy_min[30][2],copy_max[30][2];
+    float res_period,num_prom;
+    for(a=6;a<194;a++){
+        if((muestras[a]<magnitud)&&(muestras[a]>15000)){//segun recomendacion de https://www.youtube.com/watch?v=36cELpNGJZY
+            magnitud=muestras[a];
+            posicion=a;
+            for (b=1;b<7;b++){
+                if((muestras[a]<=muestras[a-b])||(muestras[a-b]<=15000)){//segun recomendacion de https://www.youtube.com/watch?v=36cELpNGJZY
+                    posibilidad_anteriores++;
+                }
+                if((muestras[a]<=muestras[a+b])||(muestras[a-b]<=15000)){//segun recomendacion de https://www.youtube.com/watch?v=36cELpNGJZY
+                    posibilidad_sucesores++;
+                }
+            }
+            if ((posibilidad_anteriores>5)&&(posibilidad_sucesores>5)){
+                min_pos[indice][0]=magnitud;
+                min_pos[indice][1]=posicion;
+                if(magnitud<minimos)
+                    minimos=magnitud;
+                indice++;
+                a=a+10;
+            }
+            magnitud=4194303;
+            posibilidad_anteriores=0;
+            posibilidad_sucesores=0;
+        }
+    }
+    indice=0;
+    magnitud=-4194303;
+    posicion=0;
+    for (a=6;a<194;a++){
+        if((muestras[a]>magnitud)&&(muestras[a]<125000)){//EL 125000 DEBE SER 45000 segun recomendacion de https://www.youtube.com/watch?v=36cELpNGJZY
+            magnitud=muestras[a];
+            posicion=a;
+            for (b=1;b<7;b++){
+                if((muestras[a]>=muestras[a-b])||(muestras[a-b]>=125000)){//EL 125000 DEBE SER 45000 segun recomendacion de https://www.youtube.com/watch?v=36cELpNGJZY
+                    posibilidad_anteriores++;
+                }
+                if((muestras[a]>=muestras[a+b])||(muestras[a-b]>=125000)){//EL 125000 DEBE SER 45000 segun recomendacion de https://www.youtube.com/watch?v=36cELpNGJZY
+                    posibilidad_sucesores++;
+                }
+            }
+            if ((posibilidad_anteriores>5)&&(posibilidad_sucesores>5)){
+                max_pos[indice][0]=magnitud;
+                max_pos[indice][1]=posicion;
+                if(magnitud>maximos)
+                    maximos=magnitud;
+                indice++;
+                a=a+10;
+            }
+            posibilidad_anteriores=0;
+            posibilidad_sucesores=0;
+            magnitud=-4194303;
+        }
+    }
+    a=0;
+    b=0;
+    indice=0;
+    Vpp=maximos-minimos;
+    if (max_pos[0][1]<min_pos[0][1]){
+        if(((max_pos[0][0]-min_pos[0][0])*2)<Vpp){
+                max_pos[0][1]=401;
+                max_pos[0][0]=maximos;
+                min_pos[0][1]=401;
+                min_pos[0][0]=minimos;
+                
+        }
+        a=1;
+    }
+    while ((max_pos[a][1])!=0){
+        if((((max_pos[a][0]-min_pos[b][0])*2)<Vpp)&&((max_pos[a][0]-min_pos[b][0])<(max_pos[a][0]-min_pos[b+1][0]))){
+            max_pos[a][1]=401;
+            min_pos[b][1]=401;
+            max_pos[a][0]=maximos;
+            min_pos[b][0]=minimos;
+        }
+        else{
+            if(((max_pos[a][0]-min_pos[b+1][0])*2)<Vpp){
+                max_pos[a][1]=401;
+                min_pos[b+1][1]=401;
+                max_pos[a][0]=maximos;
+                min_pos[b+1][0]=minimos;
+            }
+        }
+        b++;
+        a++;
+    }
+    b=0;
+    for (a=0;a<30;a++){
+        if ((max_pos[a][1]>0)&&(max_pos[a][1]<400)){
+            copy_max[indice][0]=max_pos[a][0];
+            copy_max[indice][1]=max_pos[a][1];
+            prom_max=prom_max+max_pos[a][0];
+            if (b>0){
+            periodo_max=periodo_max+max_pos[a][1]-copy_max[indice-1][1];
+            }       
+            indice++;
+        }
+        if ((min_pos[a][1]>0)&&(min_pos[a][1]<400)){
+            copy_min[b][0]=min_pos[a][0];
+            copy_min[b][1]=min_pos[a][1];
+            prom_min=prom_min+min_pos[a][0];
+            if (b>0){
+            periodo_min=periodo_min+min_pos[a][1]-copy_min[b-1][1];
+            }
+            b++;
+        }
+        if((max_pos[a+1][1]==0)&&(min_pos[a+1][1]==0)){
+            posicion=a+1;
+            a=29;
+        }
+    }
+    resultados[0]=prom_max/indice;//VALOR MAXIMO
+    resultados[1]=prom_min/b;//VALOR MINIMO
+    res_period=(periodo_max+periodo_min);
+    num_prom=(b+indice-2);
+    res_period=res_period/num_prom;
+    //printf("minimo %d \n", period);
+    if (indice>b)
+        b=indice;
+    for(a=0;a<30;a++){
+        if (a<b){
+            max_pos[a][0]=copy_max[a][0];
+            max_pos[a][1]=copy_max[a][1];
+            min_pos[a][0]=copy_min[a][0];
+            min_pos[a][1]=copy_min[a][1];
+        }
+        else{
+            max_pos[a][0]=0;
+            max_pos[a][1]=0;
+            min_pos[a][0]=0;
+            min_pos[a][1]=0;
+        }
+    }
+    return(res_period);
+}
+
+void promedio(int *muestras400, int *muestras200){
+    int aux;
+    for (aux=0; aux<400; aux=aux+2){
+        *(muestras200+aux/2)=(*(muestras400+aux)+*(muestras400+aux+1))/2;
+    }
+}
\ No newline at end of file