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存储桶中获取结果 在开始这三个高级步骤之前,还…

[UE4]关卡蓝图

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

iframe的缺点

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

使用可视化工具redisclient连接redis

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

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

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

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

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

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

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

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

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

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

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

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

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

前端微信小程序实战篇

电商底部导航栏的制作 我想大家对电商一定不陌生,一般电商的底部导航栏有以下几个首页、分类、购物车、个人中心。 app.json是用来配置page路径以及导航栏属性的,那我们要做首页、分类、购物车、个人中心界面就要在page也添加这几个界面,所…

Spring MVC –使用@ResponseBody轻松实现基于REST的JSON服务

Spring 3使JSON REST服务非常容易。 本教程将通过几个步骤向您展示如何进行。 您可以在GitHub上获取代码。 先决条件 您应该有一个运行中的Spring MVC应用程序。 如果尚未设置正常的Spring MVC应用程序,请按照本教程进行操作 。 我们将定义三个REST服务&#xff1a…

(转)zabbix3.4使用percona-monitoring-plugins监控mysql

原文:https://blog.csdn.net/yanggd1987/article/details/79656771 简介 之前主要使用nagios监控mysql,本文主要介绍使用percona-monitoring-plugins监控mysql,percona监控插件是php开发,因此要在agent安装php环境。 配置安装 一.…

html基础-html简介-第一个网页(1)

今天刚刚开通博客园,把我最近整理的html/css来说一下,对于初学者还是有一定的帮助。 一、先来为大家简单普及以下html (1)、html英文即:hypertext markup language 中译 : 超文本标记语言 (2&…

javafx android sdk,JavaFX打包到Android上

让JavaFX运行到移动平台一直是社区努力完成的事。当然,目前已经可以让JavaFX运行到Android和IOS平台了,下面我们来看看如何打包自己的JavaFX项目到Android平台。这个示例是我从打包官方示例的例子里修改而来,用于打包一个简单的JavaFX程序。示…

在zookeeper集群的基础上,搭建伪solrCloud集群

伪集群的搭建:将solrCloud搭建到同一台机器上。 准备工作 1 将在window中部署的单机版solr上传到服务器(虚拟机)中 solr的简单部署:在tomcat中启动slor 的内容 这一次放到 mkdir /usr/local/solr-cloud 文件夹内并解压 2 复制4份…

css类选择器类名覆盖优先级

code <style>.a{background: red;}.b{background: yellow;} </style> <div class"a b">A</div> 渲染效果 最初以为更改元素中class类里面的类名顺序&#xff0c;渲染效果就会根据类名顺序依次渲染code <style>.a{background: red;…

CMD命令锦集

虽然随着计算机产业的发展&#xff0c;Windows 操作系统的应用越来越广泛&#xff0c;DOS 面临着被淘汰的命运&#xff0c;但是因为它运行安全、稳定&#xff0c;有的用户还在使用&#xff0c;所以一般Windows 的各种版本都与其兼容&#xff0c;用户可以在Windows 系统下运行DO…

Bootstrap学习笔记01

1、Make Images Mobile Responsive 用处&#xff1a; 使图片适配你的页面宽度。 操作&#xff1a; 给图片添加 .img-responsive class属性。 <img src"/images/cat.jpg" class"img-responsive"> 2、Center Text with Bootstrap 用处&#xff…