Lecture audio et calcul dB

5. 2.4 Microphone I2S : calcul du niveau sonore en dB RMS

5.2. Lecture audio et calcul dB

#include <driver/i2s.h>
#include <math.h>

#define I2S_WS      5
#define I2S_SCK     6
#define I2S_SD      7
#define SAMPLE_RATE 16000
#define BLOCK_SIZE  512

void setupI2S() {
  i2s_config_t i2s_config = {
    .mode                 = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),
    .sample_rate          = SAMPLE_RATE,
    .bits_per_sample      = I2S_BITS_PER_SAMPLE_32BIT,
    .channel_format       = I2S_CHANNEL_FMT_ONLY_LEFT,
    .communication_format = I2S_COMM_FORMAT_STAND_I2S,
    .intr_alloc_flags     = ESP_INTR_FLAG_LEVEL1,
    .dma_buf_count        = 4,
    .dma_buf_len          = BLOCK_SIZE,
    .use_apll             = false,
    .tx_desc_auto_clear   = false,
    .fixed_mclk           = 0
  };
  i2s_pin_config_t pin_config = {
    .bck_io_num   = I2S_SCK,
    .ws_io_num    = I2S_WS,
    .data_out_num = I2S_PIN_NO_CHANGE,
    .data_in_num  = I2S_SD
  };
  i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL);
  i2s_set_pin(I2S_NUM_0, &pin_config);
}

// Returns sound level in dB (0-90 typical range)
float computeDBRMS(int32_t *samples, int count) {
  double sum = 0;
  for (int i = 0; i < count; i++) {
    double s = (double)(samples[i] >> 14); // Scale 32-bit to ~18-bit
    sum += s * s;
  }
  double rms = sqrt(sum / count);
  if (rms < 1) rms = 1;
  return 20.0 * log10(rms);
}

Pourquoi 20 * log10 ? La puissance est proportionnelle au carré de l'amplitude. En dB amplitude, on utilise 20 × log10 (alors que pour la puissance on utilise 10 × log10). C'est la convention dB SPL pour l'audio.


Se connecter pour suivre votre progression.