Calibration routines adapted
* Implement custom mean and std functions * Use standard deviation in calibration measurment instead of peak-peak noise.
This commit is contained in:
parent
7aa0b62012
commit
1166477a6c
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user