打印
[APM32F0]

APM32F072CBT6进行DAC模拟播放声音(一)

[复制链接]
930|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
项目背景:
       终端客户需要进行一个声音功放的功能需求,主要想用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文件信息





使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

12

帖子

1

粉丝