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