63 int32_t *pn_heart_rate, int8_t *pch_hr_valid)
82 uint32_t un_ir_mean ,un_only_once ;
83 int32_t k ,n_i_ratio_count;
84 int32_t i, s, m, n_exact_ir_valley_locs_count ,n_middle_idx;
85 int32_t n_th1, n_npks,n_c_min;
86 int32_t an_ir_valley_locs[15] ;
87 int32_t an_exact_ir_valley_locs[15] ;
88 int32_t an_dx_peak_locs[15] ;
89 int32_t n_peak_interval_sum;
91 int32_t n_y_ac, n_x_ac;
93 int32_t n_y_dc_max, n_x_dc_max;
94 int32_t n_y_dc_max_idx, n_x_dc_max_idx;
95 int32_t an_ratio[5],n_ratio_average;
96 int32_t n_nume, n_denom ;
105 n_denom= ( an_x[k]+an_x[k+1]+ an_x[k+2]+ an_x[k+3]);
106 an_x[k]= n_denom/(int32_t)4;
112 an_dx[k]= (an_x[k+1]- an_x[k]);
116 an_dx[k] = ( an_dx[k]+an_dx[k+1])/2 ;
126 an_dx[i]= s/ (int32_t)1146;
132 n_th1 += ((an_dx[k]>0)? an_dx[k] : ((int32_t)0-an_dx[k])) ;
138 n_peak_interval_sum =0;
140 for (k=1; k<n_npks; k++)
141 n_peak_interval_sum += (an_dx_peak_locs[k]-an_dx_peak_locs[k -1]);
142 n_peak_interval_sum=n_peak_interval_sum/(n_npks-1);
143 *pn_heart_rate=(int32_t)(6000/n_peak_interval_sum);
147 *pn_heart_rate = -999;
151 for ( k=0 ; k<n_npks ;k++)
152 an_ir_valley_locs[k]=an_dx_peak_locs[k]+HAMMING_SIZE/2;
158 an_x[k] = pun_ir_buffer[k] ;
159 an_y[k] = pun_red_buffer[k] ;
163 n_exact_ir_valley_locs_count =0;
164 for(k=0 ; k<n_npks ;k++){
166 m=an_ir_valley_locs[k];
169 for(i= m-5;i<m+5; i++)
170 if (an_x[i]<n_c_min){
171 if (un_only_once >0){
175 an_exact_ir_valley_locs[k]=i;
177 if (un_only_once ==0)
178 n_exact_ir_valley_locs_count ++ ;
181 if (n_exact_ir_valley_locs_count <2 ){
188 an_x[k]=( an_x[k]+an_x[k+1]+ an_x[k+2]+ an_x[k+3])/(int32_t)4;
189 an_y[k]=( an_y[k]+an_y[k+1]+ an_y[k+2]+ an_y[k+3])/(int32_t)4;
197 for(k=0; k< 5; k++) an_ratio[k]=0;
198 for (k=0; k< n_exact_ir_valley_locs_count; k++){
208 for (k=0; k< n_exact_ir_valley_locs_count-1; k++){
209 n_y_dc_max= -16777216 ;
210 n_x_dc_max= - 16777216;
211 if (an_exact_ir_valley_locs[k+1]-an_exact_ir_valley_locs[k] >10){
212 for (i=an_exact_ir_valley_locs[k]; i< an_exact_ir_valley_locs[k+1]; i++){
213 if (an_x[i]> n_x_dc_max) {n_x_dc_max =an_x[i];n_x_dc_max_idx =i; }
214 if (an_y[i]> n_y_dc_max) {n_y_dc_max =an_y[i];n_y_dc_max_idx=i;}
216 n_y_ac= (an_y[an_exact_ir_valley_locs[k+1]] - an_y[an_exact_ir_valley_locs[k] ] )*(n_y_dc_max_idx -an_exact_ir_valley_locs[k]);
217 n_y_ac= an_y[an_exact_ir_valley_locs[k]] + n_y_ac/ (an_exact_ir_valley_locs[k+1] - an_exact_ir_valley_locs[k]) ;
220 n_y_ac= an_y[n_y_dc_max_idx] - n_y_ac;
221 n_x_ac= (an_x[an_exact_ir_valley_locs[k+1]] - an_x[an_exact_ir_valley_locs[k] ] )*(n_x_dc_max_idx -an_exact_ir_valley_locs[k]);
222 n_x_ac= an_x[an_exact_ir_valley_locs[k]] + n_x_ac/ (an_exact_ir_valley_locs[k+1] - an_exact_ir_valley_locs[k]);
223 n_x_ac= an_x[n_y_dc_max_idx] - n_x_ac;
224 n_nume=( n_y_ac *n_x_dc_max)>>7 ;
225 n_denom= ( n_x_ac *n_y_dc_max)>>7;
226 if (n_denom>0 && n_i_ratio_count <5 && n_nume != 0)
228 an_ratio[n_i_ratio_count]= (n_nume*100)/n_denom ;
235 n_middle_idx= n_i_ratio_count/2;
238 n_ratio_average =( an_ratio[n_middle_idx-1] +an_ratio[n_middle_idx])/2;
240 n_ratio_average = an_ratio[n_middle_idx ];
242 if( n_ratio_average>2 && n_ratio_average <184){
244 *pn_spo2 = n_spo2_calc ;
254 void maxim_find_peaks(int32_t *pn_locs, int32_t *pn_npks, int32_t *pn_x, int32_t n_size, int32_t n_min_height, int32_t n_min_distance, int32_t n_max_num)
265 *pn_npks =
min( *pn_npks, n_max_num );
277 int32_t i = 1, n_width;
280 while (i < n_size-1){
281 if (pn_x[i] > n_min_height && pn_x[i] > pn_x[i-1]){
283 while (i+n_width < n_size && pn_x[i] == pn_x[i+n_width])
285 if (pn_x[i] > pn_x[i+n_width] && (*pn_npks) < 15 ){
286 pn_locs[(*pn_npks)++] = i;
309 int32_t i, j, n_old_npks, n_dist;
314 for ( i = -1; i < *pn_npks; i++ ){
315 n_old_npks = *pn_npks;
317 for ( j = i+1; j < n_old_npks; j++ ){
318 n_dist = pn_locs[j] - ( i == -1 ? -1 : pn_locs[i] );
319 if ( n_dist > n_min_distance || n_dist < -n_min_distance )
320 pn_locs[(*pn_npks)++] = pn_locs[j];
337 int32_t i, j, n_temp;
338 for (i = 1; i < n_size; i++) {
340 for (j = i; j > 0 && n_temp < pn_x[j-1]; j--)
355 int32_t i, j, n_temp;
356 for (i = 1; i < n_size; i++) {
358 for (j = i; j > 0 && pn_x[n_temp] > pn_x[pn_indx[j-1]]; j--)
359 pn_indx[j] = pn_indx[j-1];