打印
[应用相关]

STM32 读取 WAV音频格式 播放出来

[复制链接]
3118|29
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
WAV文件格式是一种重要的用于存放声音文件的文件格式,尽管现在有MP3,RAM等压缩效率更高的声音文件格式,并且广泛被音乐文件所采用,但是又很多的应用程序仍然采用WAV文件格式。由于WAV文件没有采用压缩技术,所以它的文件很庞大,一般都在几MB以上。但也正是因为没有采用压缩技术,声音的采样数据很容易被读出来,便于用作其他的处理。

使用特权

评论回复
沙发
hanzhen654|  楼主 | 2019-7-30 16:24 | 只看该作者
正是由于WAV文件是标准的波形输出文件,正好可以使用stm32 DA来输出

使用特权

评论回复
板凳
hanzhen654|  楼主 | 2019-7-30 16:25 | 只看该作者
由于WAV采用PCM编码,音质也十分不错,于是考虑用STM32对WAV格式音频文件进行解码,

使用特权

评论回复
地板
hanzhen654|  楼主 | 2019-7-30 16:25 | 只看该作者
WAV格式符合RIFF(Resource interchange File Format)规范。所有的WAV都有一个头文件,这个头文件音频流的编码参数。

使用特权

评论回复
5
hanzhen654|  楼主 | 2019-7-30 16:26 | 只看该作者
WAV文件的文件头

使用特权

评论回复
6
hanzhen654|  楼主 | 2019-7-30 16:27 | 只看该作者
用已经编好的程序来读取一个WAV文件的文件头和数据块,看看各个内容都表示什么含义

使用特权

评论回复
7
hanzhen654|  楼主 | 2019-7-30 16:28 | 只看该作者
用WinHex软件解析WAV

使用特权

评论回复
8
hanzhen654|  楼主 | 2019-7-30 16:28 | 只看该作者
STM32读取WAV的信息

使用特权

评论回复
9
hanzhen654|  楼主 | 2019-7-30 16:30 | 只看该作者
头文件样例说明:

?        “52 49 46 46”这个是Ascii字符“RIFF”,这部分是固定格式,表明这是一个WAVE文件头。
?        “24 33 AE 00”这个是我的WAV文件的数据大小,这个大小包括除了前面4个字节的所有字节,也就是等于文件总字节数减去8。得到图3中的11416356。11416356+8=11416364Byte=10.88Mb。

使用特权

评论回复
10
hanzhen654|  楼主 | 2019-7-30 16:30 | 只看该作者
?        “57 41 56 45 66 6D 74 20”,也是Ascii字符“WAVEfmt”,这部分是固定格式。以后是PCMWAVEFORMAT部分。

?        “10 00 00 00”,这是一个DWORD,对应数字16,这个对应定义中的PCMWAVEFORMAT部分的大小,可以看到后面的这个段内容正好是16个字节。当为16时,最后是没有附加信息的,当为数字18时,最后多了两个字节的附加信息。

使用特权

评论回复
11
hanzhen654|  楼主 | 2019-7-30 16:31 | 只看该作者
?        “01 00”,这是一个WORD,对应定义为编码格式(WAVE_FORMAT_PCM格式用的就是这个)。

?        “01 00”,这是一个WORD,对应数字1,表示声道数为1,是个单声道WAV,当值为2时为立体声WAV。

?        “22 56 00 00”对应数字22050,代表的是采样频率220505,采样率(每秒样本数)表示每个通道的播放速度。

?        “44 AC 00 00”对应数字44100,代表的是每秒的数据量,波形音频数据传送数率,其值为通道数×每秒样本数×每个样本的数据位数/8。播放软件利用此值可以估计缓冲区的大小。

使用特权

评论回复
12
hanzhen654|  楼主 | 2019-7-30 16:36 | 只看该作者
?        “02 00:”对应数字是2,表示块对齐的内容。数据块的调整数(按字节算),其值为通道数×每个样本的数据位置/8.播放软件需要一次处理多个改值大小的字节数据,以便将其值用于缓冲区的调整。

?        “10 00”,此数值为16,采样大小为16bits,每样本数据位数,表示每个声道中各个样本的数据位数。如果有多个声道,对每个声道而言,样本大小都一样。

?        “64 61 74 61”,这个是Ascii字符“data”,表示头结束,开始数据区域。

?        “00 33 AE 00”,十六进制数是“0xAE3300”,对应十进制11416320,是数据区的开头以后的数据总数。

使用特权

评论回复
13
hanzhen654|  楼主 | 2019-7-30 16:36 | 只看该作者
常见的声音文件主要有两种,分别对应单声道(11.025KHz采样率、8Bit的采样值)和双声道(44.1KHz采样率、16Bit的采样值)。采样率是指:声音信号在“模->数”转换过程中单位时间内采样的次数。采样值是指每一次采样周期内声音模拟信号的积分值。

使用特权

评论回复
14
hanzhen654|  楼主 | 2019-7-30 16:53 | 只看该作者
对于单声道声音文件,采样数据位8位的短整数;而对于双声道立体声声音文件,每次采样数据位一个16位的整数,高8为和低8位分别代表左右两个声道。
WAVE文件数据块包含以脉冲编码调制(PCM)格式表示样本。WAVE文件是由样本组织而成的。在单声道WAVE文件中,声道0代表左声道,声道1代表右声道。在多声道WAVE文件中,样本是交替出现的。

使用特权

评论回复
15
hanzhen654|  楼主 | 2019-7-31 14:15 | 只看该作者
PCM数据的存放方式:

                  样本1                    样本2   

8位单声道        0声道                    0声道

8位立体声        0声道(左)1声道(右)    0声道(左) 1声道(右)

16位单声道       0声道低 0声道高          0声道低 0声道高  

16位立体声 0声道(左)低 0声道(左)高 1声道(右)低 1声道(右)高  

使用特权

评论回复
16
hanzhen654|  楼主 | 2019-7-31 14:16 | 只看该作者
系统硬件组成比较简单,可以分为液晶显示,LED指示,USB输入,SD卡,电源供电,音频功放和按键等,如图3-1所示:

使用特权

评论回复
17
hanzhen654|  楼主 | 2019-7-31 14:17 | 只看该作者
SD卡电路:
SD卡采用SPI驱动。

使用特权

评论回复
18
hanzhen654|  楼主 | 2019-7-31 14:17 | 只看该作者
USB电路:

使用特权

评论回复
19
hanzhen654|  楼主 | 2019-7-31 14:19 | 只看该作者
音频功放电路:

使用特权

评论回复
20
hanzhen654|  楼主 | 2019-7-31 14:19 | 只看该作者
充电和系统电源:

使用特权

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

本版积分规则

73

主题

1766

帖子

2

粉丝