I have been playing around with some digital microphones, which have an I2S interface. I managed to get it working (Arduino board with small I2S mems board). At least, I think I did.
When reading the I2S specification, or the microphone datasheet, I can not seem to find the answer to the following simple questions; 1. What do the digital values represent? 2. How do you convert the digital values to dbFS (and then later an dbSPL)?
The SPH0645LM4H-B (Knowles) microphone seems to output all negative values (?). I read somewhere you have to "subtract the midpoint" to eliminate the large DC offset?! On the other hand, a support engineer at Invensense explained to me that the ICS-43434 outputs positive and negative values which "represent the amplitude of the signal relative to +/-full scale".
I expected I2S to be a standard; isn't that the case ... ?
You have to save each sample of the digitized data, this word of 24 bits when converted to decimal, will give you a voltage. This voltage is what you need to calculate RMS value, and later on calculate your db SPL.
Which arduino board are you using to make it work? most arduino doesn't have I2S communication, I think Arduiino Zero and MKR are the ones available for the taks. You would achieve a better perfomance if you use STM32 microcontrollers, which have floating point, 32 bits processor, DMA.. etc.