zl程序教程

您现在的位置是:首页 >  其他

当前栏目

一个例子讲解wav头文件 stm32声音程序 录音和播放 wav

程序 一个 讲解 例子 播放 STM32 头文件 声音
2023-09-11 14:14:34 时间

下面我们一wav头文件来分析一下:

 

 

下面是双声道的,16位,48000采样录的wav文件:

打开属性,能看到的有用信息只有比特率了:

 

上图的比特率就是

wav头文件里的bitrate:

1536kbps=量化采样点*位深*声道数

这个比特率是按照 '位' 来算的,,,480 000 * 16 * :每秒内消耗多少位

                                               

 

用GoldWave软件打开,滑动滚轮进行放大:

200us总共输出了20个数据,,但是每个数据是16位(因为消耗两个8位得到的数据)

这20个数据是由40个8位的音频数据组成的.

200us消耗了40个数据

20us消耗4个数据

消耗4个数据就是完成一个 '音' 单元的播放  一个音,也就是图中的一个阶梯

所以产生一个 '音' 需要20us  [也就是 一个音对应一个中断,当产生一个中断的时候,让两个DAC分别播放出去一个阶梯]

1秒产生500 000 个约等于480 000个 '音'   :频率是根据 '音' 的设置,,一个 '音' 可能等于好几个音频数据

 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

实际上这个音频的定时器是这样设置的

 通过仿真得到:

转换成十进制  48000

 bitrate=0x00177000 ------转换成十进制就是1536000

得到:

 samplerate=48000     #在我们编写程序的时候,这个是中断设定的参数

这个是WAV头文件里得到的

按照程序里计算,48000就相当于20.833us

取整就相当于20us

20us播放两个声道,每个声道是由两个数据得到的,,

也就是20us消耗4个数据

这个结果,和我们用软件打开的查看一样的.

 

 

 

 

 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

用 UltraEdit软件打开

 

 

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

这是百度文库的一篇文章,讲解的很清楚

https://wenku.baidu.com/view/45960348551810a6f424863f.html

上面的例子属于16位立体声道,,,

 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

下面是摘自网上的:可以不用看,有些事不对的:

 

 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 推荐文档:http://www.sohu.com/a/115830046_119709

 

 

 

通过调整计时器,,每25us控制ADC进行一次采集,,,,采集的数据交给DMA,,,,然后DMA给一个数组缓存,,,之后存入SD卡

如果25us采集一个

采样率就是SampleRate=40000;  其值为通道数×每秒样本数×每样本的数据位数/8

怎么得到的呢?

 

采样率实际上意义是每秒采集的位数:

那么就是    25us采1个8位数,,,那么100us采集4个8位数,,,,1000 000us 就是1s采集 40 000个8位数

所以就是采样率为40000

 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////