DATA PROCESSING FOR SPO2 AND HR

Dependents:   MAX30100_FirstTry MAX30100_V04

PROCESAMIENTO_SPO2_FC.cpp

Committer:
Ferszt
Date:
2017-05-30
Revision:
4:ce356ed18c86
Parent:
1:7e5b24227d0a

File content as of revision 4:ce356ed18c86:

/*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 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];
    int min_pos[30][2]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    int max_pos[30][2]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    float res_period,num_prom;
    for(a=6;a<194;a++){
        if((muestras[a]<magnitud)){//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])){//segun recomendacion de https://www.youtube.com/watch?v=36cELpNGJZY
                    posibilidad_anteriores++;
                }
                if((muestras[a]<=muestras[a+b])){//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)){//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])){//EL 125000 DEBE SER 45000 segun recomendacion de https://www.youtube.com/watch?v=36cELpNGJZY
                    posibilidad_anteriores++;
                }
                if((muestras[a]>=muestras[a+b])){//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;
    }
}