ESP32 Audio Input Using I2S and Internal ADC
atomic14
For my next project, I need to get audio data into the ESP32.
The GitHub repo with the sample code for this video is here: https://github.com/atomic14/esp32_audio
The ESP32 integrates two 12-bit ADCs - ADC1 has 8 channels and ADC2 has 10 channels.
If you have an I2S microphone (like the INMP441 you may want to watch this follow up video after this one - https://youtu.be/3g7l5bm7fZ8)
ADC2 is used by the Wi-Fi driver. So we can only use ADC2 when not using WiFi. In addition, some of the pins attached to ADC2 are strapping pins so cannot be used freely.
For simple low-frequency sampling, we can use the Arduino analogRead or we can use the Esspressif ADC functions directly (00:45).
If you need very accurate readings from the ADC then you can calibrate your ADC (01:11).
For chips manufactured recently, this may have been done in the factory. For instructions on how to manually calibrate your ADC please check the Espressif documentation here: https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/adc.html
There's also a useful set of utilities here: https://github.com/tommag/ESP32_ADC_Calibration_tool
For audio we should ideally sample at 40KHz - for this, we should use the I2S (Inter-IC Sound) peripheral and DMA (04:15).
I've got two microphones break-out boards - the MAX4466 and the MAX9814 (05:29).
The power supply from the 3v3 line of the ESP32 is pretty noisy making the audio unusable, but we can fix this by filtering the VIN line and using a separate Low Dropout Regulator to generate the power supply for the microphone boards (6:48).
We can also filter out some of the noise by oversampling and then taking an average value as the sample value. I'm using a median filter here in these samples (09:18).
The audio is still not great but should be usable for my next project.
If you found this video useful then please do subscribe - there will be more videos coming! ... https://www.youtube.com/watch?v=pPh3_ciEmzs
55300871 Bytes