Android实时采集声音的频率和大小
注
笔者本不是专业人士,通过查了几篇资料和请教软件部门的同学搭的demo ,如有不正确之处,请及时指出
1.原理
- 声音大小省略,网上可以很好搜到
- 使用
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.傅里叶变换简单说明
- 快速傅里叶变换输入的一组数组,输出等长的一组数组
- 数组由时域变换成了频域,数组的中最大的值代表能量最大,下坐标乘以频幅就等于该点频率,通常以能量最大的频率代表声音的频率.
- 频幅指一个单位所代表的频率大小,例如下坐标为2 ,该点的频率=2*频幅.频幅=采样频率/采样点
- 采样点指采集信息的长度,可自己定,但最好为2的n次幂,不然结果会为零.