zoukankan      html  css  js  c++  java
  • 一个例子讲解wav头文件 stm32声音程序 录音和播放 wav

    下面我们一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

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

  • 相关阅读:
    ASP.NET Core 个人新闻项目
    C# 检查字符串中是否有HTML标签、返回过滤掉所有的HTML标签后的字符串
    VueCLI 页面加载进度条效果
    replace() 方法使用
    CentOS 7.9安装教程
    在Windows中安装MySQL
    linux安装consul
    jenkins Skywalking安装部署文档总结
    CentOS 7.x安装.NET运行时
    Apollo部署文档
  • 原文地址:https://www.cnblogs.com/chulin/p/8918957.html
Copyright © 2011-2022 走看看