\doxysection{pi2-\/\+CBPSK, pi4-\/\+CBPSK and pi4-\/\+CQPSK modulation}
\label{group__pi4cxpsk}\index{pi2-\/CBPSK, pi4-\/CBPSK and pi4-\/CQPSK modulation@{pi2-\/CBPSK, pi4-\/CBPSK and pi4-\/CQPSK modulation}}
\doxysubsection*{Files}
\begin{DoxyCompactItemize}
\item 
file \textbf{ pi4cxpsk.\+h}
\begin{DoxyCompactList}\small\item\em Osmocom GMR-\/1 pi2-\/\+CBPSK, pi4-\/\+CBPSK and pi4-\/\+CQPSK modulation support header. \end{DoxyCompactList}\item 
file \textbf{ pi4cxpsk.\+c}
\begin{DoxyCompactList}\small\item\em Osmocom GMR-\/1 pi2-\/\+CBPSK, pi4-\/\+CBPSK and pi4-\/\+CQPSK modulation support implementation. \end{DoxyCompactList}\end{DoxyCompactItemize}
\doxysubsection*{Data Structures}
\begin{DoxyCompactItemize}
\item 
struct \textbf{ gmr1\+\_\+pi4cxpsk\+\_\+symbol}
\begin{DoxyCompactList}\small\item\em pi4-\/\+Cx\+PSK symbol description \end{DoxyCompactList}\item 
struct \textbf{ gmr1\+\_\+pi4cxpsk\+\_\+modulation}
\begin{DoxyCompactList}\small\item\em pi4-\/\+Cx\+PSK modulation description \end{DoxyCompactList}\item 
struct \textbf{ gmr1\+\_\+pi4cxpsk\+\_\+sync}
\begin{DoxyCompactList}\small\item\em pi4-\/\+Cx\+PSK Synchronization sequence segment description \end{DoxyCompactList}\item 
struct \textbf{ gmr1\+\_\+pi4cxpsk\+\_\+data}
\begin{DoxyCompactList}\small\item\em pi4-\/\+Cx\+PSK Data segment description \end{DoxyCompactList}\item 
struct \textbf{ gmr1\+\_\+pi4cxpsk\+\_\+burst}
\begin{DoxyCompactList}\small\item\em pi4-\/\+Cx\+PSK Burst format description \end{DoxyCompactList}\end{DoxyCompactItemize}
\doxysubsection*{Macros}
\begin{DoxyCompactItemize}
\item 
\mbox{\label{group__pi4cxpsk_ga3a551a9ff371809aa32f6bbeaf48fc62}} 
\#define {\bfseries GMR1\+\_\+\+MAX\+\_\+\+SYM\+\_\+\+EBITS}~2
\begin{DoxyCompactList}\small\item\em Max e bits in a symbol. \end{DoxyCompactList}\item 
\mbox{\label{group__pi4cxpsk_ga7078b941f0b0a04ff9ddf290452b93a9}} 
\#define {\bfseries GMR1\+\_\+\+MAX\+\_\+\+SYNC}~4
\begin{DoxyCompactList}\small\item\em Max diff. sync seqs ~\newline
 \end{DoxyCompactList}\item 
\mbox{\label{group__pi4cxpsk_gad1c5069c814820ccbc9abcc700fb6193}} 
\#define {\bfseries GMR1\+\_\+\+MAX\+\_\+\+SYNC\+\_\+\+SYMS}~32
\begin{DoxyCompactList}\small\item\em Max sym in a sync seq ~\newline
 \end{DoxyCompactList}\end{DoxyCompactItemize}
\doxysubsection*{Functions}
\begin{DoxyCompactItemize}
\item 
int \textbf{ gmr1\+\_\+pi4cxpsk\+\_\+demod} (struct \textbf{ gmr1\+\_\+pi4cxpsk\+\_\+burst} $\ast$burst\+\_\+type, struct \textbf{ osmo\+\_\+cxvec} $\ast$burst\+\_\+in, int sps, float freq\+\_\+shift, \textbf{ sbit\+\_\+t} $\ast$ebits, int $\ast$sync\+\_\+id\+\_\+p, float $\ast$toa\+\_\+p, float $\ast$freq\+\_\+err\+\_\+p)
\begin{DoxyCompactList}\small\item\em All-\/in-\/one pi4-\/\+Cx\+PSK demodulation method. \end{DoxyCompactList}\item 
int \textbf{ gmr1\+\_\+pi4cxpsk\+\_\+detect} (struct \textbf{ gmr1\+\_\+pi4cxpsk\+\_\+burst} $\ast$$\ast$burst\+\_\+types, float e\+\_\+toa, struct \textbf{ osmo\+\_\+cxvec} $\ast$burst\+\_\+in, int sps, float freq\+\_\+shift, int $\ast$bt\+\_\+id\+\_\+p, int $\ast$sync\+\_\+id\+\_\+p, float $\ast$toa\+\_\+p)
\begin{DoxyCompactList}\small\item\em Try to identify burst type by matching training sequences. \end{DoxyCompactList}\item 
int \textbf{ gmr1\+\_\+pi4cxpsk\+\_\+mod\+\_\+order} (struct \textbf{ osmo\+\_\+cxvec} $\ast$burst\+\_\+in, int sps, float freq\+\_\+shift)
\begin{DoxyCompactList}\small\item\em Estimates modulation order by comparing power of x$^\wedge$2 vs x$^\wedge$4. \end{DoxyCompactList}\item 
int \textbf{ gmr1\+\_\+pi4cxpsk\+\_\+mod} (struct \textbf{ gmr1\+\_\+pi4cxpsk\+\_\+burst} $\ast$burst\+\_\+type, \textbf{ ubit\+\_\+t} $\ast$ebits, int sync\+\_\+id, struct \textbf{ osmo\+\_\+cxvec} $\ast$burst\+\_\+out)
\begin{DoxyCompactList}\small\item\em Modulates (currently at 1 sps) \end{DoxyCompactList}\end{DoxyCompactItemize}
\doxysubsection*{Variables}
\begin{DoxyCompactItemize}
\item 
\mbox{\label{group__pi4cxpsk_ga37214979bb79f5d23784ba1eda5fa384}} 
struct \textbf{ gmr1\+\_\+pi4cxpsk\+\_\+modulation} {\bfseries gmr1\+\_\+pi2cbpsk}
\begin{DoxyCompactList}\small\item\em pi2-\/\+CBPSK modulation description \end{DoxyCompactList}\item 
\mbox{\label{group__pi4cxpsk_gaeae7cf33a9694b1911deefb535f5c1b8}} 
struct \textbf{ gmr1\+\_\+pi4cxpsk\+\_\+modulation} {\bfseries gmr1\+\_\+pi4cbpsk}
\begin{DoxyCompactList}\small\item\em pi4-\/\+CBPSK modulation description \end{DoxyCompactList}\item 
\mbox{\label{group__pi4cxpsk_ga652dcdb5ad05ce39ebef8a5b97f6d516}} 
struct \textbf{ gmr1\+\_\+pi4cxpsk\+\_\+modulation} {\bfseries gmr1\+\_\+pi4cqpsk}
\begin{DoxyCompactList}\small\item\em pi4-\/\+CQPSK modulation description \end{DoxyCompactList}\item 
struct \textbf{ gmr1\+\_\+pi4cxpsk\+\_\+modulation} \textbf{ gmr1\+\_\+pi2cbpsk}
\begin{DoxyCompactList}\small\item\em pi2-\/\+CBPSK modulation description \end{DoxyCompactList}\item 
struct \textbf{ gmr1\+\_\+pi4cxpsk\+\_\+modulation} \textbf{ gmr1\+\_\+pi4cbpsk}
\begin{DoxyCompactList}\small\item\em pi4-\/\+CBPSK modulation description \end{DoxyCompactList}\item 
struct \textbf{ gmr1\+\_\+pi4cxpsk\+\_\+modulation} \textbf{ gmr1\+\_\+pi4cqpsk}
\begin{DoxyCompactList}\small\item\em pi4-\/\+CQPSK modulation description \end{DoxyCompactList}\end{DoxyCompactItemize}


\doxysubsection{Detailed Description}


\doxysubsection{Function Documentation}
\mbox{\label{group__pi4cxpsk_ga39685a0ee6daeb04f7ca70bbd6d1fe29}} 
\index{pi2-\/CBPSK, pi4-\/CBPSK and pi4-\/CQPSK modulation@{pi2-\/CBPSK, pi4-\/CBPSK and pi4-\/CQPSK modulation}!gmr1\_pi4cxpsk\_demod@{gmr1\_pi4cxpsk\_demod}}
\index{gmr1\_pi4cxpsk\_demod@{gmr1\_pi4cxpsk\_demod}!pi2-\/CBPSK, pi4-\/CBPSK and pi4-\/CQPSK modulation@{pi2-\/CBPSK, pi4-\/CBPSK and pi4-\/CQPSK modulation}}
\doxysubsubsection{gmr1\_pi4cxpsk\_demod()}
{\footnotesize\ttfamily int gmr1\+\_\+pi4cxpsk\+\_\+demod (\begin{DoxyParamCaption}\item[{struct \textbf{ gmr1\+\_\+pi4cxpsk\+\_\+burst} $\ast$}]{burst\+\_\+type,  }\item[{struct \textbf{ osmo\+\_\+cxvec} $\ast$}]{burst\+\_\+in,  }\item[{int}]{sps,  }\item[{float}]{freq\+\_\+shift,  }\item[{\textbf{ sbit\+\_\+t} $\ast$}]{ebits,  }\item[{int $\ast$}]{sync\+\_\+id\+\_\+p,  }\item[{float $\ast$}]{toa\+\_\+p,  }\item[{float $\ast$}]{freq\+\_\+err\+\_\+p }\end{DoxyParamCaption})}



All-\/in-\/one pi4-\/\+Cx\+PSK demodulation method. 


\begin{DoxyParams}[1]{Parameters}
\mbox{\texttt{ in}}  & {\em burst\+\_\+type} & Burst format description \\
\hline
\mbox{\texttt{ in}}  & {\em burst\+\_\+in} & Complex signal of the burst \\
\hline
\mbox{\texttt{ in}}  & {\em sps} & Oversampling used in the input complex signal \\
\hline
\mbox{\texttt{ in}}  & {\em freq\+\_\+shift} & Frequency shift to pre-\/apply to burst\+\_\+in (rad/sym) \\
\hline
\mbox{\texttt{ out}}  & {\em ebits} & Encoded soft bits return array \\
\hline
\mbox{\texttt{ out}}  & {\em sync\+\_\+id\+\_\+p} & Pointer to sync sequence id return variable \\
\hline
\mbox{\texttt{ out}}  & {\em toa\+\_\+p} & Pointer to TOA return variable \\
\hline
\mbox{\texttt{ out}}  & {\em freq\+\_\+err\+\_\+p} & Pointer to frequency error return variable (rad/sym) \\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}
0 for success. -\/errno for errors
\end{DoxyReturn}
burst\+\_\+in is expected to be longer than necessary. Any extra length will be used as \textquotesingle{}search window\textquotesingle{} to find proper alignement. Good practice is to have a few samples too much in front and a few samples after the expected TOA. \mbox{\label{group__pi4cxpsk_ga1490fd560c08a9468c40ff69f2cae2bb}} 
\index{pi2-\/CBPSK, pi4-\/CBPSK and pi4-\/CQPSK modulation@{pi2-\/CBPSK, pi4-\/CBPSK and pi4-\/CQPSK modulation}!gmr1\_pi4cxpsk\_detect@{gmr1\_pi4cxpsk\_detect}}
\index{gmr1\_pi4cxpsk\_detect@{gmr1\_pi4cxpsk\_detect}!pi2-\/CBPSK, pi4-\/CBPSK and pi4-\/CQPSK modulation@{pi2-\/CBPSK, pi4-\/CBPSK and pi4-\/CQPSK modulation}}
\doxysubsubsection{gmr1\_pi4cxpsk\_detect()}
{\footnotesize\ttfamily int gmr1\+\_\+pi4cxpsk\+\_\+detect (\begin{DoxyParamCaption}\item[{struct \textbf{ gmr1\+\_\+pi4cxpsk\+\_\+burst} $\ast$$\ast$}]{burst\+\_\+types,  }\item[{float}]{e\+\_\+toa,  }\item[{struct \textbf{ osmo\+\_\+cxvec} $\ast$}]{burst\+\_\+in,  }\item[{int}]{sps,  }\item[{float}]{freq\+\_\+shift,  }\item[{int $\ast$}]{bt\+\_\+id\+\_\+p,  }\item[{int $\ast$}]{sync\+\_\+id\+\_\+p,  }\item[{float $\ast$}]{toa\+\_\+p }\end{DoxyParamCaption})}



Try to identify burst type by matching training sequences. 


\begin{DoxyParams}[1]{Parameters}
\mbox{\texttt{ in}}  & {\em burst\+\_\+types} & Array of burst types to test (NULL terminated) \\
\hline
\mbox{\texttt{ in}}  & {\em e\+\_\+toa} & Expected time of arrival \\
\hline
\mbox{\texttt{ in}}  & {\em burst\+\_\+in} & Complex signal of the burst \\
\hline
\mbox{\texttt{ in}}  & {\em sps} & Oversampling used in the input complex signal \\
\hline
\mbox{\texttt{ in}}  & {\em freq\+\_\+shift} & Frequency shift to pre-\/apply to burst\+\_\+in (rad/sym) \\
\hline
\mbox{\texttt{ out}}  & {\em bt\+\_\+id\+\_\+p} & Pointer to burst type ID return variable \\
\hline
\mbox{\texttt{ out}}  & {\em sync\+\_\+id\+\_\+p} & Pointer to sync sequence id return variable \\
\hline
\mbox{\texttt{ out}}  & {\em toa\+\_\+p} & Pointer to TOA return variable \\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}
-\/errno for errors, 0 for success
\end{DoxyReturn}
The various burst types must be compatible in length and modulation ! 

References \textbf{ osmo\+\_\+cxvec\+\_\+sig\+\_\+normalize()}, and \textbf{ gmr1\+\_\+pi4cxpsk\+\_\+modulation\+::rotation}.

\mbox{\label{group__pi4cxpsk_ga554b1c56cd86f4e9c9cbdcc455212770}} 
\index{pi2-\/CBPSK, pi4-\/CBPSK and pi4-\/CQPSK modulation@{pi2-\/CBPSK, pi4-\/CBPSK and pi4-\/CQPSK modulation}!gmr1\_pi4cxpsk\_mod@{gmr1\_pi4cxpsk\_mod}}
\index{gmr1\_pi4cxpsk\_mod@{gmr1\_pi4cxpsk\_mod}!pi2-\/CBPSK, pi4-\/CBPSK and pi4-\/CQPSK modulation@{pi2-\/CBPSK, pi4-\/CBPSK and pi4-\/CQPSK modulation}}
\doxysubsubsection{gmr1\_pi4cxpsk\_mod()}
{\footnotesize\ttfamily int gmr1\+\_\+pi4cxpsk\+\_\+mod (\begin{DoxyParamCaption}\item[{struct \textbf{ gmr1\+\_\+pi4cxpsk\+\_\+burst} $\ast$}]{burst\+\_\+type,  }\item[{\textbf{ ubit\+\_\+t} $\ast$}]{ebits,  }\item[{int}]{sync\+\_\+id,  }\item[{struct \textbf{ osmo\+\_\+cxvec} $\ast$}]{burst\+\_\+out }\end{DoxyParamCaption})}



Modulates (currently at 1 sps) 


\begin{DoxyParams}[1]{Parameters}
\mbox{\texttt{ in}}  & {\em burst\+\_\+type} & Burst format description \\
\hline
\mbox{\texttt{ in}}  & {\em ebits} & Encoded hard bits to pack in the burst \\
\hline
\mbox{\texttt{ in}}  & {\em sync\+\_\+id} & The sequence id to use (0 if burst\+\_\+type only has one) \\
\hline
\mbox{\texttt{ out}}  & {\em burst\+\_\+out} & Complex signal to fill with modulated symbols \\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}
0 for success. -\/errno for errors
\end{DoxyReturn}
burst\+\_\+out is expected to be long enough to contains the resulting symbols see the burst\+\_\+type structure for how long that is. 

References \textbf{ osmo\+\_\+cxvec\+::len}, \textbf{ gmr1\+\_\+pi4cxpsk\+\_\+burst\+::len}, \textbf{ osmo\+\_\+cxvec\+::max\+\_\+len}, and \textbf{ gmr1\+\_\+pi4cxpsk\+\_\+burst\+::mod}.

\mbox{\label{group__pi4cxpsk_ga82887564b076046745f705f7c27c930e}} 
\index{pi2-\/CBPSK, pi4-\/CBPSK and pi4-\/CQPSK modulation@{pi2-\/CBPSK, pi4-\/CBPSK and pi4-\/CQPSK modulation}!gmr1\_pi4cxpsk\_mod\_order@{gmr1\_pi4cxpsk\_mod\_order}}
\index{gmr1\_pi4cxpsk\_mod\_order@{gmr1\_pi4cxpsk\_mod\_order}!pi2-\/CBPSK, pi4-\/CBPSK and pi4-\/CQPSK modulation@{pi2-\/CBPSK, pi4-\/CBPSK and pi4-\/CQPSK modulation}}
\doxysubsubsection{gmr1\_pi4cxpsk\_mod\_order()}
{\footnotesize\ttfamily int gmr1\+\_\+pi4cxpsk\+\_\+mod\+\_\+order (\begin{DoxyParamCaption}\item[{struct \textbf{ osmo\+\_\+cxvec} $\ast$}]{burst\+\_\+in,  }\item[{int}]{sps,  }\item[{float}]{freq\+\_\+shift }\end{DoxyParamCaption})}



Estimates modulation order by comparing power of x$^\wedge$2 vs x$^\wedge$4. 


\begin{DoxyParams}[1]{Parameters}
\mbox{\texttt{ in}}  & {\em burst\+\_\+in} & Complex signal of the burst \\
\hline
\mbox{\texttt{ in}}  & {\em sps} & Oversampling used in the input complex signal \\
\hline
\mbox{\texttt{ in}}  & {\em freq\+\_\+shift} & Frequency shift to pre-\/apply to burst\+\_\+in (rad/sym) \\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}
$<$0 for error. 2 for BPSK, 4 for QPSK.
\end{DoxyReturn}
Since x$^\wedge$4 only make sense for pi/4 variant, the pi/4 counter rotation is always applied. 

References \textbf{ M\+\_\+\+PIf}, and \textbf{ osmo\+\_\+cxvec\+\_\+sig\+\_\+normalize()}.



\doxysubsection{Variable Documentation}
\mbox{\label{group__pi4cxpsk_ga37214979bb79f5d23784ba1eda5fa384}} 
\index{pi2-\/CBPSK, pi4-\/CBPSK and pi4-\/CQPSK modulation@{pi2-\/CBPSK, pi4-\/CBPSK and pi4-\/CQPSK modulation}!gmr1\_pi2cbpsk@{gmr1\_pi2cbpsk}}
\index{gmr1\_pi2cbpsk@{gmr1\_pi2cbpsk}!pi2-\/CBPSK, pi4-\/CBPSK and pi4-\/CQPSK modulation@{pi2-\/CBPSK, pi4-\/CBPSK and pi4-\/CQPSK modulation}}
\doxysubsubsection{gmr1\_pi2cbpsk}
{\footnotesize\ttfamily struct \textbf{ gmr1\+\_\+pi4cxpsk\+\_\+modulation} gmr1\+\_\+pi2cbpsk}

{\bfseries Initial value\+:}
\begin{DoxyCode}{0}
\DoxyCodeLine{= \{}
\DoxyCodeLine{        .rotation = M\_PIf/2,}
\DoxyCodeLine{        .nbits = 1,}
\DoxyCodeLine{        .syms = gmr1\_piNcbpsk\_syms\_bits,}
\DoxyCodeLine{        .bits = gmr1\_piNcbpsk\_syms\_bits,}
\DoxyCodeLine{\}}

\end{DoxyCode}


pi2-\/\+CBPSK modulation description 

\mbox{\label{group__pi4cxpsk_gaeae7cf33a9694b1911deefb535f5c1b8}} 
\index{pi2-\/CBPSK, pi4-\/CBPSK and pi4-\/CQPSK modulation@{pi2-\/CBPSK, pi4-\/CBPSK and pi4-\/CQPSK modulation}!gmr1\_pi4cbpsk@{gmr1\_pi4cbpsk}}
\index{gmr1\_pi4cbpsk@{gmr1\_pi4cbpsk}!pi2-\/CBPSK, pi4-\/CBPSK and pi4-\/CQPSK modulation@{pi2-\/CBPSK, pi4-\/CBPSK and pi4-\/CQPSK modulation}}
\doxysubsubsection{gmr1\_pi4cbpsk}
{\footnotesize\ttfamily struct \textbf{ gmr1\+\_\+pi4cxpsk\+\_\+modulation} gmr1\+\_\+pi4cbpsk}

{\bfseries Initial value\+:}
\begin{DoxyCode}{0}
\DoxyCodeLine{= \{}
\DoxyCodeLine{        .rotation = M\_PIf/4,}
\DoxyCodeLine{        .nbits = 1,}
\DoxyCodeLine{        .syms = gmr1\_piNcbpsk\_syms\_bits,}
\DoxyCodeLine{        .bits = gmr1\_piNcbpsk\_syms\_bits,}
\DoxyCodeLine{\}}

\end{DoxyCode}


pi4-\/\+CBPSK modulation description 

\mbox{\label{group__pi4cxpsk_ga652dcdb5ad05ce39ebef8a5b97f6d516}} 
\index{pi2-\/CBPSK, pi4-\/CBPSK and pi4-\/CQPSK modulation@{pi2-\/CBPSK, pi4-\/CBPSK and pi4-\/CQPSK modulation}!gmr1\_pi4cqpsk@{gmr1\_pi4cqpsk}}
\index{gmr1\_pi4cqpsk@{gmr1\_pi4cqpsk}!pi2-\/CBPSK, pi4-\/CBPSK and pi4-\/CQPSK modulation@{pi2-\/CBPSK, pi4-\/CBPSK and pi4-\/CQPSK modulation}}
\doxysubsubsection{gmr1\_pi4cqpsk}
{\footnotesize\ttfamily struct \textbf{ gmr1\+\_\+pi4cxpsk\+\_\+modulation} gmr1\+\_\+pi4cqpsk}

{\bfseries Initial value\+:}
\begin{DoxyCode}{0}
\DoxyCodeLine{= \{}
\DoxyCodeLine{        .rotation = M\_PIf/4,}
\DoxyCodeLine{        .nbits = 2,}
\DoxyCodeLine{        .syms = gmr1\_pi4cqpsk\_syms,}
\DoxyCodeLine{        .bits = gmr1\_pi4cqpsk\_bits,}
\DoxyCodeLine{\}}

\end{DoxyCode}


pi4-\/\+CQPSK modulation description 

