#LyX 1.6.1 created this file. For more info see http://www.lyx.org/
\lyxformat 345
\begin_document
\begin_header
\textclass scrbook
\use_default_options true
\language english
\inputencoding auto
\font_roman default
\font_sans default
\font_typewriter default
\font_default_family default
\font_sc false
\font_osf false
\font_sf_scale 100
\font_tt_scale 100

\graphics default
\paperfontsize 10
\spacing single
\use_hyperref false
\papersize letterpaper
\use_geometry true
\use_amsmath 2
\use_esint 2
\cite_engine basic
\use_bibtopic false
\paperorientation portrait
\leftmargin 2cm
\topmargin 2cm
\rightmargin 2cm
\bottommargin 2cm
\secnumdepth 3
\tocdepth 3
\paragraph_separation indent
\defskip medskip
\quotes_language english
\papercolumns 1
\papersides 1
\paperpagestyle headings
\tracking_changes false
\output_changes false
\author "" 
\author "" 
\end_header

\begin_body

\begin_layout Title
The Speex Manual
\begin_inset Newline newline
\end_inset

Version 1.2
\end_layout

\begin_layout Author
Jean-Marc Valin
\end_layout

\begin_layout Standard
\begin_inset Newpage newpage
\end_inset


\end_layout

\begin_layout Standard
Copyright 
\begin_inset ERT
status collapsed

\begin_layout Plain Layout


\backslash
copyright
\end_layout

\end_inset

 2002-2008 Jean-Marc Valin/Xiph.org Foundation
\end_layout

\begin_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".
 
\end_layout

\begin_layout Standard
\begin_inset Newpage newpage
\end_inset


\begin_inset CommandInset toc
LatexCommand tableofcontents

\end_inset


\begin_inset Newpage newpage
\end_inset


\end_layout

\begin_layout Standard
\begin_inset FloatList table

\end_inset


\begin_inset Newpage newpage
\end_inset


\end_layout

\begin_layout Chapter
Introduction to Speex
\end_layout

\begin_layout Standard
The Speex codec (
\family typewriter
http://www.speex.org/
\family default
) exists because there is a need for a speech codec that is open-source
 and free from software patent royalties.
 These are essential conditions for being usable in any open-source software.
 In essence, Speex is to speech what Vorbis is to audio/music.
 Unlike many other speech codecs, Speex is not designed for mobile phones
 but rather for packet networks and voice over IP (VoIP) applications.
 File-based compression is of course also supported.
 
\end_layout

\begin_layout Standard
The Speex codec is designed to be very flexible and support a wide range
 of speech quality and bit-rate.
 Support for very good quality speech also means that Speex can encode wideband
 speech (16 kHz sampling rate) in addition to narrowband speech (telephone
 quality, 8 kHz sampling rate).
\end_layout

\begin_layout Standard
Designing for VoIP instead of mobile phones means that Speex is robust to
 lost packets, but not to corrupted ones.
 This is based on the assumption that in VoIP, packets either arrive unaltered
 or don't arrive at all.
 Because Speex is targeted at a wide range of devices, it has modest (adjustable
) complexity and a small memory footprint.
\end_layout

\begin_layout Standard
All the design goals led to the choice of CELP
\begin_inset Index
status collapsed

\begin_layout Plain Layout
CELP
\end_layout

\end_inset

 as the encoding technique.
 One of the main reasons is that CELP has long proved that it could work
 reliably and scale well to both low bit-rates (e.g.
 DoD CELP @ 4.8 kbps) and high bit-rates (e.g.
 G.728 @ 16 kbps).
 
\end_layout

\begin_layout Section
Getting help
\begin_inset CommandInset label
LatexCommand label
name "sec:Getting-help"

\end_inset


\end_layout

\begin_layout Standard
As for many open source projects, there are many ways to get help with Speex.
 These include:
\end_layout

\begin_layout Itemize
This manual
\end_layout

\begin_layout Itemize
Other documentation on the Speex website (http://www.speex.org/)
\end_layout

\begin_layout Itemize
Mailing list: Discuss any Speex-related topic on speex-dev@xiph.org (not
 just for developers)
\end_layout

\begin_layout Itemize
IRC: The main channel is #speex on irc.freenode.net.
 Note that due to time differences, it may take a while to get someone,
 so please be patient.
\end_layout

\begin_layout Itemize
Email the author privately at jean-marc.valin@usherbrooke.ca 
\series bold
only
\series default
 for private/delicate topics you do not wish to discuss publicly.
\end_layout

\begin_layout Standard
Before asking for help (mailing list or IRC), 
\series bold
it is important to first read this manual
\series default
 (OK, so if you made it here it's already a good sign).
 It is generally considered rude to ask on a mailing list about topics that
 are clearly detailed in the documentation.
 On the other hand, it's perfectly OK (and encouraged) to ask for clarifications
 about something covered in the manual.
 This manual does not (yet) cover everything about Speex, so everyone is
 encouraged to ask questions, send comments, feature requests, or just let
 us know how Speex is being used.
 
\end_layout

\begin_layout Standard
Here are some additional guidelines related to the mailing list.
 Before reporting bugs in Speex to the list, it is strongly recommended
 (if possible) to first test whether these bugs can be reproduced using
 the speexenc and speexdec (see Section 
\begin_inset CommandInset ref
LatexCommand ref
reference "sec:Command-line-encoder/decoder"

\end_inset

) command-line utilities.
 Bugs reported based on 3rd party code are both harder to find and far too
 often caused by errors that have nothing to do with Speex.
 
\end_layout

\begin_layout Section
About this document
\end_layout

\begin_layout Standard
This document is divided in the following way.
 Section 
\begin_inset CommandInset ref
LatexCommand ref
reference "sec:Feature-description"

\end_inset

 describes the different Speex features and defines many basic terms that
 are used throughout this manual.
 Section 
\begin_inset CommandInset ref
LatexCommand ref
reference "sec:Command-line-encoder/decoder"

\end_inset

 documents the standard command-line tools provided in the Speex distribution.
 Section 
\begin_inset CommandInset ref
LatexCommand ref
reference "sec:Programming-with-Speex"

\end_inset

 includes detailed instructions about programming using the libspeex
\begin_inset Index
status collapsed

\begin_layout Plain Layout
libspeex
\end_layout

\end_inset

 API.
 Section 
\begin_inset CommandInset ref
LatexCommand ref
reference "sec:Formats-and-standards"

\end_inset

 has some information related to Speex and standards.
 
\end_layout

\begin_layout Standard
The three last sections describe the algorithms used in Speex.
 These sections require signal processing knowledge, but are not required
 for merely using Speex.
 They are intended for people who want to understand how Speex really works
 and/or want to do research based on Speex.
 Section 
\begin_inset CommandInset ref
LatexCommand ref
reference "sec:Introduction-to-CELP"

\end_inset

 explains the general idea behind CELP, while sections 
\begin_inset CommandInset ref
LatexCommand ref
reference "sec:Speex-narrowband-mode"

\end_inset

 and 
\begin_inset CommandInset ref
LatexCommand ref
reference "sec:Speex-wideband-mode"

\end_inset

 are specific to Speex.
\end_layout

\begin_layout Standard
\begin_inset Newpage newpage
\end_inset


\end_layout

\begin_layout Chapter
Codec description
\begin_inset CommandInset label
LatexCommand label
name "sec:Feature-description"

\end_inset


\end_layout

\begin_layout Standard
This section describes Speex and its features into more details.
\end_layout

\begin_layout Section
Concepts
\end_layout

\begin_layout Standard
Before introducing all the Speex features, here are some concepts in speech
 coding that help better understand the rest of the manual.
 Although some are general concepts in speech/audio processing, others are
 specific to Speex.
\end_layout

\begin_layout Subsection*
Sampling rate
\begin_inset Index
status collapsed

\begin_layout Plain Layout
sampling rate
\end_layout

\end_inset


\end_layout

\begin_layout Standard
The sampling rate expressed in Hertz (Hz) is the number of samples taken
 from a signal per second.
 For a sampling rate of 
\begin_inset Formula $F_{s}$
\end_inset

 kHz, the highest frequency that can be represented is equal to 
\begin_inset Formula $F_{s}/2$
\end_inset

 kHz (
\begin_inset Formula $F_{s}/2$
\end_inset

 is known as the Nyquist frequency).
 This is a fundamental property in signal processing and is described by
 the sampling theorem.
 Speex is mainly designed for three different sampling rates: 8 kHz, 16
 kHz, and 32 kHz.
 These are respectively referred to as narrowband
\begin_inset Index
status collapsed

\begin_layout Plain Layout
narrowband
\end_layout

\end_inset

, wideband
\begin_inset Index
status collapsed

\begin_layout Plain Layout
wideband
\end_layout

\end_inset

 and ultra-wideband
\begin_inset Index
status collapsed

\begin_layout Plain Layout
ultra-wideband
\end_layout

\end_inset

.
 
\end_layout

\begin_layout Subsection*
Bit-rate
\end_layout

\begin_layout Standard
When encoding a speech signal, the bit-rate is defined as the number of
 bits per unit of time required to encode the speech.
 It is measured in 
\emph on
bits per second
\emph default
 (bps), or generally 
\emph on
kilobits per second
\emph default
.
 It is important to make the distinction between 
\emph on
kilo
\series bold
bits
\series default
\emph default
 
\emph on
per second
\emph default
 (k
\series bold
b
\series default
ps) and 
\emph on
kilo
\series bold
bytes
\series default
\emph default
 
\emph on
per second
\emph default
 (k
\series bold
B
\series default
ps).
\end_layout

\begin_layout Subsection*
Quality
\begin_inset Index
status collapsed

\begin_layout Plain Layout
quality
\end_layout

\end_inset

 (variable)
\end_layout

\begin_layout Standard
Speex is a lossy codec, which means that it achieves compression at the
 expense of fidelity of the input speech signal.
 Unlike some other speech codecs, it is possible to control the trade-off
 made between quality and bit-rate.
 The Speex encoding process is controlled most of the time by a quality
 parameter that ranges from 0 to 10.
 In constant bit-rate
\begin_inset Index
status collapsed

\begin_layout Plain Layout
constant bit-rate
\end_layout

\end_inset

 (CBR) operation, the quality parameter is an integer, while for variable
 bit-rate (VBR), the parameter is a float.
 
\end_layout

\begin_layout Subsection*
Complexity
\begin_inset Index
status collapsed

\begin_layout Plain Layout
complexity
\end_layout

\end_inset

 (variable)
\end_layout

\begin_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 1 is between 1 and 2 dB higher
 than at complexity 10, but the CPU requirements for complexity 10 is about
 5 times 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 Index
status collapsed

\begin_layout Plain Layout
DTMF
\end_layout

\end_inset

 tones.
\end_layout

\begin_layout Subsection*
Variable Bit-Rate
\begin_inset Index
status collapsed

\begin_layout Plain Layout
variable bit-rate
\end_layout

\end_inset

 (VBR)
\end_layout

\begin_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 achieve 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.
\end_layout

\begin_layout Subsection*
Average Bit-Rate
\begin_inset Index
status collapsed

\begin_layout Plain Layout
average bit-rate
\end_layout

\end_inset

 (ABR)
\end_layout

\begin_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 by encoding in
 VBR with exactly the right quality setting to meet the target average bit-rate.
\end_layout

\begin_layout Subsection*
Voice Activity Detection
\begin_inset Index
status collapsed

\begin_layout Plain Layout
voice activity detection
\end_layout

\end_inset

 (VAD)
\end_layout

\begin_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).
\end_layout

\begin_layout Subsection*
Discontinuous Transmission
\begin_inset Index
status collapsed

\begin_layout Plain Layout
discontinuous transmission
\end_layout

\end_inset

 (DTX)
\end_layout

\begin_layout Standard
Discontinuous transmission is an addition to VAD/VBR operation, that allows
 to stop transmitting completely when the background noise is stationary.
 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).
\end_layout

\begin_layout Subsection*
Perceptual enhancement
\begin_inset Index
status collapsed

\begin_layout Plain Layout
perceptual enhancement
\end_layout

\end_inset


\end_layout

\begin_layout Standard
Perceptual enhancement is a part of the decoder which, when turned on, attempts
 to reduce the perception of the noise/distortion produced by the encoding/decod
ing process.
 In most cases, perceptual enhancement brings the sound further from the
 original 
\emph on
objectively
\emph default
 (e.g.
 considering only SNR), but in the end it still 
\emph on
sounds
\emph default
 better (subjective improvement).
\end_layout

\begin_layout Subsection*
Latency and algorithmic delay
\begin_inset Index
status collapsed

\begin_layout Plain Layout
algorithmic delay
\end_layout

\end_inset


\end_layout

\begin_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 look-ahead is 10 ms, in wideband operation
 (16 kHz), the look-ahead is 13.9 ms and in ultra-wideband operation (32
 kHz) look-ahead is 15.9 ms, resulting in the algorithic delays of 30 ms,
 33.9 ms and 35.9 ms accordingly.
 These values don't account for the CPU time it takes to encode or decode
 the frames.
\end_layout

\begin_layout Section
Codec
\end_layout

\begin_layout Standard
The main characteristics of Speex can be summarized as follows:
\end_layout

\begin_layout Itemize
Free software/open-source
\begin_inset Index
status collapsed

\begin_layout Plain Layout
open-source
\end_layout

\end_inset

, patent
\begin_inset Index
status collapsed

\begin_layout Plain Layout
patent
\end_layout

\end_inset

 and royalty-free
\end_layout

\begin_layout Itemize
Integration of narrowband
\begin_inset Index
status collapsed

\begin_layout Plain Layout
narrowband
\end_layout

\end_inset

 and wideband
\begin_inset Index
status collapsed

\begin_layout Plain Layout
wideband
\end_layout

\end_inset

 using an embedded bit-stream
\end_layout

\begin_layout Itemize
Wide range of bit-rates available (from 2.15 kbps to 44 kbps)
\end_layout

\begin_layout Itemize
Dynamic bit-rate switching (AMR) and Variable Bit-Rate
\begin_inset Index
status collapsed

\begin_layout Plain Layout
variable bit-rate
\end_layout

\end_inset

 (VBR) operation
\end_layout

\begin_layout Itemize
Voice Activity Detection
\begin_inset Index
status collapsed

\begin_layout Plain Layout
voice activity detection
\end_layout

\end_inset

 (VAD, integrated with VBR) and discontinuous transmission (DTX)
\end_layout

\begin_layout Itemize
Variable complexity
\begin_inset Index
status collapsed

\begin_layout Plain Layout
complexity
\end_layout

\end_inset


\end_layout

\begin_layout Itemize
Embedded wideband structure (scalable sampling rate)
\end_layout

\begin_layout Itemize
Ultra-wideband sampling rate at 32 kHz
\end_layout

\begin_layout Itemize
Intensity stereo encoding option
\end_layout

\begin_layout Itemize
Fixed-point implementation
\end_layout

\begin_layout Section
Preprocessor
\end_layout

\begin_layout Standard
This part refers to the preprocessor module introduced in the 1.1.x branch.
 The preprocessor is designed to be used on the audio 
\emph on
before
\emph default
 running the encoder.
 The preprocessor provides three main functionalities:
\end_layout

\begin_layout Itemize
noise suppression
\end_layout

\begin_layout Itemize
automatic gain control (AGC)
\end_layout

\begin_layout Itemize
voice activity detection (VAD)
\end_layout

\begin_layout Standard
The denoiser can be used to reduce the amount of background noise present
 in the input signal.
 This provides higher quality speech whether or not the denoised signal
 is encoded with Speex (or at all).
 However, when using the denoised signal with the codec, there is an additional
 benefit.
 Speech codecs in general (Speex included) tend to perform poorly on noisy
 input, which tends to amplify the noise.
 The denoiser greatly reduces this effect.
\end_layout

\begin_layout Standard
Automatic gain control (AGC) is a feature that deals with the fact that
 the recording volume may vary by a large amount between different setups.
 The AGC provides a way to adjust a signal to a reference volume.
 This is useful for voice over IP because it removes the need for manual
 adjustment of the microphone gain.
 A secondary advantage is that by setting the microphone gain to a conservative
 (low) level, it is easier to avoid clipping.
\end_layout

\begin_layout Standard
The voice activity detector (VAD) provided by the preprocessor is more advanced
 than the one directly provided in the codec.
 
\end_layout

\begin_layout Section
Adaptive Jitter Buffer
\end_layout

\begin_layout Standard
When transmitting voice (or any content for that matter) over UDP or RTP,
 packet may be lost, arrive with different delay, or even out of order.
 The purpose of a jitter buffer is to reorder packets and buffer them long
 enough (but no longer than necessary) so they can be sent to be decoded.
 
\end_layout

\begin_layout Section
Acoustic Echo Canceller
\end_layout

\begin_layout Standard
In any hands-free communication system (Fig.
 
\begin_inset CommandInset ref
LatexCommand ref
reference "fig:Acoustic-echo-model"

\end_inset

), speech from the remote end is played in the local loudspeaker, propagates
 in the room and is captured by the microphone.
 If the audio captured from the microphone is sent directly to the remote
 end, then the remote user hears an echo of his voice.
 An acoustic echo canceller is designed to remove the acoustic echo before
 it is sent to the remote end.
 It is important to understand that the echo canceller is meant to improve
 the quality on the 
\series bold
remote
\series default
 end.
 For those who care a lot about mouth-to-ear delays it should be noted that
 unlike Speex codec, resampler and preprocessor, this Acoustic Echo Canceller
 does not introduce any latency.
\end_layout

\begin_layout Standard
\begin_inset Float figure
wide false
sideways false
status open

\begin_layout Plain Layout
\begin_inset ERT
status collapsed

\begin_layout Plain Layout


\backslash
begin{center}
\end_layout

\end_inset


\begin_inset Graphics
	filename echo_path.eps
	width 10cm

\end_inset


\begin_inset ERT
status collapsed

\begin_layout Plain Layout


\backslash
end{center}
\end_layout

\end_inset


\end_layout

\begin_layout Plain Layout
\begin_inset Caption

\begin_layout Plain Layout
Acoustic echo model
\begin_inset CommandInset label
LatexCommand label
name "fig:Acoustic-echo-model"

\end_inset


\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Section
Resampler
\end_layout

\begin_layout Standard
In some cases, it may be useful to convert audio from one sampling rate
 to another.
 There are many reasons for that.
 It can be for mixing streams that have different sampling rates, for supporting
 sampling rates that the soundcard doesn't support, for transcoding, etc.
 That's why there is now a resampler that is part of the Speex project.
 This resampler can be used to convert between any two arbitrary rates (the
 ratio must only be a rational number) and there is control over the quality/com
plexity tradeoff.
 Keep in mind, that resampler introduce some delay in audio stream, which
 size depends on resampler quality setting.
 Refer to resampler API documentation to know how to get exact delay values.
\end_layout

\begin_layout Section
Integration
\end_layout

\begin_layout Standard
Knowing 
\emph on
how
\emph default
 to use each of the components is not that useful unless we know 
\emph on
where
\emph default
 to use them.
 Figure 
\begin_inset CommandInset ref
LatexCommand ref
reference "fig:Integration-VoIP"

\end_inset

 shows where each of the components would be used in a typical VoIP client.
 Components in dotted lines are optional, though they may be very useful
 in some circumstances.
 There are several important things to note from there.
 The AEC must be placed as close as possible to the playback and capture.
 Only the resampling may be closer.
 Also, it is very important to use the same clock for both mic capture and
 speaker/headphones playback.
\end_layout

\begin_layout Standard
\begin_inset Float figure
wide false
sideways false
status open

\begin_layout Plain Layout
\begin_inset ERT
status collapsed

\begin_layout Plain Layout


\backslash
begin{center}
\end_layout

\end_inset


\begin_inset Graphics
	filename components.eps
	width 80text%

\end_inset


\begin_inset ERT
status collapsed

\begin_layout Plain Layout


\backslash
end{center}
\end_layout

\end_inset


\end_layout

\begin_layout Plain Layout
\begin_inset Caption

\begin_layout Plain Layout
Integration of all the components in a VoIP client.
\begin_inset CommandInset label
LatexCommand label
name "fig:Integration-VoIP"

\end_inset


\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
\begin_inset Newpage newpage
\end_inset


\end_layout

\begin_layout Chapter
Compiling and Porting
\end_layout

\begin_layout Standard
Compiling Speex under UNIX/Linux or any other platform supported by autoconf
 (e.g.
 Win32/cygwin) is as easy as typing:
\end_layout

\begin_layout LyX-Code
% ./configure [options]
\end_layout

\begin_layout LyX-Code
% make
\end_layout

\begin_layout LyX-Code
% make install
\end_layout

\begin_layout Standard
The options supported by the Speex configure script are:
\end_layout

\begin_layout Description
--prefix=<path> Specifies the base path for installing Speex (e.g.
 /usr)
\end_layout

\begin_layout Description
--enable-shared/--disable-shared Whether to compile shared libraries
\end_layout

\begin_layout Description
--enable-static/--disable-static Whether to compile static libraries
\end_layout

\begin_layout Description
--disable-wideband Disable the wideband part of Speex (typically to save
 space)
\end_layout

\begin_layout Description
--enable-valgrind Enable extra hits for valgrind for debugging purposes
 (do not use by default)
\end_layout

\begin_layout Description
--enable-sse Enable use of SSE instructions (x86/float only)
\end_layout

\begin_layout Description
--enable-fixed-point
\begin_inset Index
status collapsed

\begin_layout Plain Layout
fixed-point
\end_layout

\end_inset

 Compile Speex for a processor that does not have a floating point unit
 (FPU)
\end_layout

\begin_layout Description
--enable-arm4-asm Enable assembly specific to the ARMv4 architecture (gcc
 only)
\end_layout

\begin_layout Description
--enable-arm5e-asm Enable assembly specific to the ARMv5E architecture (gcc
 only)
\end_layout

\begin_layout Description
--enable-fixed-point-debug Use only for debugging the fixed-point
\begin_inset Index
status collapsed

\begin_layout Plain Layout
fixed-point
\end_layout

\end_inset

 code (very slow)
\end_layout

\begin_layout Description
--enable-ti-c55x Enable support for the TI C5x family
\end_layout

\begin_layout Description
--enable-blackfin-asm Enable assembly specific to the Blackfin DSP architecture
 (gcc only)
\end_layout

\begin_layout Section
Platforms
\end_layout

\begin_layout Standard
Speex is known to compile and work on a large number of architectures, both
 floating-point and fixed-point.
 In general, any architecture that can natively compute the multiplication
 of two signed 16-bit numbers (32-bit result) and runs at a sufficient clock
 rate (architecture-dependent) is capable of running Speex.
 Architectures on which Speex is 
\series bold
known
\series default
 to work (it probably works on many others) are:
\end_layout

\begin_layout Itemize
x86 & x86-64
\end_layout

\begin_layout Itemize
Power
\end_layout

\begin_layout Itemize
SPARC
\end_layout

\begin_layout Itemize
ARM
\end_layout

\begin_layout Itemize
Blackfin
\end_layout

\begin_layout Itemize
Coldfire (68k family)
\end_layout

\begin_layout Itemize
TI C54xx & C55xx
\end_layout

\begin_layout Itemize
TI C6xxx
\end_layout

\begin_layout Itemize
TriMedia (experimental)
\end_layout

\begin_layout Standard
Operating systems on top of which Speex is known to work include (it probably
 works on many others):
\end_layout

\begin_layout Itemize
Linux
\end_layout

\begin_layout Itemize
\begin_inset Formula $\mu$
\end_inset

Clinux
\end_layout

\begin_layout Itemize
MacOS X
\end_layout

\begin_layout Itemize
BSD
\end_layout

\begin_layout Itemize
Other UNIX/POSIX variants
\end_layout

\begin_layout Itemize
Symbian
\end_layout

\begin_layout Standard
The source code directory include additional information for compiling on
 certain architectures or operating systems in README.xxx files.
\end_layout

\begin_layout Section
Porting and Optimising
\end_layout

\begin_layout Standard
Here are a few things to consider when porting or optimising Speex for a
 new platform or an existing one.
\end_layout

\begin_layout Subsection
CPU optimisation
\end_layout

\begin_layout Standard
The single factor that will affect the CPU usage of Speex the most is whether
 it is compiled for floating point or fixed-point.
 If your CPU/DSP does not have a floating-point unit FPU, then compiling
 as fixed-point will be orders of magnitudes faster.
 If there is an FPU present, then it is important to test which version
 is faster.
 On the x86 architecture, floating-point is 
\series bold
generally
\series default
 faster, but not always.
 To compile Speex as fixed-point, you need to pass --fixed-point to the
 configure script or define the FIXED_POINT macro for the compiler.
 As of 1.2beta3, it is now possible to disable the floating-point compatibility
 API, which means that your code can link without a float emulation library.
 To do that configure with --disable-float-api or define the DISABLE_FLOAT_API
 macro.
 Until the VBR feature is ported to fixed-point, you will also need to configure
 with --disable-vbr or define DISABLE_VBR.
\end_layout

\begin_layout Standard
Other important things to check on some DSP architectures are:
\end_layout

\begin_layout Itemize
Make sure the cache is set to write-back mode
\end_layout

\begin_layout Itemize
If the chip has SRAM instead of cache, make sure as much code and data are
 in SRAM, rather than in RAM
\end_layout

\begin_layout Standard
If you are going to be writing assembly, then the following functions are
 
\series bold
usually
\series default
 the first ones you should consider optimising:
\end_layout

\begin_layout Itemize
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

filter_mem16()
\end_layout

\end_inset


\end_layout

\begin_layout Itemize
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

iir_mem16()
\end_layout

\end_inset


\end_layout

\begin_layout Itemize
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

vq_nbest()
\end_layout

\end_inset


\end_layout

\begin_layout Itemize
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

pitch_xcorr()
\end_layout

\end_inset


\end_layout

\begin_layout Itemize
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

interp_pitch()
\end_layout

\end_inset


\end_layout

\begin_layout Standard
The filtering functions 
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

filter_mem16()
\end_layout

\end_inset

 and 
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

iir_mem16()
\end_layout

\end_inset

 are implemented in the direct form II transposed (DF2T).
 However, for architectures based on multiply-accumulate (MAC), DF2T requires
 frequent reload of the accumulator, which can make the code very slow.
 For these architectures (e.g.
 Blackfin and Coldfire), a better approach is to implement those functions
 as direct form I (DF1), which is easier to express in terms of MAC.
 When doing that however, 
\series bold
it is important to make sure that the DF1 implementation still behaves like
 the original DF2T behaviour when it comes to memory values
\series default
.
 This is necessary because the filter is time-varying and must compute exactly
 the same value (not counting machine rounding) on any encoder or decoder.
\end_layout

\begin_layout Subsection
Memory optimisation
\end_layout

\begin_layout Standard
Memory optimisation is mainly something that should be considered for small
 embedded platforms.
 For PCs, Speex is already so tiny that it's just not worth doing any of
 the things suggested here.
 There are several ways to reduce the memory usage of Speex, both in terms
 of code size and data size.
 For optimising code size, the trick is to first remove features you do
 not need.
 Some examples of things that can easily be disabled 
\series bold
if you don't need them
\series default
 are:
\end_layout

\begin_layout Itemize
Wideband support (--disable-wideband)
\end_layout

\begin_layout Itemize
Support for stereo (removing stereo.c)
\end_layout

\begin_layout Itemize
VBR support (--disable-vbr or DISABLE_VBR)
\end_layout

\begin_layout Itemize
Static codebooks that are not needed for the bit-rates you are using (*_table.c
 files)
\end_layout

\begin_layout Standard
Speex also has several methods for allocating temporary arrays.
 When using a compiler that supports C99 properly (as of 2007, Microsoft
 compilers don't, but gcc does), it is best to define VAR_ARRAYS.
 That makes use of the variable-size array feature of C99.
 The next best is to define USE_ALLOCA so that Speex can use alloca() to
 allocate the temporary arrays.
 Note that on many systems, alloca() is buggy so it may not work.
 If none of VAR_ARRAYS and USE_ALLOCA are defined, then Speex falls back
 to allocating a large 
\begin_inset Quotes eld
\end_inset

scratch space
\begin_inset Quotes erd
\end_inset

 and doing its own internal allocation.
 The main disadvantage of this solution is that it is wasteful.
 It needs to allocate enough stack for the worst case scenario (worst bit-rate,
 highest complexity setting, ...) and by default, the memory isn't shared between
 multiple encoder/decoder states.
 Still, if the 
\begin_inset Quotes eld
\end_inset

manual
\begin_inset Quotes erd
\end_inset

 allocation is the only option left, there are a few things that can be
 improved.
 By overriding the speex_alloc_scratch() call in os_support.h, it is possible
 to always return the same memory area for all states
\begin_inset Foot
status collapsed

\begin_layout Plain Layout
In this case, one must be careful with threads
\end_layout

\end_inset

.
 In addition to that, by redefining the NB_ENC_STACK and NB_DEC_STACK (or
 similar for wideband), it is possible to only allocate memory for a scenario
 that is known in advance.
 In this case, it is important to measure the amount of memory required
 for the specific sampling rate, bit-rate and complexity level being used.
\end_layout

\begin_layout Standard
\begin_inset Newpage newpage
\end_inset


\end_layout

\begin_layout Chapter
Command-line encoder/decoder
\begin_inset CommandInset label
LatexCommand label
name "sec:Command-line-encoder/decoder"

\end_inset


\end_layout

\begin_layout Standard
The base Speex distribution includes a command-line encoder (
\emph on
speexenc
\emph default
) and decoder (
\emph on
speexdec
\emph default
).
 Those tools produce and read Speex files encapsulated in the Ogg container.
 Although it is possible to encapsulate Speex in any container, Ogg is the
 recommended container for files.
 This section describes how to use the command line tools for Speex files
 in Ogg.
\end_layout

\begin_layout Section

\emph on
speexenc
\begin_inset Index
status collapsed

\begin_layout Plain Layout
speexenc
\end_layout

\end_inset


\end_layout

\begin_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: 
\end_layout

\begin_layout LyX-Code
speexenc [options] input_file output_file
\end_layout

\begin_layout Standard
The value '-' for input_file or output_file corresponds respectively to
 stdin and stdout.
 The valid options are:
\end_layout

\begin_layout Description
--narrowband
\begin_inset space ~
\end_inset

(-n) Tell Speex to treat the input as narrowband (8 kHz).
 This is the default
\end_layout

\begin_layout Description
--wideband
\begin_inset space ~
\end_inset

(-w) Tell Speex to treat the input as wideband (16 kHz)
\end_layout

\begin_layout Description
--ultra-wideband
\begin_inset space ~
\end_inset

(-u) Tell Speex to treat the input as 
\begin_inset Quotes eld
\end_inset

ultra-wideband
\begin_inset Quotes erd
\end_inset

 (32 kHz)
\end_layout

\begin_layout Description
--quality
\begin_inset space ~
\end_inset

n Set the encoding quality (0-10), default is 8
\end_layout

\begin_layout Description
--bitrate
\begin_inset space ~
\end_inset

n Encoding bit-rate (use bit-rate n or lower) 
\end_layout

\begin_layout Description
--vbr Enable VBR (Variable Bit-Rate), disabled by default
\end_layout

\begin_layout Description
--abr
\begin_inset space ~
\end_inset

n Enable ABR (Average Bit-Rate) at n kbps, disabled by default
\end_layout

\begin_layout Description
--vad Enable VAD (Voice Activity Detection), disabled by default
\end_layout

\begin_layout Description
--dtx Enable DTX (Discontinuous Transmission), disabled by default
\end_layout

\begin_layout Description
--nframes
\begin_inset space ~
\end_inset

n Pack n frames in each Ogg packet (this saves space at low bit-rates)
\end_layout

\begin_layout Description
--comp
\begin_inset space ~
\end_inset

n Set encoding speed/quality tradeoff.
 The higher the value of n, the slower the encoding (default is 3)
\end_layout

\begin_layout Description
-V Verbose operation, print bit-rate currently in use
\end_layout

\begin_layout Description
--help
\begin_inset space ~
\end_inset

(-h) Print the help
\end_layout

\begin_layout Description
--version
\begin_inset space ~
\end_inset

(-v) Print version information
\end_layout

\begin_layout Subsection*
Speex comments
\end_layout

\begin_layout Description
--comment Add the given string as an extra comment.
 This may be used multiple times.
 
\end_layout

\begin_layout Description
--author Author of this track.
 
\end_layout

\begin_layout Description
--title Title for this track.
 
\end_layout

\begin_layout Subsection*
Raw input options
\end_layout

\begin_layout Description
--rate
\begin_inset space ~
\end_inset

n Sampling rate for raw input
\end_layout

\begin_layout Description
--stereo Consider raw input as stereo 
\end_layout

\begin_layout Description
--le Raw input is little-endian 
\end_layout

\begin_layout Description
--be Raw input is big-endian 
\end_layout

\begin_layout Description
--8bit Raw input is 8-bit unsigned 
\end_layout

\begin_layout Description
--16bit Raw input is 16-bit signed 
\end_layout

\begin_layout Section

\emph on
speexdec
\begin_inset Index
status collapsed

\begin_layout Plain Layout
speexdec
\end_layout

\end_inset


\end_layout

\begin_layout Standard
The 
\emph on
speexdec
\emph default
 utility is used to decode Speex files and can be used by calling: 
\end_layout

\begin_layout LyX-Code
speexdec [options] speex_file [output_file]
\end_layout

\begin_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:
\end_layout

\begin_layout Description
--enh enable post-filter (default)
\end_layout

\begin_layout Description
--no-enh disable post-filter
\end_layout

\begin_layout Description
--force-nb Force decoding in narrowband 
\end_layout

\begin_layout Description
--force-wb Force decoding in wideband 
\end_layout

\begin_layout Description
--force-uwb Force decoding in ultra-wideband 
\end_layout

\begin_layout Description
--mono Force decoding in mono 
\end_layout

\begin_layout Description
--stereo Force decoding in stereo 
\end_layout

\begin_layout Description
--rate
\begin_inset space ~
\end_inset

n Force decoding at n Hz sampling rate
\end_layout

\begin_layout Description
--packet-loss
\begin_inset space ~
\end_inset

n Simulate n % random packet loss
\end_layout

\begin_layout Description
-V Verbose operation, print bit-rate currently in use
\end_layout

\begin_layout Description
--help
\begin_inset space ~
\end_inset

(-h) Print the help
\end_layout

\begin_layout Description
--version
\begin_inset space ~
\end_inset

(-v) Print version information
\end_layout

\begin_layout Standard
\begin_inset Newpage newpage
\end_inset


\end_layout

\begin_layout Chapter
Using the Speex Codec API (
\emph on
libspeex
\emph default

\begin_inset Index
status collapsed

\begin_layout Plain Layout
libspeex
\end_layout

\end_inset

)
\begin_inset CommandInset label
LatexCommand label
name "sec:Programming-with-Speex"

\end_inset


\end_layout

\begin_layout Standard
The 
\emph on
libspeex
\emph default
 library contains all the functions for encoding and decoding speech with
 the Speex codec.
 When linking on a UNIX system, one must add 
\emph on
-lspeex -lm
\emph default
 to the compiler command line.
 One important thing to know is that 
\series bold
libspeex calls are reentrant, but not thread-safe
\series default
.
 That means that it is fine to use calls from many threads, but 
\series bold
calls using the same state from multiple threads must be protected by mutexes
\series default
.
 Examples of code can also be found in Appendix 
\begin_inset CommandInset ref
LatexCommand ref
reference "sec:Sample-code"

\end_inset

 and the complete API documentation is included in the Documentation section
 of the Speex website (http://www.speex.org/).
\end_layout

\begin_layout Section
Encoding
\begin_inset CommandInset label
LatexCommand label
name "sub:Encoding"

\end_inset


\end_layout

\begin_layout Standard
In order to encode speech using Speex, one first needs to:
\end_layout

\begin_layout Standard
\begin_inset listings
inline false
status open

\begin_layout Plain Layout

#include <speex/speex.h>
\end_layout

\end_inset

Then in the code, a Speex bit-packing struct must be declared, along with
 a Speex encoder state:
\begin_inset listings
inline false
status open

\begin_layout Plain Layout

SpeexBits bits;
\end_layout

\begin_layout Plain Layout

void *enc_state;
\end_layout

\end_inset

The two are initialized by:
\begin_inset listings
inline false
status open

\begin_layout Plain Layout

speex_bits_init(&bits);
\end_layout

\begin_layout Plain Layout

enc_state = speex_encoder_init(&speex_nb_mode);
\end_layout

\end_inset


\end_layout

\begin_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 at the sampling
 rate you are using.
 You can get that value in the 
\emph on
frame_size
\emph default
 variable (expressed in 
\series bold
samples
\series default
, not bytes) with:
\end_layout

\begin_layout Standard
\begin_inset listings
inline false
status open

\begin_layout Plain Layout

speex_encoder_ctl(enc_state,SPEEX_GET_FRAME_SIZE,&frame_size);
\end_layout

\end_inset


\end_layout

\begin_layout Standard
In practice, 
\emph on
frame_size
\emph default
 will correspond to 20 ms when using 8, 16, or 32 kHz sampling rate.
 There are many parameters that can be set for the Speex encoder, but the
 most useful one is the quality parameter that controls the quality vs bit-rate
 tradeoff.
 This is set by:
\end_layout

\begin_layout Standard
\begin_inset listings
inline false
status open

\begin_layout Plain Layout

speex_encoder_ctl(enc_state,SPEEX_SET_QUALITY,&quality);
\end_layout

\end_inset

where 
\emph on
quality
\emph default
 is an integer value ranging from 0 to 10 (inclusively).
 The mapping between quality and bit-rate is described in Fig.
 
\begin_inset CommandInset ref
LatexCommand ref
reference "cap:quality_vs_bps"

\end_inset

 for narrowband.
\end_layout

\begin_layout Standard
Once the initialization is done, for every input frame:
\end_layout

\begin_layout Standard
\begin_inset listings
inline false
status open

\begin_layout Plain Layout

speex_bits_reset(&bits);
\end_layout

\begin_layout Plain Layout

speex_encode_int(enc_state, input_frame, &bits);
\end_layout

\begin_layout Plain Layout

nbBytes = speex_bits_write(&bits, byte_ptr, MAX_NB_BYTES);
\end_layout

\end_inset


\end_layout

\begin_layout Standard
where 
\emph on
input_frame
\emph default
 is a 
\emph on
(
\emph default
short 
\emph on
*)
\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.
\end_layout

\begin_layout Standard
It is still possible to use the 
\emph on
speex_encode()
\emph default
 function, which takes a 
\emph on
(float *)
\emph default
 for the audio.
 However, this would make an eventual port to an FPU-less platform (like
 ARM) more complicated.
 Internally, 
\emph on
speex_encode()
\emph default
 and 
\emph on
speex_encode_int()
\emph default
 are processed in the same way.
 Whether the encoder uses the fixed-point version is only decided by the
 compile-time flags, not at the API level.
\end_layout

\begin_layout Standard
After you're done with the encoding, free all resources with:
\end_layout

\begin_layout Standard
\begin_inset listings
inline false
status open

\begin_layout Plain Layout

speex_bits_destroy(&bits);
\end_layout

\begin_layout Plain Layout

speex_encoder_destroy(enc_state);
\end_layout

\end_inset


\end_layout

\begin_layout Standard
That's about it for the encoder.
 
\end_layout

\begin_layout Section
Decoding
\begin_inset CommandInset label
LatexCommand label
name "sub:Decoding"

\end_inset


\end_layout

\begin_layout Standard
In order to decode speech using Speex, you first need to:
\begin_inset listings
inline false
status open

\begin_layout Plain Layout

#include <speex/speex.h>
\end_layout

\end_inset

You also need to declare a Speex bit-packing struct
\begin_inset listings
inline false
status open

\begin_layout Plain Layout

SpeexBits bits;
\end_layout

\end_inset

and a Speex decoder state
\begin_inset listings
inline false
status open

\begin_layout Plain Layout

void *dec_state;
\end_layout

\end_inset

The two are initialized by:
\begin_inset listings
inline false
status open

\begin_layout Plain Layout

speex_bits_init(&bits);
\end_layout

\begin_layout Plain Layout

dec_state = speex_decoder_init(&speex_nb_mode);
\end_layout

\end_inset


\end_layout

\begin_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 (expressed in 
\series bold
samples
\series default
, not bytes) with:
\end_layout

\begin_layout Standard
\begin_inset listings
inline false
status open

\begin_layout Plain Layout

speex_decoder_ctl(dec_state, SPEEX_GET_FRAME_SIZE, &frame_size);
\end_layout

\end_inset


\end_layout

\begin_layout Standard
There is also a parameter that can be set for the decoder: whether or not
 to use a perceptual enhancer.
 This can be set by: 
\end_layout

\begin_layout Standard
\begin_inset listings
inline false
status open

\begin_layout Plain Layout

speex_decoder_ctl(dec_state, SPEEX_SET_ENH, &enh);
\end_layout

\end_inset


\end_layout

\begin_layout Standard
where 
\emph on
enh
\emph default
 is an int with value 0 to have the enhancer disabled and 1 to have it enabled.
 As of 1.2-beta1, the default is now to enable the enhancer.
\end_layout

\begin_layout Standard
Again, once the decoder initialization is done, for every input frame:
\end_layout

\begin_layout Standard
\begin_inset listings
inline false
status open

\begin_layout Plain Layout

speex_bits_read_from(&bits, input_bytes, nbBytes);
\end_layout

\begin_layout Plain Layout

speex_decode_int(dec_state, &bits, output_frame);
\end_layout

\end_inset

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
(short *)
\emph default
 and points to the area where the decoded speech frame will be written.
 A NULL value as the second 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.
\end_layout

\begin_layout Standard
As for the encoder, the 
\emph on
speex_decode()
\emph default
 function can still be used, with a 
\emph on
(float *)
\emph default
 as the output for the audio.
 After you're done with the decoding, free all resources with:
\end_layout

\begin_layout Standard
\begin_inset listings
inline false
status open

\begin_layout Plain Layout

speex_bits_destroy(&bits);
\end_layout

\begin_layout Plain Layout

speex_decoder_destroy(dec_state);
\end_layout

\end_inset


\end_layout

\begin_layout Section
Codec Options (speex_*_ctl)
\begin_inset CommandInset label
LatexCommand label
name "sub:Codec-Options"

\end_inset


\end_layout

\begin_layout Quote
\align center

\emph on
Entities should not be multiplied beyond necessity -- William of Ockham.
\end_layout

\begin_layout Quote
\align center

\emph on
Just because there's an option for it doesn't mean you have to turn it on
 -- me.
\end_layout

\begin_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:
\end_layout

\begin_layout Standard
\begin_inset listings
inline false
status open

\begin_layout Plain Layout

void speex_encoder_ctl(void *encoder, int request, void *ptr);
\end_layout

\begin_layout Plain Layout

void speex_decoder_ctl(void *encoder, int request, void *ptr);
\end_layout

\end_inset


\end_layout

\begin_layout Standard
Despite those functions, the defaults are usually good for many applications
 and 
\series bold
optional settings should only be used when one understands them and knows
 that they are needed
\series default
.
 A common error is to attempt to set many unnecessary settings.
 
\end_layout

\begin_layout Standard
Here is a list of the values allowed for the requests.
 Some only apply to the encoder or the decoder.
 Because the last argument is of type 
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

void *
\end_layout

\end_inset

, the 
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

_ctl()
\end_layout

\end_inset

 functions are 
\series bold
not type safe
\series default
, and should thus be used with care.
 The type 
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

spx_int32_t
\end_layout

\end_inset

 is the same as the C99 
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

int32_t
\end_layout

\end_inset

 type.
\end_layout

\begin_layout Description
SPEEX_SET_ENH
\begin_inset Formula $\ddagger$
\end_inset

 Set perceptual enhancer
\begin_inset Index
status collapsed

\begin_layout Plain Layout
perceptual enhancement
\end_layout

\end_inset

 to on (1) or off (0) (
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

spx_int32_t
\end_layout

\end_inset

, default is on)
\end_layout

\begin_layout Description
SPEEX_GET_ENH
\begin_inset Formula $\ddagger$
\end_inset

 Get perceptual enhancer status (
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

spx_int32_t
\end_layout

\end_inset

)
\end_layout

\begin_layout Description
SPEEX_GET_FRAME_SIZE Get the number of samples per frame for the current
 mode (
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

spx_int32_t
\end_layout

\end_inset

)
\end_layout

\begin_layout Description
SPEEX_SET_QUALITY
\begin_inset Formula $\dagger$
\end_inset

 Set the encoder speech quality (
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

spx_int32_t
\end_layout

\end_inset

 from 0 to 10, default is 8)
\end_layout

\begin_layout Description
SPEEX_GET_QUALITY
\begin_inset Formula $\dagger$
\end_inset

 Get the current encoder speech quality (
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

spx_int32_t
\end_layout

\end_inset

 from 0 to 10)
\end_layout

\begin_layout Description
SPEEX_SET_MODE
\begin_inset Formula $\dagger$
\end_inset

 Set the mode number, as specified in the RTP spec (
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

spx_int32_t
\end_layout

\end_inset

)
\end_layout

\begin_layout Description
SPEEX_GET_MODE
\begin_inset Formula $\dagger$
\end_inset

 Get the current mode number, as specified in the RTP spec (
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

spx_int32_t
\end_layout

\end_inset

)
\end_layout

\begin_layout Description
SPEEX_SET_VBR
\begin_inset Formula $\dagger$
\end_inset

 Set variable bit-rate (VBR) to on (1) or off (0) (
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

spx_int32_t
\end_layout

\end_inset

, default is off)
\end_layout

\begin_layout Description
SPEEX_GET_VBR
\begin_inset Formula $\dagger$
\end_inset

 Get variable bit-rate
\begin_inset Index
status collapsed

\begin_layout Plain Layout
variable bit-rate
\end_layout

\end_inset

 (VBR) status (
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

spx_int32_t
\end_layout

\end_inset

)
\end_layout

\begin_layout Description
SPEEX_SET_VBR_QUALITY
\begin_inset Formula $\dagger$
\end_inset

 Set the encoder VBR speech quality (float 0.0 to 10.0, default is 8.0)
\end_layout

\begin_layout Description
SPEEX_GET_VBR_QUALITY
\begin_inset Formula $\dagger$
\end_inset

 Get the current encoder VBR speech quality (float 0 to 10)
\end_layout

\begin_layout Description
SPEEX_SET_COMPLEXITY
\begin_inset Formula $\dagger$
\end_inset

 Set the CPU resources allowed for the encoder (
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

spx_int32_t
\end_layout

\end_inset

 from 1 to 10, default is 2)
\end_layout

\begin_layout Description
SPEEX_GET_COMPLEXITY
\begin_inset Formula $\dagger$
\end_inset

 Get the CPU resources allowed for the encoder (
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

spx_int32_t
\end_layout

\end_inset

 from 1 to 10, default is 2)
\end_layout

\begin_layout Description
SPEEX_SET_BITRATE
\begin_inset Formula $\dagger$
\end_inset

 Set the bit-rate to use the closest value not exceeding the parameter (
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

spx_int32_t
\end_layout

\end_inset

 in bits per second)
\end_layout

\begin_layout Description
SPEEX_GET_BITRATE Get the current bit-rate in use (
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

spx_int32_t
\end_layout

\end_inset

 in bits per second)
\end_layout

\begin_layout Description
SPEEX_SET_SAMPLING_RATE Set real sampling rate (
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

spx_int32_t
\end_layout

\end_inset

 in Hz)
\end_layout

\begin_layout Description
SPEEX_GET_SAMPLING_RATE Get real sampling rate (
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

spx_int32_t
\end_layout

\end_inset

 in Hz)
\end_layout

\begin_layout Description
SPEEX_RESET_STATE Reset the encoder/decoder state to its original state,
 clearing all memories (no argument)
\end_layout

\begin_layout Description
SPEEX_SET_VAD
\begin_inset Formula $\dagger$
\end_inset

 Set voice activity detection
\begin_inset Index
status collapsed

\begin_layout Plain Layout
voice activity detection
\end_layout

\end_inset

 (VAD) to on (1) or off (0) (
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

spx_int32_t
\end_layout

\end_inset

, default is off)
\end_layout

\begin_layout Description
SPEEX_GET_VAD
\begin_inset Formula $\dagger$
\end_inset

 Get voice activity detection (VAD) status (
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

spx_int32_t
\end_layout

\end_inset

)
\end_layout

\begin_layout Description
SPEEX_SET_DTX
\begin_inset Formula $\dagger$
\end_inset

 Set discontinuous transmission
\begin_inset Index
status collapsed

\begin_layout Plain Layout
discontinuous transmission
\end_layout

\end_inset

 (DTX) to on (1) or off (0) (
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

spx_int32_t
\end_layout

\end_inset

, default is off)
\end_layout

\begin_layout Description
SPEEX_GET_DTX
\begin_inset Formula $\dagger$
\end_inset

 Get discontinuous transmission (DTX) status (
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

spx_int32_t
\end_layout

\end_inset

)
\end_layout

\begin_layout Description
SPEEX_SET_ABR
\begin_inset Formula $\dagger$
\end_inset

 Set average bit-rate
\begin_inset Index
status collapsed

\begin_layout Plain Layout
average bit-rate
\end_layout

\end_inset

 (ABR) to a value n in bits per second (
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

spx_int32_t
\end_layout

\end_inset

 in bits per second)
\end_layout

\begin_layout Description
SPEEX_GET_ABR
\begin_inset Formula $\dagger$
\end_inset

 Get average bit-rate (ABR) setting (
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

spx_int32_t
\end_layout

\end_inset

 in bits per second)
\end_layout

\begin_layout Description
SPEEX_SET_PLC_TUNING
\begin_inset Formula $\dagger$
\end_inset

 Tell the encoder to optimize encoding for a certain percentage of packet
 loss (
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

spx_int32_t
\end_layout

\end_inset

 in percent)
\end_layout

\begin_layout Description
SPEEX_GET_PLC_TUNING
\begin_inset Formula $\dagger$
\end_inset

 Get the current tuning of the encoder for PLC (
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

spx_int32_t
\end_layout

\end_inset

 in percent)
\end_layout

\begin_layout Description
SPEEX_GET_LOOKAHEAD Returns the lookahead used by Speex separately for an
 encoder and a decoder.
 Sum encoder and decoder lookahead values to get the total codec lookahead.
\end_layout

\begin_layout Description
SPEEX_SET_VBR_MAX_BITRATE
\begin_inset Formula $\dagger$
\end_inset

 Set the maximum bit-rate allowed in VBR operation (
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

spx_int32_t
\end_layout

\end_inset

 in bits per second)
\end_layout

\begin_layout Description
SPEEX_GET_VBR_MAX_BITRATE
\begin_inset Formula $\dagger$
\end_inset

 Get the current maximum bit-rate allowed in VBR operation (
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

spx_int32_t
\end_layout

\end_inset

 in bits per second)
\end_layout

\begin_layout Description
SPEEX_SET_HIGHPASS Set the high-pass filter on (1) or off (0) (
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

spx_int32_t
\end_layout

\end_inset

, default is on)
\end_layout

\begin_layout Description
SPEEX_GET_HIGHPASS Get the current high-pass filter status (
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

spx_int32_t
\end_layout

\end_inset

)
\end_layout

\begin_layout Description
\begin_inset Formula $\dagger$
\end_inset

 applies only to the encoder
\end_layout

\begin_layout Description
\begin_inset Formula $\ddagger$
\end_inset

 applies only to the decoder
\end_layout

\begin_layout Section
Mode queries
\begin_inset CommandInset label
LatexCommand label
name "sub:Mode-queries"

\end_inset


\end_layout

\begin_layout Standard
Speex modes have a query system similar to the speex_encoder_ctl and speex_decod
er_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:
\begin_inset listings
inline false
status open

\begin_layout Plain Layout

void speex_mode_query(SpeexMode *mode, int request, void *ptr);
\end_layout

\end_inset

The admissible values for request are (unless otherwise note, the values
 are returned through 
\emph on
ptr
\emph default
):
\end_layout

\begin_layout Description
SPEEX_MODE_FRAME_SIZE Get the frame size (in samples) for the mode
\end_layout

\begin_layout Description
SPEEX_SUBMODE_BITRATE Get the bit-rate for a submode number specified through
 
\emph on
ptr
\emph default
 (integer in bps).
 
\end_layout

\begin_layout Section
Packing and in-band signalling
\begin_inset Index
status collapsed

\begin_layout Plain Layout
in-band signalling
\end_layout

\end_inset


\end_layout

\begin_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 Table 
\begin_inset CommandInset ref
LatexCommand ref
reference "cap:quality_vs_bps"

\end_inset

.
 Note that as of version 1.0.2, calling speex_bits_write automatically inserts
 the terminator so as to fill the last byte.
 This doesn't involves any overhead and makes sure Speex can always detect
 when there is no more frame in a packet.
\end_layout

\begin_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 
\begin_inset Quotes eld
\end_inset

pseudo-frames
\begin_inset Quotes erd
\end_inset

 of mode 14 which contain a 4-bit message type code, followed by the message.
 Table 
\begin_inset CommandInset ref
LatexCommand ref
reference "cap:In-band-signalling-codes"

\end_inset

 lists the available codes, their meaning and the size of the message that
 follows.
 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.
\end_layout

\begin_layout Standard
\begin_inset Float table
placement htbp
wide false
sideways false
status open

\begin_layout Plain Layout
\begin_inset ERT
status collapsed

\begin_layout Plain Layout


\backslash
begin{center}
\end_layout

\end_inset


\begin_inset Tabular
<lyxtabular version="3" rows="17" columns="3">
<features>
<column alignment="center" valignment="top" width="0pt">
<column alignment="center" valignment="top" width="0pt">
<column alignment="center" valignment="top" width="0pt">
<row>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Code
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Size (bits)
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Content
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
0
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
1
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Asks decoder to set perceptual enhancement off (0) or on(1)
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
1
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
1
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Asks (if 1) the encoder to be less 
\begin_inset Quotes eld
\end_inset

aggressive
\begin_inset Quotes erd
\end_inset

 due to high packet loss
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
2
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
4
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Asks encoder to switch to mode N
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
3
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
4
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Asks encoder to switch to mode N for low-band
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
4
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
4
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Asks encoder to switch to mode N for high-band
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
5
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
4
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Asks encoder to switch to quality N for VBR
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
6
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
4
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Request acknowledge (0=no, 1=all, 2=only for in-band data)
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
7
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
4
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Asks encoder to set CBR (0), VAD(1), DTX(3), VBR(5), VBR+DTX(7)
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
8
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
8
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Transmit (8-bit) character to the other end
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
9
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
8
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Intensity stereo information
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
10
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
16
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Announce maximum bit-rate acceptable (N in bytes/second)
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
11
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
16
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
reserved
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
12
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
32
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Acknowledge receiving packet N
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
13
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
32
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
reserved
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
14
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
64
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
reserved
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
15
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
64
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
reserved
\end_layout

\end_inset
</cell>
</row>
</lyxtabular>

\end_inset


\begin_inset ERT
status collapsed

\begin_layout Plain Layout


\backslash
end{center}
\end_layout

\end_inset


\end_layout

\begin_layout Plain Layout
\begin_inset Caption

\begin_layout Plain Layout
In-band signalling codes
\begin_inset CommandInset label
LatexCommand label
name "cap:In-band-signalling-codes"

\end_inset


\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_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.
\begin_inset Newpage newpage
\end_inset


\end_layout

\begin_layout Chapter
Speech Processing API (
\emph on
libspeexdsp
\emph default
)
\end_layout

\begin_layout Standard
As of version 1.2beta3, the non-codec parts of the Speex package are now
 in a separate library called 
\emph on
libspeexdsp
\emph default
.
 This library includes the preprocessor, the acoustic echo canceller, the
 jitter buffer, and the resampler.
 In a UNIX environment, it can be linked into a program by adding 
\emph on
-lspeexdsp -lm
\emph default
 to the compiler command line.
 Just like for libspeex, 
\series bold
libspeexdsp calls are reentrant, but not thread-safe
\series default
.
 That means that it is fine to use calls from many threads, but 
\series bold
calls using the same state from multiple threads must be protected by mutexes
\series default
.
\end_layout

\begin_layout Section
Preprocessor
\begin_inset CommandInset label
LatexCommand label
name "sub:Preprocessor"

\end_inset


\end_layout

\begin_layout Standard
\noindent
In order to use the Speex preprocessor
\begin_inset Index
status collapsed

\begin_layout Plain Layout
preprocessor
\end_layout

\end_inset

, you first need to:
\begin_inset listings
inline false
status open

\begin_layout Plain Layout

#include <speex/speex_preprocess.h>
\end_layout

\end_inset


\end_layout

\begin_layout Standard
\noindent
Then, a preprocessor state can be created as:
\begin_inset listings
inline false
status open

\begin_layout Plain Layout

SpeexPreprocessState *preprocess_state = speex_preprocess_state_init(frame_size,
 sampling_rate);
\end_layout

\end_inset


\end_layout

\begin_layout Standard
\noindent
and it is recommended to use the same value for 
\family typewriter
frame_size
\family default
 as is used by the encoder (20 
\emph on
ms
\emph default
).
\end_layout

\begin_layout Standard
For each input frame, you need to call:
\end_layout

\begin_layout Standard
\begin_inset listings
inline false
status open

\begin_layout Plain Layout

speex_preprocess_run(preprocess_state, audio_frame);
\end_layout

\end_inset


\end_layout

\begin_layout Standard
\noindent
where 
\family typewriter
audio_frame
\family default
 is used both as input and output.
 In cases where the output audio is not useful for a certain frame, it is
 possible to use instead:
\end_layout

\begin_layout Standard
\begin_inset listings
inline false
status open

\begin_layout Plain Layout

speex_preprocess_estimate_update(preprocess_state, audio_frame);
\end_layout

\end_inset


\end_layout

\begin_layout Standard
\noindent
This call will update all the preprocessor internal state variables without
 computing the output audio, thus saving some CPU cycles.
\end_layout

\begin_layout Standard
The behaviour of the preprocessor can be changed using:
\end_layout

\begin_layout Standard
\begin_inset listings
inline false
status open

\begin_layout Plain Layout

speex_preprocess_ctl(preprocess_state, request, ptr);
\end_layout

\end_inset


\end_layout

\begin_layout Standard
\noindent
which is used in the same way as the encoder and decoder equivalent.
 Options are listed in Section 
\begin_inset CommandInset ref
LatexCommand ref
reference "sub:Preprocessor-options"

\end_inset

.
\end_layout

\begin_layout Standard
The preprocessor state can be destroyed using:
\end_layout

\begin_layout Standard
\begin_inset listings
inline false
status open

\begin_layout Plain Layout

speex_preprocess_state_destroy(preprocess_state);
\end_layout

\end_inset


\end_layout

\begin_layout Subsection
Preprocessor options
\begin_inset CommandInset label
LatexCommand label
name "sub:Preprocessor-options"

\end_inset


\end_layout

\begin_layout Standard
As with the codec, the preprocessor also has options that can be controlled
 using an ioctl()-like call.
 The available options are:
\end_layout

\begin_layout Description
SPEEX_PREPROCESS_SET_DENOISE Turns denoising on(1) or off(2) (
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

spx_int32_t
\end_layout

\end_inset

)
\end_layout

\begin_layout Description
SPEEX_PREPROCESS_GET_DENOISE Get denoising status (
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

spx_int32_t
\end_layout

\end_inset

)
\end_layout

\begin_layout Description
SPEEX_PREPROCESS_SET_AGC Turns automatic gain control (AGC) on(1) or off(2)
 (
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

spx_int32_t
\end_layout

\end_inset

)
\end_layout

\begin_layout Description
SPEEX_PREPROCESS_GET_AGC Get AGC status (
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

spx_int32_t
\end_layout

\end_inset

)
\end_layout

\begin_layout Description
SPEEX_PREPROCESS_SET_VAD Turns voice activity detector (VAD) on(1) or off(2)
 (
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

spx_int32_t
\end_layout

\end_inset

)
\end_layout

\begin_layout Description
SPEEX_PREPROCESS_GET_VAD Get VAD status (
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

spx_int32_t
\end_layout

\end_inset

)
\end_layout

\begin_layout Description
SPEEX_PREPROCESS_SET_AGC_LEVEL
\end_layout

\begin_layout Description
SPEEX_PREPROCESS_GET_AGC_LEVEL
\end_layout

\begin_layout Description
SPEEX_PREPROCESS_SET_DEREVERB Turns reverberation removal on(1) or off(2)
 (
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

spx_int32_t
\end_layout

\end_inset

)
\end_layout

\begin_layout Description
SPEEX_PREPROCESS_GET_DEREVERB Get reverberation removal status (
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

spx_int32_t
\end_layout

\end_inset

)
\end_layout

\begin_layout Description
SPEEX_PREPROCESS_SET_DEREVERB_LEVEL Not working yet, do not use
\end_layout

\begin_layout Description
SPEEX_PREPROCESS_GET_DEREVERB_LEVEL Not working yet, do not use
\end_layout

\begin_layout Description
SPEEX_PREPROCESS_SET_DEREVERB_DECAY Not working yet, do not use
\end_layout

\begin_layout Description
SPEEX_PREPROCESS_GET_DEREVERB_DECAY Not working yet, do not use
\end_layout

\begin_layout Description
SPEEX_PREPROCESS_SET_PROB_START
\end_layout

\begin_layout Description
SPEEX_PREPROCESS_GET_PROB_START
\end_layout

\begin_layout Description
SPEEX_PREPROCESS_SET_PROB_CONTINUE
\end_layout

\begin_layout Description
SPEEX_PREPROCESS_GET_PROB_CONTINUE
\end_layout

\begin_layout Description
SPEEX_PREPROCESS_SET_NOISE_SUPPRESS Set maximum attenuation of the noise
 in dB (negative 
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

spx_int32_t
\end_layout

\end_inset

)
\end_layout

\begin_layout Description
SPEEX_PREPROCESS_GET_NOISE_SUPPRESS Get maximum attenuation of the noise
 in dB (negative 
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

spx_int32_t
\end_layout

\end_inset

)
\end_layout

\begin_layout Description
SPEEX_PREPROCESS_SET_ECHO_SUPPRESS Set maximum attenuation of the residual
 echo in dB (negative 
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

spx_int32_t
\end_layout

\end_inset

)
\end_layout

\begin_layout Description
SPEEX_PREPROCESS_GET_ECHO_SUPPRESS Get maximum attenuation of the residual
 echo in dB (negative 
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

spx_int32_t
\end_layout

\end_inset

)
\end_layout

\begin_layout Description
SPEEX_PREPROCESS_SET_ECHO_SUPPRESS_ACTIVE Set maximum attenuation of the
 echo in dB when near end is active (negative 
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

spx_int32_t
\end_layout

\end_inset

)
\end_layout

\begin_layout Description
SPEEX_PREPROCESS_GET_ECHO_SUPPRESS_ACTIVE Get maximum attenuation of the
 echo in dB when near end is active (negative 
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

spx_int32_t
\end_layout

\end_inset

)
\end_layout

\begin_layout Description
SPEEX_PREPROCESS_SET_ECHO_STATE Set the associated echo canceller for residual
 echo suppression (pointer or NULL for no residual echo suppression)
\end_layout

\begin_layout Description
SPEEX_PREPROCESS_GET_ECHO_STATE Get the associated echo canceller (pointer)
\end_layout

\begin_layout Section
Echo Cancellation
\begin_inset CommandInset label
LatexCommand label
name "sub:Echo-Cancellation"

\end_inset


\end_layout

\begin_layout Standard
The Speex library now includes an echo cancellation
\begin_inset Index
status collapsed

\begin_layout Plain Layout
echo cancellation
\end_layout

\end_inset

 algorithm suitable for Acoustic Echo Cancellation
\begin_inset Index
status collapsed

\begin_layout Plain Layout
acoustic echo cancellation
\end_layout

\end_inset

 (AEC).
 In order to use the echo canceller, you first need to
\end_layout

\begin_layout Standard
\begin_inset listings
inline false
status open

\begin_layout Plain Layout

#include <speex/speex_echo.h>
\end_layout

\end_inset


\end_layout

\begin_layout Standard
Then, an echo canceller state can be created by:
\end_layout

\begin_layout Standard
\begin_inset listings
inline false
status open

\begin_layout Plain Layout

SpeexEchoState *echo_state = speex_echo_state_init(frame_size, filter_length);
\end_layout

\end_inset


\end_layout

\begin_layout Standard
where 
\family typewriter
frame_size
\family default
 is the amount of data (in samples) you want to process at once and 
\family typewriter
filter_length
\family default
 is the length (in samples) of the echo cancelling filter you want to use
 (also known as 
\shape italic
tail length
\shape default

\begin_inset Index
status collapsed

\begin_layout Plain Layout
tail length
\end_layout

\end_inset

).
 It is recommended to use a frame size in the order of 20 ms (or equal to
 the codec frame size) and make sure it is easy to perform an FFT of that
 size (powers of two are better than prime sizes).
 The recommended tail length is approximately the third of the room reverberatio
n time.
 For example, in a small room, reverberation time is in the order of 300
 ms, so a tail length of 100 ms is a good choice (800 samples at 8000 Hz
 sampling rate).
\end_layout

\begin_layout Standard
Once the echo canceller state is created, audio can be processed by:
\end_layout

\begin_layout Standard
\begin_inset listings
inline false
status open

\begin_layout Plain Layout

speex_echo_cancellation(echo_state, input_frame, echo_frame, output_frame);
\end_layout

\end_inset


\end_layout

\begin_layout Standard
where 
\family typewriter
input_frame
\family default
 is the audio as captured by the microphone, 
\family typewriter
echo_frame
\family default
 is the signal that was played in the speaker (and needs to be removed)
 and 
\family typewriter
output_frame
\family default
 is the signal with echo removed.
 
\end_layout

\begin_layout Standard
One important thing to keep in mind is the relationship between 
\family typewriter
input_frame
\family default
 and 
\family typewriter
echo_frame
\family default
.
 It is important that, at any time, any echo that is present in the input
 has already been sent to the echo canceller as 
\family typewriter
echo_frame
\family default
.
 In other words, the echo canceller cannot remove a signal that it hasn't
 yet received.
 On the other hand, the delay between the input signal and the echo signal
 must be small enough because otherwise part of the echo cancellation filter
 is inefficient.
 In the ideal case, you code would look like:
\begin_inset listings
lstparams "breaklines=true"
inline false
status open

\begin_layout Plain Layout

write_to_soundcard(echo_frame, frame_size);
\end_layout

\begin_layout Plain Layout

read_from_soundcard(input_frame, frame_size);
\end_layout

\begin_layout Plain Layout

speex_echo_cancellation(echo_state, input_frame, echo_frame, output_frame);
\end_layout

\end_inset


\end_layout

\begin_layout Standard
If you wish to further reduce the echo present in the signal, you can do
 so by associating the echo canceller to the preprocessor (see Section 
\begin_inset CommandInset ref
LatexCommand ref
reference "sub:Preprocessor"

\end_inset

).
 This is done by calling:
\begin_inset listings
lstparams "breaklines=true"
inline false
status open

\begin_layout Plain Layout

speex_preprocess_ctl(preprocess_state, SPEEX_PREPROCESS_SET_ECHO_STATE,echo_stat
e);
\end_layout

\end_inset

in the initialisation.
\end_layout

\begin_layout Standard
As of version 1.2-beta2, there is an alternative, simpler API that can be
 used instead of 
\emph on
speex_echo_cancellation()
\emph default
.
 When audio capture and playback are handled asynchronously (e.g.
 in different threads or using the 
\emph on
poll()
\emph default
 or 
\emph on
select()
\emph default
 system call), it can be difficult to keep track of what input_frame comes
 with what echo_frame.
 Instead, the playback context/thread can simply call:
\end_layout

\begin_layout Standard
\begin_inset listings
inline false
status open

\begin_layout Plain Layout

speex_echo_playback(echo_state, echo_frame);
\end_layout

\end_inset


\end_layout

\begin_layout Standard
every time an audio frame is played.
 Then, the capture context/thread calls:
\end_layout

\begin_layout Standard
\begin_inset listings
inline false
status open

\begin_layout Plain Layout

speex_echo_capture(echo_state, input_frame, output_frame);
\end_layout

\end_inset


\end_layout

\begin_layout Standard
for every frame captured.
 Internally, 
\emph on
speex_echo_playback()
\emph default
 simply buffers the playback frame so it can be used by 
\emph on
speex_echo_capture()
\emph default
 to call 
\emph on
speex_echo_cancel()
\emph default
.
 A side effect of using this alternate API is that the playback audio is
 delayed by two frames, which is the normal delay caused by the soundcard.
 When capture and playback are already synchronised, 
\emph on
speex_echo_cancellation()
\emph default
 is preferable since it gives better control on the exact input/echo timing.
\end_layout

\begin_layout Standard
The echo cancellation state can be destroyed with:
\end_layout

\begin_layout Standard
\begin_inset listings
inline false
status open

\begin_layout Plain Layout

speex_echo_state_destroy(echo_state);
\end_layout

\end_inset


\end_layout

\begin_layout Standard
It is also possible to reset the state of the echo canceller so it can be
 reused without the need to create another state with:
\end_layout

\begin_layout Standard
\begin_inset listings
inline false
status open

\begin_layout Plain Layout

speex_echo_state_reset(echo_state);
\end_layout

\end_inset


\end_layout

\begin_layout Subsection
Troubleshooting
\end_layout

\begin_layout Standard
There are several things that may prevent the echo canceller from working
 properly.
 One of them is a bug (or something suboptimal) in the code, but there are
 many others you should consider first
\end_layout

\begin_layout Itemize
Using a different soundcard to do the capture and plaback will 
\series bold
not
\series default
 work, regardless of what you may think.
 The only exception to that is if the two cards can be made to have their
 sampling clock 
\begin_inset Quotes eld
\end_inset

locked
\begin_inset Quotes erd
\end_inset

 on the same clock source.
 If not, the clocks will always have a small amount of drift, which will
 prevent the echo canceller from adapting.
\end_layout

\begin_layout Itemize
The delay between the record and playback signals must be minimal.
 Any signal played has to 
\begin_inset Quotes eld
\end_inset

appear
\begin_inset Quotes erd
\end_inset

 on the playback (far end) signal slightly before the echo canceller 
\begin_inset Quotes eld
\end_inset

sees
\begin_inset Quotes erd
\end_inset

 it in the near end signal, but excessive delay means that part of the filter
 length is wasted.
 In the worst situations, the delay is such that it is longer than the filter
 length, in which case, no echo can be cancelled.
\end_layout

\begin_layout Itemize
When it comes to echo tail length (filter length), longer is 
\series bold
not
\series default
 better.
 Actually, the longer the tail length, the longer it takes for the filter
 to adapt.
 Of course, a tail length that is too short will not cancel enough echo,
 but the most common problem seen is that people set a very long tail length
 and then wonder why no echo is being cancelled.
\end_layout

\begin_layout Itemize
Non-linear distortion cannot (by definition) be modeled by the linear adaptive
 filter used in the echo canceller and thus cannot be cancelled.
 Use good audio gear and avoid saturation/clipping.
\end_layout

\begin_layout Standard
Also useful is reading 
\emph on
Echo Cancellation Demystified
\emph default
 by Alexey Frunze
\begin_inset Foot
status collapsed

\begin_layout Plain Layout
http://www.embeddedstar.com/articles/2003/7/article20030720-1.html
\end_layout

\end_inset

, which explains the fundamental principles of echo cancellation.
 The details of the algorithm described in the article are different, but
 the general ideas of echo cancellation through adaptive filters are the
 same.
\end_layout

\begin_layout Standard
As of version 1.2beta2, a new 
\family typewriter
echo_diagnostic.m
\family default
 tool is included in the source distribution.
 The first step is to define DUMP_ECHO_CANCEL_DATA during the build.
 This causes the echo canceller to automatically save the near-end, far-end
 and output signals to files (aec_rec.sw aec_play.sw and aec_out.sw).
 These are exactly what the AEC receives and outputs.
 From there, it is necessary to start Octave and type:
\end_layout

\begin_layout Standard
\begin_inset listings
lstparams "language=Matlab"
inline false
status open

\begin_layout Plain Layout

echo_diagnostic('aec_rec.sw', 'aec_play.sw', 'aec_diagnostic.sw', 1024);
\end_layout

\end_inset


\end_layout

\begin_layout Standard
The value of 1024 is the filter length and can be changed.
 There will be some (hopefully) useful messages printed and echo cancelled
 audio will be saved to aec_diagnostic.sw .
 If even that output is bad (almost no cancellation) then there is  probably
 problem with the playback or recording process.
\end_layout

\begin_layout Section
Jitter Buffer
\end_layout

\begin_layout Standard
The jitter buffer can be enabled by including:
\begin_inset listings
lstparams "breaklines=true"
inline false
status open

\begin_layout Plain Layout

#include <speex/speex_jitter.h>
\end_layout

\end_inset

 and a new jitter buffer state can be initialised by:
\end_layout

\begin_layout Standard
\begin_inset listings
lstparams "breaklines=true"
inline false
status open

\begin_layout Plain Layout

JitterBuffer *state = jitter_buffer_init(step);
\end_layout

\end_inset


\end_layout

\begin_layout Standard
where the 
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

step
\end_layout

\end_inset

 argument is the default time step (in timestamp units) used for adjusting
 the delay and doing concealment.
 A value of 1 is always correct, but higher values may be more convenient
 sometimes.
 For example, if you are only able to do concealment on 20ms frames, there
 is no point in the jitter buffer asking you to do it on one sample.
 Another example is that for video, it makes no sense to adjust the delay
 by less than a full frame.
 The value provided can always be changed at a later time.
\end_layout

\begin_layout Standard
The jitter buffer API is based on the 
\begin_inset listings
inline true
status open

\begin_layout Plain Layout

JitterBufferPacket
\end_layout

\end_inset

 type, which is defined as:
\begin_inset listings
inline false
status open

\begin_layout Plain Layout

typedef struct {
\end_layout

\begin_layout Plain Layout

   char        *data;       /* Data bytes contained in the packet */
\end_layout

\begin_layout Plain Layout

   spx_uint32_t len;        /* Length of the packet in bytes */
\end_layout

\begin_layout Plain Layout

   spx_uint32_t timestamp;  /* Timestamp for the packet */
\end_layout

\begin_layout Plain Layout

   spx_uint32_t span;       /* Time covered by the packet (timestamp units)
 */
\end_layout

\begin_layout Plain Layout

} JitterBufferPacket; 
\end_layout

\end_inset


\end_layout

\begin_layout Standard
As an example, for audio the timestamp field would be what is obtained from
 the RTP timestamp field and the span would be the number of samples that
 are encoded in the packet.
 For Speex narrowband, span would be 160 if only one frame is included in
 the packet.
 
\end_layout

\begin_layout Standard
When a packet arrives, it need to be inserter into the jitter buffer by:
\begin_inset listings
inline false
status open

\begin_layout Plain Layout

JitterBufferPacket packet;
\end_layout

\begin_layout Plain Layout

/* Fill in each field in the packet struct */
\end_layout

\begin_layout Plain Layout

jitter_buffer_put(state, &packet);
\end_layout

\end_inset


\end_layout

\begin_layout Standard
When the decoder is ready to decode a packet the packet to be decoded can
 be obtained by: 
\begin_inset listings
inline false
status open

\begin_layout Plain Layout

int start_offset;
\end_layout

\begin_layout Plain Layout

err = jitter_buffer_get(state, &packet, desired_span, &start_offset);
\end_layout

\end_inset


\end_layout

\begin_layout Standard
If 
\begin_inset listings
inline true
status open

\begin_layout Plain Layout

jitter_buffer_put()
\end_layout

\end_inset

 and 
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

jitter_buffer_get()
\end_layout

\end_inset

 are called from different threads, then 
\series bold
you need to protect the jitter buffer state with a mutex
\series default
.
 
\end_layout

\begin_layout Standard
Because the jitter buffer is designed not to use an explicit timer, it needs
 to be told about the time explicitly.
 This is done by calling: 
\begin_inset listings
inline false
status open

\begin_layout Plain Layout

jitter_buffer_tick(state);
\end_layout

\end_inset


\end_layout

\begin_layout Standard
This needs to be done periodically in the playing thread.
 This will be the last jitter buffer call before going to sleep (until more
 data is played back).
 In some cases, it may be preferable to use 
\begin_inset listings
inline false
status open

\begin_layout Plain Layout

jitter_buffer_remaining_span(state, remaining);
\end_layout

\end_inset


\end_layout

\begin_layout Standard
The second argument is used to specify that we are still holding data that
 has not been written to the playback device.
 For instance, if 256 samples were needed by the soundcard (specified by
 
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

desired_span
\end_layout

\end_inset

), but 
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

jitter_buffer_get()
\end_layout

\end_inset

 returned 320 samples, we would have 
\begin_inset listings
inline true
status open

\begin_layout Plain Layout

remaining=64
\end_layout

\end_inset

.
\end_layout

\begin_layout Section
Resampler
\end_layout

\begin_layout Standard
Speex includes a resampling modules.
 To make use of the resampler, it is necessary to include its header file:
\end_layout

\begin_layout Standard
\begin_inset listings
inline false
status open

\begin_layout Plain Layout

#include <speex/speex_resampler.h>
\end_layout

\end_inset


\end_layout

\begin_layout Standard
For each stream that is to be resampled, it is necessary to create a resampler
 state with:
\end_layout

\begin_layout Standard
\begin_inset listings
inline false
status open

\begin_layout Plain Layout

SpeexResamplerState *resampler;
\end_layout

\begin_layout Plain Layout

resampler = speex_resampler_init(nb_channels, input_rate, output_rate, quality,
 &err);
\end_layout

\end_inset


\end_layout

\begin_layout Standard
where 
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

nb_channels
\end_layout

\end_inset

 is the number of channels that will be used (either interleaved or non-interlea
ved), 
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

input_rate
\end_layout

\end_inset

 is the sampling rate of the input stream, 
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

output_rate
\end_layout

\end_inset

 is the sampling rate of the output stream and 
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

quality
\end_layout

\end_inset

 is the requested quality setting (0 to 10).
 The quality parameter is useful for controlling the quality/complexity/latency
 tradeoff.
 Using a higher quality setting means less noise/aliasing, a higher complexity
 and a higher latency.
 Usually, a quality of 3 is acceptable for most desktop uses and quality
 10 is mostly recommended for pro audio work.
 Quality 0 usually has a decent sound (certainly better than using linear
 interpolation resampling), but artifacts may be heard.
\end_layout

\begin_layout Standard
The actual resampling is performed using
\end_layout

\begin_layout Standard
\begin_inset listings
inline false
status open

\begin_layout Plain Layout

err = speex_resampler_process_int(resampler, channelID, in, &in_length,
 out, &out_length);
\end_layout

\end_inset

where 
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

channelID
\end_layout

\end_inset

 is the ID of the channel to be processed.
 For a mono stream, use 0.
 The 
\emph on
in
\emph default
 pointer points to the first sample of the input buffer for the selected
 channel and 
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

out
\end_layout

\end_inset

 points to the first sample of the output.
 The size of the input and output buffers are specified by 
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

in_length
\end_layout

\end_inset

 and 
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

out_length
\end_layout

\end_inset

 respectively.
 Upon completion, these values are replaced by the number of samples read
 and written by the resampler.
 Unless an error occurs, either all input samples will be read or all output
 samples will be written to (or both).
 For floating-point samples, the function 
\begin_inset listings
inline true
status open

\begin_layout Plain Layout

speex_resampler_process_float()
\end_layout

\end_inset

 behaves similarly.
\end_layout

\begin_layout Standard
It is also possible to process multiple channels at once.
 To do that, you can use speex_resampler_process_interleaved_int() or 
\begin_inset listings
inline true
status open

\begin_layout Plain Layout

speex_resampler_process_interleaved_float()
\end_layout

\end_inset

.
 The arguments are the same except that there is no 
\begin_inset listings
inline true
status collapsed

\begin_layout Plain Layout

channelID
\end_layout

\end_inset

 argument.
 Note that the 
\series bold
length parameters are per-channel
\series default
.
 So if you have 1024 samples for each of 4 channels, you pass 1024 and not
 4096.
\end_layout

\begin_layout Standard
The resampler allows changing the quality and input/output sampling frequencies
 on the fly without glitches.
 This can be done with calls such as 
\begin_inset listings
inline true
status open

\begin_layout Plain Layout

speex_resampler_set_quality()
\end_layout

\end_inset

 and 
\begin_inset listings
inline true
status open

\begin_layout Plain Layout

speex_resampler_set_rate()
\end_layout

\end_inset

.
 The only side effect is that a new filter will have to be recomputed, consuming
 many CPU cycles.
 
\end_layout

\begin_layout Standard
When resampling a file, it is often desirable to have the output file perfectly
 synchronised with the input.
 To do that, you need to call 
\begin_inset listings
inline true
status open

\begin_layout Plain Layout

speex_resampler_skip_zeros()
\end_layout

\end_inset

 
\series bold
before
\series default
 you start processing any samples.
 For real-time applications (e.g.
 VoIP), it is not recommended to do that as the first process frame will
 be shorter to compensate for the delay (the skipped zeros).
 Instead, in real-time applications you may want to know how many delay
 is introduced by the resampler.
 This can be done at run-time with 
\begin_inset listings
inline true
status open

\begin_layout Plain Layout

speex_resampler_get_input_latency()
\end_layout

\end_inset

 and 
\begin_inset listings
inline true
status open

\begin_layout Plain Layout

speex_resampler_get_output_latency()
\end_layout

\end_inset

 functions.
 First function returns delay measured in samples at input samplerate, while
 second returns delay measured in samples at output samplerate.
\end_layout

\begin_layout Standard
To destroy a resampler state, just call 
\begin_inset listings
inline true
status open

\begin_layout Plain Layout

speex_resampler_destroy()
\end_layout

\end_inset

.
\end_layout

\begin_layout Section
Ring Buffer
\end_layout

\begin_layout Standard
In some cases, it is necessary to interface components that use different
 block sizes.
 For example, it is possible that the soundcard does not support reading/writing
 in blocks of 20
\begin_inset space ~
\end_inset

ms or sometimes, complicated resampling ratios mean that the blocks don't
 always have the same time.
 In thoses cases, it is often necessary to buffer a bit of audio using a
 ring buffer.
\end_layout

\begin_layout Standard
\begin_inset Newpage newpage
\end_inset


\end_layout

\begin_layout Chapter
Formats and standards
\begin_inset Index
status collapsed

\begin_layout Plain Layout
standards
\end_layout

\end_inset


\begin_inset CommandInset label
LatexCommand label
name "sec:Formats-and-standards"

\end_inset


\end_layout

\begin_layout Standard
Speex can encode speech in both narrowband and wideband and provides different
 bit-rates.
 However, not all features need to be supported by a certain implementation
 or device.
 In order to be called 
\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.
\end_layout

\begin_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
status collapsed

\begin_layout Plain Layout
The wideband bit-stream contains an embedded narrowband bit-stream which
 can be decoded alone
\end_layout

\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).
\end_layout

\begin_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.
\end_layout

\begin_layout Section
RTP
\begin_inset Index
status collapsed

\begin_layout Plain Layout
RTP
\end_layout

\end_inset

 Payload Format 
\end_layout

\begin_layout Standard
The RTP payload draft is included in appendix 
\begin_inset CommandInset ref
LatexCommand ref
reference "sec:IETF-draft"

\end_inset

 and the latest version is available at 
\begin_inset Flex URL
status collapsed

\begin_layout Plain Layout

http://www.speex.org/drafts/latest
\end_layout

\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.
 
\end_layout

\begin_layout Section
MIME Type
\end_layout

\begin_layout Standard
For now, you should use the MIME type audio/x-speex for Speex-in-Ogg.
 We will apply for type 
\family typewriter
audio/speex
\family default
 in the near future.
\end_layout

\begin_layout Section
Ogg
\begin_inset Index
status collapsed

\begin_layout Plain Layout
Ogg
\end_layout

\end_inset

 file format
\end_layout

\begin_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 CommandInset ref
LatexCommand ref
reference "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

\begin_inset space ~
\end_inset


\begin_inset space ~
\end_inset


\begin_inset space ~
\end_inset


\begin_inset Quotes erd
\end_inset

 (with 3 trailing 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
.
\end_layout

\begin_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
.
\end_layout

\begin_layout Standard
The third and subsequent 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.
 The 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.
\end_layout

\begin_layout Standard
\begin_inset Float table
placement htbp
wide true
sideways false
status open

\begin_layout Plain Layout
\begin_inset ERT
status collapsed

\begin_layout Plain Layout


\backslash
begin{center}
\end_layout

\end_inset


\begin_inset Tabular
<lyxtabular version="3" rows="16" columns="3">
<features>
<column alignment="center" valignment="top" width="0pt">
<column alignment="center" valignment="top" width="0pt">
<column alignment="center" valignment="top" width="0pt">
<row>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Field
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Type
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Size
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
speex_string
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
char[]
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
8
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
speex_version
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
char[]
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
20
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
speex_version_id
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
int
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
4
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
header_size
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
int
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
4
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
rate
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
int
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
4
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
mode
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
int
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
4
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
mode_bitstream_version
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
int
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
4
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
nb_channels
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
int
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
4
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
bitrate
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
int
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
4
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
frame_size
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
int
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
4
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
vbr
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
int
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
4
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
frames_per_packet
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
int
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
4
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
extra_headers
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
int
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
4
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
reserved1
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
int
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
4
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
reserved2
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
int
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
4
\end_layout

\end_inset
</cell>
</row>
</lyxtabular>

\end_inset


\begin_inset ERT
status collapsed

\begin_layout Plain Layout


\backslash
end{center}
\end_layout

\end_inset


\end_layout

\begin_layout Plain Layout
\begin_inset Caption

\begin_layout Plain Layout
Ogg/Speex header packet
\begin_inset CommandInset label
LatexCommand label
name "cap:ogg_speex_header"

\end_inset


\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
\begin_inset ERT
status collapsed

\begin_layout Plain Layout


\backslash
clearpage
\end_layout

\end_inset


\end_layout

\begin_layout Chapter
Introduction to CELP Coding
\begin_inset Index
status collapsed

\begin_layout Plain Layout
CELP
\end_layout

\end_inset


\begin_inset CommandInset label
LatexCommand label
name "sec:Introduction-to-CELP"

\end_inset


\end_layout

\begin_layout Quote
\align center

\emph on
Do not meddle in the affairs of poles, for they are subtle and quick to
 leave the unit circle.
\end_layout

\begin_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 CommandInset ref
LatexCommand ref
reference "sec:Speex-narrowband-mode"

\end_inset

.
 The CELP technique is based on three ideas:
\end_layout

\begin_layout Enumerate
The use of a linear prediction (LP) model to model the vocal tract
\end_layout

\begin_layout Enumerate
The use of (adaptive and fixed) codebook entries as input (excitation) of
 the LP model
\end_layout

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


\end_layout

\begin_layout Standard
This section describes the basic ideas behind CELP.
 This is still a work in progress.
\end_layout

\begin_layout Section
Source-Filter Model of Speech Prediction
\end_layout

\begin_layout Standard
The source-filter model of speech production assumes that the vocal cords
 are the source of spectrally flat sound (the excitation signal), and that
 the vocal tract acts as a filter to spectrally shape the various sounds
 of speech.
 While still an approximation, the model is widely used in speech coding
 because of its simplicity.Its use is also the reason why most speech codecs
 (Speex included) perform badly on music signals.
 The different phonemes can be distinguished by their excitation (source)
 and spectral shape (filter).
 Voiced sounds (e.g.
 vowels) have an excitation signal that is periodic and that can be approximated
 by an impulse train in the time domain or by regularly-spaced harmonics
 in the frequency domain.
 On the other hand, fricatives (such as the "s", "sh" and "f" sounds) have
 an excitation signal that is similar to white Gaussian noise.
 So called voice fricatives (such as "z" and "v") have excitation signal
 composed of an harmonic part and a noisy part.
\end_layout

\begin_layout Standard
The source-filter model is usually tied with the use of Linear prediction.
 The CELP model is based on source-filter model, as can be seen from the
 CELP decoder illustrated in Figure 
\begin_inset CommandInset ref
LatexCommand ref
reference "fig:The-CELP-model"

\end_inset

.
 
\end_layout

\begin_layout Standard
\begin_inset Float figure
wide false
sideways false
status open

\begin_layout Plain Layout
\begin_inset ERT
status collapsed

\begin_layout Plain Layout


\backslash
begin{center}
\end_layout

\end_inset


\begin_inset Graphics
	filename celp_decoder.eps
	width 45page%
	keepAspectRatio

\end_inset


\begin_inset ERT
status collapsed

\begin_layout Plain Layout


\backslash
end{center}
\end_layout

\end_inset


\end_layout

\begin_layout Plain Layout
\begin_inset Caption

\begin_layout Plain Layout
The CELP model of speech synthesis (decoder)
\begin_inset CommandInset label
LatexCommand label
name "fig:The-CELP-model"

\end_inset

 
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Section
Linear Prediction Coefficients (LPC)
\begin_inset Index
status collapsed

\begin_layout Plain Layout
linear prediction
\end_layout

\end_inset


\end_layout

\begin_layout Standard
Linear prediction is at the base of many 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:
\end_layout

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


\end_layout

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


\end_layout

\begin_layout Standard
For an order 
\begin_inset Formula $N$
\end_inset

 filter, the filter coefficients 
\begin_inset Formula $a_{i}$
\end_inset

 are found by solving the system 
\begin_inset Formula $N\times N$
\end_inset

 linear system 
\begin_inset Formula $\mathbf{Ra}=\mathbf{r}$
\end_inset

, where
\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

with 
\begin_inset Formula $R(m)$
\end_inset

, the auto-correlation
\begin_inset Index
status collapsed

\begin_layout Plain Layout
auto-correlation
\end_layout

\end_inset

 of the signal 
\begin_inset Formula $x[n]$
\end_inset

, computed as:
\end_layout

\begin_layout Standard
\begin_inset Formula \[
R(m)=\sum_{i=0}^{N-1}x[i]x[i-m]\]

\end_inset


\end_layout

\begin_layout Standard
Because 
\begin_inset Formula $\mathbf{R}$
\end_inset

 is Hermitian Toeplitz, the Levinson-Durbin
\begin_inset Index
status collapsed

\begin_layout Plain Layout
Levinson-Durbin
\end_layout

\end_inset

 algorithm can be used, 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

.
 Also, it can be proven 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.
\end_layout

\begin_layout Section
Pitch Prediction
\begin_inset Index
status collapsed

\begin_layout Plain Layout
pitch
\end_layout

\end_inset


\end_layout

\begin_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:
\end_layout

\begin_layout Standard
\begin_inset Formula \[
e[n]\simeq p[n]=\beta e[n-T]\ ,\]

\end_inset

where 
\begin_inset Formula $T$
\end_inset

 is the pitch period, 
\begin_inset Formula $\beta$
\end_inset

 is the pitch gain.
 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

.
\end_layout

\begin_layout Section
Innovation Codebook
\end_layout

\begin_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, hence the name 
\emph on
Code
\emph default
 Excited Linear Prediction.
 The final excitation is given by
\end_layout

\begin_layout Standard
\begin_inset Formula \[
e[n]=p[n]+c[n]=\beta e[n-T]+c[n]\ .\]

\end_inset

The quantization of 
\begin_inset Formula $c[n]$
\end_inset

 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


\end_layout

\begin_layout Section
Noise Weighting
\begin_inset Index
status collapsed

\begin_layout Plain Layout
error weighting
\end_layout

\end_inset


\begin_inset Index
status collapsed

\begin_layout Plain Layout
analysis-by-synthesis
\end_layout

\end_inset


\end_layout

\begin_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
.
 In order to maximize speech quality, CELP codecs minimize the mean square
 of the error (noise) in the perceptually weighted domain.
 This means that a perceptual noise weighting filter 
\begin_inset Formula $W(z)$
\end_inset

 is applied to the error signal in the encoder.
 In most CELP codecs, 
\begin_inset Formula $W(z)$
\end_inset

 is a pole-zero weighting filter derived from the linear prediction coefficients
 (LPC), generally using bandwidth expansion.
 Let the spectral envelope be represented by the synthesis filter 
\begin_inset Formula $1/A(z)$
\end_inset

, CELP codecs typically derive the noise weighting filter as 
\begin_inset Formula \begin{equation}
W(z)=\frac{A(z/\gamma_{1})}{A(z/\gamma_{2})}\ ,\label{eq:gamma-weighting}\end{equation}

\end_inset

where 
\begin_inset Formula $\gamma_{1}=0.9$
\end_inset

 and 
\begin_inset Formula $\gamma_{2}=0.6$
\end_inset

 in the Speex reference implementation.
 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

 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

.
\end_layout

\begin_layout Standard
The weighting filter is applied to the error signal used to optimize the
 codebook search through analysis-by-synthesis (AbS).
 This results in a spectral shape of the noise that tends towards 
\begin_inset Formula $1/W(z)$
\end_inset

.
 While the simplicity of the model has been an important reason for the
 success of CELP, it remains that 
\begin_inset Formula $W(z)$
\end_inset

 is a very rough approximation for the perceptually optimal noise weighting
 function.
 Fig.
 
\begin_inset CommandInset ref
LatexCommand ref
reference "cap:Standard-noise-shaping"

\end_inset

 illustrates the noise shaping that results from Eq.
 
\begin_inset CommandInset ref
LatexCommand ref
reference "eq:gamma-weighting"

\end_inset

.
 Throughout this paper, we refer to 
\begin_inset Formula $W(z)$
\end_inset

 as the noise weighting filter and to 
\begin_inset Formula $1/W(z)$
\end_inset

 as the noise shaping filter (or curve).
\end_layout

\begin_layout Standard
\begin_inset Float figure
wide false
sideways false
status open

\begin_layout Plain Layout
\begin_inset ERT
status collapsed

\begin_layout Plain Layout


\backslash
begin{center}
\end_layout

\end_inset


\begin_inset Graphics
	filename ref_shaping.eps
	width 45page%
	keepAspectRatio

\end_inset


\begin_inset ERT
status collapsed

\begin_layout Plain Layout


\backslash
end{center}
\end_layout

\end_inset


\end_layout

\begin_layout Plain Layout
\begin_inset Caption

\begin_layout Plain Layout
Standard noise shaping in CELP.
 Arbitrary y-axis offset.
\begin_inset CommandInset label
LatexCommand label
name "cap:Standard-noise-shaping"

\end_inset


\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Section
Analysis-by-Synthesis
\end_layout

\begin_layout Standard
One of the main principles behind CELP is called Analysis-by-Synthesis (AbS),
 meaning that the encoding (analysis) is performed by perceptually optimising
 the decoded (synthesis) signal in a closed loop.
 In theory, the best CELP stream would be produced by trying all possible
 bit combinations and selecting the one that produces the best-sounding
 decoded signal.
 This is obviously not possible in practice for two reasons: the required
 complexity is beyond any currently available hardware and the 
\begin_inset Quotes eld
\end_inset

best sounding
\begin_inset Quotes erd
\end_inset

 selection criterion implies a human listener.
 
\end_layout

\begin_layout Standard
In order to achieve real-time encoding using limited computing resources,
 the CELP optimisation is broken down into smaller, more manageable, sequential
 searches using the perceptual weighting function described earlier.
\end_layout

\begin_layout Standard
\begin_inset Newpage newpage
\end_inset


\end_layout

\begin_layout Chapter
The Speex Decoder Specification
\end_layout

\begin_layout Section
Narrowband decoder
\end_layout

\begin_layout Standard
<Insert decoder figure here>
\end_layout

\begin_layout Subsection
Narrowband modes
\end_layout

\begin_layout Standard
There are 7 different narrowband bit-rates defined for Speex, ranging from
 250 bps to 24.6 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 CommandInset ref
LatexCommand ref
reference "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.
 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.
\end_layout

\begin_layout Standard
\begin_inset Float table
placement h
wide true
sideways false
status open

\begin_layout Plain Layout
\begin_inset ERT
status collapsed

\begin_layout Plain Layout


\backslash
begin{center}
\end_layout

\end_inset


\begin_inset Tabular
<lyxtabular version="3" rows="12" columns="11">
<features>
<column alignment="center" valignment="top" width="0pt">
<column alignment="center" valignment="top" width="0pt">
<column alignment="center" valignment="top" width="0pt">
<column alignment="center" valignment="top" width="0pt">
<column alignment="center" valignment="top" width="0pt">
<column alignment="center" valignment="top" width="0pt">
<column alignment="center" valignment="top" width="0pt">
<column alignment="center" valignment="top" width="0pt">
<column alignment="center" valignment="top" width="0pt">
<column alignment="center" valignment="top" width="0pt">
<column alignment="center" valignment="top" width="0pt">
<row>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Parameter
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Update rate
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
0
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
1
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
2
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
3
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
4
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
5
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
6
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
7
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
8
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Wideband bit
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
frame
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
1
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
1
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
1
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
1
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
1
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
1
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
1
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
1
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
1
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Mode ID
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
frame
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
4
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
4
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
4
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
4
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
4
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
4
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
4
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
4
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
4
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
LSP
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
frame
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
0
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
18
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
18
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
18
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
18
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
30
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
30
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
30
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
18
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
OL pitch
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
frame
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
0
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
7
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
7
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
0
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
0
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
0
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
0
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
0
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
7
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
OL pitch gain
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
frame
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
0
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
4
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
0
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
0
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
0
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
0
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
0
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
0
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
4
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
OL Exc gain
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
frame
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
0
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
5
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
5
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
5
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
5
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
5
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
5
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
5
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
5
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Fine pitch
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
sub-frame
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
0
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
0
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
0
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
7
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
7
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
7
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
7
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
7
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
0
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Pitch gain
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
sub-frame
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
0
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
0
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
5
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
5
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
5
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
7
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
7
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
7
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
0
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Innovation gain
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
sub-frame
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
0
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
1
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
0
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
1
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
1
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
3
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
3
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
3
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
0
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Innovation VQ
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
sub-frame
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
0
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
0
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
16
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
20
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
35
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
48
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
64
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
96
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
10
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Total
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
frame
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
5
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
43
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
119
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
160
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
220
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
300
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
364
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
492
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
79
\end_layout

\end_inset
</cell>
</row>
</lyxtabular>

\end_inset


\begin_inset ERT
status collapsed

\begin_layout Plain Layout


\backslash
end{center}
\end_layout

\end_inset


\end_layout

\begin_layout Plain Layout
\begin_inset Caption

\begin_layout Plain Layout
Bit allocation for narrowband modes
\begin_inset CommandInset label
LatexCommand label
name "cap:bits-narrowband"

\end_inset


\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Subsection
LSP decoding
\end_layout

\begin_layout Standard
Depending on the mode, LSP parameters are encoded using either 18 bits or
 30 bits.
\end_layout

\begin_layout Standard
Interpolation
\end_layout

\begin_layout Standard
Safe margin
\end_layout

\begin_layout Subsection
Adaptive codebook
\end_layout

\begin_layout Standard
For rates of 8 kbit/s and above, the pitch period is encoded for each subframe.
 The real period is 
\begin_inset Formula $T=p_{i}+17$
\end_inset

 where 
\begin_inset Formula $p_{i}$
\end_inset

 is a value encoded with 7 bits and 17 corresponds to the minimum pitch.
 The maximum period is 144.
 At 5.95 kbit/s (mode 2), the pitch period is similarly encoded, but only
 once for the frame.
 Each sub-frame then has a 2-bit offset that is added to the pitch value
 of the frame.
 In that case, the pitch for each sub-frame is equal to 
\begin_inset Formula $T-1+offset$
\end_inset

.
 For rates below 5.95 kbit/s, only the per-frame pitch is used and the pitch
 is constant for all sub-frames.
\end_layout

\begin_layout Standard
Speex uses a 3-tap predictor for rates of 5.95 kbit/s and above.
 The three gain values are obtained from a 5-bit or a 7-bit codebook, depending
 on the mode.
  
\end_layout

\begin_layout Subsection
Innovation codebook
\end_layout

\begin_layout Standard
Split codebook, size and entries depend on bit-rate
\end_layout

\begin_layout Standard
a 5-bit gain is encoder on a per-frame basis
\end_layout

\begin_layout Standard
Depending on the mode, higher resolution per sub-frame
\end_layout

\begin_layout Standard
innovation sub-vectors concatenated, gain applied
\end_layout

\begin_layout Subsection
Perceptual enhancement
\end_layout

\begin_layout Standard
Optional, implementation-defined.
 
\end_layout

\begin_layout Subsection
Bit-stream definition
\end_layout

\begin_layout Standard
This section defines the bit-stream that is transmitted on the wire.
 One speex packet consist of 1 frame header and 4 sub-frames:
\end_layout

\begin_layout Standard
\begin_inset Tabular
<lyxtabular version="3" rows="1" columns="5">
<features>
<column alignment="center" valignment="top" width="0">
<column alignment="center" valignment="top" width="0">
<column alignment="center" valignment="top" width="0">
<column alignment="center" valignment="top" width="0">
<column alignment="center" valignment="top" width="0">
<row>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Frame Header
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Subframe 1
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Subframe2
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Subframe 3
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Subframe 4
\end_layout

\end_inset
</cell>
</row>
</lyxtabular>

\end_inset


\end_layout

\begin_layout Standard
The frame header is variable length, depending on decoding mode and submode.
 The narrowband frame header is defined as follows:
\end_layout

\begin_layout Standard
\begin_inset Tabular
<lyxtabular version="3" rows="1" columns="6">
<features>
<column alignment="center" valignment="top" width="0">
<column alignment="center" valignment="top" width="0">
<column alignment="center" valignment="top" width="0">
<column alignment="center" valignment="top" width="0">
<column alignment="center" valignment="top" width="0">
<column alignment="center" valignment="top" width="0">
<row>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
wb bit
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
modeid
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
LSP
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
OL-pitch
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
OL-pitchgain
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
OL ExcGain
\end_layout

\end_inset
</cell>
</row>
</lyxtabular>

\end_inset


\end_layout

\begin_layout Standard
wb-bit: Wideband bit (1 bit) 0=narrowband, 1=wideband
\end_layout

\begin_layout Standard
modeid: Mode identifier (4 bits)
\end_layout

\begin_layout Standard
LSP: Line Spectral Pairs (0, 18 or 30 bits)
\end_layout

\begin_layout Standard
OL-pitch: Open Loop Pitch (0 or 7 bits)
\end_layout

\begin_layout Standard
OL-pitchgain: Open Loop Pitch Gain (0 or 4 bits)
\end_layout

\begin_layout Standard
OL-ExcGain: Open Loop Excitation Gain (0 or 5 bits)
\end_layout

\begin_layout Standard
...
\end_layout

\begin_layout Standard
Each subframe is defined as follows:
\end_layout

\begin_layout Standard
\begin_inset Tabular
<lyxtabular version="3" rows="1" columns="4">
<features>
<column alignment="center" valignment="top" width="0">
<column alignment="center" valignment="top" width="0">
<column alignment="center" valignment="top" width="0">
<column alignment="center" valignment="top" width="0">
<row>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
FinePitch
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
PitchGain
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
InnovationGain
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Innovation VQ
\end_layout

\end_inset
</cell>
</row>
</lyxtabular>

\end_inset


\end_layout

\begin_layout Standard
FinePitch: (0 or 7 bits)
\end_layout

\begin_layout Standard
PitchGain: (0, 5, or 7 bits)
\end_layout

\begin_layout Standard
Innovation Gain: (0, 1, 3 bits)
\end_layout

\begin_layout Standard
Innovation VQ: (0-96 bits)
\end_layout

\begin_layout Standard
...
\end_layout

\begin_layout Subsection
Sample decoder
\end_layout

\begin_layout Standard
This section contains some sample source code, showing how a basic Speex
 decoder can be implemented.
 The sample decoder is narrowband submode 3 only, and with no advanced features
 like enhancement, vbr etc.
\end_layout

\begin_layout Standard
...
\end_layout

\begin_layout Standard
\begin_inset CommandInset include
LatexCommand lstinputlisting
filename "nb_celp.c"
lstparams "caption={Sample Decoder}"

\end_inset


\end_layout

\begin_layout Subsection
Lookup tables
\end_layout

\begin_layout Standard
The Speex decoder includes a set of lookup tables and codebooks, which are
 used to convert between values of different domains.
 This includes:
\end_layout

\begin_layout Standard
- Excitation 10x16 (3200 bps)
\end_layout

\begin_layout Standard
- Excitation 10x32 (4000 bps)
\end_layout

\begin_layout Standard
- Excitation 20x32 (2000 bps)
\end_layout

\begin_layout Standard
- Excitation 5x256 (12800 bps)
\end_layout

\begin_layout Standard
- Excitation 5x64 (9600 bps)
\end_layout

\begin_layout Standard
- Excitation 8x128 (7000 bps)
\end_layout

\begin_layout Standard
- Codebook for 3-tap pitch prediction gain (Normal and Low Bitrate)
\end_layout

\begin_layout Standard
- Codebook for LSPs in narrowband CELP mode
\end_layout

\begin_layout Standard
...
\end_layout

\begin_layout Standard
The exact lookup tables are included here for reference.
\end_layout

\begin_layout Standard
\begin_inset CommandInset include
LatexCommand lstinputlisting
filename "../libspeex/exc_5_64_table.c"

\end_inset


\end_layout

\begin_layout Standard
\begin_inset CommandInset include
LatexCommand lstinputlisting
filename "../libspeex/exc_5_256_table.c"

\end_inset


\end_layout

\begin_layout Standard
\begin_inset CommandInset include
LatexCommand lstinputlisting
filename "../libspeex/exc_8_128_table.c"

\end_inset


\end_layout

\begin_layout Standard
\begin_inset CommandInset include
LatexCommand lstinputlisting
filename "../libspeex/exc_10_16_table.c"

\end_inset


\end_layout

\begin_layout Standard
\begin_inset CommandInset include
LatexCommand lstinputlisting
filename "../libspeex/exc_10_32_table.c"

\end_inset


\end_layout

\begin_layout Standard
\begin_inset CommandInset include
LatexCommand lstinputlisting
filename "../libspeex/exc_20_32_table.c"

\end_inset


\end_layout

\begin_layout Standard
\begin_inset CommandInset include
LatexCommand lstinputlisting
filename "../libspeex/gain_table.c"

\end_inset


\end_layout

\begin_layout Standard
\begin_inset CommandInset include
LatexCommand lstinputlisting
filename "../libspeex/gain_table_lbr.c"

\end_inset


\end_layout

\begin_layout Standard
\begin_inset CommandInset include
LatexCommand lstinputlisting
filename "../libspeex/lsp_tables_nb.c"

\end_inset


\end_layout

\begin_layout Section
Wideband embedded decoder
\end_layout

\begin_layout Standard
QMF filter.
 Narrowband signal decoded using narrowband decoder
\end_layout

\begin_layout Standard
For the high band, the decoder is similar to the narrowband decoder, with
 the main difference being that there is no adaptive codebook.
\end_layout

\begin_layout Standard
Gain is per-subframe
\end_layout

\begin_layout Chapter
Speex narrowband mode
\begin_inset CommandInset label
LatexCommand label
name "sec:Speex-narrowband-mode"

\end_inset


\begin_inset Index
status collapsed

\begin_layout Plain Layout
narrowband
\end_layout

\end_inset


\end_layout

\begin_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.
\end_layout

\begin_layout Standard
Also many design decisions were based on the original goals and assumptions:
\end_layout

\begin_layout Itemize
Minimizing the amount of information extracted from past frames (for robustness
 to packet loss)
\end_layout

\begin_layout Itemize
Dynamically-selectable codebooks (LSP, pitch and innovation)
\end_layout

\begin_layout Itemize
sub-vector fixed (innovation) codebooks
\end_layout

\begin_layout Section
Whole-Frame Analysis
\begin_inset Index
status collapsed

\begin_layout Plain Layout
linear prediction
\end_layout

\end_inset


\end_layout

\begin_layout Standard
In narrowband, Speex frames are 20 ms long (160 samples) and are subdivided
 in 4 sub-frames of 5 ms each (40 samples).
 For most narrowband bit-rates (8 kbps and above), the only parameters encoded
 at the frame level are the Line Spectral Pairs (LSP) and a global excitation
 gain 
\begin_inset Formula $g_{frame}$
\end_inset

, as shown in Fig.
 
\begin_inset CommandInset ref
LatexCommand ref
reference "cap:Frame-open-loop-analysis"

\end_inset

.
 All other parameters are encoded at the sub-frame level.
\end_layout

\begin_layout Standard
Linear prediction analysis is performed once per frame using an asymmetric
 Hamming window centered on the fourth sub-frame.
 Because linear prediction coefficients (LPC) are not robust to quantization,
 they are first converted to line spectral pairs (LSP)
\begin_inset Index
status collapsed

\begin_layout Plain Layout
line spectral pair
\end_layout

\end_inset

.
 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 coefficients.
 The LSP coefficients and converted back to the LPC filter 
\begin_inset Formula $\hat{A}(z)$
\end_inset

.
 The non-quantized interpolated filter is denoted 
\begin_inset Formula $A(z)$
\end_inset

 and can be used for the weighting filter 
\begin_inset Formula $W(z)$
\end_inset

 because it does not need to be available to the decoder.
 
\end_layout

\begin_layout Standard
To make Speex more robust to packet loss, no prediction is applied on the
 LSP coefficients prior to quantization.
 The LSPs are encoded using vector quantization (VQ) with 30 bits for higher
 quality modes and 18 bits for lower quality.
\end_layout

\begin_layout Standard
\begin_inset Float figure
wide false
sideways false
status open

\begin_layout Plain Layout
\begin_inset ERT
status collapsed

\begin_layout Plain Layout


\backslash
begin{center}
\end_layout

\end_inset


\begin_inset Graphics
	filename speex_analysis.eps
	width 35page%

\end_inset


\begin_inset ERT
status collapsed

\begin_layout Plain Layout


\backslash
end{center}
\end_layout

\end_inset


\end_layout

\begin_layout Plain Layout
\begin_inset Caption

\begin_layout Plain Layout
Frame open-loop analysis
\begin_inset CommandInset label
LatexCommand label
name "cap:Frame-open-loop-analysis"

\end_inset


\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Section
Sub-Frame Analysis-by-Synthesis
\end_layout

\begin_layout Standard
\begin_inset Float figure
wide false
sideways false
status open

\begin_layout Plain Layout
\begin_inset ERT
status collapsed

\begin_layout Plain Layout


\backslash
begin{center}
\end_layout

\end_inset


\begin_inset Graphics
	filename speex_abs.eps
	lyxscale 75
	width 40page%

\end_inset


\begin_inset ERT
status collapsed

\begin_layout Plain Layout


\backslash
end{center}
\end_layout

\end_inset


\end_layout

\begin_layout Plain Layout
\begin_inset Caption

\begin_layout Plain Layout
Analysis-by-synthesis closed-loop optimization on a sub-frame.
\begin_inset CommandInset label
LatexCommand label
name "cap:Sub-frame-AbS"

\end_inset


\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
The analysis-by-synthesis (AbS) encoder loop is described in Fig.
 
\begin_inset CommandInset ref
LatexCommand ref
reference "cap:Sub-frame-AbS"

\end_inset

.
 There are three main aspects where Speex significantly differs from most
 other CELP codecs.
 First, while most recent CELP codecs make use of fractional pitch estimation
 with a single gain, Speex uses an integer to encode the pitch period, but
 uses a 3-tap predictor (3 gains).
 The adaptive codebook contribution 
\begin_inset Formula $e_{a}[n]$
\end_inset

 can thus be expressed as:
\begin_inset Formula \begin{equation}
e_{a}[n]=g_{0}e[n-T-1]+g_{1}e[n-T]+g_{2}e[n-T+1]\label{eq:adaptive-3tap}\end{equation}

\end_inset

where 
\begin_inset Formula $g_{0}$
\end_inset

, 
\begin_inset Formula $g_{1}$
\end_inset

 and 
\begin_inset Formula $g_{2}$
\end_inset

 are the jointly quantized pitch gains and 
\begin_inset Formula $e[n]$
\end_inset

 is the codec excitation memory.
 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\geq0$
\end_inset

, we use 
\begin_inset Formula $n-2T+1$
\end_inset

 instead.
 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 at higher bit-rates (15
 kbps narrowband and above) and 5 bits at lower bit-rates (11 kbps narrowband
 and below).
\end_layout

\begin_layout Standard
Many current CELP codecs use moving average (MA) prediction to encode the
 fixed codebook gain.
 This provides slightly better coding at the expense of introducing a dependency
 on previously encoded frames.
 A second difference is that Speex encodes the fixed codebook gain as the
 product of the global excitation gain 
\begin_inset Formula $g_{frame}$
\end_inset

 with a sub-frame gain corrections 
\begin_inset Formula $g_{subf}$
\end_inset

.
 This increases robustness to packet loss by eliminating the inter-frame
 dependency.
 The sub-frame gain correction is encoded before the fixed codebook is searched
 (not closed-loop optimized) and uses between 0 and 3 bits per sub-frame,
 depending on the bit-rate.
\end_layout

\begin_layout Standard
The third difference is that Speex uses sub-vector quantization of the innovatio
n (fixed codebook) signal instead of an algebraic codebook.
 Each sub-frame is divided into sub-vectors of lengths ranging between 5
 and 20 samples.
 Each sub-vector is chosen from a bitrate-dependent codebook and all sub-vectors
 are concatenated to form a sub-frame.
 As an example, the 3.95 kbps mode uses a sub-vector size of 20 samples with
 32 entries in the codebook (5 bits).
 This means that the innovation is encoded with 10 bits per sub-frame, or
 2000 bps.
 On the other hand, the 18.2 kbps mode uses a sub-vector size of 5 samples
 with 256 entries in the codebook (8 bits), so the innovation uses 64 bits
 per sub-frame, or 12800 bps.
 
\end_layout

\begin_layout Section
Bit-rates
\end_layout

\begin_layout Standard
So far, no MOS (Mean Opinion Score
\begin_inset Index
status collapsed

\begin_layout Plain Layout
mean opinion score
\end_layout

\end_inset

) subjective evaluation has been performed for Speex.
 In order to give an idea of the quality achievable with it, table 
\begin_inset CommandInset ref
LatexCommand ref
reference "cap:quality_vs_bps"

\end_inset

 presents my own subjective opinion on it.
 It should 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 lowest complexity setting).
 Decoding requires approximately 0.5 mflops
\begin_inset Index
status collapsed

\begin_layout Plain Layout
complexity
\end_layout

\end_inset

 in most modes (1 mflops with perceptual enhancement).
\end_layout

\begin_layout Standard
\begin_inset Float table
placement h
wide true
sideways false
status open

\begin_layout Plain Layout
\begin_inset ERT
status collapsed

\begin_layout Plain Layout


\backslash
begin{center}
\end_layout

\end_inset


\begin_inset Tabular
<lyxtabular version="3" rows="17" columns="5">
<features>
<column alignment="center" valignment="top" width="0pt">
<column alignment="center" valignment="top" width="0pt">
<column alignment="center" valignment="top" width="0pt">
<column alignment="center" valignment="top" width="0pt">
<column alignment="center" valignment="top" width="0pt">
<row>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Mode
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Quality
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Bit-rate
\begin_inset Index
status collapsed

\begin_layout Plain Layout
bit-rate
\end_layout

\end_inset

 (bps)
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
mflops
\begin_inset Index
status collapsed

\begin_layout Plain Layout
complexity
\end_layout

\end_inset


\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Quality/description
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
0
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
-
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
250
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
0
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
No transmission (DTX)
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
1
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
0
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
2,150
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
6
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Vocoder (mostly for comfort noise)
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
2
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
2
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
5,950
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
9
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Very noticeable artifacts/noise, good intelligibility
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
3
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
3-4
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
8,000
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
10
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Artifacts/noise sometimes noticeable
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
4
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
5-6
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
11,000
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
14
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Artifacts usually noticeable only with headphones
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
5
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
7-8
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
15,000
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
11
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Need good headphones to tell the difference
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
6
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
9
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
18,200
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
17.5
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Hard to tell the difference even with good headphones
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
7
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
10
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
24,600
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
14.5
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Completely transparent for voice, good quality music
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
8
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
1
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
3,950
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
10.5
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Very noticeable artifacts/noise, good intelligibility
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
9
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
-
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
-
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
-
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
reserved
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
10
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
-
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
-
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
-
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
reserved
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
11
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
-
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
-
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
-
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
reserved
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
12
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
-
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
-
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
-
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
reserved
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
13
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
-
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
-
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
-
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Application-defined, interpreted by callback or skipped
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
14
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
-
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
-
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
-
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Speex in-band signaling
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
15
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
-
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
-
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
-
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Terminator code
\end_layout

\end_inset
</cell>
</row>
</lyxtabular>

\end_inset


\begin_inset ERT
status collapsed

\begin_layout Plain Layout


\backslash
end{center}
\end_layout

\end_inset


\end_layout

\begin_layout Plain Layout
\begin_inset Caption

\begin_layout Plain Layout
Quality versus bit-rate
\begin_inset CommandInset label
LatexCommand label
name "cap:quality_vs_bps"

\end_inset


\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Section
Perceptual enhancement
\begin_inset Index
status collapsed

\begin_layout Plain Layout
perceptual enhancement
\end_layout

\end_inset


\end_layout

\begin_layout Standard

\series bold
This section was only valid for version 1.1.12 and earlier.
 It does not apply to version 1.2-beta1 (and later), for which the new perceptual
 enhancement is not yet documented.
\end_layout

\begin_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 divided into 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.
 
\end_layout

\begin_layout Standard
\begin_inset Newpage newpage
\end_inset


\end_layout

\begin_layout Chapter
Speex wideband mode (sub-band CELP)
\begin_inset Index
status collapsed

\begin_layout Plain Layout
wideband
\end_layout

\end_inset


\begin_inset CommandInset label
LatexCommand label
name "sec:Speex-wideband-mode"

\end_inset


\end_layout

\begin_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 Index
status collapsed

\begin_layout Plain Layout
quadrature mirror filter
\end_layout

\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 CommandInset ref
LatexCommand ref
reference "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.
\end_layout

\begin_layout Section
Linear Prediction
\end_layout

\begin_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.
\end_layout

\begin_layout Section
Pitch Prediction
\end_layout

\begin_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 is no longer at multiples of the fundamental
 (pitch).
\end_layout

\begin_layout Section
Excitation Quantization
\end_layout

\begin_layout Standard
The high-band excitation is coded in the same way as for narrowband.
 
\end_layout

\begin_layout Section
Bit allocation
\end_layout

\begin_layout Standard
For the wideband mode, the entire narrowband frame is packed before the
 high-band is encoded.
 The narrowband part of the bit-stream is as defined in table 
\begin_inset CommandInset ref
LatexCommand ref
reference "cap:bits-narrowband"

\end_inset

.
 The high-band follows, as described in table 
\begin_inset CommandInset ref
LatexCommand ref
reference "cap:bits-wideband"

\end_inset

.
 For wideband, the mode ID is the same as the Speex quality setting and
 is defined in table 
\begin_inset CommandInset ref
LatexCommand ref
reference "tab:wideband-quality"

\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.
\end_layout

\begin_layout Standard
\begin_inset Float table
placement h
wide true
sideways false
status open

\begin_layout Plain Layout
\begin_inset ERT
status collapsed

\begin_layout Plain Layout


\backslash
begin{center}
\end_layout

\end_inset


\begin_inset Tabular
<lyxtabular version="3" rows="7" columns="7">
<features>
<column alignment="center" valignment="top" width="0pt">
<column alignment="center" valignment="top" width="0pt">
<column alignment="center" valignment="top" width="0pt">
<column alignment="center" valignment="top" width="0pt">
<column alignment="center" valignment="top" width="0pt">
<column alignment="center" valignment="top" width="0pt">
<column alignment="center" valignment="top" width="0pt">
<row>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Parameter
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Update rate
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
0
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
1
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
2
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
3
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
4
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Wideband bit
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
frame
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
1
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
1
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
1
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
1
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
1
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Mode ID
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
frame
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
3
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
3
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
3
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
3
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
3
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
LSP
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
frame
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
0
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
12
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
12
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
12
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
12
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Excitation gain
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
sub-frame
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
0
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
5
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
4
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
4
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
4
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Excitation VQ
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
sub-frame
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
0
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
0
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
20
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
40
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
80
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Total
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
frame
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
4
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
36
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
112
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
192
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
352
\end_layout

\end_inset
</cell>
</row>
</lyxtabular>

\end_inset


\begin_inset ERT
status collapsed

\begin_layout Plain Layout


\backslash
end{center}
\end_layout

\end_inset


\end_layout

\begin_layout Plain Layout
\begin_inset Caption

\begin_layout Plain Layout
Bit allocation for high-band in wideband mode
\begin_inset CommandInset label
LatexCommand label
name "cap:bits-wideband"

\end_inset


\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
\begin_inset Float table
placement h
wide true
sideways false
status open

\begin_layout Plain Layout
\begin_inset ERT
status collapsed

\begin_layout Plain Layout


\backslash
begin{center}
\end_layout

\end_inset


\begin_inset Tabular
<lyxtabular version="3" rows="12" columns="3">
<features>
<column alignment="center" valignment="top" width="0pt">
<column alignment="center" valignment="top" width="0pt">
<column alignment="center" valignment="top" width="0pt">
<row>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Mode/Quality
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Bit-rate
\begin_inset Index
status collapsed

\begin_layout Plain Layout
bit-rate
\end_layout

\end_inset

 (bps)
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Quality/description
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
0
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
3,950
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Barely intelligible (mostly for comfort noise)
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
1
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
5,750
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Very noticeable artifacts/noise, poor intelligibility
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
2
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
7,750
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Very noticeable artifacts/noise, good intelligibility
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
3
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
9,800
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Artifacts/noise sometimes annoying
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
4
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
12,800
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Artifacts/noise usually noticeable
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
5
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
16,800
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Artifacts/noise sometimes noticeable
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
6
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
20,600
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Need good headphones to tell the difference
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
7
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
23,800
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Need good headphones to tell the difference
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
8
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
27,800
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Hard to tell the difference even with good headphones
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
9
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
34,200
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Hard to tell the difference even with good headphones
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
10
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
42,200
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Completely transparent for voice, good quality music
\end_layout

\end_inset
</cell>
</row>
</lyxtabular>

\end_inset


\begin_inset ERT
status collapsed

\begin_layout Plain Layout


\backslash
end{center}
\end_layout

\end_inset


\end_layout

\begin_layout Plain Layout
\begin_inset Caption

\begin_layout Plain Layout
Quality versus bit-rate for the wideband encoder
\begin_inset CommandInset label
LatexCommand label
name "tab:wideband-quality"

\end_inset


\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
\begin_inset ERT
status open

\begin_layout Plain Layout


\backslash
clearpage
\end_layout

\end_inset


\end_layout

\begin_layout Standard
\begin_inset ERT
status collapsed

\begin_layout Plain Layout


\backslash
clearpage
\end_layout

\end_inset


\end_layout

\begin_layout Chapter
\start_of_appendix
Sample code
\begin_inset CommandInset label
LatexCommand label
name "sec:Sample-code"

\end_inset


\end_layout

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

\begin_inset Newline newline
\end_inset

% sampleenc in_file.sw | sampledec out_file.sw
\family default

\begin_inset Newline newline
\end_inset

where both files are raw (no header) files encoded at 16 bits per sample
 (in the machine natural endianness).
\end_layout

\begin_layout Section
sampleenc.c
\end_layout

\begin_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 
\series bold
not
\series default
 compatible with that of speexenc/speexdec.
\end_layout

\begin_layout Standard
\begin_inset CommandInset include
LatexCommand lstinputlisting
filename "sampleenc.c"
lstparams "caption={Source code for sampleenc},label={sampleenc-source-code},numbers=left,numberstyle={\\footnotesize}"

\end_inset


\end_layout

\begin_layout Section
sampledec.c
\end_layout

\begin_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 
\series bold
not
\series default
 compatible with that of speexenc/speexdec.
\end_layout

\begin_layout Standard
\begin_inset CommandInset include
LatexCommand lstinputlisting
filename "sampledec.c"
lstparams "caption={Source code for sampledec},label={sampledec-source-code},numbers=left,numberstyle={\\footnotesize}"

\end_inset


\end_layout

\begin_layout Standard
\begin_inset Newpage newpage
\end_inset


\end_layout

\begin_layout Chapter
Jitter Buffer for Speex
\end_layout

\begin_layout Standard
\begin_inset CommandInset include
LatexCommand lstinputlisting
filename "../speexclient/speex_jitter_buffer.c"
lstparams "caption={Example of using the jitter buffer for Speex packets},label={example-speex-jitter},numbers=left,numberstyle={\\footnotesize}"

\end_inset


\end_layout

\begin_layout Standard
\begin_inset Newpage newpage
\end_inset


\end_layout

\begin_layout Chapter
IETF RTP Profile
\begin_inset CommandInset label
LatexCommand label
name "sec:IETF-draft"

\end_inset


\end_layout

\begin_layout Standard
\begin_inset CommandInset include
LatexCommand verbatiminput
filename "draft-ietf-avt-rtp-speex-05-tmp.txt"

\end_inset


\end_layout

\begin_layout Standard
\begin_inset Newpage newpage
\end_inset


\end_layout

\begin_layout Chapter
Speex License
\begin_inset CommandInset label
LatexCommand label
name "sec:Speex-License"

\end_inset


\end_layout

\begin_layout Standard
\begin_inset CommandInset include
LatexCommand verbatiminput
filename "../COPYING"

\end_inset


\end_layout

\begin_layout Standard
\begin_inset Newpage newpage
\end_inset


\end_layout

\begin_layout Chapter
GNU Free Documentation License
\end_layout

\begin_layout Standard
Version 1.1, March 2000
\end_layout

\begin_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.
 
\end_layout

\begin_layout Section*
0.
 PREAMBLE
\end_layout

\begin_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.
\end_layout

\begin_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.
\end_layout

\begin_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.
 
\end_layout

\begin_layout Section*
1.
 APPLICABILITY AND DEFINITIONS
\end_layout

\begin_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".
\end_layout

\begin_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.
\end_layout

\begin_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.
\end_layout

\begin_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.
\end_layout

\begin_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.
\end_layout

\begin_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".
\end_layout

\begin_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.
\end_layout

\begin_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.
\end_layout

\begin_layout Section*
2.
 VERBATIM COPYING
\end_layout

\begin_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.
\end_layout

\begin_layout Standard
You may also lend copies, under the same conditions stated above, and you
 may publicly display copies.
\end_layout

\begin_layout Section*
3.
 COPYING IN QUANTITY
\end_layout

\begin_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.
\end_layout

\begin_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.
\end_layout

\begin_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.
\end_layout

\begin_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.
 
\end_layout

\begin_layout Section*
4.
 MODIFICATIONS
\end_layout

\begin_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: 
\end_layout

\begin_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.
\end_layout

\begin_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).
\end_layout

\begin_layout Itemize
C.
 State on the Title page the name of the publisher of the Modified Version,
 as the publisher.
\end_layout

\begin_layout Itemize
D.
 Preserve all the copyright notices of the Document.
\end_layout

\begin_layout Itemize
E.
 Add an appropriate copyright notice for your modifications adjacent to
 the other copyright notices.
\end_layout

\begin_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.
\end_layout

\begin_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.
\end_layout

\begin_layout Itemize
H.
 Include an unaltered copy of this License.
\end_layout

\begin_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.
\end_layout

\begin_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.
\end_layout

\begin_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.
\end_layout

\begin_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.
\end_layout

\begin_layout Itemize
M.
 Delete any section entitled "Endorsements".
 Such a section may not be included in the Modified Version.
\end_layout

\begin_layout Itemize
N.
 Do not retitle any existing section as "Endorsements" or to conflict in
 title with any Invariant Section.
 
\end_layout

\begin_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.
\end_layout

\begin_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.
\end_layout

\begin_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.
\end_layout

\begin_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.
 
\end_layout

\begin_layout Section*
5.
 COMBINING DOCUMENTS
\end_layout

\begin_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.
\end_layout

\begin_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.
\end_layout

\begin_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."
\end_layout

\begin_layout Section*
6.
 COLLECTIONS OF DOCUMENTS
\end_layout

\begin_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.
\end_layout

\begin_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.
 
\end_layout

\begin_layout Section*
7.
 AGGREGATION WITH INDEPENDENT WORKS
\end_layout

\begin_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.
\end_layout

\begin_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.
\end_layout

\begin_layout Section*
8.
 TRANSLATION
\end_layout

\begin_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.
\end_layout

\begin_layout Section*
9.
 TERMINATION
\end_layout

\begin_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.
 
\end_layout

\begin_layout Section*
10.
 FUTURE REVISIONS OF THIS LICENSE
\end_layout

\begin_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/.
\end_layout

\begin_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.
\end_layout

\begin_layout Standard
\begin_inset CommandInset index_print
LatexCommand printindex

\end_inset


\end_layout

\end_body
\end_document
