因此,我有一个AudioRecord设置与一个快速傅立叶变换,以确定频率,以确定音符。
在我要求的时候
AudioRecord.getMinBufferSize(rate, channelConfig, audioFormat)然后,我有一些if语句,将其设置为下一个更大的2的幂。对于我的手机,通常是2048(2^11)。其目的是,我所做的下一件事是一个FFT,它的算法需要一个缓冲器长度,是一个2的幂。
如果我错了,请纠正我,但我的印象是,您之所以找到最小缓冲区大小是因为它会减少延迟。
这一切都很好,直到我读到,为了准确地确定特定的音符,特别是那些频率较低的音符,你必须有一个更大的样本大小来输入快速傅立叶变换;最好是大于16384的样本大小(2^14)。
我想我要问的问题是。当我创建AudioRecord时:
AudioRecord recorder = new AudioRecord(MediaRecorder.AudioSource.DEFAULT,
rate, channelConfig, audioFormat, bufferSize1);在读取缓冲区时,可以使用一个较小的缓冲区大小以减少延迟:
AudioRecord().read(thisbuffer, 0, bufferSize2);使用不同的缓冲区大小,更长的长度,然后发送到FFT?还是有更好的方法来做这件事?
发布于 2015-03-26 19:23:03
首先,FFT是确定“音符”的一个糟糕的选择,就像人们通常想要估计的音高而不是频谱频率一样,这是心理声学中两种非常不同的东西。
对于加窗FFT,频谱频率是在FFT窗口中部附近最精确地确定的。因此,使用较长的FFT,即使在非常短的输入缓冲区大小后通过重叠重复它们,也会导致大约是FFT长度的一半的延迟。
但是,更频繁地重复FFT (通过在较短的输入缓冲区延迟后将它们重叠)将给您更好的时间分辨率,如果不是更快的延迟。为了真正降低延迟,您需要使用更短的FFT,并丢失频率分辨率,或者使用另一种频率或基音估计器,这也将有其他时频鲁棒性权衡。
https://stackoverflow.com/questions/29286851
复制相似问题