Android手机麦克端的数据采集与显示
扫描二维码
随时随地手机看文章
摘 要: 以Android平台为基础,设计了一种通过Android手机的麦克端采集数据信号的方案,不仅扩展了数据采集的方法,同时也把Android平台应用到工程领域中。
关键词: Android;嵌入式;麦克;数据采集;数据显示
Android是一个开放、自由的移动终端平台,其开放性保证了该平台不存在任何阻碍移动产业创新的专有权障碍,一经推出就深受业内人士的认可。随着电子科技的发展,Android平台不仅仅应用于移动互联网上的开发,在工程上的开发前景也得到了广泛的关注[1]。
Android平台使用Java语言进行开发,支持SQLite数据库、2D/3D图形加速、多媒体播放和摄像头等硬件设备,并设置了丰富的应用程序,如电子邮件客户端、闹钟、Web浏览器、计数器、通信录和MP3播放器等。Android采用了软件堆层(Software Stack)的架构,共分为4层:第一层是Linux内核,提供由操作系统内核管理的底层基础功能;第二层是中间件层,由函数库和Android运行时所需的虚拟机构成;第三层是应用程序框架层,提供了Android平台基本的管理功能和组件重用机制;第四层是应用程序层,提供了一系列核心应用程序[2]。数据信号的采集一般是通过USB、蓝牙、WiFi等方法,而本文是通过Android手机的麦克端来采集数字信号,从而实现了一种新型的数据采集的方法。
1 硬件系统设计
1.1 硬件结构
Android手机的麦克端不能接收任意频率的信号,只能接收频率在20 Hz~20 kHz范围内(即达到音频信号的范围)的信号,因为只有音频信号才能被人耳听到,才能被麦克采集到。本文采集的信号是一电压信号,而电压信号不能直接被Android手机的麦克端接收。因此在硬件系统设计中,需要把电压信号转换成频率范围在20 Hz~20 kHz之间的频率信号,即达到音频信号的标准。电压信号转换成频率信号的方法有很多,本文采用V/F转换器LM331实现把电压信号转换成频率在20 Hz~20 kHz范围内的音频信号,其硬件框图如图1所示。
经调整电路后的频率信号就是标准的音频信号了,但信号并不能直接连接到送话器让Android手机的麦克端接收,因为不能保证周围绝对安静, 误差会很大,而是要把音频信号与耳机中的送话器线相连,再把耳机与Android手机相连,这样就可以大大减少失真的程度。
1.2 V/F转换器LM331模块
LM331是美国NS公司生产的性价比较高的集成芯片,它是当前最简单的一种高精度V/F转换器,将电压信号转换成脉冲频率信号,输出频率严格正比于输入电压。LM331为双列直插式8引脚芯片,线性度好,最大非线性失真小于0.01%,工作频率为0.1 Hz时仍有较好的线性;变换精度高,分辨率可达16位;外接电路简单,只需接入几个外部元件就可方便地构成V/F转换器,并且容易保持转换精度。LM331在4.0 V的电压供电的情况下,就可在整个工作温度范围内高精度地工作[3]。V/F转换电路如图2所示。
2 音频格式
音频的格式有很多种,但在Android的API中与音频有关的包是android.media,其中有两个类是与音频采集有关的,分别是MediaRecorder和AudioRecord。用Media-Recorder采集的音频信号经过压缩编码后变成的声音数据为AMR格式。但因为数据是被压缩的,所以在读取数据时,要面临解压缩的问题。而用AudioRecord采集音频可以直接获得无压缩的PCM数据,即可以直接读取音频数据,数据不再需要解压缩。基于AudioRecord的方便性与实用性,本文采用AudioRecord来采集音频信号。
脉冲编码调制PCM(Pulse Code Modulation)是将音频数字化的最好途径,声音经过麦克风,转换成一系列电压变化的信号。要将这样的信号转换成PCM格式,要使用声道数、采样位数和采样频率3个参数来表示声音:(1)声道数可分为单声道和立体声,单声道即用一个传声器拾取声音,用一个扬声器来播放声音;而立体声则是由两个传声器轮流拾取声音,用两个扬声器来播放声音。(2)采样位数即采样值,它是用来衡量声音动态波动变化的一个参数,其值越大,分辨率就越高,在Android提供的API中,所提供的分辨率有8 bit和16 bit两种。(3)采样频率(即取样频率)指的是每秒钟采得声音样本的次数,采样频率越高,声音的质量也就越好,声音的还原越真实,同时它占用的资源也比较多。通常选用的采样频率一般有11 025 Hz、22 050 Hz和44 100 Hz。11 025 Hz、8 bit的声音称为电话音质;22 050 Hz、16 bit的声音称为广播音质;44 100 Hz、16 bit已达到CD的音质了[4]。
3 Android平台下的软件系统设计
首先是建立Android工程(即MediaPCM),其中包括主界面MainActivity,在主界面上有MediaFile和Recorder两个图标,分别代表音频文件列表和音频信号采集,如图3所示。
点击右边的Recorder,就会进入到音频采集界面(即Record-Activity),实现采集和播放音频的功能,同时要把采集到的音频打包成文件存放到SD卡指定的目录下;点击左边MediaFile,就会进入到音频文件显示列表界面(即ListActivity),点击其中某一项文件,就会进入波形显示界面(即WaveFormActivity),就会把音频文件以二进制数据的形式显示在Android手机的界面上。软件系统的整体框架流程图如图4所示。
3.1 清单(AndroidManifest)文件
在每一个Android项目中,都包含了一个清单(AndroidManifest)文件,即AndroidManifest.xml,它存储在项目层次中的最底层,用于在程序运行之前向Android系统声明程序的相关信息,这些信息包括应用程序需要的许可、程序运行的最低SDK版本、程序运行所需要的硬件支持和函数库等。由于本文要用到SD卡的操作和采集音频信号(即录音)的操作,所以要在AndroidManifest.xml文件中加入以下两个权限:"android.permission.WRITE_EXTERNAL_STORAGE"和"android.permission.RECORD_AUDIO",这样就可以访问SD卡和进行采集音频信号了。
3.2 音频的采集与播放
因为音频的采集需要使用AudioRecord类,与之对应的音频的播放需要用到AudioTrack类;要把声音转化成PCM格式,需要使用采样频率、声道数和采样位数这三个参数。因此在编写程序时,要对这三个参数进行初始化,即在本文中表示为frequence、channelConfig和audioEncoding。本文采用的是采样频率为44 100 Hz、单声道16位进行采样。点击开始按钮(startButton)时,就会开始录音(即采集音频信号)。其核心代码如下:
int bufferSize = AudioRecord.getMinBufferSize(frequence,
channelConfig, audioEncoding);
int resource = MediaRecorder.AudioSource.MIC;
AudioRecord record = new AudioRecord(resource, frequence,
channelConfig, audioEncoding, bufferSize);
record.startRecording();
其中,bufferSize是根据采样频率、声道和采样位数三个参数得到一个最小的缓冲区,并且MediaRecorder.AudioSou-rce.MIC声明了音频信号的来源是Android手机的麦克端。这样当调用record的startRecording()方法时就开始录音(即音频采集);当点击停止按钮(stopButton)时就会停止采集;点击播放按钮(playButton)时,就开始播放已经录制的音频;点击结束按钮(finishButton)就结束播放音频。至于播放音频这一项,对数据的采集并没有太大的影响。为了完善界面,在没有硬件电路的情况下,只用一个Android手机也能完成录音播放的功能。录音界面如图5所示。
3.3 打包音频文件
只采集音频信号是远远不够的,还要把采集到的音频信号打包成文件存放到SD卡指定的目录中,并把采集到的音频信号显示在音频文件显示界面上,在SD卡中的位置如图6所示。