// MEMS mic level maths — pure logic. See mems_level.h. #include "mems_level.h" #include double mems_level_rms(const int32_t *samples, size_t n_samples) { if (samples == NULL || n_samples == 0) { return 0.0; } double sum_sq = 0.0; for (size_t i = 0; i < n_samples; i++) { double sample = (double)(samples[i] >> 8); sum_sq += sample * sample; } return sqrt(sum_sq / (double)n_samples); } double mems_level_dbfs(double rms) { if (rms < 1.0) { return MEMS_DBFS_FLOOR; // effective noise floor } double dbfs = 20.0 * log10(rms / MEMS_FULL_SCALE_24BIT); if (dbfs < MEMS_DBFS_FLOOR) dbfs = MEMS_DBFS_FLOOR; return dbfs; }