我想使用EZAudio框架来做实时麦克风信号的快速傅立叶变换处理,以及一些其他的处理,以便确定峰值频率。
问题是,EZmicrophone类似乎只对512个样本起作用,然而,我的信号需要8192个甚至16384个样本。在EZMicrophone中似乎没有改变缓冲区大小的方法,但我读过一些帖子,建议创建一个与目标大小相同的数组,并将麦克风缓冲区附加到该数组中,然后当该数组已满时,执行快速傅立叶变换。
但是,当我这样做时,我得到了大量没有数据的内存块,或者复制的内存段之间不连续。我认为这可能与麦克风委托被调用的时间或顺序有关,或者内存在不同的线程中被覆盖……我在这里抓住了救命稻草。我假设每次麦克风缓冲区充满新的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];
}
});
}发布于 2015-04-25 00:17:43
您可能会遇到线程问题,因为您正在尝试在某些块中执行工作,而这些工作所需的时间要比音频回调之间的时间长得多。在前面的调用可以表明它们已经完成之前,您的代码正在被重复调用(通过FFT设置或清除FFT缓冲区)。
在开始录制之前,尝试在回调外部执行FFT设置,仅复制到回调内的循环缓冲区或FIFO,并在代码中与回调异步执行FFT (未锁定在与循环缓冲区复制相同的块中)。
https://stackoverflow.com/questions/29851382
复制相似问题