我想使用EZAudio框架进行实时麦克风信号FFT处理,以及其他一些处理以确定峰值频率。
问题是,EZmicrophone类似乎只能处理512个样本,但是,我的信号要求FFT为8192甚至16384个样本。似乎没有办法在EZMicrophone中更改缓冲区大小,但我已经阅读过建议创建目标大小数组并将麦克风缓冲区附加到其中的帖子,然后当它已满时,执行FFT。
当我这样做时,我得到大块的内存,没有数据,或者复制内存段之间的不连续性。我认为这可能与调用麦克风代表的时间或顺序或者在不同线程中覆盖内存有关...我在这里抓住了吸管。我是否正确假设每次麦克风缓冲区充满新的512个样本时都会执行此代码?
有谁能建议我做错了什么?我已经坚持了很长时间。
这是我一直用作参考的帖子: EZAudio: How do you separate the buffersize from the FFT window size(desire higher frequency bin resolution).
// Global variables which are bad but I'm just trying to make things work
float tempBuf[512];
float fftBuf[8192];
int samplesRemaining = 8192;
int samplestoCopy = 512;
int FFTLEN = 8192;
int fftBufIndex = 0;
#pragma mark - EZMicrophoneDelegate
-(void) microphone:(EZMicrophone *)microphone
hasAudioReceived:(float **)buffer
withBufferSize:(UInt32)bufferSize
withNumberOfChannels:(UInt32)numberOfChannels {
// Copy the microphone buffer so it wont be changed
memcpy(tempBuf, buffer[0], bufferSize);
dispatch_async(dispatch_get_main_queue(),^{
// Setup the FFT if it's not already setup
if( !_isFFTSetup ){
[self createFFTWithBufferSize:FFTLEN withAudioData:fftBuf];
_isFFTSetup = YES;
}
int samplesRemaining = FFTLEN;
memcpy(fftBuf+fftBufIndex, tempBuf, samplestoCopy*sizeof(float));
fftBufIndex += samplestoCopy;
samplesRemaining -= samplestoCopy;
if (fftBufIndex == FFTLEN)
{
fftBufIndex = 0;
samplesRemaining = FFTLEN;
[self updateFFTWithBufferSize:FFTLEN withAudioData:fftBuf];
}
});
}
答案 0 :(得分:0)
您可能遇到线程问题,因为您尝试在某些块中执行工作,这需要比音频回调之间的时间长得多。在先前的调用可以说它们已完成之前(使用FFT设置或清除FFT缓冲区),您的代码将被重复调用。
在开始录制之前尝试在回调之外进行FFT设置,仅复制到回调内的循环缓冲区或FIFO,并在代码中执行FFT异步回调(不与循环缓冲区副本锁定在同一块中) )。