CSDN账号注册了3年,一直没有上来过,更不用说写博客了。我不知道博客的具体用途,我只想把它当做一种心得来发表,可能是一些技术上的理解或者生活上的小故事。好了,下面我将记录我对WAV播放器的理解。

很久以前就看到过某知名嵌入式论坛上有大牛用单片机来做WAV播放器,我看到后觉得很不错,有一种制作的冲动,因为那时MP3播放器还很贵。后来我确实也做出来了,还把它送给朋友。但是,当时只是完全copy别人的电路和程序,唯一跟原创不同的是把它外表做得精美点,并没有对里面的原理做出分析。今天突然想起那个WAV播放器来,所以打算把知识点梳理一番。

一、 首先是WAV格式。WAV格式音频是采用原始的PCM编码数据,没有经过压缩。PCM编码只是一种数字的量化手段,直接用它来当做原始数据来处理是可以的。只要我们按照原来的采样速率把数据通过DAC,那么声音就会还原回来。你要PCM数据你首先要知道.WAV后缀文件的格式。

WAV文件是以RIFF格式为标准的,RIFF格式是windows环境下大部分多媒体文件遵循的一种文件结构,由多个chunk(块)组成,:RIFF WAVE Chunk, Format Chunk, Fact Chunk(optinal), Data Chunk,LIST Chunk(optinal)等。如下图所示:

那么,每一个chunk的格式是怎样的呢?每个Chunk 有各自的ID,位于Chunk 最开始位置,作为本Chunk 开始的标识,均为4 个字节字符。紧跟在ID 后面的是Chunk 的大小---Size,也占用4 个字节,Size 是本Chunk所占字节总数减去8 个字节(ID 和Size)的数值,低字节表示数值的低8 位,高字节表示数值的高8 位(类似于小端模式),下面具体介绍各个Chunk 内容。

1.RIFF WAVE Chunk

假设size大小为a,则这个文件大小为(a+8)字节,type标示这是WAV文件。

2.Format Chunk

这一块很重要,包含了重要信息,包括声道数,采样频率,数据位数等

3.Fact Chunk(optinal)

这一块为可选,有些没有此chunk

4.Data Chunk

size大小纯粹是data的大小。

5.LIST Chunk(optinal)

此块也是可选,可以用来在文件最末端添加一些附加信息。

声道数据是怎样反映在data里呢?假如是8位单声道,则是每个采样点一个数据,不间隔。假如是8位双声道,则每个采样点的采样数据包含左右两个声道数据,也就是先左声道的数据,紧跟着是右声道数据,然后下一个采样点......16位数据这里就不介绍了。8位PCM的格式为ungsigned char 0~255。刚好与AVR单片机的TCNT0的范围一样,待会讲到PWM时再讨论。相信大家对WAV文件格式有初步了解。大家可以用WinHex软件查看WAV文件,对照上面的表格,自己找出实际音乐数据的位置,查看一下没有声音时PCM数据是多少(0x80)。

二、PWM组成的零阶保持器

PWM是脉冲宽度调制的缩写,可以通过改变“占空比”来改变电压有效值。我们可以考虑,当占空比可以由数字信号的量化值来改变时,那么输出电压的有效值跟量化值应该会有一个近似正比的映射关系,于是,这一个装置可以看做是一个粗糙的DAC。我们可以用这个"DAC"来将PCM信号还原成声音信号(类似于D类放大器)。

我们可以使用AVR的PWM来实现。AVR单片机的PWM有几种模式-----普通模式,CTC模式,相位修正PWM模式,快速PWM模式.每种模式有各自的优缺点。我们这里可以用快速PWM模式。下图是ATMEGA16的快速PWM模式的时序图:

可以看出,当COM01:COM00=1:0时,TCNT0为初值时引脚OC0输出高电平,一直持续到TOP,或者跟OCR0的值匹配后,引脚OC0变低。当改变OCCR0值时,占空比也跟着改变,而且,OCR0值越大(最大0xFF),占空比越大。AVR单片机快速PWM模式的PWM频率F=Fosc/(256*N);N为分频值。F越大,“DAC”的噪声就更多地分布在高频,容易使用低通滤波器滤除,提高音质。我们可以设置TCCR0=0X69;TCNT=0X00;OCR0=0X7F;代表的意义具体查看ATMEGA16的寄存器说明。为了能让从WAV格式文件读取出来的数据转换成音频信号,除了有DAC,我么还需要把数据按照采样率来输送到“DAC”才能还原成原来的声音。相信大家小时候都玩过磁带录音机,磁带录音机的转速是有一个标准的,也就是录音和播放采取一样的转速,如果因为里面的齿轮生锈了,转速变慢,那么播放出来的声音就变得走音、低沉,有时女声变成男声。同样地,这里的采样率跟磁带录音机的转速一个道理。那么,我们可以用单片机的定时器功能来做到,在定时器中断服务程序中发送数据给OCR0,也就是定时发送数据给“DAC”,只要将定时器的频率调节到采样率,那么声音就还原出来了。

如果没有接触过SD卡和文件系统,我们可以简单地,用Windows系统自带的录音机功能录取一段单声道语音,用WinHex查看,找到数据,把它做成一个C语言数组形式。就可以用单片机读取还原出声音了!!第一次写博客,请多多关照,

单片机播放WAV格式音频的理解相关推荐

  1. c语言 输出音频 单片机,单片机播放WAV格式音频的理解

    CSDN账号注册了3年,一直没有上来过,更不用说写博客了.我不知道博客的具体用途,我只想把它当做一种心得来发表,可能是一些技术上的理解或者生活上的小故事.好了,下面我将记录我对WAV播放器的理解. 很 ...

  2. Qt播放WAV格式音频文件的两种方法

    这两种方法都需要在.pro文件中加入multimedia模块. 方法一.使用QAudioOutput #include <QApplication> #include <QFile& ...

  3. 用C#来播放.wav格式的音频文件

    .net自带的有播放.wav格式音频文件的类:System.Media.SoundPlayer,只要调用这个类就可以了. 代码如下:     string path = "....../so ...

  4. Android 录音机小米商业项目开源代码 AudioRecord录音暂停 播放 Wav格式(音频二)

    Android MediaRecorder录音录像 暂停 继续录音 播放 ARM格式(音频一) https://blog.csdn.net/WHB20081815/article/details/88 ...

  5. html中怎么写播放音乐格式,HTML+CSS入门 如何实现多浏览器播放wav格式的音频文件...

    本篇教程介绍了HTML+CSS入门 如何实现多浏览器播放wav格式的音频文件,希望阅读本篇文章以后大家有所收获,帮助大家HTML+CSS入门. < 使用audioplayer.js 基本上能支持 ...

  6. TTS(1)单片机播放WAV语音,有原理,有代码

    声音:是由物体振动所发出来的.     那么,一个物体的振动有振动频率与振动幅度与振动强度等有关.     振动频率就是每秒振动多少次     振动幅度就是振动一次所产生的距离     振动强度就是振 ...

  7. window API播放pcm格式音频文件,函数waveOutOpen等

    之前在我的博客中有一篇关于编写录音器的代码,可保存为pcm和wav格式,说白了其实两者是一个东西,只不过wav比pcm多了一个文件头,这个文件头一共占了44个字节.此处这个不是重点,重点是如何编写程序 ...

  8. Java如何播放MP3格式音频文件,以及如何循环播放音频?

    首选,感谢你能在百忙之中阅读我的博客,在这里我告诉大家2中播放MP3格式音频的方法.第一种,使用自带的JavaFX技术来播放(现再最新的JDK版本中已被移除).第二种我们使用第三方库来进行播放. 点击 ...

  9. 【音视频数据数据处理 10】【PCM篇】将PCM转为WAV格式音频

    [音视频数据数据处理 10][PCM篇]将PCM转为WAV格式音频 一.WAV头信息 1.1 RIFF区块 1.2 FORMAT区块 1.3 DATA区块 二.PCM 转 WAV 代码实现 PCM转为 ...

最新文章

  1. 安装Intel图像处理IPP库
  2. mysql select 区分大小写,MySql查询不区分大小写解决方案(两种)
  3. linux tar 提示 time stamp xxx in the future 解决方法
  4. windows下node安装
  5. Laravel源码解析之中间件
  6. 程序员打字练习_程序员必须来看的面试圣经!!
  7. scala学习-Linux命令行运行jar包传入main方法参数
  8. Tomcat不能自动编译JSP文件问题的一种解决方法
  9. homebrew安装失败的解决方案
  10. C#调用API函数EnumWindows枚举窗口的方法
  11. Spring MVC接受参数的注解
  12. 精心为学弟学妹整理了60个适合练手的C语言/C++项目,值得收藏!
  13. 《QTreeView表项实现排序的2种方式》:系列教程之九
  14. 项目Kick Off的作用
  15. Flutter TextField输入文字时,若页面刷新,会导致光标位置发生变化。
  16. 抖音xlog算法解密过程
  17. node项目部署https服务
  18. 《逆向工程核心原理》相关说明
  19. Latex 之公式编辑
  20. 大数据技术之 Sqoop

热门文章

  1. FileUriExposedException: file:///storage/emulated/0/Android/data/com.skyrin.bingo/cache/app/app.apk
  2. 北京葡萄藤2019年上半年简报
  3. 【408计算机考研】计算机网络——第1章 计算机网络体系结构
  4. QEMU零知识学习2 —— QEMU源码下载
  5. 微型计算机原理及应用 课程设计,微型计算机原理及应用课程设计.docx
  6. 2019-7-29-PowerShell-拿到显卡信息
  7. K-Prototypes聚类的Python实现
  8. 基于Java图书馆管理系统、JAVA图书借阅系统设计与实现 毕业设计开题报告
  9. 利用NAS免费部署动态解析实现内网穿透
  10. Android Fragment异常:java.lang.IllegalStateException: Fragment XXXFragment not attached to Activity