diff --git a/stm-firmware/calibration.c b/stm-firmware/calibration.c index 489e8f4..1b00983 100644 --- a/stm-firmware/calibration.c +++ b/stm-firmware/calibration.c @@ -75,6 +75,71 @@ free_mem: return NULL; } +static float calculate_mean(float *values, uint32_t count) +{ + uint32_t loop_cnt = (count + 7) / 8; + uint32_t remainder = count % 8; + float sum = 0; + + switch (remainder) { + case 0: do { sum += *values++; /* FALLTHRU */ + case 7: sum += *values++; /* FALLTHRU */ + case 6: sum += *values++; /* FALLTHRU */ + case 5: sum += *values++; /* FALLTHRU */ + case 4: sum += *values++; /* FALLTHRU */ + case 3: sum += *values++; /* FALLTHRU */ + case 2: sum += *values++; /* FALLTHRU */ + case 1: sum += *values++; + } while (--loop_cnt > 0); + } + + return sum/(float)count; +} + +static float calculate_standard_deviation(float *values, uint32_t count, float mean) +{ + uint32_t loop_cnt = (count + 7) / 8; + uint32_t remainder = count % 8; + float sum = 0; + float res; + + switch (remainder) { + case 0: do { sum += (*values - mean) * (*values - mean); + values++; + /* FALLTHRU */ + case 7: sum += (*values - mean) * (*values - mean); + values++; + /* FALLTHRU */ + case 6: sum += (*values - mean) * (*values - mean); + values++; + /* FALLTHRU */ + case 5: sum += (*values - mean) * (*values - mean); + values++; + /* FALLTHRU */ + case 4: sum += (*values - mean) * (*values - mean); + values++; + /* FALLTHRU */ + case 3: sum += (*values - mean) * (*values - mean); + values++; + /* FALLTHRU */ + case 2: sum += (*values - mean) * (*values - mean); + values++; + /* FALLTHRU */ + case 1: sum += (*values - mean) * (*values - mean); + values++; + /* FALLTHRU */ + } while (--loop_cnt > 0); + } + + sum /= (float)count; + /* Compute the square roor using the FPU. + * The constraint 't' tells GCC to use a floating point register + */ + __asm__ __volatile__("vsqrt.f32 %0, %1" : "=t"(res) : "t"(sum)); + + return res; +} + static int calibration_poll_data_acquisition(float *mem_array, uint32_t count, volatile int *flag, float *mu, float *max_dev) { int ret_val = 0; @@ -99,10 +164,9 @@ static int calibration_poll_data_acquisition(float *mem_array, uint32_t count, v /* Convert the stream memory to Ohm readings */ adc_pt1000_convert_raw_value_array_to_resistance(NULL, mem_array, count); - /* Do not compute std-deviation. Too imprecise - * arm_std_f32(stream_mem, count, sigma); - */ - arm_mean_f32(mem_array, count, mu); + /* Do not compute std-deviation. Too imprecise */ + *mu = calculate_mean(mem_array, count); + *max_dev = calculate_standard_deviation(mem_array, count, *mu); /* Find min and max values of array */ for (i = 0U; i < count; i++) { @@ -111,7 +175,7 @@ static int calibration_poll_data_acquisition(float *mem_array, uint32_t count, v } /* Compute maximum deviation range */ - *max_dev = max_val - min_val; + //*max_dev = max_val - min_val; ret_free_mem: free(mem_array);