Android 实时采集声音的频率和大小

Android实时采集声音的频率和大小

笔者本不是专业人士,通过查了几篇资料和请教软件部门的同学搭的demo ,如有不正确之处,请及时指出

1.原理

  1. 声音大小省略,网上可以很好搜到
  2. 使用AudioRecord类采集声音信息,通过傅里叶转换,获取声音的频率

2.AudioRecord类说明

/**
 *@param audioSource  采集声音源  MediaRecorder.AudioSource.MIC 为采集麦克风
 *@param sampleRateInHz  采集声音的频率,因设备而定,44100Hz 支持所有的设备,部分设     备上也支持 22050 16000 11025
 *@param channelConfig 采集声音的声道 AudioFormat.CHANNEL_CONFIGURATION_MONO为单声道
 *@param audioFormat  返回信息的格式 这里是 AudioFormat.ENCODING_PCM_16BIT
 *@param bufferSizeInBytes  缓存区大小 有要求的 ,可以用 AudioRecord.getMinBufferSize 获取
 */
public AudioRecord(int audioSource, int sampleRateInHz, int channelConfig, int audioFormat,int bufferSizeInBytes)

/**
 *@param sampleRateInHz  采集声音的频率
 *@param channelConfig 采集声音的声道 
 *@param audioFormat  返回信息的格式
 *
 */
static public int getMinBufferSize(int sampleRateInHz, int channelConfig, int audioFormat) 

3.傅里叶变换简单说明

  1. 快速傅里叶变换输入的一组数组,输出等长的一组数组
  2. 数组由时域变换成了频域,数组的中最大的值代表能量最大,下坐标乘以频幅就等于该点频率,通常以能量最大的频率代表声音的频率.
  3. 频幅指一个单位所代表的频率大小,例如下坐标为2 ,该点的频率=2*频幅.频幅=采样频率/采样点
  4. 采样点指采集信息的长度,可自己定,但最好为2的n次幂,不然结果会为零.

项目地址

https://github.com/xuanxuandaoren/SoundAnalysis/tree/master

你可能感兴趣的:(android)