Page 1 of 1

ESP32C3 读取 Raw PDM 数据问题

Posted: Thu Mar 19, 2026 9:40 am
by zhou_xingxing1
使用的是 esp-idf v5.5.3

.clk_cfg = I2S_PDM_RX_CLK_DEFAULT_CONFIG(1024000),
.slot_cfg = I2S_PDM_RX_SLOT_RAW_FMT_DEFAULT_CONFIG(I2S_DATA_BIT_WIDTH_16BIT, I2S_SLOT_MODE_MONO),

基于这样的配置,我想通过 i2s_channel_read 连续采样 20ms 的 PDM 数据。
是不是需要的 buffer 大小为:
1024000 * 20 / 1000 = 20480 bits = 2560 bytes

但是我通过 esp_timer_get_time() 计算 i2s_channel_read() 读取 2560 的耗时,却只有 10ms

是什么导致了这样的差异?PDM 数据量计算难道不是这样算的么

Re: ESP32C3 读取 Raw PDM 数据问题

Posted: Sun Mar 22, 2026 1:50 pm
by lieushaw
我是用PCM方式的,调试过程中豆包告诉我的,我也打印了原始数据看了,确实有如下的现象:
1、你设置了单声道读取,系统只是不读取数据,但是PCM数据里还是有另外一个声道的数据的
2、另外一个声道的数据大部分是0

Re: ESP32C3 读取 Raw PDM 数据问题

Posted: Tue Mar 24, 2026 2:31 pm
by zhou_xingxing1
哥们,感谢讨论。你这个还能解释的通。
我用的 ESP32C3 没有内置的 PDM2PCM 模块,然后项目上用的又是个 PDM MIC。
从数据量和采样时长上解释不通,看原始数据,也看不出 left, right 数据到底是怎么样分布的

Re: ESP32C3 读取 Raw PDM 数据问题

Posted: Fri Mar 27, 2026 3:33 am
by lieushaw
使用串口打印能够看到有一个声道的大部分数据是0,但不全是0
因为我是使用32位方式读取24位的MIC,所以存在数据左右对齐的问题
另外,你使用的是什么MIC,我使用的是INMP441

Re: ESP32C3 读取 Raw PDM 数据问题

Posted: Tue Apr 07, 2026 1:42 am
by zhou_xingxing1
INMP441 输出的是 I2S 格式数据,我用的是颗 PDM 数字 mic,和标准 I2S 不太一样。 :(

我现在按照 IDF 文档里的说明在处理了:
无论原始 PDM 格式还是 PCM 格式,PDM 模式下的一个数据单元总是 16 比特的位宽。例如,用原始 PDM 格式发送数据,那么您数组中的数据应该像这样排列:CH0 0x1234,CH1 0x5678,CH0 0x9abc,CH1 0xdef0。RX 方向同理。

即只取奇数位 u16 的数据做处理。

只是之前测试的时候发现,我硬件上只接了一个通道的 PDM MIC,但不论取奇数位,还是偶数位的 u16,好像都有效果(都可以体现模拟信号值)