DATA PROCESSING FOR SPO2 AND HR
Dependents: MAX30100_FirstTry MAX30100_V04
PROCESAMIENTO_SPO2_FC.cpp
- Committer:
- cesarcazal
- Date:
- 2017-03-27
- Revision:
- 0:264c403954d8
- Child:
- 1:7e5b24227d0a
- Child:
- 2:2cd93c474a32
File content as of revision 0:264c403954d8:
/*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; } }