VirtualBox

source: vbox/trunk/src/libs/libvorbis-1.3.7/doc/06-floor0.tex@ 107044

Last change on this file since 107044 was 96468, checked in by vboxsync, 2 years ago

libs/libvorbis-1.3.7: Re-exporting, hopefully this time everything is there. bugref:10275

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 8.9 KB
Line 
1% -*- mode: latex; TeX-master: "Vorbis_I_spec"; -*-
2%!TEX root = Vorbis_I_spec.tex
3\section{Floor type 0 setup and decode} \label{vorbis:spec:floor0}
4
5\subsection{Overview}
6
7Vorbis floor type zero uses Line Spectral Pair (LSP, also alternately
8known as Line Spectral Frequency or LSF) representation to encode a
9smooth spectral envelope curve as the frequency response of the LSP
10filter. This representation is equivalent to a traditional all-pole
11infinite impulse response filter as would be used in linear predictive
12coding; LSP representation may be converted to LPC representation and
13vice-versa.
14
15
16
17\subsection{Floor 0 format}
18
19Floor zero configuration consists of six integer fields and a list of
20VQ codebooks for use in coding/decoding the LSP filter coefficient
21values used by each frame.
22
23\subsubsection{header decode}
24
25Configuration information for instances of floor zero decodes from the
26codec setup header (third packet). configuration decode proceeds as
27follows:
28
29\begin{Verbatim}[commandchars=\\\{\}]
30 1) [floor0\_order] = read an unsigned integer of 8 bits
31 2) [floor0\_rate] = read an unsigned integer of 16 bits
32 3) [floor0\_bark\_map\_size] = read an unsigned integer of 16 bits
33 4) [floor0\_amplitude\_bits] = read an unsigned integer of six bits
34 5) [floor0\_amplitude\_offset] = read an unsigned integer of eight bits
35 6) [floor0\_number\_of\_books] = read an unsigned integer of four bits and add 1
36 7) array [floor0\_book\_list] = read a list of [floor0\_number\_of\_books] unsigned integers of eight bits each;
37\end{Verbatim}
38
39An end-of-packet condition during any of these bitstream reads renders
40this stream undecodable. In addition, any element of the array
41\varname{[floor0\_book\_list]} that is greater than the maximum codebook
42number for this bitstream is an error condition that also renders the
43stream undecodable.
44
45
46
47\subsubsection{packet decode} \label{vorbis:spec:floor0-decode}
48
49Extracting a floor0 curve from an audio packet consists of first
50decoding the curve amplitude and \varname{[floor0\_order]} LSP
51coefficient values from the bitstream, and then computing the floor
52curve, which is defined as the frequency response of the decoded LSP
53filter.
54
55Packet decode proceeds as follows:
56\begin{Verbatim}[commandchars=\\\{\}]
57 1) [amplitude] = read an unsigned integer of [floor0\_amplitude\_bits] bits
58 2) if ( [amplitude] is greater than zero ) \{
59 3) [coefficients] is an empty, zero length vector
60 4) [booknumber] = read an unsigned integer of \link{vorbis:spec:ilog}{ilog}( [floor0\_number\_of\_books] ) bits
61 5) if ( [booknumber] is greater than the highest number decode codebook ) then packet is undecodable
62 6) [last] = zero;
63 7) vector [temp\_vector] = read vector from bitstream using codebook number [floor0\_book\_list] element [booknumber] in VQ context.
64 8) add the scalar value [last] to each scalar in vector [temp\_vector]
65 9) [last] = the value of the last scalar in vector [temp\_vector]
66 10) concatenate [temp\_vector] onto the end of the [coefficients] vector
67 11) if (length of vector [coefficients] is less than [floor0\_order], continue at step 6
68
69 \}
70
71 12) done.
72
73\end{Verbatim}
74
75Take note of the following properties of decode:
76\begin{itemize}
77 \item An \varname{[amplitude]} value of zero must result in a return code that indicates this channel is unused in this frame (the output of the channel will be all-zeroes in synthesis). Several later stages of decode don't occur for an unused channel.
78 \item An end-of-packet condition during decode should be considered a
79nominal occruence; if end-of-packet is reached during any read
80operation above, floor decode is to return 'unused' status as if the
81\varname{[amplitude]} value had read zero at the beginning of decode.
82
83 \item The book number used for decode
84can, in fact, be stored in the bitstream in \link{vorbis:spec:ilog}{ilog}( \varname{[floor0\_number\_of\_books]} -
851 ) bits. Nevertheless, the above specification is correct and values
86greater than the maximum possible book value are reserved.
87
88 \item The number of scalars read into the vector \varname{[coefficients]}
89may be greater than \varname{[floor0\_order]}, the number actually
90required for curve computation. For example, if the VQ codebook used
91for the floor currently being decoded has a
92\varname{[codebook\_dimensions]} value of three and
93\varname{[floor0\_order]} is ten, the only way to fill all the needed
94scalars in \varname{[coefficients]} is to to read a total of twelve
95scalars as four vectors of three scalars each. This is not an error
96condition, and care must be taken not to allow a buffer overflow in
97decode. The extra values are not used and may be ignored or discarded.
98\end{itemize}
99
100
101
102
103\subsubsection{curve computation} \label{vorbis:spec:floor0-synth}
104
105Given an \varname{[amplitude]} integer and \varname{[coefficients]}
106vector from packet decode as well as the [floor0\_order],
107[floor0\_rate], [floor0\_bark\_map\_size], [floor0\_amplitude\_bits] and
108[floor0\_amplitude\_offset] values from floor setup, and an output
109vector size \varname{[n]} specified by the decode process, we compute a
110floor output vector.
111
112If the value \varname{[amplitude]} is zero, the return value is a
113length \varname{[n]} vector with all-zero scalars. Otherwise, begin by
114assuming the following definitions for the given vector to be
115synthesized:
116
117 \begin{displaymath}
118 \mathrm{map}_i = \left\{
119 \begin{array}{ll}
120 \min (
121 \mathtt{floor0\texttt{\_}bark\texttt{\_}map\texttt{\_}size} - 1,
122 foobar
123 ) & \textrm{for } i \in [0,n-1] \\
124 -1 & \textrm{for } i = n
125 \end{array}
126 \right.
127 \end{displaymath}
128
129 where
130
131 \begin{displaymath}
132 foobar =
133 \left\lfloor
134 \mathrm{bark}\left(\frac{\mathtt{floor0\texttt{\_}rate} \cdot i}{2n}\right) \cdot \frac{\mathtt{floor0\texttt{\_}bark\texttt{\_}map\texttt{\_}size}} {\mathrm{bark}(.5 \cdot \mathtt{floor0\texttt{\_}rate})}
135 \right\rfloor
136 \end{displaymath}
137
138 and
139
140 \begin{displaymath}
141 \mathrm{bark}(x) = 13.1 \arctan (.00074x) + 2.24 \arctan (.0000000185x^2) + .0001x
142 \end{displaymath}
143
144The above is used to synthesize the LSP curve on a Bark-scale frequency
145axis, then map the result to a linear-scale frequency axis.
146Similarly, the below calculation synthesizes the output LSP curve \varname{[output]} on a log
147(dB) amplitude scale, mapping it to linear amplitude in the last step:
148
149\begin{enumerate}
150 \item \varname{[i]} = 0
151 \item \varname{[$\omega$]} = $\pi$ * map element \varname{[i]} / \varname{[floor0\_bark\_map\_size]}
152 \item if ( \varname{[floor0\_order]} is odd ) {
153 \begin{enumerate}
154 \item calculate \varname{[p]} and \varname{[q]} according to:
155 \begin{eqnarray*}
156 p & = & (1 - \cos^2\omega)\prod_{j=0}^{\frac{\mathtt{floor0\texttt{\_}order}-3}{2}} 4 (\cos([\mathtt{coefficients}]_{2j+1}) - \cos \omega)^2 \\
157 q & = & \frac{1}{4} \prod_{j=0}^{\frac{\mathtt{floor0\texttt{\_}order}-1}{2}} 4 (\cos([\mathtt{coefficients}]_{2j}) - \cos \omega)^2
158 \end{eqnarray*}
159
160 \end{enumerate}
161 } else \varname{[floor0\_order]} is even {
162 \begin{enumerate}[resume]
163 \item calculate \varname{[p]} and \varname{[q]} according to:
164 \begin{eqnarray*}
165 p & = & \frac{(1 - \cos\omega)}{2} \prod_{j=0}^{\frac{\mathtt{floor0\texttt{\_}order}-2}{2}} 4 (\cos([\mathtt{coefficients}]_{2j+1}) - \cos \omega)^2 \\
166 q & = & \frac{(1 + \cos\omega)}{2} \prod_{j=0}^{\frac{\mathtt{floor0\texttt{\_}order}-2}{2}} 4 (\cos([\mathtt{coefficients}]_{2j}) - \cos \omega)^2
167 \end{eqnarray*}
168
169 \end{enumerate}
170 }
171
172 \item calculate \varname{[linear\_floor\_value]} according to:
173 \begin{displaymath}
174 \exp \left( .11512925 \left(\frac{\mathtt{amplitude} \cdot \mathtt{floor0\texttt{\_}amplitute\texttt{\_}offset}}{(2^{\mathtt{floor0\texttt{\_}amplitude\texttt{\_}bits}}-1)\sqrt{p+q}}
175 - \mathtt{floor0\texttt{\_}amplitude\texttt{\_}offset} \right) \right)
176 \end{displaymath}
177
178 \item \varname{[iteration\_condition]} = map element \varname{[i]}
179 \item \varname{[output]} element \varname{[i]} = \varname{[linear\_floor\_value]}
180 \item increment \varname{[i]}
181 \item if ( map element \varname{[i]} is equal to \varname{[iteration\_condition]} ) continue at step 5
182 \item if ( \varname{[i]} is less than \varname{[n]} ) continue at step 2
183 \item done
184\end{enumerate}
185
186\paragraph{Errata 20150227: Bark scale computation}
187
188Due to a typo when typesetting this version of the specification from the original HTML document, the Bark scale computation previously erroneously read:
189
190 \begin{displaymath}
191 \hbox{\sout{$
192 \mathrm{bark}(x) = 13.1 \arctan (.00074x) + 2.24 \arctan (.0000000185x^2 + .0001x)
193 $}}
194 \end{displaymath}
195
196Note that the last parenthesis is misplaced. This document now uses the correct equation as it appeared in the original HTML spec document:
197
198 \begin{displaymath}
199 \mathrm{bark}(x) = 13.1 \arctan (.00074x) + 2.24 \arctan (.0000000185x^2) + .0001x
200 \end{displaymath}
201
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette