| 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> |