#include "common.h"
static void compute_rms_peak(const float *buf, int n,
double *out_rms, float *out_peak) {
double sum_sq = 0.0;
float peak = 0.0f;
for (int i = 0; i < n; i++) {
float s = buf[i];
float a = fabsf(s);
sum_sq += (double)s * (double)s;
if (a > peak) peak = a;
}
*out_rms = sqrt(sum_sq / (double)n);
*out_peak = peak;
}
static volatile double g_sink = 0.0;
static void bench(int duration_s, int iterations, int warmup, int sr) {
int n = sr * duration_s;
float *input = malloc((size_t)n * sizeof(float));
generate_sine(input, n, 440.0f, 0.5f, sr);
long long *times = malloc((size_t)iterations * sizeof(long long));
double rms = 0.0; float peak = 0.0f;
for (int i = 0; i < warmup; i++) {
compute_rms_peak(input, n, &rms, &peak);
g_sink = rms + (double)peak;
}
for (int i = 0; i < iterations; i++) {
long long t0 = get_time_ns();
compute_rms_peak(input, n, &rms, &peak);
long long t1 = get_time_ns();
times[i] = t1 - t0;
g_sink = rms + (double)peak;
}
char op[64];
snprintf(op, sizeof(op), "rms_and_peak_%ds", duration_s);
print_stats(op, "c_native", duration_s, n, iterations, warmup, times);
free(times);
free(input);
}
int main(int argc, char **argv) {
int dur = parse_int_arg(argc, argv, "--duration", 1);
int iters = parse_int_arg(argc, argv, "--iterations", 1000);
int warmup = parse_int_arg(argc, argv, "--warmup", 100);
print_csv_header();
bench(dur, iters, warmup, 44100);
return 0;
}