Preparing for rc2
[speexdsp.git] / doc / manual.lyx
index 6118259..af400e5 100644 (file)
@@ -29,7 +29,7 @@
 
 The Speex Codec Manual
 \newline 
-(draft for Speex 1.0beta1)
+(for version 1.0rc2)
 \layout Author
 
 Jean-Marc Valin
@@ -45,36 +45,6 @@ Permission is granted to copy, distribute and/or modify this document under
  A copy of the license is included in the section entitled "GNU Free Documentati
 on License".
  
-\layout Section*
-
-Disclaimer
-\layout Standard
-
-This document is meant to provide useful information on the Speex codec
- but there is absolutely no warranty regarding usefulness or correctness
- of the information provided.
- Also, some techniques used in Speex are said to be 
-\begin_inset Quotes eld
-\end_inset 
-
-similar
-\begin_inset Quotes erd
-\end_inset 
-
- to techniques used in known codecs.
- This should not be understood as an acknowledgment that Speex is using
- any patented algorithm used in these codecs, but merely that comprehension
- of Speex can be facilitated by thinking that the principles of operation
- are the same or similar.
- Of course, there's also the obligatory 
-\begin_inset Quotes eld
-\end_inset 
-
-all trademarks are property of their respective owner
-\begin_inset Quotes erd
-\end_inset 
-
-.
 \layout Standard
 \pagebreak_top \pagebreak_bottom 
 
@@ -96,8 +66,12 @@ all trademarks are property of their respective owner
 Introduction to Speex
 \layout Standard
 
-The Speex project has been started because there was a need for a speech
- codec that was open-source and free from software patents.
+The Speex project (
+\family typewriter 
+http://www.speex.org/
+\family default 
+) has been started because there was a need for a speech codec that was
+ open-source and free from software patents.
  These are essential conditions for being used by any open-source software.
  There is already Vorbis that does general audio, but it is not really suitable
  for speech.
@@ -121,8 +95,12 @@ Designing for VoIP instead of cell phone use means that Speex must be robust
  without compromising too much on the efficiency of the codec.
 \layout Standard
 
-All this led us to the choice of CELP as the encoding technique to use for
- Speex.
+All this led us to the choice of CELP
+\begin_inset LatexCommand \index{CELP}
+
+\end_inset 
+
+ as the encoding technique to use for Speex.
  One of the main reasons is that CELP has long proved that it could do the
  job and scale well to both low bit-rates (think DoD CELP @ 4.8 kbps) and
  high bit-rates (think G.728 @ 16 kbps).
@@ -132,25 +110,82 @@ All this led us to the choice of CELP as the encoding technique to use for
 The main characteristics can be summerized as follows:
 \layout Itemize
 
-Free software/open-source, patent and royalty-free
+Free software/open-source
+\begin_inset LatexCommand \index{open-source}
+
+\end_inset 
+
+, patent
+\begin_inset LatexCommand \index{patent}
+
+\end_inset 
+
+ and royalty-free
 \layout Itemize
 
-Integration of wideband and narrowband in the same bit-stream
+Integration of narrowband
+\begin_inset LatexCommand \index{narrowband}
+
+\end_inset 
+
+ and wideband
+\begin_inset LatexCommand \index{wideband}
+
+\end_inset 
+
+ in the same bit-stream
 \layout Itemize
 
-Wide range of bit-rates available
+Wide range of bit-rates available (from 2 kbps to 44 kbps)
 \layout Itemize
 
-Dynamic bit-rate switching and variable bit-rate (VBR)
+Dynamic bit-rate switching and Variable Bit-Rate
+\begin_inset LatexCommand \index{variable bit-rate}
+
+\end_inset 
+
+ (VBR)
 \layout Itemize
 
-Voice Activity Detection (VAD, integrated with VBR)
+Voice Activity Detection
+\begin_inset LatexCommand \index{voice activity detection}
+
+\end_inset 
+
+ (VAD, integrated with VBR)
 \layout Itemize
 
 Variable complexity
+\begin_inset LatexCommand \index{complexity}
+
+\end_inset 
+
+
+\layout Itemize
+
+Ultra-wideband mode at 32 kHz (up to 48 kHz)
+\layout Itemize
+
+Intensity stereo encoding option
+\layout Standard
+
+The next two sections describe the internals of the codec and require some
+ signal processing knowledge.
+ If you are only interested in using Speex, you can skip to section 
+\begin_inset LatexCommand \ref{sec:Command-line-encoder/decoder}
+
+\end_inset 
+
+.
 \layout Section
 \pagebreak_top 
 Introduction to CELP Coding
+\begin_inset LatexCommand \index{CELP}
+
+\end_inset 
+
+
 \layout Standard
 
 Speex is based on CELP, which stands for Code Excited Linear Prediction.
@@ -180,75 +215,97 @@ perceptually weighted domain
 \end_inset 
 
 
-\layout Subsection
-
-Linear Prediction
 \layout Standard
 
-The linear prediction model represents each speech sample as linear combination
- of past samples, plus an error signal called the excitation (or residual).
-\begin_inset Formula \[
-x(n)=\sum _{i=1}^{N}a_{i}x(n-i)+e(n)\]
+This section describes the basic ideas behind CELP.
+ Note that it's still incomplete.
+\layout Subsection
+
+Linear Prediction (LPC)
+\begin_inset LatexCommand \index{linear prediction}
 
 \end_inset 
 
 
 \layout Standard
 
-In the 
-\emph on 
-z
-\emph default 
--domain, this can be expressed as
+Linear prediction is at the base of may speech coding techniques, including
+ CELP.
+ The idea behind it is to predict the signal 
+\begin_inset Formula $x(n)$
+\end_inset 
+
+ using a linear combination of its past samples:
 \layout Standard
 
 
 \begin_inset Formula \[
-x(z)=\frac{1}{A(z)}\: e(z)\]
+y[n]=\sum _{i=1}^{N}a_{i}x[n-i]\]
 
 \end_inset 
 
+where 
+\begin_inset Formula $y[n]$
+\end_inset 
 
-\layout Standard
+ 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]\]
 
-where 
-\begin_inset Formula $A(z)$
 \end_inset 
 
- is defined as
+
 \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 \[
-A(z)=1-\sum _{i=1}^{N}a_{i}z^{-i}\]
+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 
 
-\layout Standard
+ 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\]
 
-We usually refer to 
-\begin_inset Formula $A(z)$
 \end_inset 
 
- as the analysis filter and 
-\begin_inset Formula $1/A(z)$
-\end_inset 
 
- as the synthesis filter.
 \layout Standard
 
 The 
-\begin_inset Formula $A(z)$
+\begin_inset Formula $a_{i}$
+\end_inset 
+
+ filter coefficients are computed using the Levinson-Durbin
+\begin_inset LatexCommand \index{Levinson-Durbin}
+
+\end_inset 
+
+ algorithm, which starts from the auto-correlation
+\begin_inset LatexCommand \index{auto-correlation}
+
 \end_inset 
 
- filter is computed using the Levinson-Durbin algorithm, which starts from
- the auto-correlation 
 \begin_inset Formula $R(m)$
 \end_inset 
 
  of the signal 
-\begin_inset Formula $x(n)$
+\begin_inset Formula $x[n]$
 \end_inset 
 
 .
@@ -256,7 +313,7 @@ The
 
 
 \begin_inset Formula \[
-r(m)=\sum _{i=0}^{N-1}x(i)x(i-m)\]
+R(m)=\sum _{i=0}^{N-1}x[i]x[i-m]\]
 
 \end_inset 
 
@@ -270,10 +327,10 @@ For an order
  filter, we have:
 \begin_inset Formula \[
 \mathbf{R}=\left[\begin{array}{cccc}
r(0) & r(1) & \cdots  & r(N-1)\\
r(1) & r(0) & \cdots  & r(N-2)\\
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}
R(N-1) & R(N-2) & \cdots  & R(0)\end{array}
 \right]\]
 
 \end_inset 
@@ -281,8 +338,8 @@ For an order
 
 \begin_inset Formula \[
 \mathbf{r}=\left[\begin{array}{c}
r(1)\\
r(2)\\
R(1)\\
R(2)\\
  \vdots \\
  R(N)\end{array}
 \right]\]
@@ -327,7 +384,7 @@ The filter coefficients
  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)$
+\begin_inset Formula $R(0)$
 \end_inset 
 
  by a number slightly above one (such as 1.0001), which is equivalent to
@@ -336,27 +393,104 @@ The filter coefficients
  to filtering in the frequency domain, reducing sharp resonances.
 \layout Standard
 
+The linear prediction model represents each speech sample as linear combination
+ of past samples, plus an error signal called the excitation (or residual).
+\begin_inset Formula \[
+x[n]=\sum _{i=1}^{N}a_{i}x[n-i]+e[n]\]
+
+\end_inset 
+
+
+\layout Standard
+
+In the 
+\emph on 
+z
+\emph default 
+-domain, this can be expressed as
+\layout Standard
+
+
+\begin_inset Formula \[
+x(z)=\frac{1}{A(z)}\: e(z)\]
+
+\end_inset 
+
+
+\layout Standard
+
+where 
+\begin_inset Formula $A(z)$
+\end_inset 
+
+ is defined as
+\layout Standard
+
+
+\begin_inset Formula \[
+A(z)=1-\sum _{i=1}^{N}a_{i}z^{-i}\]
+
+\end_inset 
+
+
+\layout Standard
+
+We usually refer to 
+\begin_inset Formula $A(z)$
+\end_inset 
+
+ as the analysis filter and 
+\begin_inset Formula $1/A(z)$
+\end_inset 
+
+ as the synthesis filter.
+ The whole process is called short-term prediction as it predicts the signal
+\begin_inset Formula $x[n]$
+\end_inset 
+
+ using a prediction using only the 
+\begin_inset Formula $N$
+\end_inset 
+
+ past samples, where 
+\begin_inset Formula $N$
+\end_inset 
+
+ is usually around 10.
+\layout Standard
+
 Because LPC coefficients have very little robustness to quantization, they
- are converted to Line Spectral Pair (LSP) coefficients which have a much
- better behaviour with quantization, one of them being that it's easy to
- keep the filter stable.
+ are converted to Line Spectral Pair
+\begin_inset LatexCommand \index{line spectral pair}
+
+\end_inset 
+
+ (LSP) coefficients which have a much better behaviour with quantization,
+ one of them being that it's easy to keep the filter stable.
  
 \layout Subsection
 
 Pitch Prediction
+\begin_inset LatexCommand \index{pitch}
+
+\end_inset 
+
+
 \layout Standard
 
-During voiced segments, the speech signal is very periodic, so it is possible
- to take advantage of that by expressing the excitation signal 
-\begin_inset Formula $e(n)$
+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 
 
- as
+ by a gain times the past of the excitation:
 \layout Standard
 
 
 \begin_inset Formula \[
-e(n)=\beta e(n-T)+c(n)\]
+e[n]\simeq p[n]=\beta e[n-T]\]
 
 \end_inset 
 
@@ -380,45 +514,103 @@ where
 innovation codebook
 \emph default 
 .
- In the 
+ We call that long-term prediction since the excitation is predicted from
+\begin_inset Formula $e[n-T]$
+\end_inset 
+
+ with 
+\begin_inset Formula $T\gg N$
+\end_inset 
+
+.
+\layout Subsection
+
+Innovation Codebook
+\layout Standard
+
+The final excitation 
+\begin_inset Formula $e[n]$
+\end_inset 
+
+ will be the sum of the pitch prediction and an 
 \emph on 
-z
+innovation
 \emph default 
--domain, the excitation can be expressed as:
+ signal 
+\begin_inset Formula $c[n]$
+\end_inset 
+
+ taken from a fixed codebook.
 \layout Standard
 
 
 \begin_inset Formula \[
-e(z)=\frac{1}{1-\beta z^{-T}}\: c(z)\]
+e[n]=p[n]+c[n]=\beta e[n-T]+c[n]\]
 
 \end_inset 
 
-
-\layout Subsection
-
-Innovation Codebook
-\layout Standard
-
 This is where most of the bits in a CELP codec are allocated.
  It represents the information that couldn't be obtained either from linear
  prediction or pitch prediction.
+ In the 
+\emph on 
+z
+\emph default 
+-domain we can represent the final signal 
+\begin_inset Formula $X(z)$
+\end_inset 
+
+ as 
+\begin_inset Formula \[
+X(z)=\frac{C(z)}{A(z)\left(1-\beta z^{-T}\right)}\]
+
+\end_inset 
+
+
 \layout Subsection
 
 Analysis-by-Synthesis and Error Weighting
+\begin_inset LatexCommand \index{error weighting}
+
+\end_inset 
+
+
+\begin_inset LatexCommand \index{analysis-by-synthesis}
+
+\end_inset 
+
+
 \layout Standard
 
 Most (if not all) modern audio codecs attempt to 
-\emph on 
+\begin_inset Quotes eld
+\end_inset 
+
 shape
-\emph default 
- the noise so that it is the hardest to detect with the ear.
- That means that more noise can be tolerated in parts of the spectrum that
- are louder and 
+\begin_inset Quotes erd
+\end_inset 
+
+ the noise so that it appears mostly in the frequency regions where the
+ ear cannot detect it.
+ For example, the ear is more tolerant to noise in parts of the spectrum
+ that are louder and 
 \emph on 
 vice versa
 \emph default 
 .
- That's why the error is minimized for the perceptually weighted signal
+ That's why instead of minimizing the simple quadratic error
+\begin_inset Formula \[
+E=\sum _{n}\left(x[n]-\overline{x}[n]\right)^{2}\]
+
+\end_inset 
+
+where 
+\begin_inset Formula $\overline{x}[n]$
+\end_inset 
+
+ is the encoder signal, we minimize the error for the perceptually weighted
+ signal
 \begin_inset Formula \[
 X_{w}(z)=W(z)X(z)\]
 
@@ -488,6 +680,11 @@ Speex narrowband mode
 \end_inset 
 
 
+\begin_inset LatexCommand \index{narrowband}
+
+\end_inset 
+
+
 \layout Standard
 
 This section looks at how Speex works for narrowband (
@@ -513,17 +710,25 @@ Minimizing the amount of information extracted from past frames (for robustness
 Dynamically-selectable codebooks (LSP, pitch and innovation)
 \layout Itemize
 
-G.728-like fixed codebooks (without backward-adaptive grains because of patent
- issues)
+sub-vector fixed (innovation) codebooks
 \layout Subsection
 
 LPC Analysis
+\begin_inset LatexCommand \index{linear prediction}
+
+\end_inset 
+
+
 \layout Standard
 
-An LPC analysis is first performed on a (Hamming) window that spans all
- the current frame and half a frame in advance.
- The LPC coefficients are then converted to Line Spectral Pair (LSP), a
- representation that is more robust to quantization.
+An LPC analysis is first performed on a (asymetric Hamming) window that
+ spans all the current frame and half a frame in advance.
+ The LPC coefficients are then converted to Line Spectral Pair
+\begin_inset LatexCommand \index{line spectral pair}
+
+\end_inset 
+
+ (LSP), a representation that is more robust to quantization.
  The LSP's are considered to be associated to the 
 \begin_inset Formula $4^{th}$
 \end_inset 
@@ -538,15 +743,18 @@ The LSP's are encoded using 30 bits for higher quality modes and 18 bits
  6 bits and the error is then divided in two 5-coefficient sub-vectors.
  Each of them is quantized with 6 bits, for a total of 18 bits.
  For the higher quality modes, the remaining error on both sub-vectors is
turther quantized with 6 bits each, for a total of 30 bits.
further quantized with 6 bits each, for a total of 30 bits.
 \layout Standard
 
 The perceptual weighting filter 
 \begin_inset Formula $W(z)$
 \end_inset 
 
- used by Speex is derived from the LPC analysis and corresponds to the one
- described by eq.
+ used by Speex is derived from the LPC filter 
+\begin_inset Formula $A(z)$
+\end_inset 
+
+ and corresponds to the one described by eq.
  
 \begin_inset LatexCommand \ref{eq:weighting_filter}
 
@@ -569,15 +777,21 @@ The perceptual weighting filter
 \layout Subsection
 
 Pitch Prediction (adaptive codebook)
-\layout Standard
+\begin_inset LatexCommand \index{pitch}
+
+\end_inset 
+
 
-Speex uses a 3-tap prediction for pitch.
- That is, 
 \layout Standard
 
+Speex uses a 3-tap prediction for pitch.
+ That is, the pitch prediction signal 
+\begin_inset Formula $p[n]$
+\end_inset 
 
+ is obtained by the past of the excitation by:
 \begin_inset Formula \[
-e(n)=\beta _{0}e(n-T-1)+\beta _{1}e(n-T)+\beta _{2}e(n-T+1)+c(n)\]
+p[n]=\beta _{0}e[n-T-1]+\beta _{1}e[n-T]+\beta _{2}e[n-T+1]\]
 
 \end_inset 
 
@@ -593,7 +807,33 @@ where
 \end_inset 
 
  are the prediction (filter) taps.
+ It is worth noting that when the pitch is smaller than the sub-frame size,
+ we repeat the excitation at a period 
+\begin_inset Formula $T$
+\end_inset 
+
+.
+ For example, when 
+\begin_inset Formula $n-T+1$
+\end_inset 
+
+, we use 
+\begin_inset Formula $n-2T+1$
+\end_inset 
+
+ instead.
  The period and quantized gains are determined in closed loop.
+ In most modes, the pitch period is encoded with 7 bits in the 
+\begin_inset Formula $\left[17,144\right]$
+\end_inset 
+
+ range and the 
+\begin_inset Formula $\beta _{i}$
+\end_inset 
+
+ coefficients are vector-quantized using 7 bits (15 kbps narrowband and
+ above) at higher bit-rates and 5 bits at lower bit-rates (11 kbps narrowband
+ and below).
 \layout Subsection
 
 Innovation Codebook
@@ -605,18 +845,7 @@ n (VQ).
  the gain at the same time.
  This save many bits that would otherwise be allocated for a separate gain
  at the price of a slight increase in complexity.
- Except for the absence of (backward-adaptive) gain, the technique used
- in Speex is similar to G.728 (LD-CELP).
- However since we do not have a low-delay constraint, the search can be
- made more 
-\begin_inset Quotes eld
-\end_inset 
-
-global
-\begin_inset Quotes erd
-\end_inset 
-
- and make use of the whole information available for a sub-frame.
 \layout Subsection
 
 Bit allocation
@@ -652,7 +881,7 @@ OL
 
 
 \begin_inset Float table
-placement htbp
+placement h
 wide true
 collapsed false
 
@@ -660,7 +889,7 @@ collapsed false
 
 
 \begin_inset  Tabular
-<lyxtabular version="3" rows="12" columns="10">
+<lyxtabular version="3" rows="12" columns="11">
 <features>
 <column alignment="center" valignment="top" leftline="true" width="0pt">
 <column alignment="center" valignment="top" leftline="true" width="0pt">
@@ -671,6 +900,7 @@ collapsed false
 <column alignment="center" valignment="top" leftline="true" width="0pt">
 <column alignment="center" valignment="top" leftline="true" width="0pt">
 <column alignment="center" valignment="top" leftline="true" width="0pt">
+<column alignment="center" valignment="top" leftline="true" width="0pt">
 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0pt">
 <row topline="true" bottomline="true">
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
@@ -753,6 +983,14 @@ Update rate
 7
 \end_inset 
 </cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+8
+\end_inset 
+</cell>
 </row>
 <row topline="true">
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
@@ -835,6 +1073,14 @@ frame
 1
 \end_inset 
 </cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+1
+\end_inset 
+</cell>
 </row>
 <row topline="true">
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
@@ -917,6 +1163,14 @@ frame
 4
 \end_inset 
 </cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+4
+\end_inset 
+</cell>
 </row>
 <row topline="true">
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
@@ -999,6 +1253,14 @@ frame
 30
 \end_inset 
 </cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+18
+\end_inset 
+</cell>
 </row>
 <row topline="true">
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
@@ -1081,6 +1343,14 @@ frame
 0
 \end_inset 
 </cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+7
+\end_inset 
+</cell>
 </row>
 <row topline="true">
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
@@ -1163,6 +1433,14 @@ frame
 0
 \end_inset 
 </cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+4
+\end_inset 
+</cell>
 </row>
 <row topline="true">
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
@@ -1245,6 +1523,14 @@ frame
 5
 \end_inset 
 </cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+5
+\end_inset 
+</cell>
 </row>
 <row topline="true">
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
@@ -1327,6 +1613,14 @@ sub-frame
 7
 \end_inset 
 </cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+0
+\end_inset 
+</cell>
 </row>
 <row topline="true">
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
@@ -1409,6 +1703,14 @@ sub-frame
 7
 \end_inset 
 </cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+0
+\end_inset 
+</cell>
 </row>
 <row topline="true">
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
@@ -1491,6 +1793,14 @@ sub-frame
 3
 \end_inset 
 </cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+0
+\end_inset 
+</cell>
 </row>
 <row topline="true" bottomline="true">
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
@@ -1573,6 +1883,14 @@ sub-frame
 96
 \end_inset 
 </cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+10
+\end_inset 
+</cell>
 </row>
 <row topline="true" bottomline="true">
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
@@ -1655,6 +1973,14 @@ frame
 492
 \end_inset 
 </cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+79
+\end_inset 
+</cell>
 </row>
 </lyxtabular>
 
@@ -1674,8 +2000,12 @@ Bit allocation for narrowband modes
 
 \layout Standard
 
-So far, no MOS (mean opinion score) subjective evaluation has been performed
- for Speex.
+So far, no MOS (Mean Opinion Score
+\begin_inset LatexCommand \index{mean opinion score}
+
+\end_inset 
+
+) subjective evaluation has been performed for Speex.
  In order to give an idea of the quality achivable with it, table 
 \begin_inset LatexCommand \ref{cap:quality_vs_bps}
 
@@ -1687,11 +2017,19 @@ So far, no MOS (mean opinion score) subjective evaluation has been performed
  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 (withing 0.5 mflops and using
+ the lowers complexity setting).
+ Decoding requires approximately 0.5 mflops
+\begin_inset LatexCommand \index{complexity}
+
+\end_inset 
+
+ in most modes (1 mflops with perceptual enhancement).
 \layout Standard
 
 
 \begin_inset Float table
-placement htbp
+placement h
 wide true
 collapsed false
 
@@ -1699,10 +2037,11 @@ collapsed false
 
 
 \begin_inset  Tabular
-<lyxtabular version="3" rows="17" columns="3">
+<lyxtabular version="3" rows="17" columns="4">
 <features>
 <column alignment="center" valignment="top" leftline="true" width="0pt">
 <column alignment="center" valignment="top" leftline="true" width="0pt">
+<column alignment="center" valignment="top" leftline="true" width="0pt">
 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0pt">
 <row topline="true" bottomline="true">
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
@@ -1718,7 +2057,25 @@ Mode
 
 \layout Standard
 
-Bitrate (bps)
+Bit-rate
+\begin_inset LatexCommand \index{bit-rate}
+
+\end_inset 
+
+ (bps)
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+mflops
+\begin_inset LatexCommand \index{complexity}
+
+\end_inset 
+
+
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -1747,6 +2104,14 @@ Quality/description
 250
 \end_inset 
 </cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+N/A
+\end_inset 
+</cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
 \begin_inset Text
 
@@ -1773,12 +2138,20 @@ No sound (VBR only)
 2,150
 \end_inset 
 </cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+6
+\end_inset 
+</cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
-Comfort noise only (VBR only)
+Vocoder (mostly for comfort noise)
 \end_inset 
 </cell>
 </row>
@@ -1799,6 +2172,14 @@ Comfort noise only (VBR only)
 5,950
 \end_inset 
 </cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+9
+\end_inset 
+</cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
 \begin_inset Text
 
@@ -1825,6 +2206,14 @@ Very noticeable artifacts/noise, good intelligibility
 8,000
 \end_inset 
 </cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+10
+\end_inset 
+</cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
 \begin_inset Text
 
@@ -1851,6 +2240,14 @@ Artifacts/noise sometimes noticeable
 11,000
 \end_inset 
 </cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+14
+\end_inset 
+</cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
 \begin_inset Text
 
@@ -1877,6 +2274,14 @@ Artifacts usually noticeable only with headphones
 15,000
 \end_inset 
 </cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+11
+\end_inset 
+</cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
 \begin_inset Text
 
@@ -1903,6 +2308,14 @@ Need good headphones to tell the difference
 18,200
 \end_inset 
 </cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+17.5
+\end_inset 
+</cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
 \begin_inset Text
 
@@ -1929,6 +2342,14 @@ Hard to tell the difference even with good headphones
 24,600
 \end_inset 
 </cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+14.5
+\end_inset 
+</cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
 \begin_inset Text
 
@@ -1952,7 +2373,15 @@ Completely transparent for voice, good quality music
 
 \layout Standard
 
-N/A
+3,950
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+-
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -1960,7 +2389,7 @@ N/A
 
 \layout Standard
 
-(Tones/DTMF to be implemented)
+Very noticeable artifacts/noise, good intelligibility
 \end_inset 
 </cell>
 </row>
@@ -1981,6 +2410,14 @@ N/A
 N/A
 \end_inset 
 </cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+N/A
+\end_inset 
+</cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
 \begin_inset Text
 
@@ -2007,6 +2444,14 @@ reserved
 N/A
 \end_inset 
 </cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+N/A
+\end_inset 
+</cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
 \begin_inset Text
 
@@ -2033,6 +2478,14 @@ reserved
 N/A
 \end_inset 
 </cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+N/A
+\end_inset 
+</cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
 \begin_inset Text
 
@@ -2059,6 +2512,14 @@ reserved
 N/A
 \end_inset 
 </cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+N/A
+\end_inset 
+</cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
 \begin_inset Text
 
@@ -2085,6 +2546,14 @@ reserved
 N/A
 \end_inset 
 </cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+N/A
+\end_inset 
+</cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
 \begin_inset Text
 
@@ -2111,6 +2580,14 @@ Application-defined, interpreted by callback or skipped
 N/A
 \end_inset 
 </cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+N/A
+\end_inset 
+</cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
 \begin_inset Text
 
@@ -2137,6 +2614,14 @@ Speex in-band signaling
 N/A
 \end_inset 
 </cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+N/A
+\end_inset 
+</cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
 \begin_inset Text
 
@@ -2165,6 +2650,11 @@ Quality versus bit-rate
 \layout Subsection
 
 Perceptual enhancement
+\begin_inset LatexCommand \index{perceptual enhancement}
+
+\end_inset 
+
+
 \layout Standard
 
 This part of the codec only applies to the decoder and can even be changed
@@ -2205,6 +2695,11 @@ where
 \layout Section
 \pagebreak_top 
 Speex wideband mode (sub-band CELP)
+\begin_inset LatexCommand \index{wideband}
+
+\end_inset 
+
+
 \layout Standard
 
 For wideband, the Speex approach uses a 
@@ -2219,7 +2714,12 @@ irror
 \emph on 
 f
 \emph default 
-ilter (QMF) to split the band in two.
+ilter
+\begin_inset LatexCommand \index{quadrature mirror filter}
+
+\end_inset 
+
+ (QMF) to split the band in two.
  The 16 kHz signal is thus divided into two 8 kHz signals, one representing
  the low band (0-4 kHz), the other the high band (4-8 kHz).
  The low band is encoded with the narrowband mode described in section 
@@ -2296,7 +2796,7 @@ For the wideband mode, all the narrowband frame is packed before the high-band
 
 
 \begin_inset Float table
-placement htbp
+placement h
 wide true
 collapsed false
 
@@ -2665,79 +3165,317 @@ sub-frame
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
-\layout Standard
+\layout Standard
+
+Total
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+frame
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+4
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+36
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+112
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+192
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+352
+\end_inset 
+</cell>
+</row>
+</lyxtabular>
+
+\end_inset 
+
+
+\layout Caption
+
+Bit allocation for high-band in wideband mode
+\begin_inset LatexCommand \label{cap:bits-wideband}
+
+\end_inset 
+
+
+\end_inset 
+
+
+\layout Standard
+
+
+\begin_inset ERT
+status Open
+
+\layout Standard
+
+\backslash 
+clearpage
+\end_inset 
+
+
+\layout Section
+\pagebreak_top 
+Feature description
+\layout Standard
+
+This section explains the main Speex features, as well as some concepts
+ in speech coding that help better understand the next sections.
+\layout Subsection*
+
+Sampling rate
+\begin_inset LatexCommand \index{sampling rate}
+
+\end_inset 
+
+
+\layout Standard
+
+Speex is mainly designed for 3 different sampling rates: 8 kHz, 16 kHz,
+ and 32 kHz.
+ These are respectively refered to as narrowband
+\begin_inset LatexCommand \index{narrowband}
+
+\end_inset 
+
+, wideband
+\begin_inset LatexCommand \index{wideband}
+
+\end_inset 
+
+ and ultra-wideband
+\begin_inset LatexCommand \index{ultra-wideband}
+
+\end_inset 
+
+.
+\layout Subsection*
+
+Quality
+\begin_inset LatexCommand \index{quality}
+
+\end_inset 
+
+
+\layout Standard
+
+Speex encoding is controlled most of the time by a quality parameter that
+ range from 0 to 10.
+ In constant bit-rate
+\begin_inset LatexCommand \index{constant bit-rate}
+
+\end_inset 
+
+ (CBR) operation, the quality parameter is an integer, while for variable
+ bit-rate (VBR), the parameter is a float.
+\layout Subsection*
+
+Complexity
+\begin_inset LatexCommand \index{complexity}
+
+\end_inset 
+
+ (variable)
+\layout Standard
+
+With Speex, it is possible to vary the complexity allowed for the encoder.
+ This is done by controlling how the search is performed with an integer
+ ranging from 1 to 10 in a way that's similar to the -1 to -9 options to
+\emph on 
+gzip
+\emph default 
+ and 
+\emph on 
+bzip2
+\emph default 
+ compression utilities.
+ For normal use, the noise level at complexity 1is between 1 and 2 dB higher
+ than at complexity 10, but the CPU requirements for complexity 10 is about
+ 5 time higher than for complexity 1.
+ In practice, the best trade-off is between complexity 2 and 4, though higher
+ settings are often useful when encoding non-speech sounds like DTMF
+\begin_inset LatexCommand \index{DTMF}
+
+\end_inset 
+
+ tones.
+\layout Subsection*
+
+Variable Bit-Rate
+\begin_inset LatexCommand \index{variable bit-rate}
+
+\end_inset 
+
+ (VBR)
+\layout Standard
+
+Variable bit-rate (VBR) allows a codec to change its bit-rate dynamically
+ to adapt to the 
+\begin_inset Quotes eld
+\end_inset 
+
+difficulty
+\begin_inset Quotes erd
+\end_inset 
+
+ of the audio being encoded.
+ In the example of Speex, sounds like vowels and high-energy transients
+ require a higher bit-rate to achieve good quality, while fricatives (e.g.
+ s,f sounds) can be coded adequately with less bits.
+ For this reason, VBR can achive lower bit-rate for the same quality, or
+ a better quality for a certain bit-rate.
+ Despite its advantages, VBR has two main drawbacks: first, by only specifying
+ quality, there's no guaranty about the final average bit-rate.
+ Second, for some real-time applications like voice over IP (VoIP), what
+ counts is the maximum bit-rate, which must be low enough for the communication
+ channel.
+\layout Subsection*
+
+Average Bit-Rate
+\begin_inset LatexCommand \index{average bit-rate}
 
-Total
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
+ (ABR)
 \layout Standard
 
-frame
-\end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
+Average bit-rate solves one of the problems of VBR, as it dynamically adjusts
+ VBR quality in order to meet a specific target bit-rate.
+ Because the quality/bit-rate is adjusted in real-time (open-loop), the
+ global quality will be slightly lower than that obtained be encoding in
+ VBR with exactly the right quality setting to meet the target average bit-rate.
+\layout Subsection*
 
-\layout Standard
+Voice Activity Detection
+\begin_inset LatexCommand \index{voice activity detection}
 
-4
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
+ (VAD)
 \layout Standard
 
-36
+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 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\layout Standard
 
-112
+comfort noise generation
+\begin_inset Quotes erd
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+ (CNG).
+\layout Subsection*
+
+Discontinuous Transmission
+\begin_inset LatexCommand \index{discontinuous transmission}
 
-192
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
+ (DTX)
 \layout Standard
 
-352
-\end_inset 
-</cell>
-</row>
-</lyxtabular>
+Discontinuous transmission is an addition to VAD operation, that allows
+ to stop transmitting completely when the background noise is stationnary.
+ In file-based operation, since we cannot just stop writing to the file,
+ only 5 bits are used for such frames (corresponding to 250 bps).
+\layout Subsection*
+
+Perceptual enhancement
+\begin_inset LatexCommand \index{perceptual enhancement}
 
 \end_inset 
 
 
-\layout Caption
+\layout Standard
 
-Bit allocation for high-band in wideband mode
-\begin_inset LatexCommand \label{cap:bits-wideband}
+Perceptual enhancement is a part of the decoder which, when turned on, tries
+ to reduce (the perception of) the noise produced by the coding/decoding
+ process.
+ In most cases, perceptual enhancement make the sound further from the original
+\emph on 
+objectively
+\emph default 
+ (if you use SNR), but in the end it still 
+\emph on 
+sounds
+\emph default 
+ better (subjective improvement).
+\layout Subsection*
+
+Algorithmic delay
+\begin_inset LatexCommand \index{algorithmic delay}
 
 \end_inset 
 
 
+\layout Standard
+
+Every speech codec introduces a delay in the transmission.
+ For Speex, this delay is equal to the frame size, plus some amount of 
+\begin_inset Quotes eld
 \end_inset 
 
+look-ahead
+\begin_inset Quotes erd
+\end_inset 
 
+ required to process each frame.
+ In narrowband operation (8 kHz), the delay is 30 ms, while for wideband
+ (16 kHz), the delay is 34 ms.
+ These values don't account for the CPU time it takes to encode or decode
+ the frames.
 \layout Section
-
+\pagebreak_top 
 Command-line encoder/decoder
+\begin_inset LatexCommand \label{sec:Command-line-encoder/decoder}
+
+\end_inset 
+
+
 \layout Standard
 
 The base Speex distribution includes a command-line encoder (
@@ -2749,14 +3487,33 @@ speexenc
 speexdec
 \emph default 
 ).
+ This section describes how to use these tools.
 \layout Subsection
 
 
 \emph on 
 speexenc
+\begin_inset LatexCommand \index{speexenc}
+
+\end_inset 
+
+
+\layout Standard
+
+The 
+\emph on 
+speexenc
+\emph default 
+ utility is used to create Speex files from raw PCM or wave files.
+ It can be used by calling: 
+\layout LyX-Code
+
+speexenc [options] input_file output_file
 \layout Standard
 
-The encoder takes the following options:
+The value '-' for input_file or output_file corresponds respectively to
+ stdin and stdout.
+ The valid options are:
 \layout Description
 
 --narrowband\SpecialChar ~
@@ -2768,13 +3525,39 @@ The encoder takes the following options:
 (-w) Tell Speex to treat the input as wideband (16 kHz)
 \layout Description
 
+--ultra-wideband\SpecialChar ~
+(-u) Tell Speex to treat the input as 
+\begin_inset Quotes eld
+\end_inset 
+
+ultra-wideband
+\begin_inset Quotes erd
+\end_inset 
+
+ (32 kHz)
+\layout Description
+
 --quality\SpecialChar ~
-n Set the encoding quality (0-10)
+n Set the encoding quality (0-10), default is 8
+\layout Description
+
+--bitrate\SpecialChar ~
+n Encoding bit-rate (use bit-rate n or lower) 
 \layout Description
 
 --vbr Enable VBR (Variable Bit-Rate), disabled by default
 \layout Description
 
+--abr\SpecialChar ~
+n Enable ABR (Average Bit-Rate) at n kbps, disabled by default
+\layout Description
+
+--vad Enable VAD (Voice Activity Detection), disabled by default
+\layout Description
+
+--dtx Enable DTX (Discontinuous Transmission), disabled by default
+\layout Description
+
 --nframes\SpecialChar ~
 n Pack n frames in each Ogg packet (this saves space at low bit-rates)
 \layout Description
@@ -2793,20 +3576,95 @@ n Set encoding speed/quality tradeoff.
 
 --version\SpecialChar ~
 (-v) Print version information
+\layout Subsubsection*
+
+Speex comments
+\layout Description
+
+--comment Add the given string as an extra comment.
+ This may be used multiple times.
+\layout Description
+
+--author Author of this track.
+\layout Description
+
+--title Title for this track.
+\layout Subsubsection*
+
+Raw input options
+\layout Description
+
+--rate\SpecialChar ~
+n Sampling rate for raw input
+\layout Description
+
+--stereo Consider raw input as stereo 
+\layout Description
+
+--le Raw input is little-endian 
+\layout Description
+
+--be Raw input is big-endian 
+\layout Description
+
+--8bit Raw input is 8-bit unsigned 
+\layout Description
+
+--16bit Raw input is 16-bit signed 
 \layout Subsection
 
 
 \emph on 
 speexdec
+\begin_inset LatexCommand \index{speexdec}
+
+\end_inset 
+
+
+\layout Standard
+
+The 
+\emph on 
+speexdec
+\emph default 
+ utility is used to decode Speex files and can be used by calling: 
+\layout LyX-Code
+
+speexdec [options] speex_file [output_file]
 \layout Standard
 
-The decoder takes the following options:
+The value '-' for input_file or output_file corresponds respectively to
+ stdin and stdout.
+ Also, when no output_file is specified, the file is played to the soundcard.
+ The valid options are:
+\layout Description
+
+--enh enable post-filter (default)
+\layout Description
+
+--no-enh disable post-filter
+\layout Description
+
+--force-nb Force decoding in narrowband 
+\layout Description
+
+--force-wb Force decoding in wideband 
+\layout Description
+
+--force-uwb Force decoding in ultra-wideband 
+\layout Description
+
+--mono Force decoding in mono 
 \layout Description
 
---enh enable post-filter
+--stereo Force decoding in stereo 
 \layout Description
 
---no-enh disable post-filter (default)
+--rate\SpecialChar ~
+n For decoding at n Hz sampling rate
 \layout Description
 
 --packet-loss\SpecialChar ~
@@ -2824,7 +3682,17 @@ n Simulate n % random packet loss
 (-v) Print version information
 \layout Section
 \pagebreak_top 
-Programming with Speex (the libspeex API)
+Programming with Speex (the libspeex
+\begin_inset LatexCommand \index{libspeex}
+
+\end_inset 
+
+ API
+\begin_inset LatexCommand \index{API}
+
+\end_inset 
+
+)
 \layout Subsection
 
 Encoding
@@ -2954,7 +3822,7 @@ In order to encode speech using Speex, you first need to:
 #include <speex.h>
 \layout Standard
 
-You then need to declare a Speex bit-packing struct
+You also need to declare a Speex bit-packing struct
 \layout LyX-Code
 
 SpeexBits bits;
@@ -2984,7 +3852,8 @@ speex_nb_mode
 speex_wb_mode
 \emph default 
 .
- You can get that value in the 
+ 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 
@@ -2999,11 +3868,15 @@ There is also a parameter that can be set for the decoder: whether or not
  This can be set by: 
 \layout LyX-Code
 
-speex_decoder_ctl(dec_state, SPEEX_SET_PF, &pf); 
+speex_decoder_ctl(dec_state, SPEEX_SET_ENH, &enh); 
 \layout Standard
 
-where pf is an int that with value 0 to have the post-filter disabled and
- 1 to have it enabled.
+where 
+\emph on 
+enh
+\emph default 
+ is an int that with value 0 to have the post-filter disabled and 1 to have
+ it enabled.
 \layout Standard
 
 Again, once the decoder initialization is done, for every input frame:
@@ -3077,7 +3950,12 @@ The different values of request allowed are (note that some only apply to
  the encoder or the decoder):
 \layout Description
 
-SPEEX_SET_ENH** Set perceptual enhancer to on (1) or off (0) (integer)
+SPEEX_SET_ENH** Set perceptual enhancer
+\begin_inset LatexCommand \index{perceptual enhancement}
+
+\end_inset 
+
+ to on (1) or off (0) (integer)
 \layout Description
 
 SPEEX_GET_ENH** Get perceptual enhancer status (integer)
@@ -3138,7 +4016,12 @@ SPEEX_GET_HIGH_MODE*
 SPEEX_SET_VBR* Set variable bit-rate (VBR) to on (1) or off (0) (integer)
 \layout Description
 
-SPEEX_GET_VBR* Get variable bit-rate (VBR) status (integer)
+SPEEX_GET_VBR* Get variable bit-rate
+\begin_inset LatexCommand \index{variable bit-rate}
+
+\end_inset 
+
+ (VBR) status (integer)
 \layout Description
 
 SPEEX_SET_VBR_QUALITY* Set the encoder VBR speech quality (integer 0 to
@@ -3149,15 +4032,64 @@ SPEEX_GET_VBR_QUALITY* Get the current encoder VBR speech quality (integer
  0 to 10)
 \layout Description
 
-SPEEX_SET_COMPLEXITY* Set the CPU resources allowed for the encoder
+SPEEX_SET_COMPLEXITY* Set the CPU resources allowed for the encoder (integer
+ 1 to 10)
+\layout Description
+
+SPEEX_GET_COMPLEXITY* Get the CPU resources allowed for the encoder (integer
+ 1 to 10)
 \layout Description
 
-SPEEX_GET_COMPLEXITY* Get the CPU resources allowed for the encoder
+SPEEX_SET_BITRATE* Set the bit-rate to use to the closest value not exceeding
+ the parameter (integer in bps)
 \layout Description
 
 SPEEX_GET_BITRATE Get the current bit-rate in use (integer in bps)
 \layout Description
 
+SPEEX_SET_SAMPLING_RATE Set real sampling rate (integer in Hz)
+\layout Description
+
+SPEEX_GET_SAMPLING_RATE Get real sampling rate (integer in Hz)
+\layout Description
+
+SPEEX_RESET_STATE Reset the encoder/decoder state to its original state
+ (zeros all memories)
+\layout Description
+
+SPEEX_SET_VAD* Set voice activity detection
+\begin_inset LatexCommand \index{voice activity detection}
+
+\end_inset 
+
+ (VAD) to on (1) or off (0) (integer)
+\layout Description
+
+SPEEX_GET_VAD* Get voice activity detection (VAD) status (integer)
+\layout Description
+
+SPEEX_SET_DTX* Set discontinuous transmission
+\begin_inset LatexCommand \index{discontinuous transmission}
+
+\end_inset 
+
+ (DTX) to on (1) or off (0) (integer)
+\layout Description
+
+SPEEX_GET_DTX* Get discontinuous transmission (DTX) status (integer)
+\layout Description
+
+SPEEX_SET_ABR* Set average bit-rate
+\begin_inset LatexCommand \index{average bit-rate}
+
+\end_inset 
+
+ (ABR) to a value n in bits per second (integer in bps)
+\layout Description
+
+SPEEX_GET_ABR* Get average bit-rate (ABR) setting (integer in bps)
+\layout Description
+
 * applies only to the encoder
 \layout Description
 
@@ -3200,10 +4132,16 @@ SPEEX_SUBMODE_BITRATE Get the bit-rate for a submode number specified throught
 \emph on 
 ptr
 \emph default 
-.
+ (integer in bps).
 \layout Subsection
 
 Packing and in-band signalling
+\begin_inset LatexCommand \index{in-band signalling}
+
+\end_inset 
+
+
 \layout Standard
 
 Sometimes it is desirable to pack more than one frame per packet (or other
@@ -3318,7 +4256,7 @@ Content
 
 \layout Standard
 
-Asks decoder to set perceptual enhancement on (1) or off(1)
+Asks decoder to set perceptual enhancement off (0) or on(1)
 \end_inset 
 </cell>
 </row>
@@ -3344,7 +4282,7 @@ Asks decoder to set perceptual enhancement on (1) or off(1)
 
 \layout Standard
 
-Asks encoder to set VBR on (1) or off(1)
+reserved
 \end_inset 
 </cell>
 </row>
@@ -3500,7 +4438,7 @@ Request acknowloedge (0=no, 1=all, 2=only for in-band data)
 
 \layout Standard
 
-reserved
+Asks encoder to set VBR off (0), on(1), VAD(2), DTX(3)
 \end_inset 
 </cell>
 </row>
@@ -3552,7 +4490,7 @@ Transmit (8-bit) character to the other end
 
 \layout Standard
 
-reserved
+Intensity stereo information
 \end_inset 
 </cell>
 </row>
@@ -3736,6 +4674,11 @@ Finally, applications may define custom in-band messages using mode 13.
 \layout Section
 \pagebreak_top 
 Formats and standards
+\begin_inset LatexCommand \index{standards}
+
+\end_inset 
+
+
 \layout Standard
 
 Speex can encode speech in both narrowband and wideband and provides different
@@ -3779,21 +4722,41 @@ For encoders, at least one narrowband or wideband mode MUST be supported.
  some modes.
 \layout Subsection
 
-RTP Payload Format
+RTP
+\begin_inset LatexCommand \index{RTP}
+
+\end_inset 
+
+ Payload Format 
 \layout Standard
 
-This is a work in progress.
-\layout Comment
+The latest RTP payload draft can be found at 
+\begin_inset LatexCommand \url{http://www.speex.org/drafts/latest}
+
+\end_inset 
 
-Since Speex encoded frames already contain mode information, they can be
- sent without any other information in an RTP packet.
- If more than one frame is transmitted, no byte padding is performed at
- the end of frames, except the last one.
- The number of frames contained in each packet MUST be transmitted out-of-band.
+.
+ We are (2003/01/14) about to send the latest draft to the IETF for comments.
  
 \layout Subsection
 
-Ogg file format
+MIME Type
+\layout Standard
+
+Speex will use the MIME type 
+\family typewriter 
+audio/speex
+\family default 
+.
+ We will apply for that type in the near future.
+\layout Subsection
+
+Ogg
+\begin_inset LatexCommand \index{Ogg}
+
+\end_inset 
+
+ file format
 \layout Standard
 
 Speex bit-streams can be stored in Ogg files.
@@ -3986,7 +4949,7 @@ char[]
 
 \layout Standard
 
-speex_header_version
+speex_version_id
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
@@ -4246,7 +5209,7 @@ int
 
 \layout Standard
 
-reserved1
+extra_headers
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
@@ -4272,7 +5235,7 @@ int
 
 \layout Standard
 
-reserved2
+reserved1
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
@@ -4298,7 +5261,7 @@ int
 
 \layout Standard
 
-reserved3
+reserved2
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
@@ -4352,7 +5315,17 @@ clearpage
 FAQ
 \layout Subsection*
 
-Vorbis is open-source and patent-free, why do we need Speex?
+Vorbis is open-source
+\begin_inset LatexCommand \index{open-source}
+
+\end_inset 
+
+ and patent-free
+\begin_inset LatexCommand \index{patent}
+
+\end_inset 
+
+, why do we need Speex?
 \layout Standard
 
 Vorbis is a great project but its goals are not the same as Speex.
@@ -4362,14 +5335,31 @@ Vorbis is a great project but its goals are not the same as Speex.
  typically 2-4 times higher compression at equal quality.
 \layout Subsection*
 
-Ogg, Speex, Vorbis, what's the difference?
+Under what license is Speex released?
+\layout Standard
+
+As of version 1.0 beta 1, Speex in released under Xiph's BSD-like license.
+ This license is the most permissive of the open-source licenses.
+\layout Subsection*
+
+Ogg
+\begin_inset LatexCommand \index{Ogg}
+
+\end_inset 
+
+, Speex, Vorbis
+\begin_inset LatexCommand \index{Vorbis}
+
+\end_inset 
+
+, what's the difference?
 \layout Standard
 
 Ogg is a 
 \begin_inset Quotes eld
 \end_inset 
 
-file format
+container format
 \begin_inset Quotes erd
 \end_inset 
 
@@ -4390,7 +5380,20 @@ Ogg Speex
  Actually, if what you do is Voice of IP (VoIP), you don't need Ogg at all.
 \layout Subsection*
 
-Can I use Speex for compressing music?
+What's the extension for Speex?
+\layout Standard
+
+Speex files have the .spx extension.
+ Note however that all the Speex tools (speexenc, speexdec) do not rely
+ on the extension at all so any extension will work.
+\layout Subsection*
+
+Can I use Speex for compressing music
+\begin_inset LatexCommand \index{music}
+
+\end_inset 
+
+?
 \layout Standard
 
 Just like Vorbis is not really adapted to speech, Speex is really not adapted
@@ -4413,8 +5416,8 @@ This is called transcoding and it will always result in much poorer quality
 Does Speex run on Windows?
 \layout Standard
 
-As of 0.8.0, Speex can now compile on Windows, though limited testing has
been done so far.
+As of 0.8.0, Speex can now compile on Windows.
There are also several front-ends available from the web site.
 \layout Subsection*
 
 Why is encoding so slow compared to decoding?
@@ -4481,12 +5484,18 @@ There are many possible causes for that.
  causing clipping when saving as 16-bit PCM.
 \layout Subsection*
 
-Can Speex pass DTMF?
+Can Speex pass DTMF
+\begin_inset LatexCommand \index{DTMF}
+
+\end_inset 
+
+?
 \layout Standard
 
 I guess it all depends on the bit-rate used.
  Though no formal testing has yet been performed, I'd say don't go below
  the 15 kbps mode if you want DTMF to be transmitted correctly.
+ DTMF at 8 kbps may work but your mileage may vary.
  Also, make sure you don't use the lowest complexity (see SPEEX_SET_COMPLEXITY
  or --comp option), as it causes important noise.
 \layout Subsection*
@@ -4501,7 +5510,7 @@ What is your (Jean-Marc) relationship with the University of Sherbrooke
  and how does Speex fit into that?
 \layout Standard
 
-I am currently (2002/08/13) doing a Ph.D.
+I am currently (2003/01/13) doing a Ph.D.
  at the University of Sherbrooke in mobile robotics.
  Although I did my master with the Sherbrooke speech coding group (in speech
  enhancement, not coding), I am not associated with them anymore.
@@ -4516,7 +5525,12 @@ not
  
 \layout Subsection*
 
-CELP, ACELP, what's the difference?
+CELP, ACELP
+\begin_inset LatexCommand \index{ACELP}
+
+\end_inset 
+
+, what's the difference?
 \layout Standard
 
 CELP stands for 
@@ -4972,4 +5986,12 @@ n.
  If the Document does not specify a version number of this License, you
  may choose any version ever published (not as a draft) by the Free Software
  Foundation.
+\layout Standard
+
+
+\begin_inset LatexCommand \printindex{}
+
+\end_inset 
+
+
 \the_end