首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何增加EZAudio EZMicrophone的大小?

如何增加EZAudio EZMicrophone的大小?
EN

Stack Overflow用户
提问于 2015-04-24 23:22:07
回答 1查看 530关注 0票数 0

我想使用EZAudio框架来做实时麦克风信号的快速傅立叶变换处理,以及一些其他的处理,以便确定峰值频率。

问题是,EZmicrophone类似乎只对512个样本起作用,然而,我的信号需要8192个甚至16384个样本。在EZMicrophone中似乎没有改变缓冲区大小的方法,但我读过一些帖子,建议创建一个与目标大小相同的数组,并将麦克风缓冲区附加到该数组中,然后当该数组已满时,执行快速傅立叶变换。

但是,当我这样做时,我得到了大量没有数据的内存块,或者复制的内存段之间不连续。我认为这可能与麦克风委托被调用的时间或顺序有关,或者内存在不同的线程中被覆盖……我在这里抓住了救命稻草。我假设每次麦克风缓冲区充满新的512个样本时都会执行此代码,对吗?

有没有人能建议我可能做错了什么?我已经被困在这件事上很久了。

这是我一直用作参考的帖子:EZAudio: How do you separate the buffersize from the FFT window size(desire higher frequency bin resolution).

代码语言:javascript
复制
// 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];
        }

    });

}
EN

回答 1

Stack Overflow用户

发布于 2015-04-25 00:17:43

您可能会遇到线程问题,因为您正在尝试在某些块中执行工作,而这些工作所需的时间要比音频回调之间的时间长得多。在前面的调用可以表明它们已经完成之前,您的代码正在被重复调用(通过FFT设置或清除FFT缓冲区)。

在开始录制之前,尝试在回调外部执行FFT设置,仅复制到回调内的循环缓冲区或FIFO,并在代码中与回调异步执行FFT (未锁定在与循环缓冲区复制相同的块中)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29851382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档