From RevSpace
Revision as of 09:58, 15 April 2019 by Bertrik Sikken (talk | contribs) (Software)
Jump to navigation Jump to search
Project ESP audio sensor
ESP-based audio sensor
Status Initializing
Contact bertrik
Last Update 2019-04-15


This project is about using an ESP-32 together with an I2S digital microphone to create an audio sensor.

This could be a decibel meter, or perhaps an environmental noise meter.

Measuring audio as a citizen science project

Possibly a nice match for measuring stuff by citizens could be to measure audio:

  • ESP8266/ESP32 have an I2S input, there are cheap microphones available that directly output I2S, saving on interface electronics
  • ESP8266/ESP32 is probably powerful enough to do basic processing, like FFT, summing power in various frequency ranges, etc.
  • ESP8266/ESP32 has a wifi connection so it can easily upload data

Questions/stuff to investigate:

  • what kind of measurements can we do reliably?
    • probably absolute measurements are very difficult
    • possibly useful relative measurements
      • calculate average over (say) 10 seconds, and compare it with the average over (say) 10 minutes
      • compare averages over time, e.g. compare daytime minute average with each other
      • determine peak-to-average ratios

Waag society uses the following microphone in their kit 2.1: Invensense ICS4342

On AliExpress you can find many INMP441, with claims of compatibility with ESP32, so I ordered those INMP441.

External things to investigate:


The plan is to divide the audio spectrum up into octaves and calculate the total energy in each octave. To this we can then easily apply sensor/housing specific corrections, do A weighting, etc.

An octave is basically a factor of two in frequency. Coincidentally an FFT also calculates things in factors of two, for example when sampling at 44100 Hz, you get the following octave boundaries: 22050 Hz, 11025 Hz, 5512 Hz, 2756 Hz, 1378 Hz, 689 Hz, 244 Hz, 172 Hz, 86 Hz, 43 Hz, 22 Hz.


Audio levels are generally measured in dB using the A-weighted scale. A-weighting calculates a subjective loudness level from a physical loudness.

Energy it calculated per octave and an A-weight factor is applied. The octaves are defined referenced to 1000 Hz, so submultiples like 500, 250, 125, 62 Hz and multiples like 2000, 4000, 8000, 16000 Hz. In decibels this means adding a octave-specific correction in each octave to the loudness.



The physical device consists of:

  • an ESP32 (or possibly an ESP8266), it has an I2S digital audio input.
  • a digital I2S microphone, like the INMP441 (datasheet)

The microphone is connected as follows:

  • INMP441 GND to ESP32 GND
  • INMP441 VDD to ESP32 3.3V
  • INMP441 SD to ESP32 A4/32
  • INMP441 SCK to ESP32 A16/14
  • INMP441 WS to ESP32 15
  • INMP441 L/R to ESP32 GND


Initial code can be found on github.

What the software should do:

  • Take audio measurement from the microphone at a regular interval (say 1 second every 10 seconds)
  • On the recorded audio, perform a 4096-point FFT with a windowing function (Gaussian for example). This results in 2048 FFT coefficients.
  • Sum up FFT into octave power, e.g. top 1024 coefficients represent octave of 11025-22050 Hz, next 512 coefficients represent is 5512-11025 Hz octave, etc.
  • Calculate statistics, e.g. minimum/average/maximum as decibels in the current 5 minute interval
  • Every 5 minutes, send the statistics to the network using WiFi

The network receives the raw decibel values and can apply corrections for specific microphones, do A-weighting, etc.