ESP32+INMP441+DHT11+OLED+网页+Arduino——“智能”语音天气站(2):INMP441录音生成wav文件

本文介绍了使用ESP32、INMP441麦克风、DHT11传感器和OLED显示屏构建智能语音天气站的过程。内容涉及PCM编码、I2S接口标准、wav文件头的生成以及SPIFFS文件系统的应用。在实现过程中遇到了内存出错问题,通过调整DMA的count解决了该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考视频:
Recording using INMP441

参考代码:学会了代码复用
Recording using INMP441

知识

什么是wav文件

可以在维基百科找到wav文件的历史渊源。这个网站有一个详尽的wav格式说明:
wav格式说明

这里主要是想说wav文件重要的就是生成一个wavhead来标识它是一个wave文件,wave文件的data chunk 中的data部分还是PCM编码格式的数据,直接从I2S读进去就可以,不需要压缩。

wav head

wav文件的头一般由4个chunk组成,上面引用的网站里写的很清楚了。生成wav head的代码如下:

// 生成wav header,32bit 位深
void wavHeader(byte* header, int wavSize){
    // 数字小端格式,字符大端格式
  header[0] = 'R';
  header[1] = 'I';
  header[2] = 'F';
  header[3] = 'F';
  unsigned int fileSize = wavSize + headerSize - 8;
  header[4] = (byte)(fileSize & 0xFF); // file size, 4byte integer
  header[5] = (byte)((fileSize >> 8) & 0xFF);
  header[6] = (byte)((fileSize >> 16) & 0xFF);
  header[7] = (byte)((fileSize >> 24) & 0xFF);
  header[8] = 'W';
  header[9] = 'A';
  header[10] = 'V';
  header[11] = 'E';
  header[12] = 'f';
  header[13] = 'm';
  header[14] = 't';
  header[15] = ' ';
  header[16] = 0x10; // length of format data = 16, 4byte integer
  header[17] = 0x00;
  header[18] = 0x00;
  header[19] = 0x00;
  header[20] = 0x01;  // format type:1(PCM), 2byte integer 
  header[21] = 0x00;
  header[22] = 0x01; // channel number:1, 2byte integer
  header[23] = 0x00;
  header[24] = 0x80; // sample rate:16000=0x00003E80, 4byte integer
  header[25] = 0x3E;
  header[26] = 0x00;
  header[27] = 0x00;
  header[28] = 0x00; // SampleRate*BitPerSample*ChannelNum/8=16000*32*1/8=64000=0x0000FA00, 4byte integer
  header[29] = 0xFA;
  header[30] = 0x00;
  header[31] = 0x00;
  header[32] = 0x04; // BitPerSample*ChannelNum/8 = 4, 2byte integer 
  header[33] = 0x00;
  header[34] = 0x20; // BitPerSample:32 = 0x0020, 2byte integer 
  header[35] = 0x00;
  header[36] = 'd';
  header[37] = 'a';
  header[38] = 't';
  header[39] = 'a';
  header[40] = (byte)(wavSize & 0xFF);
  header[41] = (byte)((wavSize >> 8) & 0xFF);
  header[42] = (byte)((wavSize >> 16) & 0xFF);
  header[43] = (byte)((wavSize >> 24) & 0xFF);
  
}

PCM编码

I2S工作

I²S 模式下,BCK 为串行时钟;WS 为通道选择信号,用于表示左右声道的切换;SD 为串行数据信号,传输音频数据。WS 信号和 SD 信号在 BCK 的下降沿发生变化,并在 BCK 的上升沿采样 SD 信号。

I2S接口标准

I2S支持三种接口标准。(ESP32 技术参考手册)
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值