\doxysection{AMBE vocoder -\/ internal API}
\label{group__codec__private}\index{AMBE vocoder -\/ internal API@{AMBE vocoder -\/ internal API}}
\doxysubsection*{Files}
\begin{DoxyCompactItemize}
\item 
file \textbf{ ambe.\+c}
\begin{DoxyCompactList}\small\item\em Osmocom GMR-\/1 AMBE internal API. \end{DoxyCompactList}\item 
file \textbf{ frame.\+c}
\begin{DoxyCompactList}\small\item\em Osmocom GMR-\/1 AMBE speech parameters to/from frame. \end{DoxyCompactList}\item 
file \textbf{ math.\+c}
\begin{DoxyCompactList}\small\item\em Osmocom GMR-\/1 AMBE vocoder math functions. \end{DoxyCompactList}\item 
file \textbf{ private.\+h}
\begin{DoxyCompactList}\small\item\em Osmocom GMR-\/1 AMBE vocoder private header. \end{DoxyCompactList}\item 
file \textbf{ synth.\+c}
\begin{DoxyCompactList}\small\item\em Osmocom GMR-\/1 AMBE vocoder speech synthesis. \end{DoxyCompactList}\item 
file \textbf{ tables.\+c}
\begin{DoxyCompactList}\small\item\em Osmocom GMR-\/1 AMBE vocoder tables. \end{DoxyCompactList}\item 
file \textbf{ tone.\+c}
\begin{DoxyCompactList}\small\item\em Osmocom GMR-\/1 AMBE vocoder tone frames handling. \end{DoxyCompactList}\end{DoxyCompactItemize}
\doxysubsection*{Data Structures}
\begin{DoxyCompactItemize}
\item 
struct \textbf{ ambe\+\_\+raw\+\_\+params}
\begin{DoxyCompactList}\small\item\em AMBE encoded frame raw parameters. \end{DoxyCompactList}\item 
struct \textbf{ ambe\+\_\+subframe}
\begin{DoxyCompactList}\small\item\em AMBE subframe parameters. \end{DoxyCompactList}\item 
struct \textbf{ ambe\+\_\+synth}
\begin{DoxyCompactList}\small\item\em AMBE synthesizer state. \end{DoxyCompactList}\item 
struct \textbf{ ambe\+\_\+decoder}
\begin{DoxyCompactList}\small\item\em AMBE decoder state. \end{DoxyCompactList}\item 
struct \textbf{ tone\+\_\+desc}
\begin{DoxyCompactList}\small\item\em Structure describing a dual-\/frequency tone. \end{DoxyCompactList}\end{DoxyCompactItemize}
\doxysubsection*{Macros}
\begin{DoxyCompactItemize}
\item 
\mbox{\label{group__codec__private_gac1723f2fb63e31519d15815b05cc2a67}} 
\#define {\bfseries AMBE\+\_\+\+RATE}~8000
\begin{DoxyCompactList}\small\item\em AMBE sample rate (Hz) \end{DoxyCompactList}\item 
\mbox{\label{group__codec__private_gacbb42dc053fedc161079f0a4d20a64e8}} 
\#define {\bfseries M\+\_\+\+PIf}~(3.\+141592653589793f)
\begin{DoxyCompactList}\small\item\em Value of pi as a float. \end{DoxyCompactList}\end{DoxyCompactItemize}
\doxysubsection*{Enumerations}
\begin{DoxyCompactItemize}
\item 
enum \textbf{ ambe\+\_\+frame\+\_\+type} \{ \textbf{ AMBE\+\_\+\+SPEECH}
, \textbf{ AMBE\+\_\+\+SILENCE}
, \textbf{ AMBE\+\_\+\+TONE}
 \}
\begin{DoxyCompactList}\small\item\em AMBE possible frame types. \end{DoxyCompactList}\end{DoxyCompactItemize}
\doxysubsection*{Functions}
\begin{DoxyCompactItemize}
\item 
void \textbf{ ambe\+\_\+decode\+\_\+init} (struct \textbf{ ambe\+\_\+decoder} $\ast$dec)
\begin{DoxyCompactList}\small\item\em Initializes decoder state. \end{DoxyCompactList}\item 
void \textbf{ ambe\+\_\+decode\+\_\+fini} (struct \textbf{ ambe\+\_\+decoder} $\ast$dec)
\begin{DoxyCompactList}\small\item\em Release all resources associated with a decoder. \end{DoxyCompactList}\item 
int \textbf{ ambe\+\_\+decode\+\_\+frame} (struct \textbf{ ambe\+\_\+decoder} $\ast$dec, int16\+\_\+t $\ast$audio, int N, const uint8\+\_\+t $\ast$frame, int bad)
\begin{DoxyCompactList}\small\item\em Decodes an AMBE frame to audio. \end{DoxyCompactList}\item 
int \textbf{ ambe\+\_\+decode\+\_\+dtx} (struct \textbf{ ambe\+\_\+decoder} $\ast$dec, int16\+\_\+t $\ast$audio, int N)
\begin{DoxyCompactList}\small\item\em Generates audio for DTX period. \end{DoxyCompactList}\item 
void \textbf{ ambe\+\_\+frame\+\_\+unpack\+\_\+raw} (struct \textbf{ ambe\+\_\+raw\+\_\+params} $\ast$rp, const uint8\+\_\+t $\ast$frame)
\begin{DoxyCompactList}\small\item\em Unpack a frame into its raw encoded parameters. \end{DoxyCompactList}\item 
void \textbf{ ambe\+\_\+frame\+\_\+decode\+\_\+params} (struct \textbf{ ambe\+\_\+subframe} $\ast$sf, struct \textbf{ ambe\+\_\+subframe} $\ast$sf\+\_\+prev, struct \textbf{ ambe\+\_\+raw\+\_\+params} $\ast$rp)
\begin{DoxyCompactList}\small\item\em Decodes the speech parameters for both subframes from raw params. \end{DoxyCompactList}\item 
void \textbf{ ambe\+\_\+subframe\+\_\+expand} (struct \textbf{ ambe\+\_\+subframe} $\ast$sf)
\begin{DoxyCompactList}\small\item\em Expands the decoded subframe params to prepare for synthesis. \end{DoxyCompactList}\item 
float \textbf{ cosf\+\_\+fast} (float angle)
\begin{DoxyCompactList}\small\item\em Fast Cosinus approximation using a simple table. \end{DoxyCompactList}\item 
float \textbf{ sinf\+\_\+fast} (float angle)
\begin{DoxyCompactList}\small\item\em Fast Sinus approximation using a simple table. \end{DoxyCompactList}\item 
void \textbf{ ambe\+\_\+fdct} (float $\ast$out, float $\ast$in, int N, int M)
\begin{DoxyCompactList}\small\item\em Forward Discrete Cosine Transform (f\+DCT) \end{DoxyCompactList}\item 
void \textbf{ ambe\+\_\+idct} (float $\ast$out, float $\ast$in, int N, int M)
\begin{DoxyCompactList}\small\item\em Inverse Discrete Cosine Transform (i\+DCT) \end{DoxyCompactList}\item 
void \textbf{ ambe\+\_\+fdft\+\_\+fc} (float $\ast$out\+\_\+i, float $\ast$out\+\_\+q, float $\ast$in, int N, int M)
\begin{DoxyCompactList}\small\item\em Forward Discrete Fourrier Transform (float-\/$>$complex) \end{DoxyCompactList}\item 
void \textbf{ ambe\+\_\+idft\+\_\+cf} (float $\ast$out, float $\ast$in\+\_\+i, float $\ast$in\+\_\+q, int N, int M)
\begin{DoxyCompactList}\small\item\em Inverse Discret Fourrier Transform (complex-\/$>$float) \end{DoxyCompactList}\item 
void \textbf{ ambe\+\_\+synth\+\_\+init} (struct \textbf{ ambe\+\_\+synth} $\ast$synth)
\begin{DoxyCompactList}\small\item\em Initialized Synthesizer state. \end{DoxyCompactList}\item 
void \textbf{ ambe\+\_\+synth\+\_\+enhance} (struct \textbf{ ambe\+\_\+synth} $\ast$synth, struct \textbf{ ambe\+\_\+subframe} $\ast$sf)
\begin{DoxyCompactList}\small\item\em Apply the spectral magnitude enhancement on the subframe. \end{DoxyCompactList}\item 
void \textbf{ ambe\+\_\+synth\+\_\+audio} (struct \textbf{ ambe\+\_\+synth} $\ast$synth, int16\+\_\+t $\ast$audio, struct \textbf{ ambe\+\_\+subframe} $\ast$sf, struct \textbf{ ambe\+\_\+subframe} $\ast$sf\+\_\+prev)
\begin{DoxyCompactList}\small\item\em Generate audio for a given subframe. \end{DoxyCompactList}\item 
int \textbf{ ambe\+\_\+decode\+\_\+tone} (struct \textbf{ ambe\+\_\+decoder} $\ast$dec, int16\+\_\+t $\ast$audio, int N, const uint8\+\_\+t $\ast$frame)
\begin{DoxyCompactList}\small\item\em Decodes an AMBE tone frame. \end{DoxyCompactList}\end{DoxyCompactItemize}
\doxysubsection*{Variables}
\begin{DoxyCompactItemize}
\item 
\mbox{\label{group__codec__private_gafaaf0c3cc5a7cd0f44133e1f5922a52d}} 
const uint8\+\_\+t {\bfseries ambe\+\_\+hpg\+\_\+tbl} [48][4]
\begin{DoxyCompactList}\small\item\em Number of harmonics per group for a given L (starts at L=9) \end{DoxyCompactList}\item 
\mbox{\label{group__codec__private_ga8782e94d4fc86ce45ea714a7316eecd4}} 
const float {\bfseries ambe\+\_\+gain\+\_\+tbl} [256][2]
\begin{DoxyCompactList}\small\item\em Gain (subframe 0, subframe 1) \end{DoxyCompactList}\item 
\mbox{\label{group__codec__private_ga735cc90f20631506f7a5fc4827f4e8d5}} 
const uint16\+\_\+t {\bfseries ambe\+\_\+v\+\_\+uv\+\_\+tbl} [64]
\begin{DoxyCompactList}\small\item\em V/\+UV decisions (subframe 0 = low byte. MSBs = low freq) \end{DoxyCompactList}\item 
\mbox{\label{group__codec__private_gae5a94c3201e655989c87379268c30623}} 
const float {\bfseries ambe\+\_\+prba12\+\_\+tbl} [128][2]
\begin{DoxyCompactList}\small\item\em PRBA[1\+:2]. \end{DoxyCompactList}\item 
\mbox{\label{group__codec__private_gaadea447d12d8536738479b549eb42fdf}} 
const float {\bfseries ambe\+\_\+prba34\+\_\+tbl} [64][2]
\begin{DoxyCompactList}\small\item\em PRBA[3\+:4]. \end{DoxyCompactList}\item 
\mbox{\label{group__codec__private_ga35df9825da65a2015f7576c83c9843f4}} 
const float {\bfseries ambe\+\_\+prba57\+\_\+tbl} [128][3]
\begin{DoxyCompactList}\small\item\em PRBA[5\+:7]. \end{DoxyCompactList}\item 
\mbox{\label{group__codec__private_gac6bf71952dbf30ef32fb5cc91681d8d6}} 
const float {\bfseries ambe\+\_\+hoc0\+\_\+tbl} [128][4]
\begin{DoxyCompactList}\small\item\em HOC for 1st frequency block. \end{DoxyCompactList}\item 
\mbox{\label{group__codec__private_ga934c67cf74ce3f2944594eab3958139c}} 
const float {\bfseries ambe\+\_\+hoc1\+\_\+tbl} [64][4]
\begin{DoxyCompactList}\small\item\em HOC for 2nd frequency block. \end{DoxyCompactList}\item 
\mbox{\label{group__codec__private_ga8992a95357c191374ac100f76f8b42fe}} 
const float {\bfseries ambe\+\_\+hoc2\+\_\+tbl} [64][4]
\begin{DoxyCompactList}\small\item\em HOC for 3rd frequency block. \end{DoxyCompactList}\item 
\mbox{\label{group__codec__private_ga616fdb311356f3430ade8e24d45479b4}} 
const float {\bfseries ambe\+\_\+hoc3\+\_\+tbl} [64][4]
\begin{DoxyCompactList}\small\item\em HOC for last frequency block. \end{DoxyCompactList}\item 
\mbox{\label{group__codec__private_gab7a7b1219368c43c898cfb24ff3cb5cd}} 
const float {\bfseries ambe\+\_\+sf0\+\_\+interp\+\_\+tbl} [4]
\begin{DoxyCompactList}\small\item\em Interpolation ratios for subframe 0 magnitude prediction. \end{DoxyCompactList}\item 
\mbox{\label{group__codec__private_ga42a2421d73b8b9021b2b88698057b53b}} 
const float {\bfseries ambe\+\_\+sf0\+\_\+perr14\+\_\+tbl} [64][4]
\begin{DoxyCompactList}\small\item\em Prediction Error [1\+:4] for subframe 0. \end{DoxyCompactList}\item 
\mbox{\label{group__codec__private_ga109dca33b432f87d6d6a14a4a0787e06}} 
const float {\bfseries ambe\+\_\+sf0\+\_\+perr58\+\_\+tbl} [32][4]
\begin{DoxyCompactList}\small\item\em Prediction Error [5\+:8] for subframe 0. \end{DoxyCompactList}\item 
\mbox{\label{group__codec__private_gafaaf0c3cc5a7cd0f44133e1f5922a52d}} 
const uint8\+\_\+t {\bfseries ambe\+\_\+hpg\+\_\+tbl} [48][4]
\begin{DoxyCompactList}\small\item\em Number of harmonics per group for a given L (starts at L=9) \end{DoxyCompactList}\item 
\mbox{\label{group__codec__private_ga8782e94d4fc86ce45ea714a7316eecd4}} 
const float {\bfseries ambe\+\_\+gain\+\_\+tbl} [256][2]
\begin{DoxyCompactList}\small\item\em Gain (subframe 0, subframe 1) \end{DoxyCompactList}\item 
const uint16\+\_\+t \textbf{ ambe\+\_\+v\+\_\+uv\+\_\+tbl} [64]
\begin{DoxyCompactList}\small\item\em V/\+UV decisions (subframe 0 = low byte. MSBs = low freq) \end{DoxyCompactList}\item 
\mbox{\label{group__codec__private_gae5a94c3201e655989c87379268c30623}} 
const float {\bfseries ambe\+\_\+prba12\+\_\+tbl} [128][2]
\begin{DoxyCompactList}\small\item\em PRBA[1\+:2]. \end{DoxyCompactList}\item 
\mbox{\label{group__codec__private_gaadea447d12d8536738479b549eb42fdf}} 
const float {\bfseries ambe\+\_\+prba34\+\_\+tbl} [64][2]
\begin{DoxyCompactList}\small\item\em PRBA[3\+:4]. \end{DoxyCompactList}\item 
\mbox{\label{group__codec__private_ga35df9825da65a2015f7576c83c9843f4}} 
const float {\bfseries ambe\+\_\+prba57\+\_\+tbl} [128][3]
\begin{DoxyCompactList}\small\item\em PRBA[5\+:7]. \end{DoxyCompactList}\item 
\mbox{\label{group__codec__private_gac6bf71952dbf30ef32fb5cc91681d8d6}} 
const float {\bfseries ambe\+\_\+hoc0\+\_\+tbl} [128][4]
\begin{DoxyCompactList}\small\item\em HOC for 1st frequency block. \end{DoxyCompactList}\item 
\mbox{\label{group__codec__private_ga934c67cf74ce3f2944594eab3958139c}} 
const float {\bfseries ambe\+\_\+hoc1\+\_\+tbl} [64][4]
\begin{DoxyCompactList}\small\item\em HOC for 2nd frequency block. \end{DoxyCompactList}\item 
\mbox{\label{group__codec__private_ga8992a95357c191374ac100f76f8b42fe}} 
const float {\bfseries ambe\+\_\+hoc2\+\_\+tbl} [64][4]
\begin{DoxyCompactList}\small\item\em HOC for 3rd frequency block. \end{DoxyCompactList}\item 
\mbox{\label{group__codec__private_ga616fdb311356f3430ade8e24d45479b4}} 
const float {\bfseries ambe\+\_\+hoc3\+\_\+tbl} [64][4]
\begin{DoxyCompactList}\small\item\em HOC for last frequency block. \end{DoxyCompactList}\item 
const float \textbf{ ambe\+\_\+sf0\+\_\+interp\+\_\+tbl} [4]
\begin{DoxyCompactList}\small\item\em Interpolation ratios for subframe 0 magnitude prediction. \end{DoxyCompactList}\item 
\mbox{\label{group__codec__private_ga42a2421d73b8b9021b2b88698057b53b}} 
const float {\bfseries ambe\+\_\+sf0\+\_\+perr14\+\_\+tbl} [64][4]
\begin{DoxyCompactList}\small\item\em Prediction Error [1\+:4] for subframe 0. \end{DoxyCompactList}\item 
\mbox{\label{group__codec__private_ga109dca33b432f87d6d6a14a4a0787e06}} 
const float {\bfseries ambe\+\_\+sf0\+\_\+perr58\+\_\+tbl} [32][4]
\begin{DoxyCompactList}\small\item\em Prediction Error [5\+:8] for subframe 0. \end{DoxyCompactList}\end{DoxyCompactItemize}


\doxysubsection{Detailed Description}


\doxysubsection{Enumeration Type Documentation}
\mbox{\label{group__codec__private_ga109f07fd3782470868b1d1d2ec099eb6}} 
\index{AMBE vocoder -\/ internal API@{AMBE vocoder -\/ internal API}!ambe\_frame\_type@{ambe\_frame\_type}}
\index{ambe\_frame\_type@{ambe\_frame\_type}!AMBE vocoder -\/ internal API@{AMBE vocoder -\/ internal API}}
\doxysubsubsection{ambe\_frame\_type}
{\footnotesize\ttfamily enum \textbf{ ambe\+\_\+frame\+\_\+type}}



AMBE possible frame types. 

\begin{DoxyEnumFields}{Enumerator}
\raisebox{\heightof{T}}[0pt][0pt]{\index{AMBE\_SPEECH@{AMBE\_SPEECH}!AMBE vocoder -\/ internal API@{AMBE vocoder -\/ internal API}}\index{AMBE vocoder -\/ internal API@{AMBE vocoder -\/ internal API}!AMBE\_SPEECH@{AMBE\_SPEECH}}}\mbox{\label{group__codec__private_gga109f07fd3782470868b1d1d2ec099eb6a14419c7969d8bb6cf9b2d8b71f30f33b}} 
AMBE\+\_\+\+SPEECH&Speech frame. \\
\hline

\raisebox{\heightof{T}}[0pt][0pt]{\index{AMBE\_SILENCE@{AMBE\_SILENCE}!AMBE vocoder -\/ internal API@{AMBE vocoder -\/ internal API}}\index{AMBE vocoder -\/ internal API@{AMBE vocoder -\/ internal API}!AMBE\_SILENCE@{AMBE\_SILENCE}}}\mbox{\label{group__codec__private_gga109f07fd3782470868b1d1d2ec099eb6a719fb04a91460753423334efdad424b5}} 
AMBE\+\_\+\+SILENCE&Silence indication frame. \\
\hline

\raisebox{\heightof{T}}[0pt][0pt]{\index{AMBE\_TONE@{AMBE\_TONE}!AMBE vocoder -\/ internal API@{AMBE vocoder -\/ internal API}}\index{AMBE vocoder -\/ internal API@{AMBE vocoder -\/ internal API}!AMBE\_TONE@{AMBE\_TONE}}}\mbox{\label{group__codec__private_gga109f07fd3782470868b1d1d2ec099eb6a3ed83bce1686c0614c9377ff191cc8d1}} 
AMBE\+\_\+\+TONE&Tone frame ~\newline
 \\
\hline

\end{DoxyEnumFields}


\doxysubsection{Function Documentation}
\mbox{\label{group__codec__private_ga8f0cf32d32bde050a40a3e7087185aad}} 
\index{AMBE vocoder -\/ internal API@{AMBE vocoder -\/ internal API}!ambe\_decode\_dtx@{ambe\_decode\_dtx}}
\index{ambe\_decode\_dtx@{ambe\_decode\_dtx}!AMBE vocoder -\/ internal API@{AMBE vocoder -\/ internal API}}
\doxysubsubsection{ambe\_decode\_dtx()}
{\footnotesize\ttfamily int ambe\+\_\+decode\+\_\+dtx (\begin{DoxyParamCaption}\item[{struct \textbf{ ambe\+\_\+decoder} $\ast$}]{dec,  }\item[{int16\+\_\+t $\ast$}]{audio,  }\item[{int}]{N }\end{DoxyParamCaption})}



Generates audio for DTX period. 


\begin{DoxyParams}[1]{Parameters}
\mbox{\texttt{ in}}  & {\em dec} & Decoder state structure \\
\hline
\mbox{\texttt{ out}}  & {\em audio} & Output audio buffer \\
\hline
\mbox{\texttt{ in}}  & {\em N} & number of audio samples to produce (152..168) \\
\hline
\end{DoxyParams}


Referenced by \textbf{ gmr1\+\_\+codec\+\_\+decode\+\_\+dtx()}.

\mbox{\label{group__codec__private_ga8a426acea7ced6d46716695e243462dd}} 
\index{AMBE vocoder -\/ internal API@{AMBE vocoder -\/ internal API}!ambe\_decode\_fini@{ambe\_decode\_fini}}
\index{ambe\_decode\_fini@{ambe\_decode\_fini}!AMBE vocoder -\/ internal API@{AMBE vocoder -\/ internal API}}
\doxysubsubsection{ambe\_decode\_fini()}
{\footnotesize\ttfamily void ambe\+\_\+decode\+\_\+fini (\begin{DoxyParamCaption}\item[{struct \textbf{ ambe\+\_\+decoder} $\ast$}]{dec }\end{DoxyParamCaption})}



Release all resources associated with a decoder. 


\begin{DoxyParams}[1]{Parameters}
\mbox{\texttt{ in}}  & {\em dec} & Decoder state structure \\
\hline
\end{DoxyParams}


Referenced by \textbf{ gmr1\+\_\+codec\+\_\+release()}.

\mbox{\label{group__codec__private_ga96427955e6f3174ea846064627843bc3}} 
\index{AMBE vocoder -\/ internal API@{AMBE vocoder -\/ internal API}!ambe\_decode\_frame@{ambe\_decode\_frame}}
\index{ambe\_decode\_frame@{ambe\_decode\_frame}!AMBE vocoder -\/ internal API@{AMBE vocoder -\/ internal API}}
\doxysubsubsection{ambe\_decode\_frame()}
{\footnotesize\ttfamily int ambe\+\_\+decode\+\_\+frame (\begin{DoxyParamCaption}\item[{struct \textbf{ ambe\+\_\+decoder} $\ast$}]{dec,  }\item[{int16\+\_\+t $\ast$}]{audio,  }\item[{int}]{N,  }\item[{const uint8\+\_\+t $\ast$}]{frame,  }\item[{int}]{bad }\end{DoxyParamCaption})}



Decodes an AMBE frame to audio. 


\begin{DoxyParams}[1]{Parameters}
\mbox{\texttt{ in}}  & {\em dec} & Decoder state structure \\
\hline
\mbox{\texttt{ out}}  & {\em audio} & Output audio buffer \\
\hline
\mbox{\texttt{ in}}  & {\em N} & number of audio samples to produce (152..168) \\
\hline
\mbox{\texttt{ in}}  & {\em frame} & Frame data (10 bytes = 80 bits) \\
\hline
\mbox{\texttt{ in}}  & {\em bad} & Bad Frame Indicator. Set to 1 if frame is corrupt \\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}
0 for success. Negative error code otherwise. 
\end{DoxyReturn}


Referenced by \textbf{ gmr1\+\_\+codec\+\_\+decode\+\_\+frame()}.

\mbox{\label{group__codec__private_gaac2c306e18df0fb45f2487e83ba4f9e9}} 
\index{AMBE vocoder -\/ internal API@{AMBE vocoder -\/ internal API}!ambe\_decode\_init@{ambe\_decode\_init}}
\index{ambe\_decode\_init@{ambe\_decode\_init}!AMBE vocoder -\/ internal API@{AMBE vocoder -\/ internal API}}
\doxysubsubsection{ambe\_decode\_init()}
{\footnotesize\ttfamily void ambe\+\_\+decode\+\_\+init (\begin{DoxyParamCaption}\item[{struct \textbf{ ambe\+\_\+decoder} $\ast$}]{dec }\end{DoxyParamCaption})}



Initializes decoder state. 


\begin{DoxyParams}[1]{Parameters}
\mbox{\texttt{ in}}  & {\em dec} & Decoder state structure \\
\hline
\end{DoxyParams}


References \textbf{ ambe\+\_\+synth\+\_\+init()}, \textbf{ ambe\+\_\+subframe\+::f0}, \textbf{ ambe\+\_\+subframe\+::L}, \textbf{ M\+\_\+\+PIf}, \textbf{ ambe\+\_\+decoder\+::sf\+\_\+prev}, \textbf{ ambe\+\_\+decoder\+::synth}, and \textbf{ ambe\+\_\+subframe\+::w0}.



Referenced by \textbf{ gmr1\+\_\+codec\+\_\+alloc()}.

\mbox{\label{group__codec__private_gaf5856df7a0f19188013d6c610a2b7f60}} 
\index{AMBE vocoder -\/ internal API@{AMBE vocoder -\/ internal API}!ambe\_decode\_tone@{ambe\_decode\_tone}}
\index{ambe\_decode\_tone@{ambe\_decode\_tone}!AMBE vocoder -\/ internal API@{AMBE vocoder -\/ internal API}}
\doxysubsubsection{ambe\_decode\_tone()}
{\footnotesize\ttfamily int ambe\+\_\+decode\+\_\+tone (\begin{DoxyParamCaption}\item[{struct \textbf{ ambe\+\_\+decoder} $\ast$}]{dec,  }\item[{int16\+\_\+t $\ast$}]{audio,  }\item[{int}]{N,  }\item[{const uint8\+\_\+t $\ast$}]{frame }\end{DoxyParamCaption})}



Decodes an AMBE tone frame. 


\begin{DoxyParams}[1]{Parameters}
\mbox{\texttt{ in}}  & {\em dec} & AMBE decoder state \\
\hline
\mbox{\texttt{ out}}  & {\em audio} & Output audio buffer \\
\hline
\mbox{\texttt{ in}}  & {\em N} & number of audio samples to produce (152..168) \\
\hline
\mbox{\texttt{ in}}  & {\em frame} & Frame data (10 bytes = 80 bits). Must be tone frame ! \\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}
0 for success. -\/EINVAL if frame was invalid. 
\end{DoxyReturn}
\mbox{\label{group__codec__private_ga83063f9ee0607fe61bacc11bd42d059f}} 
\index{AMBE vocoder -\/ internal API@{AMBE vocoder -\/ internal API}!ambe\_fdct@{ambe\_fdct}}
\index{ambe\_fdct@{ambe\_fdct}!AMBE vocoder -\/ internal API@{AMBE vocoder -\/ internal API}}
\doxysubsubsection{ambe\_fdct()}
{\footnotesize\ttfamily void ambe\+\_\+fdct (\begin{DoxyParamCaption}\item[{float $\ast$}]{out,  }\item[{float $\ast$}]{in,  }\item[{int}]{N,  }\item[{int}]{M }\end{DoxyParamCaption})}



Forward Discrete Cosine Transform (f\+DCT) 


\begin{DoxyParams}[1]{Parameters}
\mbox{\texttt{ out}}  & {\em out} & f\+DCT result buffer (freq domain, M elements) \\
\hline
\mbox{\texttt{ in}}  & {\em in} & f\+DCT input buffer (time domain, N elements) \\
\hline
\mbox{\texttt{ in}}  & {\em N} & Number of points of the DCT \\
\hline
\mbox{\texttt{ in}}  & {\em M} & Limit to the number of frequency components (M $<$= N) \\
\hline
\end{DoxyParams}


References \textbf{ cosf\+\_\+fast()}, and \textbf{ M\+\_\+\+PIf}.

\mbox{\label{group__codec__private_ga9d9e8b11e46bf3ccf14d22be87f1c719}} 
\index{AMBE vocoder -\/ internal API@{AMBE vocoder -\/ internal API}!ambe\_fdft\_fc@{ambe\_fdft\_fc}}
\index{ambe\_fdft\_fc@{ambe\_fdft\_fc}!AMBE vocoder -\/ internal API@{AMBE vocoder -\/ internal API}}
\doxysubsubsection{ambe\_fdft\_fc()}
{\footnotesize\ttfamily void ambe\+\_\+fdft\+\_\+fc (\begin{DoxyParamCaption}\item[{float $\ast$}]{out\+\_\+i,  }\item[{float $\ast$}]{out\+\_\+q,  }\item[{float $\ast$}]{in,  }\item[{int}]{N,  }\item[{int}]{M }\end{DoxyParamCaption})}



Forward Discrete Fourrier Transform (float-\/$>$complex) 


\begin{DoxyParams}[1]{Parameters}
\mbox{\texttt{ out}}  & {\em out\+\_\+i} & Real component result buffer (freq domain, N/2+1 elements) \\
\hline
\mbox{\texttt{ out}}  & {\em out\+\_\+q} & Imag component result buffer (freq domain, N/2+1 elements) \\
\hline
\mbox{\texttt{ in}}  & {\em in} & Input buffer (time domain, M elements) \\
\hline
\mbox{\texttt{ in}}  & {\em N} & Number of points of the DFT \\
\hline
\mbox{\texttt{ in}}  & {\em M} & Limit to to the number of available time domain elements\\
\hline
\end{DoxyParams}
Since the input is float, the result is symmetric and so only one side is computed. The output index 0 is DC. 

References \textbf{ cosf\+\_\+fast()}, \textbf{ M\+\_\+\+PIf}, \textbf{ sinf\+\_\+fast()}, and \textbf{ ts}.

\mbox{\label{group__codec__private_ga55a71c63c53e21c1d6fc9c91ddf519cd}} 
\index{AMBE vocoder -\/ internal API@{AMBE vocoder -\/ internal API}!ambe\_frame\_decode\_params@{ambe\_frame\_decode\_params}}
\index{ambe\_frame\_decode\_params@{ambe\_frame\_decode\_params}!AMBE vocoder -\/ internal API@{AMBE vocoder -\/ internal API}}
\doxysubsubsection{ambe\_frame\_decode\_params()}
{\footnotesize\ttfamily void ambe\+\_\+frame\+\_\+decode\+\_\+params (\begin{DoxyParamCaption}\item[{struct \textbf{ ambe\+\_\+subframe} $\ast$}]{sf,  }\item[{struct \textbf{ ambe\+\_\+subframe} $\ast$}]{sf\+\_\+prev,  }\item[{struct \textbf{ ambe\+\_\+raw\+\_\+params} $\ast$}]{rp }\end{DoxyParamCaption})}



Decodes the speech parameters for both subframes from raw params. 


\begin{DoxyParams}[1]{Parameters}
\mbox{\texttt{ out}}  & {\em sf} & Array of 2 subframes data to fill-\/in \\
\hline
\mbox{\texttt{ in}}  & {\em sf\+\_\+prev} & Previous subframe 1 data \\
\hline
\mbox{\texttt{ in}}  & {\em rp} & Encoded frame raw parameters \\
\hline
\end{DoxyParams}


References \textbf{ ambe\+\_\+subframe\+::f0}, \textbf{ ambe\+\_\+subframe\+::f0log}, and \textbf{ ambe\+\_\+raw\+\_\+params\+::pitch}.

\mbox{\label{group__codec__private_ga8a4e007b142973be5b44ef1637c9bfee}} 
\index{AMBE vocoder -\/ internal API@{AMBE vocoder -\/ internal API}!ambe\_frame\_unpack\_raw@{ambe\_frame\_unpack\_raw}}
\index{ambe\_frame\_unpack\_raw@{ambe\_frame\_unpack\_raw}!AMBE vocoder -\/ internal API@{AMBE vocoder -\/ internal API}}
\doxysubsubsection{ambe\_frame\_unpack\_raw()}
{\footnotesize\ttfamily void ambe\+\_\+frame\+\_\+unpack\+\_\+raw (\begin{DoxyParamCaption}\item[{struct \textbf{ ambe\+\_\+raw\+\_\+params} $\ast$}]{rp,  }\item[{const uint8\+\_\+t $\ast$}]{frame }\end{DoxyParamCaption})}



Unpack a frame into its raw encoded parameters. 


\begin{DoxyParams}[1]{Parameters}
\mbox{\texttt{ out}}  & {\em rp} & Encoded frame raw parameters to unpack into \\
\hline
\mbox{\texttt{ in}}  & {\em frame} & Frame data (10 bytes = 80 bits) \\
\hline
\end{DoxyParams}


References \textbf{ ambe\+\_\+raw\+\_\+params\+::pitch}.

\mbox{\label{group__codec__private_ga0d2a102900214d2ebdab56bf85024cf2}} 
\index{AMBE vocoder -\/ internal API@{AMBE vocoder -\/ internal API}!ambe\_idct@{ambe\_idct}}
\index{ambe\_idct@{ambe\_idct}!AMBE vocoder -\/ internal API@{AMBE vocoder -\/ internal API}}
\doxysubsubsection{ambe\_idct()}
{\footnotesize\ttfamily void ambe\+\_\+idct (\begin{DoxyParamCaption}\item[{float $\ast$}]{out,  }\item[{float $\ast$}]{in,  }\item[{int}]{N,  }\item[{int}]{M }\end{DoxyParamCaption})}



Inverse Discrete Cosine Transform (i\+DCT) 


\begin{DoxyParams}[1]{Parameters}
\mbox{\texttt{ out}}  & {\em out} & i\+DCT result buffer (time domain, N elements) \\
\hline
\mbox{\texttt{ in}}  & {\em in} & i\+DCT input buffer (freq domain, M elements) \\
\hline
\mbox{\texttt{ in}}  & {\em N} & Number of points of the DCT \\
\hline
\mbox{\texttt{ in}}  & {\em M} & Limit to the number of frequency components (M $<$= N) \\
\hline
\end{DoxyParams}


References \textbf{ cosf\+\_\+fast()}, and \textbf{ M\+\_\+\+PIf}.

\mbox{\label{group__codec__private_gadbfdcbf5186cc1c567112e4edc29a1a1}} 
\index{AMBE vocoder -\/ internal API@{AMBE vocoder -\/ internal API}!ambe\_idft\_cf@{ambe\_idft\_cf}}
\index{ambe\_idft\_cf@{ambe\_idft\_cf}!AMBE vocoder -\/ internal API@{AMBE vocoder -\/ internal API}}
\doxysubsubsection{ambe\_idft\_cf()}
{\footnotesize\ttfamily void ambe\+\_\+idft\+\_\+cf (\begin{DoxyParamCaption}\item[{float $\ast$}]{out,  }\item[{float $\ast$}]{in\+\_\+i,  }\item[{float $\ast$}]{in\+\_\+q,  }\item[{int}]{N,  }\item[{int}]{M }\end{DoxyParamCaption})}



Inverse Discret Fourrier Transform (complex-\/$>$float) 


\begin{DoxyParams}[1]{Parameters}
\mbox{\texttt{ out}}  & {\em out} & Result buffer (time domain, M \\
\hline
\mbox{\texttt{ in}}  & {\em in\+\_\+i} & Real component input buffer (freq domain, N/2+1 elements) \\
\hline
\mbox{\texttt{ in}}  & {\em in\+\_\+q} & Imag component input buffer (freq domain, N/2+1 elements) \\
\hline
\mbox{\texttt{ in}}  & {\em N} & Number of points of the DFT \\
\hline
\mbox{\texttt{ in}}  & {\em M} & Limit to the number of time domain elements to generate\\
\hline
\end{DoxyParams}
The input is assumed to be symmetric and so only N/2+1 inputs are needed. DC component must be input index 0. 

References \textbf{ cosf\+\_\+fast()}, \textbf{ M\+\_\+\+PIf}, \textbf{ sinf\+\_\+fast()}, and \textbf{ ts}.

\mbox{\label{group__codec__private_ga2d3ff962344089d1a44fd0d659c55df8}} 
\index{AMBE vocoder -\/ internal API@{AMBE vocoder -\/ internal API}!ambe\_subframe\_expand@{ambe\_subframe\_expand}}
\index{ambe\_subframe\_expand@{ambe\_subframe\_expand}!AMBE vocoder -\/ internal API@{AMBE vocoder -\/ internal API}}
\doxysubsubsection{ambe\_subframe\_expand()}
{\footnotesize\ttfamily void ambe\+\_\+subframe\+\_\+expand (\begin{DoxyParamCaption}\item[{struct \textbf{ ambe\+\_\+subframe} $\ast$}]{sf }\end{DoxyParamCaption})}



Expands the decoded subframe params to prepare for synthesis. 


\begin{DoxyParams}[1]{Parameters}
\mbox{\texttt{ in}}  & {\em sf} & The subframe to expand \\
\hline
\end{DoxyParams}


References \textbf{ ambe\+\_\+subframe\+::f0}, \textbf{ ambe\+\_\+subframe\+::L}, \textbf{ M\+\_\+\+PIf}, \textbf{ ambe\+\_\+subframe\+::\+Ml}, \textbf{ ambe\+\_\+subframe\+::\+Mlog}, \textbf{ ambe\+\_\+subframe\+::v\+\_\+uv}, \textbf{ ambe\+\_\+subframe\+::\+Vl}, and \textbf{ ambe\+\_\+subframe\+::w0}.

\mbox{\label{group__codec__private_ga7ca25dc5919fcff4c7494eb02d25fda2}} 
\index{AMBE vocoder -\/ internal API@{AMBE vocoder -\/ internal API}!ambe\_synth\_audio@{ambe\_synth\_audio}}
\index{ambe\_synth\_audio@{ambe\_synth\_audio}!AMBE vocoder -\/ internal API@{AMBE vocoder -\/ internal API}}
\doxysubsubsection{ambe\_synth\_audio()}
{\footnotesize\ttfamily void ambe\+\_\+synth\+\_\+audio (\begin{DoxyParamCaption}\item[{struct \textbf{ ambe\+\_\+synth} $\ast$}]{synth,  }\item[{int16\+\_\+t $\ast$}]{audio,  }\item[{struct \textbf{ ambe\+\_\+subframe} $\ast$}]{sf,  }\item[{struct \textbf{ ambe\+\_\+subframe} $\ast$}]{sf\+\_\+prev }\end{DoxyParamCaption})}



Generate audio for a given subframe. 


\begin{DoxyParams}[1]{Parameters}
\mbox{\texttt{ in}}  & {\em synth} & Synthesizer state structure \\
\hline
\mbox{\texttt{ out}}  & {\em audio} & Result buffer (80 samples) \\
\hline
\mbox{\texttt{ in}}  & {\em sf} & Expanded subframe data for current subframe \\
\hline
\mbox{\texttt{ in}}  & {\em sf\+\_\+prev} & Expanded subframe data for prevous subframe \\
\hline
\end{DoxyParams}
\mbox{\label{group__codec__private_ga5fdca2bf0b039f3bb0dd97b0f601fe62}} 
\index{AMBE vocoder -\/ internal API@{AMBE vocoder -\/ internal API}!ambe\_synth\_enhance@{ambe\_synth\_enhance}}
\index{ambe\_synth\_enhance@{ambe\_synth\_enhance}!AMBE vocoder -\/ internal API@{AMBE vocoder -\/ internal API}}
\doxysubsubsection{ambe\_synth\_enhance()}
{\footnotesize\ttfamily void ambe\+\_\+synth\+\_\+enhance (\begin{DoxyParamCaption}\item[{struct \textbf{ ambe\+\_\+synth} $\ast$}]{synth,  }\item[{struct \textbf{ ambe\+\_\+subframe} $\ast$}]{sf }\end{DoxyParamCaption})}



Apply the spectral magnitude enhancement on the subframe. 


\begin{DoxyParams}[1]{Parameters}
\mbox{\texttt{ in}}  & {\em synth} & Synthesizer state structure \\
\hline
\mbox{\texttt{ in}}  & {\em sf} & Expanded subframe data for subframe to enhance \\
\hline
\end{DoxyParams}


References \textbf{ cosf\+\_\+fast()}, \textbf{ ambe\+\_\+subframe\+::L}, \textbf{ M\+\_\+\+PIf}, \textbf{ ambe\+\_\+subframe\+::\+Ml}, \textbf{ ambe\+\_\+synth\+::\+SE}, and \textbf{ ambe\+\_\+subframe\+::w0}.

\mbox{\label{group__codec__private_ga31252750e130d6bf531c483df2ec8a49}} 
\index{AMBE vocoder -\/ internal API@{AMBE vocoder -\/ internal API}!ambe\_synth\_init@{ambe\_synth\_init}}
\index{ambe\_synth\_init@{ambe\_synth\_init}!AMBE vocoder -\/ internal API@{AMBE vocoder -\/ internal API}}
\doxysubsubsection{ambe\_synth\_init()}
{\footnotesize\ttfamily void ambe\+\_\+synth\+\_\+init (\begin{DoxyParamCaption}\item[{struct \textbf{ ambe\+\_\+synth} $\ast$}]{synth }\end{DoxyParamCaption})}



Initialized Synthesizer state. 


\begin{DoxyParams}[1]{Parameters}
\mbox{\texttt{ out}}  & {\em synth} & The structure to reset \\
\hline
\end{DoxyParams}


References \textbf{ ambe\+\_\+synth\+::u\+\_\+prev}.



Referenced by \textbf{ ambe\+\_\+decode\+\_\+init()}.

\mbox{\label{group__codec__private_ga62bc434f8483f0198f86b388ab30ced6}} 
\index{AMBE vocoder -\/ internal API@{AMBE vocoder -\/ internal API}!cosf\_fast@{cosf\_fast}}
\index{cosf\_fast@{cosf\_fast}!AMBE vocoder -\/ internal API@{AMBE vocoder -\/ internal API}}
\doxysubsubsection{cosf\_fast()}
{\footnotesize\ttfamily float cosf\+\_\+fast (\begin{DoxyParamCaption}\item[{float}]{angle }\end{DoxyParamCaption})}



Fast Cosinus approximation using a simple table. 


\begin{DoxyParams}[1]{Parameters}
\mbox{\texttt{ in}}  & {\em angle} & The angle value \\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}
The cosinus of the angle 
\end{DoxyReturn}


References \textbf{ M\+\_\+\+PIf}.



Referenced by \textbf{ ambe\+\_\+fdct()}, \textbf{ ambe\+\_\+fdft\+\_\+fc()}, \textbf{ ambe\+\_\+idct()}, \textbf{ ambe\+\_\+idft\+\_\+cf()}, and \textbf{ ambe\+\_\+synth\+\_\+enhance()}.

\mbox{\label{group__codec__private_gade8a6e65fb5db286835ffd82b0f61dd1}} 
\index{AMBE vocoder -\/ internal API@{AMBE vocoder -\/ internal API}!sinf\_fast@{sinf\_fast}}
\index{sinf\_fast@{sinf\_fast}!AMBE vocoder -\/ internal API@{AMBE vocoder -\/ internal API}}
\doxysubsubsection{sinf\_fast()}
{\footnotesize\ttfamily float sinf\+\_\+fast (\begin{DoxyParamCaption}\item[{float}]{angle }\end{DoxyParamCaption})}



Fast Sinus approximation using a simple table. 


\begin{DoxyParams}[1]{Parameters}
\mbox{\texttt{ in}}  & {\em angle} & The angle value \\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}
The sinus of the angle 
\end{DoxyReturn}


References \textbf{ M\+\_\+\+PIf}.



Referenced by \textbf{ ambe\+\_\+fdft\+\_\+fc()}, and \textbf{ ambe\+\_\+idft\+\_\+cf()}.



\doxysubsection{Variable Documentation}
\mbox{\label{group__codec__private_gab7a7b1219368c43c898cfb24ff3cb5cd}} 
\index{AMBE vocoder -\/ internal API@{AMBE vocoder -\/ internal API}!ambe\_sf0\_interp\_tbl@{ambe\_sf0\_interp\_tbl}}
\index{ambe\_sf0\_interp\_tbl@{ambe\_sf0\_interp\_tbl}!AMBE vocoder -\/ internal API@{AMBE vocoder -\/ internal API}}
\doxysubsubsection{ambe\_sf0\_interp\_tbl}
{\footnotesize\ttfamily const float ambe\+\_\+sf0\+\_\+interp\+\_\+tbl[4]}

{\bfseries Initial value\+:}
\begin{DoxyCode}{0}
\DoxyCodeLine{= \{}
\DoxyCodeLine{        0.90f,}
\DoxyCodeLine{        0.70f,}
\DoxyCodeLine{        0.50f,}
\DoxyCodeLine{        0.17f,}
\DoxyCodeLine{\}}

\end{DoxyCode}


Interpolation ratios for subframe 0 magnitude prediction. 

\mbox{\label{group__codec__private_ga735cc90f20631506f7a5fc4827f4e8d5}} 
\index{AMBE vocoder -\/ internal API@{AMBE vocoder -\/ internal API}!ambe\_v\_uv\_tbl@{ambe\_v\_uv\_tbl}}
\index{ambe\_v\_uv\_tbl@{ambe\_v\_uv\_tbl}!AMBE vocoder -\/ internal API@{AMBE vocoder -\/ internal API}}
\doxysubsubsection{ambe\_v\_uv\_tbl}
{\footnotesize\ttfamily const uint16\+\_\+t ambe\+\_\+v\+\_\+uv\+\_\+tbl[64]}

{\bfseries Initial value\+:}
\begin{DoxyCode}{0}
\DoxyCodeLine{= \{}
\DoxyCodeLine{        0x0000, 0xffff, 0xc0c0, 0xe0e0, 0xf0f0, 0x8080, 0xfefe, 0x0080,}
\DoxyCodeLine{        0xfcfc, 0x80c0, 0xf8f8, 0x8000, 0x00c0, 0xfffe, 0xfeff, 0xc000,}
\DoxyCodeLine{        0xf0e0, 0xc0e0, 0xfbfb, 0xfcfe, 0xf8f0, 0xfdfd, 0xfffb, 0xe000,}
\DoxyCodeLine{        0xe0f0, 0xfcff, 0xfdff, 0xe0c0, 0xfffc, 0xf0f8, 0xfefc, 0xfffd,}
\DoxyCodeLine{        0xf8fc, 0xfcf8, 0xfcfd, 0x4000, 0xf0c0, 0xf9f9, 0xfbff, 0xefef,}
\DoxyCodeLine{        0xf3f3, 0xc080, 0xf0e0, 0xfff8, 0xf0fc, 0xf1f1, 0x0040, 0xc0d0,}
\DoxyCodeLine{        0xc0f0, 0xf7f7, 0xfaf8, 0xfafa, 0xfcf0, 0xfef8, 0x00e0, 0x0100,}
\DoxyCodeLine{        0x1000, 0xe0e1, 0xe0f8, 0xf2f0, 0xf8ff, 0xfafe, 0xfff7, 0xdfdf,}
\DoxyCodeLine{\}}

\end{DoxyCode}


V/\+UV decisions (subframe 0 = low byte. MSBs = low freq) 

