项目背景:
终端客户需要进行一个声音功放的功能需求,主要想用DAC的形式播放,后期可以根据语音数据情况进行变频调速,设置音量大小,直接进行OTA升级。
选型带有2路DAC通道的MCU,APM32F072CBT6;适用语音的各种场景,智能门锁语音降本,汽车声浪模拟器,智能家居建议语音提示.....
主要开发思路
原语音文件解析;生成FLASH烧录文件:硬件实现:软件流程实现:
本章节先说明头两点:
52 49 46 46 14 58 31 00 3233812 3233820 - 8 57 41 56 45 66 6d 74 20 WAVEfmt 10 00 00 00 这是一个DWORD(双字节数据类型),对应数字16,这个对应定义中的PCMWAVEFORMAT部分的大小,可以看到后面的这个段内容正好是16个字节。一般情况下大小为16,此时最后附加信息没有 “01 00”,这是一个WORD,对应定义为编码格式(01表示WAVE_FORMAT_PCM格式) “02 00”,这是一个WORD,对应数字2,表示声道数为2,是个双声道Wav。 “22 56 00 00 ” 22050采样率。数据格式对应下方数据表(8bit数据 16bit数据 单通道,双通道) 88 58 01 00 其值为通道数×每秒样本数×每样本的数据位数/8(1*16000*16/8)。播放软件利用此值可以估计缓冲区的大小。 22050HZ代表1秒内的播放数据量 = 1000000us/22050 = 45us.即45usDAC一个数据量。 88200 2*22050*16/8 04 00 对应数字是4,表示块对齐的内容。数据块的调整数(按字节算的),其值为通道数×每样本的数据位值/8。播放软件需要一次处理多个该值大小的字节数据,以便将其值用于缓冲区的调整。 2*16/8 10 00 “10 00”数值为16,采样大小为16Bits,每样本的数据位数,表示每个声道中各个样本的数据位数。如果有多个声道,对每个声道而言,样本大小都一样。 “64 61 74 61”,这个是Ascii字符“data”,标示头结束,开始数据区域。
//16bit dac 数据为补码形式的(-32768 - +32768),需要进行处理+0x8000 (0-65,535) voice = voice+0x8000;
voice = voice >>num; //num 一般为4 右移4位剩下12bit dac数据 (声音大小相关)
WAV文件转化成外部flash数据方法: 直接拖拽WAV文件进flash烧录软件EZP_XPro.exe 由于原wav是双通道 16bit 22050hz 需要转换成 单通道 16bit 22050hz的数据,需要使用工具软件GoldWave
烧进flash后初始化spi外设读取外部flash 读取wav文件信息
|