DATA PROCESSING FOR SPO2 AND HR
Dependents: MAX30100_FirstTry MAX30100_V04
Diff: PROCESAMIENTO_SPO2_FC.cpp
- Revision:
- 0:264c403954d8
- Child:
- 1:7e5b24227d0a
- Child:
- 2:2cd93c474a32
diff -r 000000000000 -r 264c403954d8 PROCESAMIENTO_SPO2_FC.cpp --- /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