120 lines
4.3 KiB
HTML
120 lines
4.3 KiB
HTML
<html devsite>
|
|
<head>
|
|
<title>Sample Rate Conversion</title>
|
|
<meta name="project_path" value="/_project.yaml" />
|
|
<meta name="book_path" value="/_book.yaml" />
|
|
</head>
|
|
<body>
|
|
<!--
|
|
Copyright 2017 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.
|
|
-->
|
|
|
|
|
|
|
|
<h2 id="srcIntro">Introduction</h2>
|
|
|
|
<p>
|
|
See the Wikipedia article
|
|
<a href="http://en.wikipedia.org/wiki/Resampling_(audio)">Resampling (audio)</a>
|
|
for a generic definition of sample rate conversion, also known as "resampling."
|
|
The remainder of this article describes resampling within Android.
|
|
See <a href="terminology.html#srcTerms">Sample Rate Conversion</a> for related terminology.
|
|
</p>
|
|
|
|
<p>
|
|
Sample rate conversion is the process of changing a
|
|
stream of discrete samples at one sample rate to another stream at
|
|
another sample rate. A sample rate converter, or resampler, is a module
|
|
that implements sample rate conversion. With respect to the resampler,
|
|
the original stream is called the source signal, and the resampled stream is
|
|
the sink signal.
|
|
</p>
|
|
|
|
<p>
|
|
Resamplers are used in several places in Android.
|
|
For example, an MP3 file may be encoded at 44.1 kHz sample rate and
|
|
needs to be played back on an Android device supporting 48 kHz audio
|
|
internally. In that case, a resampler would be used to upsample the MP3
|
|
output audio from 44.1 kHz source sample rate to a 48 kHz sink sample rate
|
|
used within the Android device.
|
|
</p>
|
|
|
|
<p>
|
|
The characteristics of a resampler can be expressed using metrics, including:
|
|
</p>
|
|
|
|
<ul>
|
|
<li>degree of preservation of the overall amplitude of the signal</li>
|
|
<li>degree of preservation of the frequency bandwidth of the signal,
|
|
subject to limitations of the sink sample rate</li>
|
|
<li>overall latency through the resampler</li>
|
|
<li>consistent phase and group delay with respect to frequency</li>
|
|
<li>computational complexity, expressed in CPU cycles or power draw</li>
|
|
<li>permitted ratios of source and sink sample rates</li>
|
|
<li>ability to dynamically change sample rate ratios</li>
|
|
<li>which digital audio sample formats are supported</li>
|
|
</ul>
|
|
|
|
<p>
|
|
The ideal resampler would exactly preserve the source signal's amplitude
|
|
and frequency bandwidth (subject to limitations of the sink
|
|
sample rate), have minimal and consistent delay, have minimal
|
|
computational complexity, permit arbitrary and dynamic conversion ratios,
|
|
and support all common digital audio sample formats.
|
|
In practice, ideal resamplers do not exist, and actual resamplers are
|
|
a compromise among these characteristics.
|
|
For example, the goals of ideal quality conflict with short delay and low complexity.
|
|
</p>
|
|
|
|
<p>
|
|
Android includes a variety of audio resamplers, so that appropriate
|
|
compromises can be made depending on the application use case and load.
|
|
Section <a href="#srcResamplers">Resampler implementations</a>
|
|
below lists the available resamplers, summarizes their characteristics,
|
|
and identifies where they should typically be used.
|
|
</p>
|
|
|
|
<h2 id="srcResamplers">Resampler implementations</h2>
|
|
|
|
<p>
|
|
Available resampler implementations change frequently,
|
|
and may be customized by OEMs.
|
|
As of Android 4.4, the default resamplers
|
|
in descending order of signal distortion, and ascending order of
|
|
computational complexity include:
|
|
</p>
|
|
|
|
<ul>
|
|
<li>linear</li>
|
|
<li>cubic</li>
|
|
<li>sinc with original coefficients</li>
|
|
<li>sinc with revised coefficients</li>
|
|
</ul>
|
|
|
|
<p>
|
|
In general, the sinc resamplers are more appropriate for higher-quality
|
|
music playback, and the other resamplers should be reserved for cases
|
|
where quality is less important (an example might be "key clicks" or similar).
|
|
</p>
|
|
|
|
<p>
|
|
The specific resampler implementation selected depends on
|
|
the use case, load, and the value of system property
|
|
<code>af.resampler.quality</code>. For details,
|
|
consult the audio resampler source code in AudioFlinger.
|
|
</p>
|
|
|
|
</body>
|
|
</html>
|