blob: 3e0906b4028915fb5099344758542739a696fced [file] [log] [blame]
#LyX 1.3 created this file. For more info see http://www.lyx.org/
\lyxformat 221
\textclass article
\language english
\inputencoding auto
\fontscheme default
\graphics default
\float_placement h
\paperfontsize default
\spacing single
\papersize Default
\paperpackage a4
\use_geometry 0
\use_amsmath 0
\use_natbib 0
\use_numerical_citations 0
\paperorientation portrait
\secnumdepth 3
\tocdepth 3
\paragraph_separation indent
\defskip medskip
\quotes_language english
\quotes_times 2
\papercolumns 1
\papersides 1
\paperpagestyle headings
\layout Title
The Speex Codec Manual
\newline
(version 1.0)
\layout Author
Jean-Marc Valin
\layout Standard
\pagebreak_top
Copyright (c) 2002-2003 Jean-Marc Valin.
\layout Standard
Permission is granted to copy, distribute and/or modify this document under
the terms of the GNU Free Documentation License, Version 1.1 or any later
version published by the Free Software Foundation; with no Invariant Section,
with no Front-Cover Texts, and with no Back-Cover.
A copy of the license is included in the section entitled "GNU Free Documentati
on License".
\layout Standard
\pagebreak_top \pagebreak_bottom
\begin_inset LatexCommand \tableofcontents{}
\end_inset
\layout Standard
\pagebreak_bottom
\begin_inset FloatList table
\end_inset
\layout Section
Introduction to Speex
\layout Standard
The Speex project (
\family typewriter
http://www.speex.org/
\family default
) has been started because there was a need for a speech codec that was
open-source and free from software patents.
These are essential conditions for being used by any open-source software.
There is already Vorbis that does general audio, but it is not really suitable
for speech.
Also, unlike many other speech codecs, Speex is not targeted at cell phones
(not many open-source cell phones anyway :-) ) but rather voice over IP
(VoIP) and file-based compression.
\layout Standard
As design goals, we wanted to have a codec that would allowed both very
good quality speech and low bit-rate (unfortunately not at the same time!),
which led us to developing a codec with multiple bit-rates.
Of course very good quality also meant we had to do wideband (16 kHz sampling
rate) in addition to narrowband (telephone quality, 8 kHz sampling rate).
\layout Standard
Designing for VoIP instead of cell phone use means that Speex must be robust
to lost packets, but not to corrupted ones since packets either arrive
unaltered or don't arrive at all.
Also, the idea was to have a reasonnable complexity and memory requirement
without compromising too much on the efficiency of the codec.
\layout Standard
All this led us to the choice of CELP
\begin_inset LatexCommand \index{CELP}
\end_inset
as the encoding technique to use for Speex.
One of the main reasons is that CELP has long proved that it could do the
job and scale well to both low bit-rates (think DoD CELP @ 4.8 kbps) and
high bit-rates (think G.728 @ 16 kbps).
\layout Standard
The main characteristics can be summerized as follows:
\layout Itemize
Free software/open-source
\begin_inset LatexCommand \index{open-source}
\end_inset
, patent
\begin_inset LatexCommand \index{patent}
\end_inset
and royalty-free
\layout Itemize
Integration of narrowband
\begin_inset LatexCommand \index{narrowband}
\end_inset
and wideband
\begin_inset LatexCommand \index{wideband}
\end_inset
in the same bit-stream
\layout Itemize
Wide range of bit-rates available (from 2 kbps to 44 kbps)
\layout Itemize
Dynamic bit-rate switching and Variable Bit-Rate
\begin_inset LatexCommand \index{variable bit-rate}
\end_inset
(VBR)
\layout Itemize
Voice Activity Detection
\begin_inset LatexCommand \index{voice activity detection}
\end_inset
(VAD, integrated with VBR)
\layout Itemize
Variable complexity
\begin_inset LatexCommand \index{complexity}
\end_inset
\layout Itemize
Ultra-wideband mode at 32 kHz (up to 48 kHz)
\layout Itemize
Intensity stereo encoding option
\layout Section
\pagebreak_top
Feature description
\layout Standard
This section explains the main Speex features, as well as some concepts
in speech coding that help better understand the next sections.
\layout Subsection*
Sampling rate
\begin_inset LatexCommand \index{sampling rate}
\end_inset
\layout Standard
Speex is mainly designed for 3 different sampling rates: 8 kHz, 16 kHz,
and 32 kHz.
These are respectively refered to as narrowband
\begin_inset LatexCommand \index{narrowband}
\end_inset
, wideband
\begin_inset LatexCommand \index{wideband}
\end_inset
and ultra-wideband
\begin_inset LatexCommand \index{ultra-wideband}
\end_inset
.
\layout Subsection*
Quality
\begin_inset LatexCommand \index{quality}
\end_inset
\layout Standard
Speex encoding is controlled most of the time by a quality parameter that
range from 0 to 10.
In constant bit-rate
\begin_inset LatexCommand \index{constant bit-rate}
\end_inset
(CBR) operation, the quality parameter is an integer, while for variable
bit-rate (VBR), the parameter is a float.
\layout Subsection*
Complexity
\begin_inset LatexCommand \index{complexity}
\end_inset
(variable)
\layout Standard
With Speex, it is possible to vary the complexity allowed for the encoder.
This is done by controlling how the search is performed with an integer
ranging from 1 to 10 in a way that's similar to the -1 to -9 options to
\emph on
gzip
\emph default
and
\emph on
bzip2
\emph default
compression utilities.
For normal use, the noise level at complexity 1is between 1 and 2 dB higher
than at complexity 10, but the CPU requirements for complexity 10 is about
5 time higher than for complexity 1.
In practice, the best trade-off is between complexity 2 and 4, though higher
settings are often useful when encoding non-speech sounds like DTMF
\begin_inset LatexCommand \index{DTMF}
\end_inset
tones.
\layout Subsection*
Variable Bit-Rate
\begin_inset LatexCommand \index{variable bit-rate}
\end_inset
(VBR)
\layout Standard
Variable bit-rate (VBR) allows a codec to change its bit-rate dynamically
to adapt to the
\begin_inset Quotes eld
\end_inset
difficulty
\begin_inset Quotes erd
\end_inset
of the audio being encoded.
In the example of Speex, sounds like vowels and high-energy transients
require a higher bit-rate to achieve good quality, while fricatives (e.g.
s,f sounds) can be coded adequately with less bits.
For this reason, VBR can achive lower bit-rate for the same quality, or
a better quality for a certain bit-rate.
Despite its advantages, VBR has two main drawbacks: first, by only specifying
quality, there's no guaranty about the final average bit-rate.
Second, for some real-time applications like voice over IP (VoIP), what
counts is the maximum bit-rate, which must be low enough for the communication
channel.
\layout Subsection*
Average Bit-Rate
\begin_inset LatexCommand \index{average bit-rate}
\end_inset
(ABR)
\layout Standard
Average bit-rate solves one of the problems of VBR, as it dynamically adjusts
VBR quality in order to meet a specific target bit-rate.
Because the quality/bit-rate is adjusted in real-time (open-loop), the
global quality will be slightly lower than that obtained be encoding in
VBR with exactly the right quality setting to meet the target average bit-rate.
\layout Subsection*
Voice Activity Detection
\begin_inset LatexCommand \index{voice activity detection}
\end_inset
(VAD)
\layout Standard
When enabled, voice activity detection detects whether the audio being encoded
is speech or silence/background noise.
VAD is always implicitly activated when encoding in VBR, so the option
is only useful in non-VBR operation.
In this case, Speex detects non-speech periods and encode them with just
enough bits to reproduce the background noise.
This is called
\begin_inset Quotes eld
\end_inset
comfort noise generation
\begin_inset Quotes erd
\end_inset
(CNG).
\layout Subsection*
Discontinuous Transmission
\begin_inset LatexCommand \index{discontinuous transmission}
\end_inset
(DTX)
\layout Standard
Discontinuous transmission is an addition to VAD operation, that allows
to stop transmitting completely when the background noise is stationnary.
In file-based operation, since we cannot just stop writing to the file,
only 5 bits are used for such frames (corresponding to 250 bps).
\layout Subsection*
Perceptual enhancement
\begin_inset LatexCommand \index{perceptual enhancement}
\end_inset
\layout Standard
Perceptual enhancement is a part of the decoder which, when turned on, tries
to reduce (the perception of) the noise produced by the coding/decoding
process.
In most cases, perceptual enhancement make the sound further from the original
\emph on
objectively
\emph default
(if you use SNR), but in the end it still
\emph on
sounds
\emph default
better (subjective improvement).
\layout Subsection*
Algorithmic delay
\begin_inset LatexCommand \index{algorithmic delay}
\end_inset
\layout Standard
Every speech codec introduces a delay in the transmission.
For Speex, this delay is equal to the frame size, plus some amount of
\begin_inset Quotes eld
\end_inset
look-ahead
\begin_inset Quotes erd
\end_inset
required to process each frame.
In narrowband operation (8 kHz), the delay is 30 ms, while for wideband
(16 kHz), the delay is 34 ms.
These values don't account for the CPU time it takes to encode or decode
the frames.
\layout Section
\pagebreak_top
Command-line encoder/decoder
\begin_inset LatexCommand \label{sec:Command-line-encoder/decoder}
\end_inset
\layout Standard
The base Speex distribution includes a command-line encoder (
\emph on
speexenc
\emph default
) and decoder (
\emph on
speexdec
\emph default
).
This section describes how to use these tools.
\layout Subsection
\emph on
speexenc
\begin_inset LatexCommand \index{speexenc}
\end_inset
\layout Standard
The
\emph on
speexenc
\emph default
utility is used to create Speex files from raw PCM or wave files.
It can be used by calling:
\layout LyX-Code
speexenc [options] input_file output_file
\layout Standard
The value '-' for input_file or output_file corresponds respectively to
stdin and stdout.
The valid options are:
\layout Description
--narrowband\SpecialChar ~
(-n) Tell Speex to treat the input as narrowband (8 kHz).
This is the default
\layout Description
--wideband\SpecialChar ~
(-w) Tell Speex to treat the input as wideband (16 kHz)
\layout Description
--ultra-wideband\SpecialChar ~
(-u) Tell Speex to treat the input as
\begin_inset Quotes eld
\end_inset
ultra-wideband
\begin_inset Quotes erd
\end_inset
(32 kHz)
\layout Description
--quality\SpecialChar ~
n Set the encoding quality (0-10), default is 8
\layout Description
--bitrate\SpecialChar ~
n Encoding bit-rate (use bit-rate n or lower)
\layout Description
--vbr Enable VBR (Variable Bit-Rate), disabled by default
\layout Description
--abr\SpecialChar ~
n Enable ABR (Average Bit-Rate) at n kbps, disabled by default
\layout Description
--vad Enable VAD (Voice Activity Detection), disabled by default
\layout Description
--dtx Enable DTX (Discontinuous Transmission), disabled by default
\layout Description
--nframes\SpecialChar ~
n Pack n frames in each Ogg packet (this saves space at low bit-rates)
\layout Description
--comp\SpecialChar ~
n Set encoding speed/quality tradeoff.
The higher the value of n, the slower the encoding (default is 3)
\layout Description
-V Verbose operation, print bit-rate currently in use
\layout Description
--help\SpecialChar ~
(-h) Print the help
\layout Description
--version\SpecialChar ~
(-v) Print version information
\layout Subsubsection*
Speex comments
\layout Description
--comment Add the given string as an extra comment.
This may be used multiple times.
\layout Description
--author Author of this track.
\layout Description
--title Title for this track.
\layout Subsubsection*
Raw input options
\layout Description
--rate\SpecialChar ~
n Sampling rate for raw input
\layout Description
--stereo Consider raw input as stereo
\layout Description
--le Raw input is little-endian
\layout Description
--be Raw input is big-endian
\layout Description
--8bit Raw input is 8-bit unsigned
\layout Description
--16bit Raw input is 16-bit signed
\layout Subsection
\emph on
speexdec
\begin_inset LatexCommand \index{speexdec}
\end_inset
\layout Standard
The
\emph on
speexdec
\emph default
utility is used to decode Speex files and can be used by calling:
\layout LyX-Code
speexdec [options] speex_file [output_file]
\layout Standard
The value '-' for input_file or output_file corresponds respectively to
stdin and stdout.
Also, when no output_file is specified, the file is played to the soundcard.
The valid options are:
\layout Description
--enh enable post-filter (default)
\layout Description
--no-enh disable post-filter
\layout Description
--force-nb Force decoding in narrowband
\layout Description
--force-wb Force decoding in wideband
\layout Description
--force-uwb Force decoding in ultra-wideband
\layout Description
--mono Force decoding in mono
\layout Description
--stereo Force decoding in stereo
\layout Description
--rate\SpecialChar ~
n For decoding at n Hz sampling rate
\layout Description
--packet-loss\SpecialChar ~
n Simulate n % random packet loss
\layout Description
-V Verbose operation, print bit-rate currently in use
\layout Description
--help\SpecialChar ~
(-h) Print the help
\layout Description
--version\SpecialChar ~
(-v) Print version information
\layout Section
\pagebreak_top
Programming with Speex (the libspeex
\begin_inset LatexCommand \index{libspeex}
\end_inset
API
\begin_inset LatexCommand \index{API}
\end_inset
)
\layout Standard
This section explains how to use the Speex API.
Examples of code can also be found in appendix
\begin_inset LatexCommand \ref{sec:Sample-code}
\end_inset
.
\layout Subsection
Encoding
\layout Standard
In order to encode speech using Speex, you first need to:
\layout LyX-Code
#include <speex.h>
\layout Standard
You then need to declare a Speex bit-packing struct
\layout LyX-Code
SpeexBits bits;
\layout Standard
and a Speex encoder state
\layout LyX-Code
void *enc_state;
\layout Standard
The two are initialized by:
\layout LyX-Code
speex_bits_init(&bits);
\layout LyX-Code
enc_state = speex_encoder_init(&speex_nb_mode);
\layout Standard
For wideband coding,
\emph on
speex_nb_mode
\emph default
will be replaced by
\emph on
speex_wb_mode
\emph default
.
In most cases, you will need to know the frame size used by the mode you
are using.
You can get that value in the
\emph on
frame_size
\emph default
variable with:
\layout LyX-Code
speex_encoder_ctl(enc_state,SPEEX_GET_FRAME_SIZE,&frame_size);
\layout Standard
Once the initialization is done, for every input frame:
\layout LyX-Code
speex_bits_reset(&bits);
\layout LyX-Code
speex_encode(enc_state, input_frame, &bits);
\layout LyX-Code
nbBytes = speex_bits_write(&bits, byte_ptr, MAX_NB_BYTES);
\layout Standard
where
\emph on
input_frame
\emph default
is a
\emph on
(float *)
\emph default
pointing to the beginning of a speech frame,
\emph on
byte_ptr
\emph default
is a
\emph on
(char *)
\emph default
where the encoded frame will be written,
\emph on
MAX_NB_BYTES
\emph default
is the maximum number of bytes that can be written to
\emph on
byte_ptr
\emph default
without causing an overflow and
\emph on
nbBytes
\emph default
is the number of bytes actually written to
\emph on
byte_ptr
\emph default
(the encoded size in bytes).
Before calling speex_bits_write, it is possible to find the number of bytes
that need to be written by calling
\family typewriter
speex_bits_nbytes(&bits)
\family default
, which returns a number of bytes.
\layout Standard
After you're done with the encoding, free all resources with:
\layout LyX-Code
speex_bits_destroy(&bits);
\layout LyX-Code
speex_encoder_destroy(enc_state);
\layout Standard
That's about it for the encoder.
\layout Subsection
Decoding
\layout Standard
In order to encode speech using Speex, you first need to:
\layout LyX-Code
#include <speex.h>
\layout Standard
You also need to declare a Speex bit-packing struct
\layout LyX-Code
SpeexBits bits;
\layout Standard
and a Speex encoder state
\layout LyX-Code
void *dec_state;
\layout Standard
The two are initialized by:
\layout LyX-Code
speex_bits_init(&bits);
\layout LyX-Code
dec_state = speex_decoder_init(&speex_nb_mode);
\layout Standard
For wideband decoding,
\emph on
speex_nb_mode
\emph default
will be replaced by
\emph on
speex_wb_mode
\emph default
.
If you need to obtain the size of the frames that will be used by the decoder,
you can get that value in the
\emph on
frame_size
\emph default
variable with:
\layout LyX-Code
speex_decoder_ctl(dec_state, SPEEX_GET_FRAME_SIZE, &frame_size);
\layout Standard
There is also a parameter that can be set for the decoder: whether or not
to use a perceptual post-filter.
This can be set by:
\layout LyX-Code
speex_decoder_ctl(dec_state, SPEEX_SET_ENH, &enh);
\layout Standard
where
\emph on
enh
\emph default
is an int that with value 0 to have the post-filter disabled and 1 to have
it enabled.
\layout Standard
Again, once the decoder initialization is done, for every input frame:
\layout LyX-Code
speex_bits_read_from(&bits, input_bytes, nbBytes);
\layout LyX-Code
speex_decode(st, &bits, output_frame);
\layout Standard
where input_bytes is a
\emph on
(char *)
\emph default
containing the bit-stream data received for a frame,
\emph on
nbBytes
\emph default
is the size (in bytes) of that bit-stream, and
\emph on
output_frame
\emph default
is a
\emph on
(float *)
\emph default
and points to the area where the decoded speech frame will be written.
A NULL value as the first argument indicates that we don't have the bits
for the current frame.
When a frame is lost, the Speex decoder will do its best to "guess" the
correct signal.
\layout Standard
After you're done with the decoding, free all resources with:
\layout LyX-Code
speex_bits_destroy(&bits);
\layout LyX-Code
speex_decoder_destroy(dec_state);
\layout Subsection
Codec Options (speex_*_ctl)
\layout Standard
The Speex encoder and decoder support many options and requests that can
be accessed through the
\emph on
speex_encoder_ctl
\emph default
and
\emph on
speex_decoder_ctl
\emph default
functions.
These functions are similar to the
\emph on
ioctl
\emph default
system call and their prototypes are:
\layout LyX-Code
void speex_encoder_ctl(void *encoder, int request, void *ptr);
\layout LyX-Code
void speex_decoder_ctl(void *encoder, int request, void *ptr);
\layout Standard
The different values of request allowed are (note that some only apply to
the encoder or the decoder):
\layout Description
SPEEX_SET_ENH** Set perceptual enhancer
\begin_inset LatexCommand \index{perceptual enhancement}
\end_inset
to on (1) or off (0) (integer)
\layout Description
SPEEX_GET_ENH** Get perceptual enhancer status (integer)
\layout Description
SPEEX_GET_FRAME_SIZE Get the frame size used for the current mode (integer)
\layout Description
SPEEX_SET_QUALITY* Set the encoder speech quality (integer 0 to 10)
\layout Description
SPEEX_GET_QUALITY* Get the current encoder speech quality (integer 0 to
10)
\layout Description
SPEEX_SET_MODE*
\begin_inset Formula $\dagger$
\end_inset
\layout Description
SPEEX_GET_MODE*
\begin_inset Formula $\dagger$
\end_inset
\layout Description
SPEEX_SET_LOW_MODE*
\begin_inset Formula $\dagger$
\end_inset
\layout Description
SPEEX_GET_LOW_MODE*
\begin_inset Formula $\dagger$
\end_inset
\layout Description
SPEEX_SET_HIGH_MODE*
\begin_inset Formula $\dagger$
\end_inset
\layout Description
SPEEX_GET_HIGH_MODE*
\begin_inset Formula $\dagger$
\end_inset
\layout Description
SPEEX_SET_VBR* Set variable bit-rate (VBR) to on (1) or off (0) (integer)
\layout Description
SPEEX_GET_VBR* Get variable bit-rate
\begin_inset LatexCommand \index{variable bit-rate}
\end_inset
(VBR) status (integer)
\layout Description
SPEEX_SET_VBR_QUALITY* Set the encoder VBR speech quality (float 0 to 10)
\layout Description
SPEEX_GET_VBR_QUALITY* Get the current encoder VBR speech quality (float
0 to 10)
\layout Description
SPEEX_SET_COMPLEXITY* Set the CPU resources allowed for the encoder (integer
1 to 10)
\layout Description
SPEEX_GET_COMPLEXITY* Get the CPU resources allowed for the encoder (integer
1 to 10)
\layout Description
SPEEX_SET_BITRATE* Set the bit-rate to use to the closest value not exceeding
the parameter (integer in bps)
\layout Description
SPEEX_GET_BITRATE Get the current bit-rate in use (integer in bps)
\layout Description
SPEEX_SET_SAMPLING_RATE Set real sampling rate (integer in Hz)
\layout Description
SPEEX_GET_SAMPLING_RATE Get real sampling rate (integer in Hz)
\layout Description
SPEEX_RESET_STATE Reset the encoder/decoder state to its original state
(zeros all memories)
\layout Description
SPEEX_SET_VAD* Set voice activity detection
\begin_inset LatexCommand \index{voice activity detection}
\end_inset
(VAD) to on (1) or off (0) (integer)
\layout Description
SPEEX_GET_VAD* Get voice activity detection (VAD) status (integer)
\layout Description
SPEEX_SET_DTX* Set discontinuous transmission
\begin_inset LatexCommand \index{discontinuous transmission}
\end_inset
(DTX) to on (1) or off (0) (integer)
\layout Description
SPEEX_GET_DTX* Get discontinuous transmission (DTX) status (integer)
\layout Description
SPEEX_SET_ABR* Set average bit-rate
\begin_inset LatexCommand \index{average bit-rate}
\end_inset
(ABR) to a value n in bits per second (integer in bps)
\layout Description
SPEEX_GET_ABR* Get average bit-rate (ABR) setting (integer in bps)
\layout Description
* applies only to the encoder
\layout Description
** applies only to the decoder
\layout Description
\begin_inset Formula $\dagger$
\end_inset
normally only used internally
\layout Subsection
Mode queries
\layout Standard
Speex modes have a querry system similar to the speex_encoder_ctl and speex_deco
der_ctl calls.
Since modes are read-only, it is only possible to get information about
a particular mode.
The function used to do that is:
\layout LyX-Code
void speex_mode_query(SpeexMode *mode, int request, void *ptr);
\layout Standard
The admissible values for request are (unless otherwise note, the values
are returned through
\emph on
ptr
\emph default
):
\layout Description
SPEEX_MODE_FRAME_SIZE Get the frame size (in samples) for the mode
\layout Description
SPEEX_SUBMODE_BITRATE Get the bit-rate for a submode number specified throught
\emph on
ptr
\emph default
(integer in bps).
\layout Subsection
Packing and in-band signalling
\begin_inset LatexCommand \index{in-band signalling}
\end_inset
\layout Standard
Sometimes it is desirable to pack more than one frame per packet (or other
basic unit of storage).
The proper way to do it is to call speex_encode
\begin_inset Formula $N$
\end_inset
times before writing the stream with speex_bits_write.
In cases where the number of frames is not determined by an out-of-band
mechanism, it is possible to include a terminator code.
That terminator consists of the code 15 (decimal) encoded with 5 bits,
as shown in figure
\begin_inset LatexCommand \ref{cap:quality_vs_bps}
\end_inset
.
\layout Standard
It is also possible to send in-band
\begin_inset Quotes eld
\end_inset
messages
\begin_inset Quotes erd
\end_inset
to the other side.
All these messages are encoded as a
\begin_inset Quotes eld
\end_inset
pseudo-frame
\begin_inset Quotes erd
\end_inset
of mode 14 which contain a 4-bit message type code, followed by the message.
Table
\begin_inset LatexCommand \ref{cap:In-band-signalling-codes}
\end_inset
lists the available codes, their meaning and the size of the message that
follow.
Most of these messages are requests that are sent to the encoder or decoder
on the other end, which is free to comply or ignore them.
By default, all in-band messages are ignored.
\layout Standard
\begin_inset Float table
placement htbp
wide false
collapsed false
\layout Standard
\begin_inset Tabular
<lyxtabular version="3" rows="17" columns="3">
<features>
<column alignment="center" valignment="top" leftline="true" width="0pt">
<column alignment="center" valignment="top" leftline="true" width="0pt">
<column alignment="center" valignment="top" leftline="true" rightline="true" width="0pt">
<row topline="true" bottomline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
code
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
Size (bits)
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
Content
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
0
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
1
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
Asks decoder to set perceptual enhancement off (0) or on(1)
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
1
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
1
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
reserved
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
2
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
4
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
Asks encoder to switch to mode N
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
3
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
4
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
Asks encoder to switch to mode N for low-band
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
4
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
4
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
Asks encoder to switch to mode N for high-band
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
5
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
4
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
Asks encoder to switch to quality N for VBR
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
6
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
4
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
Request acknowloedge (0=no, 1=all, 2=only for in-band data)
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
7
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
4
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
Asks encoder to set CBR (0), VAD(1), DTX(3), VBR(5), VBR+DTX(7)
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
8
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
8
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
Transmit (8-bit) character to the other end
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
9
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
8
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
Intensity stereo information
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
10
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
16
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
Announce maximum bit-rate acceptable (N in bytes/second)
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
11
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
16
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
reserved
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
12
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
32
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
Acknowledge receiving packet N
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
13
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
32
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
reserved
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
14
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
64
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
reserved
\end_inset
</cell>
</row>
<row topline="true" bottomline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
15
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
64
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
reserved
\end_inset
</cell>
</row>
</lyxtabular>
\end_inset
\layout Caption
In-band signalling codes
\begin_inset LatexCommand \label{cap:In-band-signalling-codes}
\end_inset
\end_inset
\layout Standard
Finally, applications may define custom in-band messages using mode 13.
The size of the message in bytes is encoded with 5 bits, so that the decoder
can skip it if it doesn't know how to interpret it.
\layout Section
\pagebreak_top
Formats and standards
\begin_inset LatexCommand \index{standards}
\end_inset
\layout Standard
Speex can encode speech in both narrowband and wideband and provides different
bit-rates.
However not all features must be supported by a certain implementation
or device.
In order to be said
\begin_inset Quotes eld
\end_inset
Speex compatible
\begin_inset Quotes erd
\end_inset
(whatever that means), an implementation must implement at least a basic
set of features.
\layout Standard
At the minimum, all narrowband modes of operation MUST be supported at the
decoder.
This includes the decoding of a wideband bit-stream by the narrowband decoder
\begin_inset Foot
collapsed true
\layout Standard
The wideband bit-stream contains an embedded narrowband bit-stream which
can be decoded alone
\end_inset
.
If present, a wideband decoder MUST be able to decode a narrowband stream,
and MAY either be able to decode all wideband modes or be able to decode
the embedded narrowband part of all modes (which includes ignoring the
high-band bits).
\layout Standard
For encoders, at least one narrowband or wideband mode MUST be supported.
The main reason why all encoding modes do not have to be supported is that
some platforms may not be able to handle the complexity of encoding in
some modes.
\layout Subsection
RTP
\begin_inset LatexCommand \index{RTP}
\end_inset
Payload Format
\layout Standard
The RTP payload draft is included in appendix
\begin_inset LatexCommand \ref{sec:IETF-draft}
\end_inset
and the latest version is available at
\begin_inset LatexCommand \url{http://www.speex.org/drafts/latest}
\end_inset
.
This draft has been sent (2003/02/26) to the Internet Engineering Task
Force (IETF) and will be discussed at the March 18th meeting in San Francisco.
\layout Subsection
MIME Type
\layout Standard
Speex will use the MIME type
\family typewriter
audio/speex
\family default
.
We will apply for that type in the near future.
\layout Subsection
Ogg
\begin_inset LatexCommand \index{Ogg}
\end_inset
file format
\layout Standard
Speex bit-streams can be stored in Ogg files.
In this case, the first packet of the Ogg file contains the Speex header
described in table
\begin_inset LatexCommand \ref{cap:ogg_speex_header}
\end_inset
.
All integer fields in the headers are stored as little-endian.
The
\family typewriter
speex_string
\family default
field must contain the
\begin_inset Quotes eld
\end_inset
\family typewriter
Speex
\family default
\SpecialChar ~
\SpecialChar ~
\SpecialChar ~
\begin_inset Quotes eld
\end_inset
(with 3 training spaces), which identifies the bit-stream.
The next field,
\family typewriter
speex_version
\family default
contains the version of Speex that encoded the file.
For now, refer to speex_header.[ch] for more info.
The
\emph on
beginning of stream
\emph default
(
\family typewriter
b_o_s
\family default
) flag is set to 1 for the header.
The header packet has
\family typewriter
packetno=0
\family default
and
\family typewriter
granulepos=0
\family default
.
\layout Standard
The second packet contains the Speex comment header.
The format used is the Vorbis comment format described here: http://www.xiph.org/
ogg/vorbis/doc/v-comment.html .
This packet has
\family typewriter
packetno=1
\family default
and
\family typewriter
granulepos=0
\family default
.
\layout Standard
The third and subsequant packets each contain one or more (number found
in header) Speex frames.
These are identified with
\family typewriter
packetno
\family default
starting from 2 and the
\family typewriter
granulepos
\family default
is the number of the last sample encoded in that packet.
Le last of these packets has the
\emph on
end of stream
\emph default
(
\family typewriter
e_o_s
\family default
) flag is set to 1.
\layout Standard
\begin_inset Float table
placement htbp
wide true
collapsed false
\layout Standard
\begin_inset Tabular
<lyxtabular version="3" rows="16" columns="3">
<features>
<column alignment="center" valignment="top" leftline="true" width="0pt">
<column alignment="center" valignment="top" leftline="true" width="0pt">
<column alignment="center" valignment="top" leftline="true" rightline="true" width="0pt">
<row topline="true" bottomline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
Field
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
Type
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
Size
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
speex_string
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
char[]
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
8
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
speex_version
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
char[]
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
20
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
speex_version_id
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
int
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
4
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
header_size
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
int
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
4
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
rate
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
int
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
4
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
mode
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
int
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
4
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
mode_bitstream_version
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
int
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
4
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
nb_channels
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
int
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
4
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
bitrate
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
int
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
4
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
frame_size
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
int
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
4
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
vbr
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
int
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
4
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
frames_per_packet
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
int
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
4
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
extra_headers
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
int
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
4
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
reserved1
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
int
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
4
\end_inset
</cell>
</row>
<row topline="true" bottomline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
reserved2
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
int
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
4
\end_inset
</cell>
</row>
</lyxtabular>
\end_inset
\layout Caption
Ogg/Speex header packet
\begin_inset LatexCommand \label{cap:ogg_speex_header}
\end_inset
\end_inset
\layout Section
\pagebreak_top
Introduction to CELP Coding
\begin_inset LatexCommand \index{CELP}
\end_inset
\layout Standard
The three following sections describe the internals of the codec and require
some signal processing knowledge.
If you are only interested in using Speex, they are not required.
\layout Standard
Speex is based on CELP, which stands for Code Excited Linear Prediction.
This section attempts to introduce the principles behind CELP, so if you
are already familiar with CELP, you can safely skip to section
\begin_inset LatexCommand \ref{sec:Speex-narrowband-mode}
\end_inset
.
The CELP technique is based on three ideas:
\layout Enumerate
The use of a linear prediction (LP) model to model the vocal tract
\layout Enumerate
The use of (adaptive and fixed) codebook entries as input (excitation) of
the LP model
\layout Enumerate
The search performed in closed-loop in a
\begin_inset Quotes eld
\end_inset
perceptually weighted domain
\begin_inset Quotes erd
\end_inset
\layout Standard
This section describes the basic ideas behind CELP.
Note that it's still incomplete.
\layout Subsection
Linear Prediction (LPC)
\begin_inset LatexCommand \index{linear prediction}
\end_inset
\layout Standard
Linear prediction is at the base of may speech coding techniques, including
CELP.
The idea behind it is to predict the signal
\begin_inset Formula $x(n)$
\end_inset
using a linear combination of its past samples:
\layout Standard
\begin_inset Formula \[
y[n]=\sum_{i=1}^{N}a_{i}x[n-i]\]
\end_inset
where
\begin_inset Formula $y[n]$
\end_inset
is the linear prediction of
\begin_inset Formula $x[n]$
\end_inset
.
The prediction error is thus given by:
\begin_inset Formula \[
e[n]=x[n]-y[n]=x[n]-\sum_{i=1}^{N}a_{i}x[n-i]\]
\end_inset
\layout Standard
The goal of the LPC analysis is to find the best prediction coefficients
\begin_inset Formula $a_{i}$
\end_inset
which minimize the quadratic error function:
\begin_inset Formula \[
E=\sum_{n=0}^{L-1}\left[e[n]\right]^{2}=\sum_{n=0}^{L-1}\left[x[n]-\sum_{i=1}^{N}a_{i}x[n-i]\right]^{2}\]
\end_inset
That can be done by making all derivatives
\begin_inset Formula $\frac{\partial E}{\partial a_{i}}$
\end_inset
equal to zero:
\begin_inset Formula \[
\frac{\partial E}{\partial a_{i}}=\frac{\partial}{\partial a_{i}}\sum_{n=0}^{L-1}\left[x[n]-\sum_{i=1}^{N}a_{i}x[n-i]\right]^{2}=0\]
\end_inset
\layout Standard
The
\begin_inset Formula $a_{i}$
\end_inset
filter coefficients are computed using the Levinson-Durbin
\begin_inset LatexCommand \index{Levinson-Durbin}
\end_inset
algorithm, which starts from the auto-correlation
\begin_inset LatexCommand \index{auto-correlation}
\end_inset
\begin_inset Formula $R(m)$
\end_inset
of the signal
\begin_inset Formula $x[n]$
\end_inset
.
\layout Standard
\begin_inset Formula \[
R(m)=\sum_{i=0}^{N-1}x[i]x[i-m]\]
\end_inset
\layout Standard
For an order
\begin_inset Formula $N$
\end_inset
filter, we have:
\begin_inset Formula \[
\mathbf{R}=\left[\begin{array}{cccc}
R(0) & R(1) & \cdots & R(N-1)\\
R(1) & R(0) & \cdots & R(N-2)\\
\vdots & \vdots & \ddots & \vdots\\
R(N-1) & R(N-2) & \cdots & R(0)\end{array}\right]\]
\end_inset
\begin_inset Formula \[
\mathbf{r}=\left[\begin{array}{c}
R(1)\\
R(2)\\
\vdots\\
R(N)\end{array}\right]\]
\end_inset
\layout Standard
The filter coefficients
\begin_inset Formula $a_{i}$
\end_inset
are found by solving the system
\begin_inset Formula $\mathbf{Ra}=\mathbf{r}$
\end_inset
.
What the Levinson-Durbin algorithm does here is making the solution to
the problem
\begin_inset Formula $\mathcal{O}\left(N^{2}\right)$
\end_inset
instead of
\begin_inset Formula $\mathcal{O}\left(N^{3}\right)$
\end_inset
by exploiting the fact that matrix
\begin_inset Formula $\mathbf{R}$
\end_inset
is toeplitz hermitian.
Also, it can be proved that all the roots of
\begin_inset Formula $A(z)$
\end_inset
are within the unit circle, which means that
\begin_inset Formula $1/A(z)$
\end_inset
is always stable.
This is in theory; in practice because of finite precision, there are two
commonly used techniques to make sure we have a stable filter.
First, we multiply
\begin_inset Formula $R(0)$
\end_inset
by a number slightly above one (such as 1.0001), which is equivalent to
adding noise to the signal.
Also, we can apply a window to the auto-correlation, which is equivalent
to filtering in the frequency domain, reducing sharp resonances.
\layout Standard
The linear prediction model represents each speech sample as linear combination
of past samples, plus an error signal called the excitation (or residual).
\begin_inset Formula \[
x[n]=\sum_{i=1}^{N}a_{i}x[n-i]+e[n]\]
\end_inset
\layout Standard
In the
\emph on
z
\emph default
-domain, this can be expressed as
\layout Standard
\begin_inset Formula \[
x(z)=\frac{1}{A(z)}\: e(z)\]
\end_inset
\layout Standard
where
\begin_inset Formula $A(z)$
\end_inset
is defined as
\layout Standard
\begin_inset Formula \[
A(z)=1-\sum_{i=1}^{N}a_{i}z^{-i}\]
\end_inset
\layout Standard
We usually refer to
\begin_inset Formula $A(z)$
\end_inset
as the analysis filter and
\begin_inset Formula $1/A(z)$
\end_inset
as the synthesis filter.
The whole process is called short-term prediction as it predicts the signal
\begin_inset Formula $x[n]$
\end_inset
using a prediction using only the
\begin_inset Formula $N$
\end_inset
past samples, where
\begin_inset Formula $N$
\end_inset
is usually around 10.
\layout Standard
Because LPC coefficients have very little robustness to quantization, they
are converted to Line Spectral Pair
\begin_inset LatexCommand \index{line spectral pair}
\end_inset
(LSP) coefficients which have a much better behaviour with quantization,
one of them being that it's easy to keep the filter stable.
\layout Subsection
Pitch Prediction
\begin_inset LatexCommand \index{pitch}
\end_inset
\layout Standard
During voiced segments, the speech signal is periodic, so it is possible
to take advantage of that property by approximating the excitation signal
\begin_inset Formula $e[n]$
\end_inset
by a gain times the past of the excitation:
\layout Standard
\begin_inset Formula \[
e[n]\simeq p[n]=\beta e[n-T]\]
\end_inset
\layout Standard
where
\begin_inset Formula $T$
\end_inset
is the pitch period,
\begin_inset Formula $\beta$
\end_inset
is the pitch gain and
\begin_inset Formula $c(n)$
\end_inset
is taken from the
\emph on
innovation codebook
\emph default
.
We call that long-term prediction since the excitation is predicted from
\begin_inset Formula $e[n-T]$
\end_inset
with
\begin_inset Formula $T\gg N$
\end_inset
.
\layout Subsection
Innovation Codebook
\layout Standard
The final excitation
\begin_inset Formula $e[n]$
\end_inset
will be the sum of the pitch prediction and an
\emph on
innovation
\emph default
signal
\begin_inset Formula $c[n]$
\end_inset
taken from a fixed codebook.
\layout Standard
\begin_inset Formula \[
e[n]=p[n]+c[n]=\beta e[n-T]+c[n]\]
\end_inset
This is where most of the bits in a CELP codec are allocated.
It represents the information that couldn't be obtained either from linear
prediction or pitch prediction.
In the
\emph on
z
\emph default
-domain we can represent the final signal
\begin_inset Formula $X(z)$
\end_inset
as
\begin_inset Formula \[
X(z)=\frac{C(z)}{A(z)\left(1-\beta z^{-T}\right)}\]
\end_inset
\layout Subsection
Analysis-by-Synthesis and Error Weighting
\begin_inset LatexCommand \index{error weighting}
\end_inset
\begin_inset LatexCommand \index{analysis-by-synthesis}
\end_inset
\layout Standard
Most (if not all) modern audio codecs attempt to
\begin_inset Quotes eld
\end_inset
shape
\begin_inset Quotes erd
\end_inset
the noise so that it appears mostly in the frequency regions where the
ear cannot detect it.
For example, the ear is more tolerant to noise in parts of the spectrum
that are louder and
\emph on
vice versa
\emph default
.
That's why instead of minimizing the simple quadratic error
\begin_inset Formula \[
E=\sum_{n}\left(x[n]-\overline{x}[n]\right)^{2}\]
\end_inset
where
\begin_inset Formula $\overline{x}[n]$
\end_inset
is the encoder signal, we minimize the error for the perceptually weighted
signal
\begin_inset Formula \[
X_{w}(z)=W(z)X(z)\]
\end_inset
where
\begin_inset Formula $W(z)$
\end_inset
is the weighting filter, usually of the form
\layout Standard
\begin_inset Formula \begin{equation}
W(z)=\frac{A\left(\frac{z}{\gamma_{1}}\right)}{A\left(\frac{z}{\gamma_{2}}\right)}\label{eq:weighting_filter}\end{equation}
\end_inset
\layout Standard
with control parameters
\begin_inset Formula $\gamma_{1}>\gamma_{2}$
\end_inset
.
If the noise is white in the perceptually weighted domain, then in the
signal domain its spectral shape will be of the form
\begin_inset Formula \[
A_{noise}(z)=\frac{1}{W(z)}=\frac{A\left(\frac{z}{\gamma_{2}}\right)}{A\left(\frac{z}{\gamma_{1}}\right)}\]
\end_inset
\layout Standard
If a filter
\begin_inset Formula $A(z)$
\end_inset
has (complex) poles at
\begin_inset Formula $p_{i}$
\end_inset
in the
\begin_inset Formula $z$
\end_inset
-plane, the filter
\begin_inset Formula $A(z/\gamma)$
\end_inset
filter will have its poles at
\begin_inset Formula $p_{i}^{'}=\gamma p_{i}$
\end_inset
, making it a flatter version of
\begin_inset Formula $A(z)$
\end_inset
.
\layout Section
\pagebreak_top
Speex narrowband mode
\begin_inset LatexCommand \label{sec:Speex-narrowband-mode}
\end_inset
\begin_inset LatexCommand \index{narrowband}
\end_inset
\layout Standard
This section looks at how Speex works for narrowband (
\begin_inset Formula $8\:\mathrm{kHz}$
\end_inset
sampling rate) operation.
The frame size for this mode is
\begin_inset Formula $20\:\mathrm{ms}$
\end_inset
, corresponding to 160 samples.
Each frame is also subdivided into 4 sub-frames of 40 samples each.
\layout Standard
Also many design decisions were based on the original goals and assumptions:
\layout Itemize
Minimizing the amount of information extracted from past frames (for robustness
to packet loss)
\layout Itemize
Dynamically-selectable codebooks (LSP, pitch and innovation)
\layout Itemize
sub-vector fixed (innovation) codebooks
\layout Subsection
LPC Analysis
\begin_inset LatexCommand \index{linear prediction}
\end_inset
\layout Standard
An LPC analysis is first performed on a (asymetric Hamming) window that
spans all the current frame and half a frame in advance.
The LPC coefficients are then converted to Line Spectral Pair
\begin_inset LatexCommand \index{line spectral pair}
\end_inset
(LSP), a representation that is more robust to quantization.
The LSP's are considered to be associated to the
\begin_inset Formula $4^{th}$
\end_inset
sub-frames and the LSP's associated to the first 3 sub-frames are linearly
interpolated using the current and previous LSP's.
\layout Standard
The LSP's are encoded using 30 bits for higher quality modes and 18 bits
for lower quality, through the use of a multi-stage split-vector quantizer.
For the lower quality modes, the 10 coefficients are first quantized with
6 bits and the error is then divided in two 5-coefficient sub-vectors.
Each of them is quantized with 6 bits, for a total of 18 bits.
For the higher quality modes, the remaining error on both sub-vectors is
further quantized with 6 bits each, for a total of 30 bits.
\layout Standard
The perceptual weighting filter
\begin_inset Formula $W(z)$
\end_inset
used by Speex is derived from the LPC filter
\begin_inset Formula $A(z)$
\end_inset
and corresponds to the one described by eq.
\begin_inset LatexCommand \ref{eq:weighting_filter}
\end_inset
with
\begin_inset Formula $\gamma_{1}=0.9$
\end_inset
and
\begin_inset Formula $\gamma_{2}=0.6$
\end_inset
.
We can use the unquantized
\begin_inset Formula $A(z)$
\end_inset
filter since the weighting filter is only used in the encoder.
\layout Subsection
Pitch Prediction (adaptive codebook)
\begin_inset LatexCommand \index{pitch}
\end_inset
\layout Standard
Speex uses a 3-tap prediction for pitch.
That is, the pitch prediction signal
\begin_inset Formula $p[n]$
\end_inset
is obtained by the past of the excitation by:
\begin_inset Formula \[
p[n]=\beta_{0}e[n-T-1]+\beta_{1}e[n-T]+\beta_{2}e[n-T+1]\]
\end_inset
\layout Standard
where
\begin_inset Formula $T$
\end_inset
is the pitch period and the
\begin_inset Formula $\beta_{i}$
\end_inset
are the prediction (filter) taps.
It is worth noting that when the pitch is smaller than the sub-frame size,
we repeat the excitation at a period
\begin_inset Formula $T$
\end_inset
.
For example, when
\begin_inset Formula $n-T+1$
\end_inset
, we use
\begin_inset Formula $n-2T+1$
\end_inset
instead.
The period and quantized gains are determined in closed loop.
In most modes, the pitch period is encoded with 7 bits in the
\begin_inset Formula $\left[17,144\right]$
\end_inset
range and the
\begin_inset Formula $\beta_{i}$
\end_inset
coefficients are vector-quantized using 7 bits (15 kbps narrowband and
above) at higher bit-rates and 5 bits at lower bit-rates (11 kbps narrowband
and below).
\layout Subsection
Innovation Codebook
\layout Standard
In Speex, the innovation signal is quantized using shape-only vector quantizatio
n (VQ).
That means that the codebooks that are used represent both the shape and
the gain at the same time.
This save many bits that would otherwise be allocated for a separate gain
at the price of a slight increase in complexity.
\layout Subsection
Bit allocation
\layout Standard
There are 7 different narrowband bit-rates defined for Speex, ranging from
200 bps to 18.15 kbps, although the modes below 5.9 kbps should not be used
for speech.
The bit-allocation for each mode is detailed in table
\begin_inset LatexCommand \ref{cap:bits-narrowband}
\end_inset
.
Each frame starts with the mode ID encoded with 4 bits which allows a range
from 0 to 15, though only the first 7 values are used (the others are reserved).
The parameters are listed in the table in the order they are packed in
the bit-stream.
All frame-based parameters are packed before sub-frame parameters.
The parameters for a certain sub-frame are all packed before the following
sub-frame is packed.
Note that the
\begin_inset Quotes eld
\end_inset
OL
\begin_inset Quotes erd
\end_inset
in the parameter description means that the parameter is an open loop estimatio
n based on the whole frame.
\layout Standard
\begin_inset Float table
placement h
wide true
collapsed false
\layout Standard
\begin_inset Tabular
<lyxtabular version="3" rows="12" columns="11">
<features>
<column alignment="center" valignment="top" leftline="true" width="0pt">
<column alignment="center" valignment="top" leftline="true" width="0pt">
<column alignment="center" valignment="top" leftline="true" width="0pt">
<column alignment="center" valignment="top" leftline="true" width="0pt">
<column alignment="center" valignment="top" leftline="true" width="0pt">
<column alignment="center" valignment="top" leftline="true" width="0pt">
<column alignment="center" valignment="top" leftline="true" width="0pt">
<column alignment="center" valignment="top" leftline="true" width="0pt">
<column alignment="center" valignment="top" leftline="true" width="0pt">
<column alignment="center" valignment="top" leftline="true" width="0pt">
<column alignment="center" valignment="top" leftline="true" rightline="true" width="0pt">
<row topline="true" bottomline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
Parameter
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
Update rate
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
0
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
1
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
2
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
3
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
4
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
5
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
6
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
7
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
8
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
Wideband bit
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
frame
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
1
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
1
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
1
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
1
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
1
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
1
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
1
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
1
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
1
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
Mode ID
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
frame
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
4
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
4
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
4
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
4
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
4
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
4
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
4
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
4
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
4
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
LSP
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
frame
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
0
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
18
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
18
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
18
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
18
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
30
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
30
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
30
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
18
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
OL pitch
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
frame
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
0
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
7
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
7
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
0
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
0
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
0
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
0
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
0
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
7
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
OL pitch gain
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
frame
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
0
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
4
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
0
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
0
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
0
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
0
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
0
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
0
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
4
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
OL Exc gain
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
frame
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
0
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
5
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
5
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
5
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
5
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
5
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
5
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
5
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
5
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
Fine pitch
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
sub-frame
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
0
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
0
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
0
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
7
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
7
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
7
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
7
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
7
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
0
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
Pitch gain
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
sub-frame
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
0
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
0
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
5
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
5
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
5
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
7
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
7
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
7
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
0
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
Innovation gain
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
sub-frame
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
0
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
1
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
0
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
1
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
1
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
3
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
3
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
3
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
0
\end_inset
</cell>
</row>
<row topline="true" bottomline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
Innovation VQ
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
sub-frame
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
0
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
0
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
16
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
20
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
35
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
48
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
64
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
96
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
10
\end_inset
</cell>
</row>
<row topline="true" bottomline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
Total
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
frame
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
5
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
43
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
119
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
160
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
220
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
300
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
364
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
492
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
79
\end_inset
</cell>
</row>
</lyxtabular>
\end_inset
\layout Caption
Bit allocation for narrowband modes
\begin_inset LatexCommand \label{cap:bits-narrowband}
\end_inset
\end_inset
\layout Standard
So far, no MOS (Mean Opinion Score
\begin_inset LatexCommand \index{mean opinion score}
\end_inset
) subjective evaluation has been performed for Speex.
In order to give an idea of the quality achivable with it, table
\begin_inset LatexCommand \ref{cap:quality_vs_bps}
\end_inset
presents my own subjective opinion on it.
It sould be noted that different people will perceive the quality differently
and that the person that designed the codec often has a bias (one way or
another) when it comes to subjective evaluation.
Last thing, it should be noted that for most codecs (including Speex) encoding
quality sometimes varies depending on the input.
Note that the complexity is only approximate (within 0.5 mflops and using
the lowers complexity setting).
Decoding requires approximately 0.5 mflops
\begin_inset LatexCommand \index{complexity}
\end_inset
in most modes (1 mflops with perceptual enhancement).
\layout Standard
\begin_inset Float table
placement h
wide true
collapsed false
\layout Standard
\begin_inset Tabular
<lyxtabular version="3" rows="17" columns="4">
<features>
<column alignment="center" valignment="top" leftline="true" width="0pt">
<column alignment="center" valignment="top" leftline="true" width="0pt">
<column alignment="center" valignment="top" leftline="true" width="0pt">
<column alignment="center" valignment="top" leftline="true" rightline="true" width="0pt">
<row topline="true" bottomline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
Mode
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
Bit-rate
\begin_inset LatexCommand \index{bit-rate}
\end_inset
(bps)
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
mflops
\begin_inset LatexCommand \index{complexity}
\end_inset
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
Quality/description
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
0
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
250
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
N/A
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
No sound (VBR only)
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
1
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
2,150
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
6
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
Vocoder (mostly for comfort noise)
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
2
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
5,950
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
9
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
Very noticeable artifacts/noise, good intelligibility
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
3
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
8,000
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
10
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
Artifacts/noise sometimes noticeable
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
4
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
11,000
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
14
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
Artifacts usually noticeable only with headphones
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
5
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
15,000
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
11
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
Need good headphones to tell the difference
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
6
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
18,200
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
17.5
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
Hard to tell the difference even with good headphones
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
7
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
24,600
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
14.5
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
Completely transparent for voice, good quality music
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
8
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
3,950
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
-
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
Very noticeable artifacts/noise, good intelligibility
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
9
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
N/A
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
N/A
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
reserved
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
10
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
N/A
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
N/A
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
reserved
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
11
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
N/A
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
N/A
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
reserved
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
12
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
N/A
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
N/A
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
reserved
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
13
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
N/A
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
N/A
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
Application-defined, interpreted by callback or skipped
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
14
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
N/A
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
N/A
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
Speex in-band signaling
\end_inset
</cell>
</row>
<row topline="true" bottomline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
15
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
N/A
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
N/A
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
Terminator code
\end_inset
</cell>
</row>
</lyxtabular>
\end_inset
\layout Caption
Quality versus bit-rate
\begin_inset LatexCommand \label{cap:quality_vs_bps}
\end_inset
\end_inset
\layout Subsection
Perceptual enhancement
\begin_inset LatexCommand \index{perceptual enhancement}
\end_inset
\layout Standard
This part of the codec only applies to the decoder and can even be changed
without affecting inter-operability.
For that reason, the implementation provided and described here should
only be considered as a reference implementation.
The enhancement system is devided in two parts.
First, the synthesis filter
\begin_inset Formula $S(z)=1/A(z)$
\end_inset
is replaced by an enhanced filter
\begin_inset Formula \[
S'(z)=\frac{A\left(z/a_{2}\right)A\left(z/a_{3}\right)}{A\left(z\right)A\left(z/a_{1}\right)}\]
\end_inset
where
\begin_inset Formula $a_{1}$
\end_inset
and
\begin_inset Formula $a_{2}$
\end_inset
depend on the mode in use and
\begin_inset Formula $a_{3}=\frac{1}{r}\left(1-\frac{1-ra_{1}}{1-ra_{2}}\right)$
\end_inset
with
\begin_inset Formula $r=.9$
\end_inset
.
The second part of the enhancement consists of using a comb filter to enhance
the pitch in the excitation domain.
\layout Section
\pagebreak_top
Speex wideband mode (sub-band CELP)
\begin_inset LatexCommand \index{wideband}
\end_inset
\layout Standard
For wideband, the Speex approach uses a
\emph on
q
\emph default
uadrature
\emph on
m
\emph default
irror
\emph on
f
\emph default
ilter
\begin_inset LatexCommand \index{quadrature mirror filter}
\end_inset
(QMF) to split the band in two.
The 16 kHz signal is thus divided into two 8 kHz signals, one representing
the low band (0-4 kHz), the other the high band (4-8 kHz).
The low band is encoded with the narrowband mode described in section
\begin_inset LatexCommand \ref{sec:Speex-narrowband-mode}
\end_inset
in such a way that the resulting
\begin_inset Quotes eld
\end_inset
embedded narrowband bit-stream
\begin_inset Quotes erd
\end_inset
can also be decoded with the narrowband decoder.
Since the low band encoding has already been described only the high band
encoding is described in this section.
\layout Subsection
Linear Prediction
\layout Standard
The linear prediction part used for the high-band is very similar to what
is done for narrowband.
The only difference is that we use only 12 bits to encode the high-band
LSP's using a multi-stage vector quantizer (MSVQ).
The first level quantizes the 10 coefficients with 6 bits and the error
is then quantized using 6 bits too.
\layout Subsection
Pitch Prediction
\layout Standard
That part is easy: there's no pitch prediction for the high-band.
There are two reasons for that.
First, there is usually little harmonic structure in this band (above 4
kHz).
Second, it would be very hard to implement since the QMF folds the 4-8
kHz band into 4-0 kHz (reversing the frequency axis), which means that
the location of the harmonics are no longer at multiples of the fundamental
(pitch).
\layout Subsection
Excitation Quantization
\layout Standard
The high-band excitation is coded in the same way as for narrowband.
\layout Subsection
Bit allocation
\layout Standard
For the wideband mode, all the narrowband frame is packed before the high-band
is encoded.
The narrowband part of the bit-stream is as defined in table
\begin_inset LatexCommand \ref{cap:bits-narrowband}
\end_inset
.
The high-band follows, as described in table
\begin_inset LatexCommand \ref{cap:bits-wideband}
\end_inset
.
This also means that a wideband frame may be correctly decoded by a narrowband
decoder with the only caveat that if more than one frame is packed in the
same packet, the decoder will need to skip the high-band parts in order
to sync with the bit-stream.
\layout Standard
\begin_inset Float table
placement h
wide true
collapsed false
\layout Standard
\begin_inset Tabular
<lyxtabular version="3" rows="7" columns="7">
<features>
<column alignment="center" valignment="top" leftline="true" width="0pt">
<column alignment="center" valignment="top" leftline="true" width="0pt">
<column alignment="center" valignment="top" leftline="true" width="0pt">
<column alignment="center" valignment="top" leftline="true" width="0pt">
<column alignment="center" valignment="top" leftline="true" width="0pt">
<column alignment="center" valignment="top" leftline="true" width="0pt">
<column alignment="center" valignment="top" leftline="true" rightline="true" width="0pt">
<row topline="true" bottomline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
Parameter
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
Update rate
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
0
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
1
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
2
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
3
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
4
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
Wideband bit
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
frame
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
1
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
1
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
1
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
1
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
1
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
Mode ID
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
frame
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
3
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
3
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
3
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
3
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
3
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
LSP
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
frame
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
0
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
12
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
12
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
12
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
12
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
Excitation gain
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
sub-frame
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
0
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
5
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
4
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
4
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
4
\end_inset
</cell>
</row>
<row topline="true" bottomline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
Excitation VQ
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
sub-frame
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
0
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
0
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
20
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
40
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
80
\end_inset
</cell>
</row>
<row topline="true" bottomline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
Total
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
frame
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
4
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
36
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
112
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
192
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
352
\end_inset
</cell>
</row>
</lyxtabular>
\end_inset
\layout Caption
Bit allocation for high-band in wideband mode
\begin_inset LatexCommand \label{cap:bits-wideband}
\end_inset
\end_inset
\layout Standard
\begin_inset ERT
status Open
\layout Standard
\backslash
clearpage
\end_inset
\layout Standard
\begin_inset ERT
status Collapsed
\layout Standard
\backslash
clearpage
\end_inset
\layout Section
\start_of_appendix
FAQ
\layout Subsection*
Vorbis is open-source
\begin_inset LatexCommand \index{open-source}
\end_inset
and patent-free
\begin_inset LatexCommand \index{patent}
\end_inset
, why do we need Speex?
\layout Standard
Vorbis is a great project but its goals are not the same as Speex.
Vorbis is mostly aimed at compressing music and audio in general, while
Speex targets speech only.
For that reason Speex can achieve much better results than Vorbis on speech,
typically 2-4 times higher compression at equal quality.
\layout Subsection*
Isn't there a GPL implementation of the GSM-FR codec? Why is Speex necessary?
\layout Standard
First of all, it's not clear whether or not GSM-FR is covered by a phillips
patent (see http://kbs.cs.tu-berlin.de/~jutta/toast.html).
Also, GSM-FR offers mediocre quality at a relatively high bit-rate, while
Speex can offer equivalent quality at almost half the bit-rate.
Last but not least, Speex offers a wide range of bit-rates and sampling
rates, while GSM-FR is limited to 8 kHz speech at 13 kbps.
\layout Subsection*
Under what license is Speex released?
\layout Standard
As of version 1.0 beta 1, Speex in released under Xiph's BSD-like license.
This license is the most permissive of the open-source licenses.
\layout Subsection*
Ogg
\begin_inset LatexCommand \index{Ogg}
\end_inset
, Speex, Vorbis
\begin_inset LatexCommand \index{Vorbis}
\end_inset
, what's the difference?
\layout Standard
Ogg is a
\begin_inset Quotes eld
\end_inset
container format
\begin_inset Quotes erd
\end_inset
for holding multimedia data.
Vorbis is an audio codec that uses Ogg to store its bit-streams as files,
hence the name Ogg Vorbis.
Speex also uses the Ogg format to store its bit-streams as files, so technicall
y they would be
\begin_inset Quotes eld
\end_inset
Ogg Speex
\begin_inset Quotes erd
\end_inset
files (I prefer to call them just Speex files).
One difference with Vorbis however, is that Speex is less tied with Ogg.
Actually, if what you do is Voice of IP (VoIP), you don't need Ogg at all.
\layout Subsection*
What's the extension for Speex?
\layout Standard
Speex files have the .spx extension.
Note however that all the Speex tools (speexenc, speexdec) do not rely
on the extension at all so any extension will work.
\layout Subsection*
Can I use Speex for compressing music
\begin_inset LatexCommand \index{music}
\end_inset
?
\layout Standard
Just like Vorbis is not really adapted to speech, Speex is really not adapted
for music.
In most cases, you'll be better of with Vorbis when it comes to music.
\layout Subsection*
I converted some MP3's to Speex and the quality is bad.
What's wrong?
\layout Standard
This is called transcoding and it will always result in much poorer quality
than the original MP3.
Unless you have a really good (size) reason to do so, never transcode speech.
This is even valid for self transcoding (tandeming), i.e.
If you decode a Speex file and re-encode it again at the same bit-rate,
you will lose quality.
\layout Subsection*
Does Speex run on Windows?
\layout Standard
As of 0.8.0, Speex can now compile on Windows.
There are also several front-ends available from the web site.
\layout Subsection*
Why is encoding so slow compared to decoding?
\layout Standard
For most kinds of compression, encoding is inherently slower than decoding.
In the case of Speex, encoding consists of finding, for each vector of
5 to 10 samples, the entry that matches the best within a codebook consisting
of 16 to 256 entries.
On the other hand, at decoding all that needs to be done is lookup the
right entry in the codebook using the encoded index.
Since a lookup is much faster than a search, the decoder works much faster
than the encoder.
\layout Subsection*
Why is Speex so slow on my iPaq (or insert any platform without an FPU)?
\layout Standard
Well the parenthesis provides the answer: no FPU (floating-point unit).
The Speex code makes heavy use of floating-point operations.
On devices with no FPU, all floating-point instructions need to be emulated.
This is a very time consuming operation.
\layout Subsection*
I'm getting unusual background noise (hiss) when using libspeex in my applicatio
n.
How do I fix that?
\layout Standard
One of the cause could be scaling of the input speech.
Speex expects signals to have a
\begin_inset Formula $\pm2^{15}$
\end_inset
(signed short) dynamic range.
If the dynamic range of your signals is too small (e.g.
\begin_inset Formula $\pm1.0$
\end_inset
), you will suffer important quantization noise.
A good target is to have a dynamic range around
\begin_inset Formula $\pm8000$
\end_inset
which is large enough, but small enough to make sure there's no clipping
when converting back to signed short.
\layout Subsection*
I get very distorted speech when using libspeex in my application.
What's wrong?
\layout Standard
There are many possible causes for that.
One of them is errors in the way the bits are manipulated.
Another possible cause is the use of the same encoder or decoder state
for more than one audio stream (channel), which produces strange effects
with the filter memories.
If the input speech has an amplitude close to
\begin_inset Formula $\pm2^{15}$
\end_inset
, it is possible that at decoding, the amplitude be a bit higher than that,
causing clipping when saving as 16-bit PCM.
\layout Subsection*
Can Speex pass DTMF
\begin_inset LatexCommand \index{DTMF}
\end_inset
?
\layout Standard
I guess it all depends on the bit-rate used.
Though no formal testing has yet been performed, I'd say don't go below
the 15 kbps mode if you want DTMF to be transmitted correctly.
DTMF at 8 kbps may work but your mileage may vary.
Also, make sure you don't use the lowest complexity (see SPEEX_SET_COMPLEXITY
or --comp option), as it causes important noise.
\layout Subsection*
Can Speex pass V.9x modem signals correctly?
\layout Standard
If I could to that I'd be very rich by now :-)
\layout Subsection*
What is your (Jean-Marc) relationship with the University of Sherbrooke
and how does Speex fit into that?
\layout Standard
I am currently (2003/03/09) doing a Ph.D.
at the University of Sherbrooke in mobile robotics.
Although I did my master with the Sherbrooke speech coding group (in speech
enhancement, not coding), I am not associated with them anymore.
It should
\series bold
not
\series default
be understood that they or the University of Sherbrooke endorse the Speex
project in any way.
Furthermore, Speex does not make use of any code or proprietary technology
developed in the Sherbrooke speech coding group.
\layout Subsection*
CELP, ACELP
\begin_inset LatexCommand \index{ACELP}
\end_inset
, what's the difference?
\layout Standard
CELP stands for
\begin_inset Quotes eld
\end_inset
Code Excited Linear Prediction
\begin_inset Quotes erd
\end_inset
, while ACELP stands for
\begin_inset Quotes eld
\end_inset
\emph on
Algebraic
\emph default
Code Excited Linear Prediction
\begin_inset Quotes erd
\end_inset
.
That means ACELP is a CELP technique that uses an algebraic codebook represente
d as a sum of unit pulses, thus making the codebook search much more efficient.
This technique was invented at the University of Sherbrooke and is now
one of the most widely used form of CELP.
Unfortunately, since it is patented, it cannot be used in Speex.
\layout Section
\pagebreak_top
Sample code
\begin_inset LatexCommand \label{sec:Sample-code}
\end_inset
\layout Standard
This section shows sample code for encoding and decoding speech using the
Speex API.
The commands can be used to encode and decode a file by calling:
\family typewriter
\newline
% sampleenc in_file.sw | sampledec out_file.sw
\family default
\newline
where both files are raw (no header) files encoded at 16 bits per sample
(in the machine natural endianness).
\layout Subsection
sampleenc.c
\layout Standard
sampleenc takes a raw 16 bits/sample file, encodes it and outputs a Speex
stream to stdout.
Note that the packing used is NOT compatible with that of speexenc/speexdec.
\layout Standard
\begin_inset Include \verbatiminput{sampleenc.c}
preview false
\end_inset
\layout Subsection
sampledec.c
\layout Standard
sampledec reads a Speex stream from stdin, decodes it and outputs it to
a raw 16 bits/sample file.
Note that the packing used is NOT compatible with that of speexenc/speexdec.
\layout Standard
\begin_inset Include \verbatiminput{sampledec.c}
preview false
\end_inset
\layout Section
\pagebreak_top
IETF RTP Profile
\begin_inset LatexCommand \label{sec:IETF-draft}
\end_inset
\layout Standard
\begin_inset Include \verbatiminput{draft-herlein-speex-rtp-profile-00.txt}
preview false
\end_inset
\layout Section
\pagebreak_top
GNU Free Documentation License
\layout Standard
Version 1.1, March 2000
\layout Standard
Copyright (C) 2000 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted
to copy and distribute verbatim copies of this license document, but changing
it is not allowed.
\layout Subsection*
0.
PREAMBLE
\layout Standard
The purpose of this License is to make a manual, textbook, or other written
document "free" in the sense of freedom: to assure everyone the effective
freedom to copy and redistribute it, with or without modifying it, either
commercially or noncommercially.
Secondarily, this License preserves for the author and publisher a way
to get credit for their work, while not being considered responsible for
modifications made by others.
\layout Standard
This License is a kind of "copyleft", which means that derivative works
of the document must themselves be free in the same sense.
It complements the GNU General Public License, which is a copyleft license
designed for free software.
\layout Standard
We have designed this License in order to use it for manuals for free software,
because free software needs free documentation: a free program should come
with manuals providing the same freedoms that the software does.
But this License is not limited to software manuals; it can be used for
any textual work, regardless of subject matter or whether it is published
as a printed book.
We recommend this License principally for works whose purpose is instruction
or reference.
\layout Subsection*
1.
APPLICABILITY AND DEFINITIONS
\layout Standard
This License applies to any manual or other work that contains a notice
placed by the copyright holder saying it can be distributed under the terms
of this License.
The "Document", below, refers to any such manual or work.
Any member of the public is a licensee, and is addressed as "you".
\layout Standard
A "Modified Version" of the Document means any work containing the Document
or a portion of it, either copied verbatim, or with modifications and/or
translated into another language.
\layout Standard
A "Secondary Section" is a named appendix or a front-matter section of the
Document that deals exclusively with the relationship of the publishers
or authors of the Document to the Document's overall subject (or to related
matters) and contains nothing that could fall directly within that overall
subject.
(For example, if the Document is in part a textbook of mathematics, a Secondary
Section may not explain any mathematics.) The relationship could be a matter
of historical connection with the subject or with related matters, or of
legal, commercial, philosophical, ethical or political position regarding
them.
\layout Standard
The "Invariant Sections" are certain Secondary Sections whose titles are
designated, as being those of Invariant Sections, in the notice that says
that the Document is released under this License.
\layout Standard
The "Cover Texts" are certain short passages of text that are listed, as
Front-Cover Texts or Back-Cover Texts, in the notice that says that the
Document is released under this License.
\layout Standard
A "Transparent" copy of the Document means a machine-readable copy, represented
in a format whose specification is available to the general public, whose
contents can be viewed and edited directly and straightforwardly with generic
text editors or (for images composed of pixels) generic paint programs
or (for drawings) some widely available drawing editor, and that is suitable
for input to text formatters or for automatic translation to a variety
of formats suitable for input to text formatters.
A copy made in an otherwise Transparent file format whose markup has been
designed to thwart or discourage subsequent modification by readers is
not Transparent.
A copy that is not "Transparent" is called "Opaque".
\layout Standard
Examples of suitable formats for Transparent copies include plain ASCII
without markup, Texinfo input format, LaTeX input format, SGML or XML using
a publicly available DTD, and standard-conforming simple HTML designed
for human modification.
Opaque formats include PostScript, PDF, proprietary formats that can be
read and edited only by proprietary word processors, SGML or XML for which
the DTD and/or processing tools are not generally available, and the machine-ge
nerated HTML produced by some word processors for output purposes only.
\layout Standard
The "Title Page" means, for a printed book, the title page itself, plus
such following pages as are needed to hold, legibly, the material this
License requires to appear in the title page.
For works in formats which do not have any title page as such, "Title Page"
means the text near the most prominent appearance of the work's title,
preceding the beginning of the body of the text.
\layout Subsection*
2.
VERBATIM COPYING
\layout Standard
You may copy and distribute the Document in any medium, either commercially
or noncommercially, provided that this License, the copyright notices,
and the license notice saying this License applies to the Document are
reproduced in all copies, and that you add no other conditions whatsoever
to those of this License.
You may not use technical measures to obstruct or control the reading or
further copying of the copies you make or distribute.
However, you may accept compensation in exchange for copies.
If you distribute a large enough number of copies you must also follow
the conditions in section 3.
\layout Standard
You may also lend copies, under the same conditions stated above, and you
may publicly display copies.
\layout Subsection*
3.
COPYING IN QUANTITY
\layout Standard
If you publish printed copies of the Document numbering more than 100, and
the Document's license notice requires Cover Texts, you must enclose the
copies in covers that carry, clearly and legibly, all these Cover Texts:
Front-Cover Texts on the front cover, and Back-Cover Texts on the back
cover.
Both covers must also clearly and legibly identify you as the publisher
of these copies.
The front cover must present the full title with all words of the title
equally prominent and visible.
You may add other material on the covers in addition.
Copying with changes limited to the covers, as long as they preserve the
title of the Document and satisfy these conditions, can be treated as verbatim
copying in other respects.
\layout Standard
If the required texts for either cover are too voluminous to fit legibly,
you should put the first ones listed (as many as fit reasonably) on the
actual cover, and continue the rest onto adjacent pages.
\layout Standard
If you publish or distribute Opaque copies of the Document numbering more
than 100, you must either include a machine-readable Transparent copy along
with each Opaque copy, or state in or with each Opaque copy a publicly-accessib
le computer-network location containing a complete Transparent copy of the
Document, free of added material, which the general network-using public
has access to download anonymously at no charge using public-standard network
protocols.
If you use the latter option, you must take reasonably prudent steps, when
you begin distribution of Opaque copies in quantity, to ensure that this
Transparent copy will remain thus accessible at the stated location until
at least one year after the last time you distribute an Opaque copy (directly
or through your agents or retailers) of that edition to the public.
\layout Standard
It is requested, but not required, that you contact the authors of the Document
well before redistributing any large number of copies, to give them a chance
to provide you with an updated version of the Document.
\layout Subsection*
4.
MODIFICATIONS
\layout Standard
You may copy and distribute a Modified Version of the Document under the
conditions of sections 2 and 3 above, provided that you release the Modified
Version under precisely this License, with the Modified Version filling
the role of the Document, thus licensing distribution and modification
of the Modified Version to whoever possesses a copy of it.
In addition, you must do these things in the Modified Version:
\layout Itemize
A.
Use in the Title Page (and on the covers, if any) a title distinct from
that of the Document, and from those of previous versions (which should,
if there were any, be listed in the History section of the Document).
You may use the same title as a previous version if the original publisher
of that version gives permission.
\layout Itemize
B.
List on the Title Page, as authors, one or more persons or entities responsible
for authorship of the modifications in the Modified Version, together with
at least five of the principal authors of the Document (all of its principal
authors, if it has less than five).
\layout Itemize
C.
State on the Title page the name of the publisher of the Modified Version,
as the publisher.
\layout Itemize
D.
Preserve all the copyright notices of the Document.
\layout Itemize
E.
Add an appropriate copyright notice for your modifications adjacent to
the other copyright notices.
\layout Itemize
F.
Include, immediately after the copyright notices, a license notice giving
the public permission to use the Modified Version under the terms of this
License, in the form shown in the Addendum below.
\layout Itemize
G.
Preserve in that license notice the full lists of Invariant Sections and
required Cover Texts given in the Document's license notice.
\layout Itemize
H.
Include an unaltered copy of this License.
\layout Itemize
I.
Preserve the section entitled "History", and its title, and add to it an
item stating at least the title, year, new authors, and publisher of the
Modified Version as given on the Title Page.
If there is no section entitled "History" in the Document, create one stating
the title, year, authors, and publisher of the Document as given on its
Title Page, then add an item describing the Modified Version as stated
in the previous sentence.
\layout Itemize
J.
Preserve the network location, if any, given in the Document for public
access to a Transparent copy of the Document, and likewise the network
locations given in the Document for previous versions it was based on.
These may be placed in the "History" section.
You may omit a network location for a work that was published at least
four years before the Document itself, or if the original publisher of
the version it refers to gives permission.
\layout Itemize
K.
In any section entitled "Acknowledgements" or "Dedications", preserve the
section's title, and preserve in the section all the substance and tone
of each of the contributor acknowledgements and/or dedications given therein.
\layout Itemize
L.
Preserve all the Invariant Sections of the Document, unaltered in their
text and in their titles.
Section numbers or the equivalent are not considered part of the section
titles.
\layout Itemize
M.
Delete any section entitled "Endorsements".
Such a section may not be included in the Modified Version.
\layout Itemize
N.
Do not retitle any existing section as "Endorsements" or to conflict in
title with any Invariant Section.
\layout Standard
If the Modified Version includes new front-matter sections or appendices
that qualify as Secondary Sections and contain no material copied from
the Document, you may at your option designate some or all of these sections
as invariant.
To do this, add their titles to the list of Invariant Sections in the Modified
Version's license notice.
These titles must be distinct from any other section titles.
\layout Standard
You may add a section entitled "Endorsements", provided it contains nothing
but endorsements of your Modified Version by various parties--for example,
statements of peer review or that the text has been approved by an organization
as the authoritative definition of a standard.
\layout Standard
You may add a passage of up to five words as a Front-Cover Text, and a passage
of up to 25 words as a Back-Cover Text, to the end of the list of Cover
Texts in the Modified Version.
Only one passage of Front-Cover Text and one of Back-Cover Text may be
added by (or through arrangements made by) any one entity.
If the Document already includes a cover text for the same cover, previously
added by you or by arrangement made by the same entity you are acting on
behalf of, you may not add another; but you may replace the old one, on
explicit permission from the previous publisher that added the old one.
\layout Standard
The author(s) and publisher(s) of the Document do not by this License give
permission to use their names for publicity for or to assert or imply endorseme
nt of any Modified Version.
\layout Subsection*
5.
COMBINING DOCUMENTS
\layout Standard
You may combine the Document with other documents released under this License,
under the terms defined in section 4 above for modified versions, provided
that you include in the combination all of the Invariant Sections of all
of the original documents, unmodified, and list them all as Invariant Sections
of your combined work in its license notice.
\layout Standard
The combined work need only contain one copy of this License, and multiple
identical Invariant Sections may be replaced with a single copy.
If there are multiple Invariant Sections with the same name but different
contents, make the title of each such section unique by adding at the end
of it, in parentheses, the name of the original author or publisher of
that section if known, or else a unique number.
Make the same adjustment to the section titles in the list of Invariant
Sections in the license notice of the combined work.
\layout Standard
In the combination, you must combine any sections entitled "History" in
the various original documents, forming one section entitled "History";
likewise combine any sections entitled "Acknowledgements", and any sections
entitled "Dedications".
You must delete all sections entitled "Endorsements."
\layout Subsection*
6.
COLLECTIONS OF DOCUMENTS
\layout Standard
You may make a collection consisting of the Document and other documents
released under this License, and replace the individual copies of this
License in the various documents with a single copy that is included in
the collection, provided that you follow the rules of this License for
verbatim copying of each of the documents in all other respects.
\layout Standard
You may extract a single document from such a collection, and distribute
it individually under this License, provided you insert a copy of this
License into the extracted document, and follow this License in all other
respects regarding verbatim copying of that document.
\layout Subsection*
7.
AGGREGATION WITH INDEPENDENT WORKS
\layout Standard
A compilation of the Document or its derivatives with other separate and
independent documents or works, in or on a volume of a storage or distribution
medium, does not as a whole count as a Modified Version of the Document,
provided no compilation copyright is claimed for the compilation.
Such a compilation is called an "aggregate", and this License does not
apply to the other self-contained works thus compiled with the Document,
on account of their being thus compiled, if they are not themselves derivative
works of the Document.
\layout Standard
If the Cover Text requirement of section 3 is applicable to these copies
of the Document, then if the Document is less than one quarter of the entire
aggregate, the Document's Cover Texts may be placed on covers that surround
only the Document within the aggregate.
Otherwise they must appear on covers around the whole aggregate.
\layout Subsection*
8.
TRANSLATION
\layout Standard
Translation is considered a kind of modification, so you may distribute
translations of the Document under the terms of section 4.
Replacing Invariant Sections with translations requires special permission
from their copyright holders, but you may include translations of some
or all Invariant Sections in addition to the original versions of these
Invariant Sections.
You may include a translation of this License provided that you also include
the original English version of this License.
In case of a disagreement between the translation and the original English
version of this License, the original English version will prevail.
\layout Subsection*
9.
TERMINATION
\layout Standard
You may not copy, modify, sublicense, or distribute the Document except
as expressly provided for under this License.
Any other attempt to copy, modify, sublicense or distribute the Document
is void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under this
License will not have their licenses terminated so long as such parties
remain in full compliance.
\layout Subsection*
10.
FUTURE REVISIONS OF THIS LICENSE
\layout Standard
The Free Software Foundation may publish new, revised versions of the GNU
Free Documentation License from time to time.
Such new versions will be similar in spirit to the present version, but
may differ in detail to address new problems or concerns.
See http://www.gnu.org/copyleft/.
\layout Standard
Each version of the License is given a distinguishing version number.
If the Document specifies that a particular numbered version of this License
"or any later version" applies to it, you have the option of following
the terms and conditions either of that specified version or of any later
version that has been published (not as a draft) by the Free Software Foundatio
n.
If the Document does not specify a version number of this License, you
may choose any version ever published (not as a draft) by the Free Software
Foundation.
\layout Standard
\begin_inset LatexCommand \printindex{}
\end_inset
\the_end