This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

nRFX based PDM to PCM implementation (I2S example)

Hello,

I am currently interfacing my nRF52840 DK with i2S based MP34DT05 sensor. I am using nrfx i2s driver's for interfacing with sensor. I am using master clk of 2MHz, LCLK 16KHZ. 

My sensor output PDM data. In my project I am recording audio samples on left channel, so I am currently getting 2*16bit of left data per 32bits as shown in nrf docs. I have got 16bit recorded samples in buffer, but to how to convert this pdm data in pcm format. 

Normally we need to divide the PDM data with a decimation factor, but in I2S we already are dividing the bit sampling rate with ratio value. So is the output from the I2S itself is decimated PCM ?  

Or can anyone give a example of how to convert the PDM to PCM data. Any sort of help is dually appreciated. 

Parents
No Data
Reply
  • Hello,

    I have interfaced new sensor now and by using the above program i have captured the following PCM values in buffer.

    PCM samples in txt file.

    0317.test.txt

    But when i convert the above file into .wav file its just noise. I have used the following python script to convert PCM data of 16KHz into .wav file. 

    import sys
    import wave
    
    for arg in sys.argv[1:]:
        with open(arg, 'rb') as pcmfile:
            pcmdata = pcmfile.read()
        with wave.open(arg+'.wav', 'wb') as wavfile:
            wavfile.setparams((2, 2, 16000, 0, 'NONE', 'NONE'))
            wavfile.writeframes(pcmdata)

    Can you help ?

Children
  • Hello,

    there are a couple of problems with the script and data:
    1) wavfile.writeframes() needs raw int16_t byte data, not a string. Your read the text file as a string, but to put it in writeframes each of the values in the comma-separated string needs to be extracted and formatted into a continuous array of formatted bytes.

    2) The first parameter (number of channels) in wavfile.setparams is 2, but the data seems to be single channel? How is the PDM peripheral configured in the code?

    3) I would recommend printing your buffer as int16_t (signed short), as this is the PCM format generated by the PDM peripheral. When I plot the data it looks somewhat good, but there also seems to be some formatting error going on in the printouts:

Related