[英]AudioBufferList to float ** conversion EZAudio EZMicrophone for Visual Plotting
[英]How do I increase the size of EZAudio EZMicrophone?
我想使用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];
}
});
}
您可能遇到線程問題,因為您嘗試在某些塊中進行工作,而這需要比音頻回調之間的時間長得多的時間。 在先前的調用可以說完成之前(使用FFT設置或清除FFT緩沖區),將反復調用您的代碼。
在開始記錄之前,請嘗試在回調外部進行FFT設置,僅復制到回調內部的循環緩沖區或FIFO,然后將代碼中的FFT與回調異步進行(不與循環緩沖區復制鎖定在同一塊中)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.