2015-04-24 1 views
0

Я хотел бы использовать инфраструктуру 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]; 
     } 

    }); 

} 

ответ

0

Вы, вероятно, имеют поточную проблему, потому что вы пытаетесь сделать работу в некоторых блоках, занимает много много больше, чем время между звуковые обратные вызовы. Ваш код вызывается несколько раз, прежде чем предыдущие вызовы могут сказать, что они сделаны (с установкой FFT или сбросом буфера FFT).

Попробуйте выполнить настройку FFT за пределами обратного вызова перед началом записи, только скопируйте в круговой буфер или FIFO внутри обратного вызова и выполните БПФ в коде async для обратного вызова (не заблокированный в том же блоке, что и круговой буфер копия).

+0

спасибо. Я попробую. – geir58

 Смежные вопросы

  • Нет связанных вопросов^_^