使用Apple FFT和加速框架

时间:2010-08-03 16:48:58

标签: iphone audio signal-processing fft accelerate-framework

是否有人使用Apple FFT作为iPhone应用程序,或者知道我在哪里可以找到如何使用它的示例应用程序?我知道Apple发布了一些示例代码,但我不确定如何将其实现到实际项目中。

4 个答案:

答案 0 :(得分:133)

答案 1 :(得分:26)

这是一个真实的例子:一个c ++片段,它使用Accelerate的vDSP fft例程在Remote IO音频单元的输入上进行自相关。使用这个框架非常复杂,但文档不是坏。

OSStatus DSPCore::initialize (double _sampleRate, uint16_t _bufferSize) {
    sampleRate = _sampleRate;
    bufferSize = _bufferSize;
    peakIndex = 0;
    frequency = 0.f;
    uint32_t maxFrames = getMaxFramesPerSlice();
    displayData = (float*)malloc(maxFrames*sizeof(float));
    bzero(displayData, maxFrames*sizeof(float));
    log2n = log2f(maxFrames);
    n = 1 << log2n;
    assert(n == maxFrames);
    nOver2 = maxFrames/2;
    A.realp = (float*)malloc(nOver2 * sizeof(float));
    A.imagp = (float*)malloc(nOver2 * sizeof(float));
    FFTSetup fftSetup = vDSP_create_fftsetup(log2n, FFT_RADIX2);

    return noErr;
}

void DSPCore::Render(uint32_t numFrames, AudioBufferList *ioData) {

    bufferSize = numFrames;
    float ln = log2f(numFrames);

    //vDSP autocorrelation

    //convert real input to even-odd
    vDSP_ctoz((COMPLEX*)ioData->mBuffers[0].mData, 2, &A, 1, numFrames/2);
    memset(ioData->mBuffers[0].mData, 0, ioData->mBuffers[0].mDataByteSize);
    //fft
    vDSP_fft_zrip(fftSetup, &A, 1, ln, FFT_FORWARD);

    // Absolute square (equivalent to mag^2)
    vDSP_zvmags(&A, 1, A.realp, 1, numFrames/2);
    bzero(A.imagp, (numFrames/2) * sizeof(float));    

    // Inverse FFT
    vDSP_fft_zrip(fftSetup, &A, 1, ln, FFT_INVERSE);

    //convert complex split to real
    vDSP_ztoc(&A, 1, (COMPLEX*)displayData, 2, numFrames/2);

    // Normalize
    float scale = 1.f/displayData[0];
    vDSP_vsmul(displayData, 1, &scale, displayData, 1, numFrames);

    // Naive peak-pick: find the first local maximum
    peakIndex = 0;
    for (size_t ii=1; ii < numFrames-1; ++ii) {
        if ((displayData[ii] > displayData[ii-1]) && (displayData[ii] > displayData[ii+1])) {
            peakIndex = ii;
            break;
        }
    }

    // Calculate frequency
    frequency = sampleRate / peakIndex + quadInterpolate(&displayData[peakIndex-1]);

    bufferSize = numFrames;

    for (int ii=0; ii<ioData->mNumberBuffers; ++ii) {
        bzero(ioData->mBuffers[ii].mData, ioData->mBuffers[ii].mDataByteSize);
    }
}

答案 2 :(得分:13)

虽然我会说Apple的FFT框架很快......你需要知道FFT是如何工作的,以便获得准确的音高检测(即计算每个连续FFT的相位差,以便找到精确的音高,而不是最主导的垃圾箱。)

我不知道是否有任何帮助,但我从我的调谐器应用程序(musicianskit.com/developer.php)上传了我的Pitch Detector对象。还有一个用于下载的xCode 4项目示例(因此您可以看到实现的工作原理)。

我正在努力上传一个示例FFT实现 - 所以请继续关注,一旦发生这种情况我会更新。

快乐的编码!

答案 3 :(得分:4)

这是另一个现实世界的例子: https://github.com/krafter/DetectingAudioFrequency