Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>Here's a real-world example: A snippet of c++ that uses Accelerate's vDSP fft routines to do autocorrelation on the Remote IO audio unit's input. Using this framework is pretty complicated, but the documentation isn't <em>too</em> bad.</p> <pre><code>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 &lt;&lt; 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-&gt;mBuffers[0].mData, 2, &amp;A, 1, numFrames/2); memset(ioData-&gt;mBuffers[0].mData, 0, ioData-&gt;mBuffers[0].mDataByteSize); //fft vDSP_fft_zrip(fftSetup, &amp;A, 1, ln, FFT_FORWARD); // Absolute square (equivalent to mag^2) vDSP_zvmags(&amp;A, 1, A.realp, 1, numFrames/2); bzero(A.imagp, (numFrames/2) * sizeof(float)); // Inverse FFT vDSP_fft_zrip(fftSetup, &amp;A, 1, ln, FFT_INVERSE); //convert complex split to real vDSP_ztoc(&amp;A, 1, (COMPLEX*)displayData, 2, numFrames/2); // Normalize float scale = 1.f/displayData[0]; vDSP_vsmul(displayData, 1, &amp;scale, displayData, 1, numFrames); // Naive peak-pick: find the first local maximum peakIndex = 0; for (size_t ii=1; ii &lt; numFrames-1; ++ii) { if ((displayData[ii] &gt; displayData[ii-1]) &amp;&amp; (displayData[ii] &gt; displayData[ii+1])) { peakIndex = ii; break; } } // Calculate frequency frequency = sampleRate / peakIndex + quadInterpolate(&amp;displayData[peakIndex-1]); bufferSize = numFrames; for (int ii=0; ii&lt;ioData-&gt;mNumberBuffers; ++ii) { bzero(ioData-&gt;mBuffers[ii].mData, ioData-&gt;mBuffers[ii].mDataByteSize); } } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload