X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=doc%2F06-floor0.tex;h=f3042a64444dc2c3a68499edcd6f79d77e3c2b41;hb=4c60a9730106d9b810ad2b3191b3504879b7d794;hp=425a0366a207bb70aaacb585e0384cbc21a039b1;hpb=0dc1835068339377117a2919b90af7a168a005f2;p=platform%2Fupstream%2Flibvorbis.git diff --git a/doc/06-floor0.tex b/doc/06-floor0.tex index 425a036..f3042a6 100644 --- a/doc/06-floor0.tex +++ b/doc/06-floor0.tex @@ -1,6 +1,5 @@ % -*- mode: latex; TeX-master: "Vorbis_I_spec"; -*- %!TEX root = Vorbis_I_spec.tex -% $Id$ \section{Floor type 0 setup and decode} \label{vorbis:spec:floor0} \subsection{Overview} @@ -28,18 +27,18 @@ codec setup header (third packet). configuration decode proceeds as follows: \begin{Verbatim}[commandchars=\\\{\}] - 1) [floor0_order] = read an unsigned integer of 8 bits - 2) [floor0_rate] = read an unsigned integer of 16 bits - 3) [floor0_bark_map_size] = read an unsigned integer of 16 bits - 4) [floor0_amplitude_bits] = read an unsigned integer of six bits - 5) [floor0_amplitude_offset] = read an unsigned integer of eight bits - 6) [floor0_number_of_books] = read an unsigned integer of four bits and add 1 - 7) array [floor0_book_list] = read a list of [floor0_number_of_books] unsigned integers of eight bits each; + 1) [floor0\_order] = read an unsigned integer of 8 bits + 2) [floor0\_rate] = read an unsigned integer of 16 bits + 3) [floor0\_bark\_map\_size] = read an unsigned integer of 16 bits + 4) [floor0\_amplitude\_bits] = read an unsigned integer of six bits + 5) [floor0\_amplitude\_offset] = read an unsigned integer of eight bits + 6) [floor0\_number\_of\_books] = read an unsigned integer of four bits and add 1 + 7) array [floor0\_book\_list] = read a list of [floor0\_number\_of\_books] unsigned integers of eight bits each; \end{Verbatim} An end-of-packet condition during any of these bitstream reads renders this stream undecodable. In addition, any element of the array -\varname{[floor0_book_list]} that is greater than the maximum codebook +\varname{[floor0\_book\_list]} that is greater than the maximum codebook number for this bitstream is an error condition that also renders the stream undecodable. @@ -48,24 +47,24 @@ stream undecodable. \subsubsection{packet decode} \label{vorbis:spec:floor0-decode} Extracting a floor0 curve from an audio packet consists of first -decoding the curve amplitude and \varname{[floor0_order]} LSP +decoding the curve amplitude and \varname{[floor0\_order]} LSP coefficient values from the bitstream, and then computing the floor curve, which is defined as the frequency response of the decoded LSP filter. Packet decode proceeds as follows: \begin{Verbatim}[commandchars=\\\{\}] - 1) [amplitude] = read an unsigned integer of [floor0_amplitude_bits] bits + 1) [amplitude] = read an unsigned integer of [floor0\_amplitude\_bits] bits 2) if ( [amplitude] is greater than zero ) \{ 3) [coefficients] is an empty, zero length vector - 4) [booknumber] = read an unsigned integer of \link{vorbis:spec:ilog}{ilog}( [floor0_number_of_books] ) bits + 4) [booknumber] = read an unsigned integer of \link{vorbis:spec:ilog}{ilog}( [floor0\_number\_of\_books] ) bits 5) if ( [booknumber] is greater than the highest number decode codebook ) then packet is undecodable 6) [last] = zero; - 7) vector [temp_vector] = read vector from bitstream using codebook number [floor0_book_list] element [booknumber] in VQ context. - 8) add the scalar value [last] to each scalar in vector [temp_vector] - 9) [last] = the value of the last scalar in vector [temp_vector] - 10) concatenate [temp_vector] onto the end of the [coefficients] vector - 11) if (length of vector [coefficients] is less than [floor0_order], continue at step 6 + 7) vector [temp\_vector] = read vector from bitstream using codebook number [floor0\_book\_list] element [booknumber] in VQ context. + 8) add the scalar value [last] to each scalar in vector [temp\_vector] + 9) [last] = the value of the last scalar in vector [temp\_vector] + 10) concatenate [temp\_vector] onto the end of the [coefficients] vector + 11) if (length of vector [coefficients] is less than [floor0\_order], continue at step 6 \} @@ -82,16 +81,16 @@ operation above, floor decode is to return 'unused' status as if the \varname{[amplitude]} value had read zero at the beginning of decode. \item The book number used for decode -can, in fact, be stored in the bitstream in \link{vorbis:spec:ilog}{ilog}( \varname{[floor0_number_of_books]} - +can, in fact, be stored in the bitstream in \link{vorbis:spec:ilog}{ilog}( \varname{[floor0\_number\_of\_books]} - 1 ) bits. Nevertheless, the above specification is correct and values greater than the maximum possible book value are reserved. \item The number of scalars read into the vector \varname{[coefficients]} -may be greater than \varname{[floor0_order]}, the number actually +may be greater than \varname{[floor0\_order]}, the number actually required for curve computation. For example, if the VQ codebook used for the floor currently being decoded has a -\varname{[codebook_dimensions]} value of three and -\varname{[floor0_order]} is ten, the only way to fill all the needed +\varname{[codebook\_dimensions]} value of three and +\varname{[floor0\_order]} is ten, the only way to fill all the needed scalars in \varname{[coefficients]} is to to read a total of twelve scalars as four vectors of three scalars each. This is not an error condition, and care must be taken not to allow a buffer overflow in @@ -104,9 +103,9 @@ decode. The extra values are not used and may be ignored or discarded. \subsubsection{curve computation} \label{vorbis:spec:floor0-synth} Given an \varname{[amplitude]} integer and \varname{[coefficients]} -vector from packet decode as well as the [floor0_order], -[floor0_rate], [floor0_bark_map_size], [floor0_amplitude_bits] and -[floor0_amplitude_offset] values from floor setup, and an output +vector from packet decode as well as the [floor0\_order], +[floor0\_rate], [floor0\_bark\_map\_size], [floor0\_amplitude\_bits] and +[floor0\_amplitude\_offset] values from floor setup, and an output vector size \varname{[n]} specified by the decode process, we compute a floor output vector. @@ -119,7 +118,7 @@ synthesized: \mathrm{map}_i = \left\{ \begin{array}{ll} \min ( - \mathtt{floor0\_bark\_map\_size} - 1, + \mathtt{floor0\texttt{\_}bark\texttt{\_}map\texttt{\_}size} - 1, foobar ) & \textrm{for } i \in [0,n-1] \\ -1 & \textrm{for } i = n @@ -132,14 +131,14 @@ synthesized: \begin{displaymath} foobar = \left\lfloor - \mathrm{bark}\left(\frac{\mathtt{floor0\_rate} \cdot i}{2n}\right) \cdot \frac{\mathtt{floor0\_bark\_map\_size}} {\mathrm{bark}(.5 \cdot \mathtt{floor0\_rate})} + \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})} \right\rfloor \end{displaymath} and \begin{displaymath} - \mathrm{bark}(x) = 13.1 \arctan (.00074x) + 2.24 \arctan (.0000000185x^2 + .0001x) + \mathrm{bark}(x) = 13.1 \arctan (.00074x) + 2.24 \arctan (.0000000185x^2) + .0001x \end{displaymath} The above is used to synthesize the LSP curve on a Bark-scale frequency @@ -149,58 +148,54 @@ Similarly, the below calculation synthesizes the output LSP curve \varname{[outp \begin{enumerate} \item \varname{[i]} = 0 - \item \varname{[$\omega$]} = $\pi$ * map element \varname{[i]} / \varname{[floor0_bark_map_size]} - \item if ( \varname{[floor0_order]} is odd ) { + \item \varname{[$\omega$]} = $\pi$ * map element \varname{[i]} / \varname{[floor0\_bark\_map\_size]} + \item if ( \varname{[floor0\_order]} is odd ) { \begin{enumerate} \item calculate \varname{[p]} and \varname{[q]} according to: -\TODO{the following is generated from the TeX code embedded into the DocBook files:} - \begin{eqnarray*} - p & = & (1 - \cos^2\omega)\prod_{j=0}^{(\mathtt{order}-3)/2} 4 (\cos c_{2j+1} - \cos \omega)^2 \\ - q & = & \frac{1}{4} \prod_{j=0}^{(\mathtt{order}-1)/2} 4 (\cos c_{2j+1} - \cos \omega)^2 - \end{eqnarray*} - -\TODO{the following is what oddlsp.png contains:} \begin{eqnarray*} - p & = & (1 - \cos^2\omega)\prod_{j=0}^{\frac{\mathtt{floor0\_order}-3}{2}} 4 (\cos([\mathtt{coefficients}]_{2j+1}) - \cos \omega)^2 \\ - q & = & \frac{1}{4} \prod_{j=0}^{\frac{\mathtt{floor0\_order}-1}{2}} 4 (\cos([\mathtt{coefficients}]_{2j}) - \cos \omega)^2 + p & = & (1 - \cos^2\omega)\prod_{j=0}^{\frac{\mathtt{floor0\texttt{\_}order}-3}{2}} 4 (\cos([\mathtt{coefficients}]_{2j+1}) - \cos \omega)^2 \\ + q & = & \frac{1}{4} \prod_{j=0}^{\frac{\mathtt{floor0\texttt{\_}order}-1}{2}} 4 (\cos([\mathtt{coefficients}]_{2j}) - \cos \omega)^2 \end{eqnarray*} \end{enumerate} - } else \varname{[floor0_order]} is even { - \begin{enumerate} + } else \varname{[floor0\_order]} is even { + \begin{enumerate}[resume] \item calculate \varname{[p]} and \varname{[q]} according to: -\TODO{the following is generated from the TeX code embedded into the DocBook files:} - \begin{eqnarray*} - p & = & \frac{(1 - \cos^2\omega)}{2} \prod_{j=0}^{(\mathtt{order}-2)/2} 4 (\cos c_{2j} - \cos \omega)^2 \\ - q & = & \frac{(1 + \cos^2\omega)}{2} \prod_{j=0}^{(\mathtt{order}-2)/2} 4 (\cos c_{2j} - \cos \omega)^2 - \end{eqnarray*} - -\TODO{the following is what oddlsp.png contains:} \begin{eqnarray*} - p & = & \frac{(1 - \cos^2\omega)}{2} \prod_{j=0}^{\frac{\mathtt{floor0\_order}-2}{2}} 4 (\cos([\mathtt{coefficients}]_{2j+1}) - \cos \omega)^2 \\ - q & = & \frac{(1 + \cos^2\omega)}{2} \prod_{j=0}^{\frac{\mathtt{floor0\_order}-2}{2}} 4 (\cos([\mathtt{coefficients}]_{2j}) - \cos \omega)^2 + 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 \\ + q & = & \frac{(1 + \cos\omega)}{2} \prod_{j=0}^{\frac{\mathtt{floor0\texttt{\_}order}-2}{2}} 4 (\cos([\mathtt{coefficients}]_{2j}) - \cos \omega)^2 \end{eqnarray*} \end{enumerate} } - \item calculate \varname{[linear_floor_value]} according to: + \item calculate \varname{[linear\_floor\_value]} according to: \begin{displaymath} - \exp \left( .11512925 \left(\frac{\mathtt{amplitude} \cdot \mathtt{floor0\_amplitute\_offset}}{(2^{\mathtt{floor0\_amplitude\_bits}}-1)\sqrt{p+q}} - - \mathtt{floor0\_amplitude\_offset} \right) \right) + \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}} + - \mathtt{floor0\texttt{\_}amplitude\texttt{\_}offset} \right) \right) \end{displaymath} - \item \varname{[iteration_condition]} = map element \varname{[i]} - \item \varname{[output]} element \varname{[i]} = \varname{[linear_floor_value]} + \item \varname{[iteration\_condition]} = map element \varname{[i]} + \item \varname{[output]} element \varname{[i]} = \varname{[linear\_floor\_value]} \item increment \varname{[i]} - \item if ( map element \varname{[i]} is equal to \varname{[iteration_condition]} ) continue at step 5 + \item if ( map element \varname{[i]} is equal to \varname{[iteration\_condition]} ) continue at step 5 \item if ( \varname{[i]} is less than \varname{[n]} ) continue at step 2 \item done \end{enumerate} +\paragraph{Errata 20150227: Bark scale computation} +Due to a typo when typesetting this version of the specification from the original HTML document, the Bark scale computation previously erroneously read: + \begin{displaymath} + \hbox{\sout{$ + \mathrm{bark}(x) = 13.1 \arctan (.00074x) + 2.24 \arctan (.0000000185x^2 + .0001x) + $}} + \end{displaymath} +Note that the last parenthesis is misplaced. This document now uses the correct equation as it appeared in the original HTML spec document: - + \begin{displaymath} + \mathrm{bark}(x) = 13.1 \arctan (.00074x) + 2.24 \arctan (.0000000185x^2) + .0001x + \end{displaymath}