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

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)等。如下图所示:

0818b9ca8b590ca3270a3433284dd417.png

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

1.RIFF WAVE Chunk

0818b9ca8b590ca3270a3433284dd417.png

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

2.Format Chunk

0818b9ca8b590ca3270a3433284dd417.png

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

3.Fact Chunk(optinal)

0818b9ca8b590ca3270a3433284dd417.png

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

4.Data Chunk

0818b9ca8b590ca3270a3433284dd417.png

size大小纯粹是data的大小。

5.LIST Chunk(optinal)

0818b9ca8b590ca3270a3433284dd417.png

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

声道数据是怎样反映在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模式的时序图:

0818b9ca8b590ca3270a3433284dd417.png

可以看出,当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语言数组形式。就可以用单片机读取还原出声音了!!第一次写博客,请多多关照,

0818b9ca8b590ca3270a3433284dd417.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/368722.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UVALive3989 Ladies' Choice —— 稳定婚姻问题 Gale - Shapely算法

题目链接:https://vjudge.net/problem/UVALive-3989 题解: 题意:有n个男生和n个女生。每个女生对男神都有个好感度排行,同时每个男生对每个女生也有一个好感度排行。问:怎样配对,才能使的每个女生尽可能幸福…

通过命令行界面使用AWS ElasticMapReduce

在本文中,我将通过针对EMR的CLI使用AWS MapReduce服务(称为ElasticMapReduce )。 使用EMR的过程可以大致分为三个步骤: 设置并填充S3存储桶 创建并运行EMR作业 从S3存储桶中获取结果 在开始这三个高级步骤之前,还…

sublime 快捷键

Ctrl / 注释代码 <!-- <a href"http://www.baidu.com" target"_blank">百度</a> --> Tab 自动补全 <html tab 补全 html的全部基本标签 <a tab 自动补全为<a href…></a> 还有, 比如你忘记加<…

[UE4]关卡蓝图

转载于:https://www.cnblogs.com/timy/p/9053876.html

android 自定义 theme,Android使用Theme自定义Activity进入退出动画的方法

本文实例讲述了Android使用Theme自定义Activity进入退出动画的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;有没有觉得Activity的默认动画太快了或者太难看了。。我原来使用Activity.overridePendingTransition来自定义Activity的进入动画&#xff0c;却发现没…

django 静态资源配置

最近在学习一个项目&#xff0c;django框架&#xff0c;但当 render 模板时&#xff0c;模板里有引入的图片就访问不到&#xff0c; 这是因为 django部署方式比较特别&#xff0c;采用静态文件路径:STATICFILES_DIRS的部署方式&#xff0c;之前你写的相对路径&#xff0c;绝对路…

MOXy的对象图– XML和JSON的输入/输出局部模型

假设您有一个要公开为RESTful服务的域模型。 问题是您只想输入/输出部分数据。 以前&#xff0c;您将创建一个代表子集的单独模型&#xff0c;然后使用代码在模型之间移动数据。 在EclipseLink 2.5.0中&#xff0c;我们有一个称为“对象图”的新功能&#xff0c;使您能够轻松地…

iframe的缺点

一、iframe会阻塞主页面的onload事件&#xff1b; 二、搜索引擎检索程序无法解读这种页面&#xff0c;不利于SEO&#xff1b; 三、会影响页面的并行加载。 并行加载&#xff1a;同一时间对同一域名下的加载数量是有限制的&#xff1a; 解决方法&#xff1a; 使用js动态给ifr…

使用可视化工具redisclient连接redis

可视化工具推荐&#xff1a;http://database.51cto.com/art/201505/477692.htm 1.连接redis服务端 1.1 设置连接密码&#xff1a;在redis根目录下&#xff0c;双击redis-cli.exe&#xff0c; 输入命令&#xff1a;redis-cli.exe -h 127.0.0.1 -p 6379 -n 1 1就是密码 1.2 使…

android 蓝牙项目代码,Android蓝牙聊天开源项目

前言基于Android Classic Bluetooth的蓝牙聊天软件&#xff0c;目前仅支持一对一实时通信、文件传输、好友添加、好友分组、好友在线状态更新等功能&#xff0c;其中消息发送支持文本、表情等方式。前景蓝牙技术作为一种小范围无线连接技术&#xff0c;能够在设备间实现方便快捷…

你必须知道的.NET之特性和属性(转)

你必须知道的.NET之特性和属性2008-10-13 来源&#xff1a;网络 1. 引言 attribute是.NET框架引入的有一技术亮点&#xff0c;因此我们有必要花点时间走进一个发现attribute登堂入室的入口。因为.NET Framework中使用了大量的定制特性来完成代码约定&#xff0c;[Serializable]…

宽带阻抗匹配的工程实现-第一步,端口驻波仿真

概要 ADS仿真&#xff0c;Matlab仿真&#xff0c;宽带阻抗匹配&#xff0c;smith圆图。 其实阻抗匹配我工作以来经常说&#xff0c;也经常做&#xff0c;但是基本上都是直接在印制板上进行调试。现在想先用仿真软件直接设计出来&#xff0c;才发现很多东西嘴上说容易&#xf…

Hamcrest Matchers,Guava谓词和Builder设计模式

通常&#xff0c;在编码时&#xff0c;我们必须处理其中包含数十个字段的一些POJO对象。 很多时候&#xff0c;我们通过一个带有数十个参数的构造函数来初始化这些类&#xff0c;这以任何可能的想象的方式都是可怕的。 除此之外&#xff0c;使用这些构造函数的函数几乎不可测试…

学web前端一定要这样学,不然学完找不到工作哭都来不及!

因为工作原因&#xff0c;经常关注有关互联网行业的最新动态。这不&#xff0c;刚送走了高考&#xff0c;又迎来了每年的毕业季&#xff0c;看到好多人都说今年的前端工作不好找&#xff0c;很多童鞋简历投了一大堆&#xff0c;也没有回应&#xff0c;发现连实习的机会都没有&a…

面向对象的数据存储方式

目前由于项目接入redies&#xff0c;数据可持久化&#xff0c;而以何种存储数据的格式又是一个问题&#xff0c;因为数据格式在 决定之后就应该成为规范&#xff0c;所以一个简单的好用的数据格式是优先考虑的&#xff0c;而从前端的角度&#xff0c;就是命名 空间&#xff0c;…

修改linux文件权限命令:chmod

Linux系统中的每个文件和目录都有访问许可权限&#xff0c;用它来确定谁可以通过何种方式对文件和目录进行访问和操作。  文件或目录的访问权限分为只读&#xff0c;只写和可执行三种。以文件为例&#xff0c;只读权限表示只允许读其内容&#xff0c;而禁止对其做任何的更改操…

android视频通信和web端,探讨用webrtc在手机和浏览器之间实现音视频实时通信的实施环境...

探讨用webrtc在手机和浏览器之间实现音视频实时通信的实施环境Walker.Xuproduct/develop flow&#xff1a;技术需求&#xff1a;任务拆解:1.android客户端2.前端js网页客户端技术产品&#xff1a;落地&#xff0c;实施在实际应用环境中1.技术因素2.非技术因素选择浏览器的标准&…

XStream – XStreamely使用Java中的XML数据的简便方法

有时候&#xff0c;我们不得不处理XML数据。 而且大多数时候&#xff0c;这不是我们一生中最快乐的一天。 甚至有一个术语“ XML地狱”描述了程序员必须处理许多难以理解的XML配置文件时的情况。 但是&#xff0c;不管喜欢与否&#xff0c;有时我们别无选择&#xff0c;这主要是…

jQuery 一些操作

1.监听输入框输入 $("#email").bind("input propertychange change", function (event) { console.log($("#email").val()) }); 2.获取输入框内容 $(" #test ").val()$(" input[ nametest ] ").val()$(" input[ typet…

@media兼容iphone4、5、6

在网页中&#xff0c;pixel与point比值称为device-pixel-ratio&#xff0c;普通设备都是1&#xff0c;iPhone 4是2&#xff0c;有些Android机型是1.5。 那么-webkit-min-device-pixel-ratio:2可以用来区分iphone(4/4s/5)和其它的手机 iPhone4/4s的分辨率为640*960 pixels&#…