EZAudio フレームワークを使用して、リアルタイムのマイク信号 FFT 処理と、ピーク周波数を決定するための他の処理を行いたいと考えています。
問題は、EZmicrophone クラスが 512 サンプルでしか動作しないように見えることですが、私の信号には 8192 または 16384 サンプルの FFT が必要です。EZMicrophone でバッファー サイズを変更する方法はないようですが、ターゲット サイズの配列を作成してマイク バッファーを追加し、いっぱいになったら FFT を実行することを推奨する投稿を読みました。
ただし、これを行うと、データのないメモリの大きなチャンク、またはコピーされたメモリのセグメント間の不連続が発生します。マイクデリゲートが呼び出されているタイミングや順序、または別のスレッドでメモリが上書きされていることに関係している可能性があると思います...ここでストローをつかんでいます。マイク バッファが新しい 512 サンプルでいっぱいになるたびに、このコードが実行されていると仮定するのは正しいですか?
誰かが私が間違っているかもしれないことを提案できますか? 私はこれに長い間立ち往生してきました。
これは私が参照として使用している投稿です: EZAudio: バッファサイズをFFTウィンドウサイズからどのように分離しますか(より高い周波数ビン解像度が必要です)。
// 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];
}
});
}