File syn_vector.c¶
File List > src > syntropic > util > syn_vector.c
Go to the documentation of this file
#include "syn_vector.h"
#include "syn_assert.h"
void syn_vec_add(const q16_t *a, const q16_t *b, q16_t *out, uint16_t n)
{
SYN_ASSERT(a != NULL && b != NULL && out != NULL);
for (uint16_t i = 0; i < n; i++) {
out[i] = a[i] + b[i];
}
}
void syn_vec_sub(const q16_t *a, const q16_t *b, q16_t *out, uint16_t n)
{
SYN_ASSERT(a != NULL && b != NULL && out != NULL);
for (uint16_t i = 0; i < n; i++) {
out[i] = a[i] - b[i];
}
}
void syn_vec_scale(const q16_t *v, q16_t scale, q16_t *out, uint16_t n)
{
SYN_ASSERT(v != NULL && out != NULL);
for (uint16_t i = 0; i < n; i++) {
out[i] = q16_mul(v[i], scale);
}
}
void syn_vec_clamp(const q16_t *v, q16_t min_val, q16_t max_val, q16_t *out, uint16_t n)
{
SYN_ASSERT(v != NULL && out != NULL);
for (uint16_t i = 0; i < n; i++) {
q16_t val = v[i];
if (val < min_val)
val = min_val;
if (val > max_val)
val = max_val;
out[i] = val;
}
}
q16_t syn_vec_min(const q16_t *v, uint16_t n)
{
SYN_ASSERT(v != NULL && n > 0);
q16_t min_v = v[0];
for (uint16_t i = 1; i < n; i++) {
if (v[i] < min_v)
min_v = v[i];
}
return min_v;
}
q16_t syn_vec_max(const q16_t *v, uint16_t n)
{
SYN_ASSERT(v != NULL && n > 0);
q16_t max_v = v[0];
for (uint16_t i = 1; i < n; i++) {
if (v[i] > max_v)
max_v = v[i];
}
return max_v;
}
q16_t syn_vec_mean(const q16_t *v, uint16_t n)
{
SYN_ASSERT(v != NULL && n > 0);
int64_t sum = 0;
for (uint16_t i = 0; i < n; i++) {
sum += v[i];
}
return (q16_t)(sum / n);
}
q16_t syn_vec_variance(const q16_t *v, uint16_t n)
{
SYN_ASSERT(v != NULL && n > 0);
q16_t mean = syn_vec_mean(v, n);
int64_t sum_sq = 0;
for (uint16_t i = 0; i < n; i++) {
int64_t diff = v[i] - mean;
sum_sq += (diff * diff) >> Q16_SHIFT;
}
return (q16_t)(sum_sq / n);
}
q16_t syn_vec_rms(const q16_t *v, uint16_t n)
{
SYN_ASSERT(v != NULL && n > 0);
int64_t sum_sq = 0;
for (uint16_t i = 0; i < n; i++) {
sum_sq += ((int64_t)v[i] * v[i]) >> Q16_SHIFT;
}
q16_t mean_sq = (q16_t)(sum_sq / n);
return q16_sqrt(mean_sq);
}