Я хотел бы использовать инфраструктуру EZAudio для обработки сигналов FFT в реальном времени, а также некоторую другую обработку, чтобы определить пиковую частоту.Как увеличить размер EZAudio EZMicrophone?
Проблема заключается в том, что класс EZmicrophone работает только на 512 образцах, однако для моего сигнала требуется БПФ из 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];
}
});
}
спасибо. Я попробую. – geir58