基础实现方法以及图片素材来自大黑博客:http://blog.youkuaiyun.com/halibobo1998/article/details/51594655,博主基于此做了一些小小的修改和原理的推导~
博主是通信工程学院的学生,不过很不幸对通信一点都不感冒-。-!,从大一开始就走上了编程这条不归路,前几天实验考试被老师质疑是不是通信工程学院的学生咋BPSK都不知道,甚伤我心,为了证明我还是知道一点专业知识的,正好这两天预习光纤通信涉及dB(分贝),不是数据库啊!,所以就写一个Android上的分贝计,当然,在进行开发之前dB的背景知识以及相关公式必须得了解~,我也查了很多资料,下面是小米所介绍的一些背景知识!
度量声音强度,大家最熟悉的单位就是分贝(decibel,缩写为dB)。这是一个无纲量的相对单位,计算公式如下:
分子是测量值的声压,分母是参考值的声压(20微帕,人类所能听到的最小声压)。因此日常中说道声音强度是多少多少分贝时,都是默认了一个很小的参考值的。
而Android设备传感器可以提供的物理量是场的幅值(amplitude),常用下列公式计算分贝值:
从SDK中读取了某段音频数据的振幅后,取最大振幅或平均振幅(可以用平方和平均,或绝对值的和平均),代入上述公式的A1。
具体实现的原理:通过麦克风进行录音,然后通过对一段时间内的录音源文件的幅度进行分析判断,其中Android的SDK直接给我们提供了getMaxAmplitude()这个方法来获取最大的振幅,因此本项目的问题也就迎刃而解了,下面看具体的代码实现
Android源码:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.RECORD_AUDIO"/>
public class FileUtil { private static final String TAG = "FileUtil"; public static final String LOCAL = "Test"; public static final String LOCAL_PATH = Environment.getExternalStorageDirectory().getPath() + File.separator; /** * 录音文件目录 */ public static final String REC_PATH = LOCAL_PATH + LOCAL + File.separator; /** * 自动在SD卡创建相关的目录 */ static { File dirRootFile = new File(LOCAL_PATH); if (!dirRootFile.exists()) { dirRootFile.mkdirs(); } File recFile = new File(REC_PATH); if (!recFile.exists()) { recFile.mkdirs()