首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我如何设置安卓AudioRecord,使我有较低的延迟,但有一个大的样本大小的快速傅立叶变换?

我如何设置安卓AudioRecord,使我有较低的延迟,但有一个大的样本大小的快速傅立叶变换?
EN

Stack Overflow用户
提问于 2015-03-26 19:05:38
回答 1查看 528关注 0票数 1

因此,我有一个AudioRecord设置与一个快速傅立叶变换,以确定频率,以确定音符。

在我要求的时候

代码语言:javascript
运行
复制
AudioRecord.getMinBufferSize(rate, channelConfig, audioFormat)

然后,我有一些if语句,将其设置为下一个更大的2的幂。对于我的手机,通常是2048(2^11)。其目的是,我所做的下一件事是一个FFT,它的算法需要一个缓冲器长度,是一个2的幂。

如果我错了,请纠正我,但我的印象是,您之所以找到最小缓冲区大小是因为它会减少延迟。

这一切都很好,直到我读到,为了准确地确定特定的音符,特别是那些频率较低的音符,你必须有一个更大的样本大小来输入快速傅立叶变换;最好是大于16384的样本大小(2^14)。

我想我要问的问题是。当我创建AudioRecord时:

代码语言:javascript
运行
复制
AudioRecord recorder = new AudioRecord(MediaRecorder.AudioSource.DEFAULT,
                  rate, channelConfig, audioFormat, bufferSize1);

在读取缓冲区时,可以使用一个较小的缓冲区大小以减少延迟:

代码语言:javascript
运行
复制
AudioRecord().read(thisbuffer, 0, bufferSize2);

使用不同的缓冲区大小,更长的长度,然后发送到FFT?还是有更好的方法来做这件事?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-26 19:23:03

首先,FFT是确定“音符”的一个糟糕的选择,就像人们通常想要估计的音高而不是频谱频率一样,这是心理声学中两种非常不同的东西。

对于加窗FFT,频谱频率是在FFT窗口中部附近最精确地确定的。因此,使用较长的FFT,即使在非常短的输入缓冲区大小后通过重叠重复它们,也会导致大约是FFT长度的一半的延迟。

但是,更频繁地重复FFT (通过在较短的输入缓冲区延迟后将它们重叠)将给您更好的时间分辨率,如果不是更快的延迟。为了真正降低延迟,您需要使用更短的FFT,并丢失频率分辨率,或者使用另一种频率或基音估计器,这也将有其他时频鲁棒性权衡。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29286851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档