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
  • This seems to work better. Tested using python3.

    import sys
    import wave
    import re
    import struct
    
    with open('0317.test.txt', 'r') as pcmfile:
        # Convert comma-separated hex strings into list of integers
        pcm_list = list(map(lambda x: int(x, 16), re.findall(r'([\w\d]+)', pcmfile.read())))
    
    # Convert list of integers into little endian-encoded byte array
    pcmdata = bytes()
        
    for sample in pcm_list:
        # Original sample is signed 16-bit. Format as uint16, and decode as int16.
        tmpdata = struct.pack('<H', sample)
        tmpdata = struct.unpack('<h', tmpdata)[0]
        pcmdata += struct.pack('<h', tmpdata)
        
    with wave.open('0317.test.wav', 'wb') as wavfile:
        wavfile.setparams((1, 2, 16000, 0, 'NONE', 'NONE'))
        wavfile.writeframes(pcmdata)

Children
No Data
Related