dump1090-fa/dsp/benchmark/mean_power_u16_benchmark.c

58 lines
1.4 KiB
C

#include <stdlib.h>
void STARCH_BENCHMARK(mean_power_u16) (void)
{
uint16_t *in = NULL;
double mean_mag, mean_magsq;
const unsigned len = 65536;
if (!(in = STARCH_BENCHMARK_ALLOC(len, *in))) {
goto done;
}
for (unsigned i = 0; i < len; ++i) {
in[i] = i;
}
STARCH_BENCHMARK_RUN( mean_power_u16, in, len, &mean_mag, &mean_magsq );
done:
STARCH_BENCHMARK_FREE(in);
}
bool STARCH_BENCHMARK_VERIFY(mean_power_u16) (const uint16_t *in, unsigned len, double *out_mag, double *out_magsq)
{
const double max_error = 0.01; // tolerate 1% error
double sum_mag = 0;
double sum_magsq = 0;
for (unsigned i = 0; i < len; ++i) {
double mag = in[i] / 65536.0;
sum_mag += mag;
sum_magsq += mag * mag;
}
sum_mag /= len;
sum_magsq /= len;
bool okay = true;
double mag_error = sum_mag - *out_mag;
if (fabs(mag_error / sum_mag) > max_error) {
fprintf(stderr, "verification failed: expected mean magnitude %.5f, got %.5f, error=%.2f%%\n",
sum_mag, *out_mag, 100.0 * mag_error / sum_mag);
okay = false;
}
double magsq_error = sum_magsq - *out_magsq;
if (fabs(magsq_error / sum_magsq) > max_error) {
fprintf(stderr, "verification failed: expected mean magnitude-squared %.5f, got %.5f, error=%.2f%%\n",
sum_magsq, *out_magsq, 100.0 * magsq_error / sum_magsq);
okay = false;
}
return okay;
}