#创作者激励#【FFH】OpenHarmony轻量化系统声音收录 原创 精华
【本文正在参加2023年第一期优质创作者激励计划】
概括
前一阵子想着语音识别作为物联网不可或缺的一部分,前提是获取到语音的声音数据。对于声音收录数字化,stm32有很多现成的样例,而OpenHarmony方面较少该方面的资料。便想着在OpenHarmony实现接收INMP441麦克风模块。本次实现通过I2S接收INMP441模块的PCM数据。
环境
- OpenHarmony-3.1
- 润和hispark_pegasus Hi3861开发板
- DevEco Device Tool
- SerialPlot
- INMP441麦克风模块
声音数字化
生活中的声音是通过一定介质传播的波、主要由振幅和频率两个指标来描述。
声音数字化:麦克风将声音以量化位数将声音数字化,常见的量化位深有16bit、24bit、32bit,其意义就是将每个采样点用多少位表示声音振幅的范围,其位深越大音质越好。麦克风再根据采样率进行采集声音,采样率的意思就是1秒中采集声音的次数,采样率越高音质越好。还决定音质的便是声道数,使用双声道可以大大丰富声音的表现力,但随之而来的便是数据量的翻倍。
现实生活中的声音信号是如下图般的波形图,但是我们的计算机中只能保存数值。于是我们将波形图量化,使用一个个整数数据记录声音。
本次使用的INMP441是一个数字麦克风,即本身包含了ADC,传递进来的数据是数字量。得到的数据便是直接的PCM编码格式的数据,若想生成WAV文件,只需要生成一个wav head来标识即可。
针脚定义
本次实验只用到了以下四个I2S的针脚
-
SCK(CK):串行时钟,由主机产生的时钟线,用于控制每位数据的传输时序,SCK频率= 声道数 采样频率 * 采样位数*,在OpenHarmony上被定义为BCLK口
-
SD:I2S数据线,从机通过此发送数据给主机,在OpenHarmony上被定义为RX口
-
WS:声道选择线,由主机发送给从机,从机根据此判断发送左声道还是右声道。低电平为左声道,高电平为右声道。
-
L/R:左右声道选择线,指定此从机为左声道还是右声道。低电平为左声道,高电平为右声道。
INMP441 | Hi3861 |
---|---|
SCK | 7 |
SD | 11 |
WS | 8 |
L/R | 根据需求接GND或3V3 |
GND | GND |
VDD | 3V3 |
查看音频波形
Hi3861接收到了麦克风模块上传的音频数据,我们可以利用串口将音频数据发送到电脑,电脑使用串口绘画工具SerialPlot查看音频波形,该工具的使用方法和使用其他串口工具相似,网上也有许多使用教程,这里就不再详细阐述。
代码
流程:
- 初始化IO口
- 配置I2S(采样率为8KHz,量化位数为24bit)
- 初始化I2S
- 读取I2S数据,OpenHarmony的读取函数得到的数据就是24bit数字量;无需像stm32需要读取的数据是byte类型,然后再拼接。
数据将以LRLR分布,即是一个左声道数据,一个右声道数据分布
若是只使用到单声道,也是LRLR分布,另外一个声道数据为0
疑问
每次调用hi_i2s_read
读取函数,最后得到的数据只有前四分之一有数据,其余都是0,找了很久都没有找到问题所在,希望能有大佬解答一下,万分感谢!
蹲一下只能取四分之一数据的后续,会不会是存储的问题