| page.title=Audio Latency Measurements |
| @jd:body |
| |
| <!-- |
| Copyright 2015 The Android Open Source Project |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| --> |
| <div id="qv-wrapper"> |
| <div id="qv"> |
| <h2>In this document</h2> |
| <ol id="auto-toc"> |
| </ol> |
| </div> |
| </div> |
| |
| <p> |
| This article gives round-trip audio latency measurements for select devices and |
| platform versions. |
| </p> |
| |
| <h2 id="definition">Definition</h2> |
| |
| <p> |
| <a href="http://en.wikipedia.org/wiki/Latency_%28engineering%29">Latency</a> |
| is an important system performance metric. There are many kinds |
| of <a href="latency.html">audio latency</a> |
| metrics. One useful and well-understood metric is |
| <a href="latency_measure.html#measuringRoundTrip">round-trip latency</a>. |
| Round-trip latency is defined as the time it takes for |
| an audio signal to enter the input of a mobile device, be processed |
| by an app running on the application processor, and exit the output. |
| </p> |
| |
| <img src="images/round_trip_on_device.png" alt="Round-trip audio latency on device" id="figure1" /> |
| <p class="img-caption"> |
| <strong>Figure 1.</strong> Round-trip audio latency on device: T<sub>output</sub> - T<sub>input</sub> |
| </p> |
| |
| <h2 id="why">Why we measure latency</h2> |
| |
| <p> |
| We measure and report latency so Android |
| app developers will have the data they need to make informed decisions about available |
| latency on actual devices. By sharing these numbers for select Nexus devices, we also hope to |
| encourage the entire Android community to measure, publish, and reduce |
| latency on <i>all</i> devices. |
| Please join us in our commitment to reducing audio latency. |
| </p> |
| |
| <h2 id="app">Application impact on latency</h2> |
| |
| <p> |
| There are two kinds of delays that a signal processing stage can add to latency: |
| algorithmic delay and computational delay. |
| Algorithmic delay is inherent and does not vary with the CPU. |
| An example is the delay added by a |
| <a href="http://en.wikipedia.org/wiki/Finite_impulse_response">finite impulse response</a> |
| (FIR) filter. |
| Computational delay is related to the number of CPU cycles required. |
| For example, attenuation of a signal is usually done by a multiplication operation, |
| and this multiplication will take a varying number of cycles depending on the CPU. |
| </p> |
| |
| <h2 id="how">How we measure</h2> |
| |
| <p> |
| The measurements below were taken with the |
| <a href="loopback.html">Dr. Rick O’Rang audio loopback dongle</a> |
| and an |
| <a href="latency_measure.html#larsenTest">audio feedback (Larsen effect) test</a>. |
| </p> |
| |
| <p> |
| For our measurements, we assume the application signal processing |
| adds zero algorithmic delay and near zero computational delay. |
| </p> |
| |
| <p> |
| We measure round-trip latency via the headset connector for several reasons: |
| </p> |
| <ul> |
| <li> |
| There are important music applications, such as guitar and voice processing, |
| that use the headset connector. |
| </li> |
| <li> |
| Measuring round-trip latency of the on-device microphone and speaker can |
| be cumbersome, as it is difficult to keep a feedback loop in open air from entering |
| uncontrolled oscillation. |
| </li> |
| <li> |
| The on-device transducers are small and sacrifice frequency response |
| to achieve their small size. To compensate, digital signal processing is |
| applied but increases algorithmic delay for the on-device path. |
| </li> |
| </ul> |
| |
| <p> |
| There are cases where on-device microphone and speaker latencies |
| <i>do</i> |
| matter, but they are usually for one direction, not round-trip. |
| Techniques for measuring unidirectional latency are described at |
| <a href="latency_measure.html#measuringOutput">Measuring Output Latency</a> |
| and |
| <a href="latency_measure.html#measuringInput">Measuring Input Latency</a>. |
| </p> |
| |
| <img src="images/round_trip_via_headset_connector.png" alt="Round-trip latency via headset connector" id="figure2" /> |
| <p class="img-caption"> |
| <strong>Figure 2.</strong> Round-trip latency via headset connector: T<sub>output</sub> - T<sub>input</sub> |
| </p> |
| |
| <h2 id="measurements">Example measurements</h2> |
| |
| <p> |
| The measurements shown are specific to a |
| <a href="{@docRoot}source/build-numbers.html">build number</a>. |
| Devices are listed in approximate order of initial release and within device by platform version. |
| The test application uses the Android native audio API based on OpenSL ES. |
| </p> |
| |
| <table> |
| <tr> |
| <th>Model</th> |
| <th>Platform<br />version</th> |
| <th>Build<br />number</th> |
| <th>Sample rate<br />(Hz)</th> |
| <th>Buffer size<br />(frames)</th> |
| <th>Buffer size<br />(ms)</th> |
| <th>Round-trip<br />latency (ms)<br />± one buffer</th> |
| </tr> |
| |
| <tr> |
| <td>Nexus One</td> |
| <td>2.3.6</td> |
| <td>GRK39F</td> |
| <td>44100</td> |
| <td>768</td> |
| <td>17.4</td> |
| <td>345</td> |
| </tr> |
| |
| <tr> |
| <td>Nexus S</td> |
| <td>2.3.6</td> |
| <td>GRK39F</td> |
| <td>44100</td> |
| <td>1024</td> |
| <td>23.2</td> |
| <td>260</td> |
| </tr> |
| |
| <tr> |
| <td>Nexus S</td> |
| <td>4.0.4</td> |
| <td>IMM76D</td> |
| <td>44100</td> |
| <td>1024</td> |
| <td>23.2</td> |
| <td>260</td> |
| </tr> |
| |
| <tr> |
| <td>Nexus S</td> |
| <td>4.1.2</td> |
| <td>JZO54K</td> |
| <td>44100</td> |
| <td>880</td> |
| <td>20</td> |
| <td>210</td> |
| </tr> |
| |
| <tr> |
| <td>Galaxy Nexus</td> |
| <td>4.0.1</td> |
| <td>ITL41D</td> |
| <td>44100</td> |
| <td>976</td> |
| <td>22.1</td> |
| <td>270</td> |
| </tr> |
| |
| <tr> |
| <td>Galaxy Nexus</td> |
| <td>4.3</td> |
| <td>JWR66Y</td> |
| <td>44100</td> |
| <td>144</td> |
| <td>3.3</td> |
| <td>130</td> |
| </tr> |
| |
| <tr> |
| <td>Nexus 4</td> |
| <td>4.2.2</td> |
| <td>JDQ39E</td> |
| <td>48000</td> |
| <td>240</td> |
| <td>5</td> |
| <td>195</td> |
| </tr> |
| |
| <tr> |
| <td>Nexus 4</td> |
| <td>5.1</td> |
| <td>LMY47R</td> |
| <td>48000</td> |
| <td>240</td> |
| <td>5</td> |
| <td>58</td> |
| </tr> |
| |
| <tr> |
| <td>Nexus 10</td> |
| <td>5.0.2</td> |
| <td>LRX22G</td> |
| <td>44100</td> |
| <td>256</td> |
| <td>5.8</td> |
| <td>36</td> |
| </tr> |
| |
| <tr> |
| <td>Nexus 10</td> |
| <td>5.1</td> |
| <td>LMY47D</td> |
| <td>44100</td> |
| <td>256</td> |
| <td>5.8</td> |
| <td>35</td> |
| </tr> |
| |
| <tr> |
| <td>Nexus 7<br />2013</td> |
| <td>4.3</td> |
| <td>JSR78D</td> |
| <td>48000</td> |
| <td>240</td> |
| <td>5</td> |
| <td>149</td> |
| </tr> |
| |
| <tr> |
| <td>Nexus 7<br />2013</td> |
| <td>4.4</td> |
| <td>KRT16S</td> |
| <td>48000</td> |
| <td>240</td> |
| <td>5</td> |
| <td>85</td> |
| </tr> |
| |
| <tr> |
| <td>Nexus 7<br />2013</td> |
| <td>5.0.2</td> |
| <td>LRX22G</td> |
| <td>48000</td> |
| <td>240</td> |
| <td>5</td> |
| <td>64</td> |
| </tr> |
| |
| <tr> |
| <td>Nexus 7<br />2013</td> |
| <td>5.1.1</td> |
| <td>LMY47W</td> |
| <td>48000</td> |
| <td>240</td> |
| <td>5</td> |
| <td>55</td> |
| </tr> |
| |
| <tr> |
| <td>Nexus 5</td> |
| <td>4.4.4</td> |
| <td>KTU84P</td> |
| <td>48000</td> |
| <td>240</td> |
| <td>5</td> |
| <td>95</td> |
| </tr> |
| |
| <tr> |
| <td>Nexus 5</td> |
| <td>5.0.0_r3.0.1</td> |
| <td>LRX21O</td> |
| <td>48000</td> |
| <td>240</td> |
| <td>5</td> |
| <td>47</td> |
| </tr> |
| |
| <tr> |
| <td>Nexus 5</td> |
| <td>5.1</td> |
| <td>LMY47M</td> |
| <td>48000</td> |
| <td>240</td> |
| <td>5</td> |
| <td>42</td> |
| </tr> |
| |
| <tr> |
| <td>Nexus 9</td> |
| <td>5.0.0</td> |
| <td>LRX21L</td> |
| <td>48000</td> |
| <td>256</td> |
| <td>5.3</td> |
| <td>35</td> |
| </tr> |
| |
| <tr> |
| <td>Nexus 9</td> |
| <td>5.0.1</td> |
| <td>LRX22C</td> |
| <td>48000</td> |
| <td>256</td> |
| <td>5.3</td> |
| <td>38</td> |
| </tr> |
| |
| <tr> |
| <td>Nexus 9</td> |
| <td>5.1.1</td> |
| <td>LMY47S</td> |
| <td>48000</td> |
| <td>256</td> |
| <td>5.3</td> |
| <td>32</td> |
| </tr> |
| |
| <tr> |
| <td>Nexus 6</td> |
| <td>5.0.1</td> |
| <td>LRX22C</td> |
| <td>48000</td> |
| <td>240</td> |
| <td>5</td> |
| <td>65</td> |
| </tr> |
| |
| <tr> |
| <td>Nexus 6</td> |
| <td>5.1</td> |
| <td>LMY47I</td> |
| <td>48000</td> |
| <td>240</td> |
| <td>5</td> |
| <td>42</td> |
| </tr> |
| |
| </table> |
| |
| <img src="images/round_trip_bar_graph.png" alt="Round-trip latency bar graph" id="figure3" /> |
| <p class="img-caption"> |
| <strong>Figure 3.</strong> Round-trip latency bar graph |
| </p> |