Android中实时获取声音频率

本文介绍了一种在Android设备上实时获取声音频率的方法,利用AudioRecord读取麦克风输入,并通过快速傅立叶变换计算频率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现思路:
1. 通过AudioRecord类读取Mic传入的数据
2. 对读取的数据进行快速傅立叶变换
3. 计算出进过计算后的复数的模即为需要的频率
 
第一步很好实现,new 一个AudioRecord即可实现读取mic的输入,简略版代码如下:
 
AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
        sampleRate, AudioFormat.CHANNEL_CONFIGURATION_MONO,
        AudioFormat.ENCODING_PCM_16 BIT, sampleRate * 6);

audioRecord.startRecording();

byte[] bufferRead = new byte[READ_BUFFERSIZE];

while (audioRecord.read(bufferRead, 0, READ_BUFFERSIZE) > 0) {
        currentFrequency = processSampleData(bufferRead, SAMPLE_RATE);
}
 

这里的sampleRate取的是44100,stackoverflow上说AudioRecord的参数根据不同的机器可能不同,这一点通过遍历可能的参数新建AudioRecord类,具体可以参见stackoverflow上的这个问答

 
bufferRead为读取数据存储的容器。
currentFrequency即为通过快速傅立叶变换计算出的声音频率。
processSampleDate为调用的本地方法,因为已经有人用C实现了快速傅立叶变换,通过传入参数即可计算出声音的频率。
 
当然,在使用mic读取数据之前需要加上相应的权限。
 
关于 android如何通过NDK编译C语言的教程网上也有很多,在Linux下很方便,在windows上就比较麻烦了,需要通过安装Cygwin模拟linux的环境,调用GCC编译文件。
这篇 博客的教程讲得还是很详细的,建议没有用过NDK的可以参考一下。
 
这样就能计算出实时的声音频率了。
 
所有这个过程的源码都可以在我的 github上面找到,如有任何问题欢迎探讨。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值