在这篇文章中,我将在 Raspberry Pi 4B 上使用 INMP441 麦克风模块,通过 I²S 接口实现音频录制。


一、硬件接线

INMP441 是一款 I²S 数字麦克风,使用 3.3V 供电
下面是与 树莓派 GPIO 的连接方式:

树莓派引脚 INMP441 引脚 说明
3V3 VDD 电源
GND GND 地线
GPIO18(物理脚 12) SCK I²S 时钟(BCLK)
GPIO19(物理脚 35) LRCL / WS 左右声道时钟(LRCLK)
GPIO20(物理脚 38) SD 麦克风输出数据(接 Pi 的 DIN)

⚙️ L/R(SEL)引脚说明:

  • GND = 左声道
  • 3V3 = 右声道
  • 若使用两只麦克风,可分别接左、右实现立体声。

单声道接线示意图如下:
单声道接线示意图
立体声左右声道接线示意图如下:
立体声接线示意图


二、I²S 协议简介与信号解析

在深入树莓派配置前,我们先了解一下 I²S(Inter-IC Sound) 协议的基本原理。
I²S 是一种专门用于 数字音频数据传输 的串行总线标准,由 Philips(现 NXP)提出,广泛应用于音频编解码器、数字麦克风与音频 DSP 之间的通信。


1. I²S 的三条主要信号线

信号线 名称 作用
BCLK(Bit Clock) 位时钟 每传输 1 位音频数据时产生 1 个脉冲。它定义了数据位传输节奏。
LRCLK(Word Select / WS) 左右声道选择 用于区分当前传输的是左声道(低电平)还是右声道(高电平)数据。
SD(Serial Data) 串行数据线 传输实际的音频采样值(例如 24 位或 32 位)。

通常,主设备(例如 Raspberry Pi)提供 BCLK 和 LRCLK,
从设备(如 INMP441 麦克风)在 SD 线上发送数据。


2. 数据格式与时序

在标准 I²S 模式下:

  • LRCLK 为低电平 时,传输左声道;
  • LRCLK 为高电平 时,传输右声道;
  • 每个声道的数据在 LRCLK 翻转后一个 BCLK 周期开始;
  • 高位(MSB)先出,常见格式为 32-bit 左对齐

时序图大致如下:

1
2
3
LRCLK:  _------______------______
BCLK : _-_-_-_-_-_-_-_-_-_-_-_-_
SD : L15...L0 R15...R0

这样可以保证接收端在 LRCLK 变化后有稳定的时间读取正确的数据起始位。


三、启用 I²S 驱动(Device Tree Overlay)

Raspberry Pi 的音频系统通过设备树(Device Tree)加载 I²S 声卡驱动。
编辑配置文件并添加以下内容:

对应路径:

  • Bullseye 及更早版本/boot/config.txt
  • Bookworm 及以后版本/boot/firmware/config.txt

在文件末尾添加一行:

1
dtoverlay=googlevoicehat-soundcard

保存后重启:

1
sudo reboot

这会启用一个虚拟的 I²S 声卡(常见名为 snd_rpi_i2s_card),可被 arecordpyaudio 等工具识别使用。


四、使用 arecord 测试录音

系统重启后,使用以下命令查看声卡列表:

1
arecord -l

示例输出:

1
card 1: sndrpii2scard [snd_rpi_i2s_card], device 0: ...

假设卡号为 1,则可开始录音。

单声道录音(1 只麦):

1
arecord -D plughw:1 -c1 -r 48000 -f S32_LE -t wav -V mono -v mic.wav

立体声录音(2 只麦):

1
arecord -D plughw:1 -c2 -r 48000 -f S32_LE -t wav -V stereo -v mic_stereo.wav

参数详解:

参数 含义
-D plughw:1 指定设备(card 1)
-c1 / -c2 声道数(单声道/立体声)
-r 48000 采样率(48 kHz)
-f S32_LE 采样格式:32 位小端序
-t wav 输出格式
-V mono/stereo 录音电平显示
-v 输出详细信息

录音结束后,可通过以下命令播放:

1
aplay mic.wav

五、常见问题与排错技巧

1. 录不到声音 / 声卡未出现

  • 检查 overlay 配置是否写入正确路径(Bookworm 为 /boot/firmware/config.txt
  • 确认重启后执行了 arecord -l 能看到 I²S 声卡
  • dmesg有相关加载输出
  • 引脚是否按照 I²S 接口定义正确连接

2. 音量太小

INMP441 没有硬件增益,可以使用软件方式(如 .asoundrc + alsamixer 的 softvol 插件)提高录音音量。

3. 格式错误

部分版本 arecord 默认格式为 16 位,可手动指定为 S32_LE(32 位小端)匹配驱动。


六、Python扩展

如果希望在 Python 中使用,可以通过 pyaudiosounddevice 库读取相同声卡:

1
2
3
4
5
6
7
8
9
10
import sounddevice as sd
import numpy as np

fs = 48000
seconds = 5
print("Recording...")
recording = sd.rec(int(seconds * fs), samplerate=fs, channels=2, dtype='int32')
sd.wait()
print("Done. Saving to file.")
np.save("inmp441_audio.npy", recording)

七、参考资料