page.title=Floating-Point Audio @jd:body <div id="qv-wrapper"> <div id="qv"> <h2>On this page</h2> <ol> <li><a href="#best">Best Practices for Floating-Point Audio</a></li> <li><a href="#support">Floating-Point Audio in Android SDK</a></li> <li><a href="#more">For More Information</a></li> </ol> </div> </div> <a href="https://www.youtube.com/watch?v=sIcieUqMml8" class="notice-developers-video"> <div> <h3>Video</h3> <p>Will it Float? The Glory and Shame of Floating-Point Audio</p> </div> </a> <p>Using floating-point numbers to represent audio data can significantly enhance audio quality in high-performance audio applications. Floating point offers the following advantages:</p> <ul> <li>Wider dynamic range.</li> <li>Consistent accuracy across the dynamic range.</li> <li>More headroom to avoid clipping during intermediate calculations and transients.</li> </ul> <p>While floating-point can enhance audio quality, it does present certain disadvantages:</p> <ul> <li>Floating-point numbers use more memory.</li> <li>Floating-point operations employ unexpected properties, for example, addition is not associative.</li> <li>Floating-point calculations can sometimes lose arithmetic precision due to rounding or numerically unstable algorithms.</li> <li>Using floating-point effectively requires greater understanding to achieve accurate and reproducible results.</li> </ul> <p> Formerly, floating-point was notorious for being unavailable or slow. This is still true for low-end and embedded processors. But processors on modern mobile devices now have hardware floating-point with performance that is similar (or in some cases even faster) than integer. Modern CPUs also support <a href="http://en.wikipedia.org/wiki/SIMD" class="external-link">SIMD</a> (Single instruction, multiple data), which can improve performance further. </p> <h2 id="best">Best Practices for Floating-Point Audio</h2> <p>The following best practices help you avoid problems with floating-point calculations:</p> <ul> <li>Use double precision floating-point for infrequent calculations, such as computing filter coefficients.</li> <li>Pay attention to the order of operations.</li> <li>Declare explicit variables for intermediate values.</li> <li>Use parentheses liberally.</li> <li>If you get a NaN or infinity result, use binary search to discover where it was introduced.</li> </ul> <h2 id="support">Floating-Point Audio in Android SDK</h2> <p>For floating-point audio, the audio format encoding <code>AudioFormat.ENCODING_PCM_FLOAT</code> is used similarly to <code>ENCODING_PCM_16_BIT</code> or <code>ENCODING_PCM_8_BIT</code> for specifying AudioTrack data formats. The corresponding overloaded method <code>AudioTrack.write()</code> takes in a float array to deliver data.</p> <pre> public int write(float[] audioData, int offsetInFloats, int sizeInFloats, int writeMode) </pre> <h2 id="more">For More Information</h2> <p>The following Wikipedia pages are helpful in understanding floating-point audio:</p> <ul> <li><a href="http://en.wikipedia.org/wiki/Audio_bit_depth" class="external-link" >Audio bit depth</a></li> <li><a href="http://en.wikipedia.org/wiki/Floating_point" class="external-link" >Floating point</a></li> <li><a href="http://en.wikipedia.org/wiki/IEEE_floating_point" class="external-link" >IEEE 754 floating-point</a></li> <li><a href="http://en.wikipedia.org/wiki/Loss_of_significance" class="external-link" >Loss of significance</a> (catastrophic cancellation)</li> <li><a href="https://en.wikipedia.org/wiki/Numerical_stability" class="external-link" >Numerical stability</a></li> </ul> <p>The following article provides information on those aspects of floating-point that have a direct impact on designers of computer systems:</p> <ul> <li><a href="http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html" class="external-link" >What every computer scientist should know about floating-point arithmetic</a> by David Goldberg, Xerox PARC (edited reprint).</li> </ul>