发 帖  
原厂入驻New
申请华秋企业认证 多层板首单免费打样!
30s提交资料,10分钟通过审核(免费赔付+顺丰包邮)>>立即报名

[经验] 基于Arduino的简易WAV播放器

2014-10-9 17:41:27  15109 flash flash flash Arduino WAV播放器
分享
1
本帖最后由 goyuqinghua 于 2014-10-9 17:53 编辑

一、概述
该简易WAV播放器基于Arduino UNO结合自制的低通滤波器制作完成,该WAV播放器通过UNO产生PWM信号然后经过低通滤波器使存储在UNO内部flash中的PCM数据发声的过程,其实该播放器不能纯粹的说是一个WAV播放,因为笔者通过工具将WAV文件中的PCM数据提取出来以数组的形式存储在UNO的内部flash中,该DIY教程只是给读者一个启示,读者可以根据这个思路制作更加强大的基于SD卡的WAV播放器,该播放器制作简单、方便DIY,只要弄懂了发声原理就可以很方便的在不同的平台上制作功能强大的WAV播放器,该播放器可运用在简单的语音播报系统、电子琴中。
二、原理讲解
2.1数字音频基础
2.1.1、数字音频基础知识介绍
数字音频技术的基本原理和处理方法,就是采用ADC模数转换器,对模拟的音频信号进行采样、量化、编码后转换成数字化的音频数据和文件进行保存,当然,在播放的时候,还需要将数字化的音频数据经过DAC数模转换器,恢复到模拟信号形式由发声器件播放出来。
根据音频信号的应用范围的不同,模拟音频数字化ADC过程中采用的采样频率和量化精度也是不同的,通常的标准如下表所示。
  
实用领域
  
模拟信号的频率范围
ADC采样频率
ADC量化位数
电话音质
2-----4KHZ
8KHZ
广播音质
50Hz-----11KHz
22.05KHz
8--12bit
CD音质
20Hz-----20KHZ
44.1KHz
16bit
从上表中可以看到,根据采样定理,针对不同音质的音频信号,数字音频ADC的采样频率都是模拟信号最高频率的2倍,另外音质要求越高,ADC量化位数也越高,实际上人的耳朵对1/256级(8位)精度的变化基本上已经分辨不出了,但对于CD音质,还是采用了16位的量化位数,精度达到1/65536,很明显,音质越高的数字音频,数据量也越大,对于1秒钟的音频信号,如果是电话质量的数字音频,其数据量是8K字节,

一个字节存放一个采样点的电平值,而要获得CD音质,1秒钟的采样数据就需要88.2k个字节存放,如果是双声道立体声,数据量就是176.4K字节/秒。
最典型的数字音频数据文件就是WAV类型的文件,它通常采用最原始的PCM编码方式存放每个采样点的原始数据,没有经过任何的压缩处理,现在配有声卡(不管是集成或独立)都有麦克风插口,在WINDOWS平台的支持下,可以进行录音,把声音变成数字音频文件保存在电脑中,这个文件就是将一个一个原始采样按顺序记录保存的WAV格式文件,因此,只要按照采样频率的速度,把这些音频数据一个一个的读出后,通过DAC转换成模拟信号,就可以得到还原的声音了。
2.1.2WAVE数字音频文件格式简介
WAVE格式的文件(扩展名为wav)是多媒体数字音频中使用的基本音频格式之一,它是以RIFF格式为标准的,RIFF是英文ResourceInterchange File Format的缩写,每个WAVE文件的头四个字节便是“RIFF”。
WAVE文件是由若干个Chunk(块)组成的,按照在文件中通常出现的位置包括有:RIFF WAVE Chunk,Format Chunk,Fact Chunk(可选),DataChunk,LIST Chunk(可选)等,其中除了RIFFWAVE Chunk,Format Chunk,Data Chunk是必须的以外,其它是可选的。
2.1.3、从WAV文件中获取PCM音频数据
PC机中有许多WAV格式文件,其实WINDOWS的提示音都是采用WAV格式的文件,我们也可以自己利用PC机和相关软件来制作自己需要的音频文件,在我们提供的资料中有一个读者制作好的WAV文件“会说话的单片机.wav”,使用WINHEX软件可以直接以二进制的格式(显示为16进制方式)查看文件具体内容,下图是使用WINHEX软件打开该文件的显示内容。


clip_image002.jpg

2.2PWM讲解

2.2.1、什么是PWM
脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在

测量通信到功率控制与变换的许多领域中。

2.2.2PWM产生过程
最常见的微控制器的功能是一个定时器。这是一个简单的内部时钟,然后递增到某个值,然后返回到零。通过这些定时器产生PWM,通过外部引脚输出高电平当计时器到达零,然后输出低电平当计数到另一个值时,你可以改变。在这种方式中,可以使输出引脚在一个特定时间中保持高电平,而不必手动切换它的代码。如果你输出管脚通过低通滤波器你可以得到平均值。

2.2.3PWM实现ADC功能
在pwm输出引脚上通过由电阻R和电容C构成的简单积分电路,滤掉高频进行平滑后,在音频输出口上就可以得到模拟音频输出,这里以我们提供的wav文件为例,由于生成的pwm的频率为8KHz,因此PWM的输出信号中包含许多大于8K的高频信号成分,所以由电阻R和电容C构成的低通滤波器的截止频率应该在6KHz左右,以能够把8K以上的高频信号给滤掉,保留4KHz一下的模拟信号。
电阻电容构成的低通滤波器截止频率的计算公式为F=1/2∏RC,将数据代入计算得:
1/(2*3.1415*2700*0.00000001)=5897.6Hz,因此由R=2.7k,C=0.01uF构成的低通滤波器的截止频率大约为5.9KHz.

三、制作准备
clip_image004.jpg

硬件:                                                           软件:
1、USB小音响                                      AVR studio 4.19
2、数字按键                                           Winavr-2010
3、Freduino UNO
4、4x6cm万能板
5、杜邦线
6、耳机插口
注意:因为笔者觉得有些代码在AVR studio编写比在Arduino IDE中更加的方便所以提供的例程是AVR studio的例程,读者想要在ArduinoIDE中使用这个代码只要稍微修改一下就可以了。
四、制作过程
1、用烙铁按照下图电路图所以将低通滤波器焊接4x6cm的万能板上
clip_image005.jpg
clip_image006.jpg
file:///C:/DOCUME~1/YUQING~1/LOCALS~1/Temp/msohtmlclip1/01/clip_image004.jpg


2、将上图焊接的低通滤波的输入信号接入UNOD6引脚,并将滤波器与UNO共地
clip_image007.jpg
file:///C:/DOCUME~1/YUQING~1/LOCALS~1/Temp/msohtmlclip1/01/clip_image006.jpg
3、将数字按键插入UNO中的A1中如下图所示
clip_image008.jpg
file:///C:/DOCUME~1/YUQING~1/LOCALS~1/Temp/msohtmlclip1/01/clip_image008.jpg

4、USB音响的耳机口插入低通滤波器的输出端的耳机插口中
clip_image009.jpg
以上步骤完成后,将UNO上电,并将代码下入UNO中,按下数字按键就会听到USB音响有声音发出。
clip_image003.jpg
bill_yu 2014-10-31 13:55:06
哦,这个好像做起来挺麻烦的
回复

举报

gmcg 2014-12-9 23:00:16
比较高深的玩法,不错哦
回复

举报

mkxjs 2015-1-9 16:44:39
做起来挺麻烦的
回复

举报

abcbig 2015-6-5 16:30:43
学习下 好东西..........................
回复

举报

c8112499 2015-7-23 22:10:20
路过,阅读了一下,增长了知识                 
回复

举报

小虎电子 2015-9-8 14:27:30
求源代码,不知道怎么将PCM音频数据播放出来……
回复

举报

doomguards 2015-11-3 14:27:03
跪求代码。。。
回复

举报

邱錦宙 2015-12-5 12:14:56
这个好像做起来麻烦的我不會搞
回复

举报

鑫朗动漫 2017-5-19 11:35:18
有深度
回复

举报

PhyJim 2018-5-25 13:45:21
maya,源码实在太重要了
回复

举报

PhyJim 2018-5-25 13:54:46
啊啊啊啊啊,大神膜拜一个
回复

举报

wherestheway 2018-9-14 23:12:24
做出来的音质不太理想
回复

举报

ccccc8 2018-10-8 11:02:00
Mark一下,收藏备用
回复

举报

只有小组成员才能发言,加入小组>>

1643个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /6 下一条

快速回复 返回顶部 返回列表