\chapter{Předzpracování}
\label{sec:prep}
Kmitočtovou demodulací vysokofrekvenčního signálu ze snímacího oscilátoru je získán nízkofrekvenční signál, na který nelze přímo aplikovat rekonstrukční metody. Jednak se v signálu vyskytuje stejnosměrný drift (viz obr.~\ref{fig:prep:lf-signal}), jednak nejsou známy parametry \zk{zkPSF}.

\fig{sim/samples/signal}{Nízkofrekvenční signál obdržený kmitočtovou demodulací vysokofrekvenčního signálu snímacího oscilátoru}{fig:prep:lf-signal}{1}

Nejdříve je z nízkofrekvenčního signálu $y_\text{lf}[k]$ ponechán pouze úsek, v němž se nachází čárový kód (ostatní části signálu jsou odstraněny a není s nimi dále pracováno). Poté je ze signálu odstraněn stejnosměrný drift (na jehož přítomnost nejsou rekonstrukční metody přizpůsobeny). Dále jsou odhadnuty dva významné parametry \zk{zkPSF} -- šířka $\sigma$ a stejnosměrný přenos $K_0$, na základě kterého je signál zesílen tak, aby byl stejnosměrný přenos \zk{zkPSF} normalizován na jednotkovou hodnotu (čímž je zjednodušen výpočet regularizačních koeficientů pro variační rekonstrukční metody). Výsledkem je předzpracovaný signál $y[k]$.

\section{Detekce čárového kódu}
\label{sec:prep:detection}
Sledování změny okamžité hodnoty signálu by byla sice velmi jednoduchá metoda detekce čárového kódu, nicméně by reagovala i na přítomnost pouhého stejnosměrného driftu.

K detekci bude použita \emph{metoda nevydařené lineární aproximace} (v \cite{kadlcik-eeict-2013} je pojmenována jako \en{method of failed linear regression}).

Myšlenka metody je následující. V rámci krátkých časových úseků (nejvýše několik sekund, viz kap.~\ref{sec:theory:dc-drift}) je stejnosměrný drift téměř lineární signál. Naopak signál obsahující čárový kód je na mnoha místech zakřiven. Je-li tedy v signálu přítomen čárový kód, signál nelze uspokojivě aproximovat lineární funkcí.

\fig{img/barcode-detection}{Princip detekce čárového kódu}{fig:prep:detection:principle}{1}

Z nízkofrekvenčního signálu $y_\text{lf}[k]$ jsou kolem bodu $k$ s rozestupem (\emph{podvzorkováním}) $M$ vybrány tři ekvidistantní vzorky, které tvoří tzv. \emph{fragment} $y_\text{f}[l]$ (obr.~\ref{fig:prep:detection:principle}),
\begin{align}
	y_\text{f}[l] = \begin{cases}
		y_\text{lf}[k - M],	& l = 0	\\
		y_\text{lf}[k],		& l = 1	\\
		y_\text{lf}[k + M],	& l = 2	\\
	\end{cases},	\quad l \in \{0, 1, 2\}
\end{align}
Je vypočtena minimální možná energie $E_\text{min}$ odchylky mezi fragmentem $y_\text{f}[l]$ a aproximující lineární funkcí $y_\text{lin}[l]$, které lze dosáhnout volbou lineární funkce,
\begin{align}
	y_{\text{lin}_k}[l]		&= ak + b,	\quad a, b \in \mathbb{R},	\\
	E_\text{min}[k]		&= \sum_{l = 0}^2 \left(y_{\text{lin}_k}[l] - y_\text{f}[l]\right)^2.
\end{align}
Minimum energie je dosaženo, pokud je aproximující funkce nalezena např. pomocí metody nejmenších čtverců. Jelikož je podstatná pouze hodnota minima energie, lze minimum určit přímo (odvození popsáno v kap.~\ref{sec:linear-approx-min-E}),
\begin{align}
	E_\text{min}[k] = \frac{1}{6}\left(y_{\text{f}_k}[0] - 2y_{\text{f}_k}[1] + y_{\text{f}_k}[2]\right)^2.
\end{align}

\fig{sim/linear-approximation}{Minimální energie odchylky lineární aproximace konvolučně zkresleného a zašuměného signálu obsahující čárový kód}{fig:prep:detection:linear-approximation}{1}

Na obr.~\ref{fig:prep:detection:linear-approximation} je znázorněna závislost minima energie $E_\text{min}[k]$ pro různá místa ($k$) konvolučně zkresleného a zašuměného signálu, jehož část obsahuje čárový kód. Lze vidět, že pro fragmenty sestavené ze vzorků náležící čárovému kódu vykazuje minimum energie $E_\text{min}[k]$ výrazné špičky.

Při detekci čárového kódu je zvolen určitý \emph{práh detekce} $E_{\text{min}_\text{thr}}$. Pokud minimum energie $E_\text{min}[k]$ práh detekce překročí, je v signálu čárový kód považován za přítomný. První a poslední překročení prahu vymezuje začátek a konec \emph{vnitřní části} čárového kódu (obr.~\ref{fig:prep:detection:principle}). Doplněním vnitřní části o úsek jí předcházející (\emph{prefix}) a následující (\emph{sufix}) je obdržena část, která obsahuje celý čárový kód.

Z obr.~\ref{fig:prep:detection:linear-approximation} je zřejmé, že existují místa ve vstupním signálu $y_\text{lf}[k]$, pro než nabývá minimum energie $E_\text{min}[k]$ nízkých hodnot (méně než vhodně zvolený práh detekce $E_{\text{min}_\text{thr}}$). Aby při detekci nebyla tato místa považována za konec čárového kódu, je zavedena tzv. \emph{doba udržení} (ve zdrojových kódech označována jako \en{holdon}). Doba udržení udává maximální šířku místa ve vstupním signálu, pro nějž minimum energie $E_\text{min}[k]$ nesmí překročit práh detekce $E_{\text{min}_\text{thr}}$, aby konec čárového kódu byl považován za nalezený.

Pro snížení výpočetní náročnosti je vhodné minimum energie $E_\text{min}[k]$ určovat pouze pro vybrané hodnoty $k$, rozestup mezi je označen jako \emph{posun} (viz obr.~\ref{fig:prep:detection:principle}).

Vlivem konvolučního zkreslení je začátek a konec signálu obsahujícího čárový kód prolnut s okolím, kde se již čárový kód nenachází. Pro vnitřní část signálu signálu je typické, že toto prolnutí zde prakticky již nezasahuje (a proto vnitřní část bude použita pro odhad stejnosměrného přenosu \zk{zkPSF}).

Přidáním sufixu a prefixu je zajištěno, že okrajové části signálu stále obsahující čárový kód nebudou odstraněny (pro následující odstranění stejnosměrného driftu je navíc vyžadováno, aby do začátku a konce signálu již čárový kód nezasahoval).

\section{Odstranění stejnosměrného driftu}
\label{sec:prep:drift-removal}
Prvním krokem v odstranění stejnosměrného driftu je jeho extrakce ze signálu (obr.~\ref{fig:prep:drift-removal:drift-extraction}).

\fig{img/drift-extraction}{Extrakce stejnosměrného driftu}{fig:prep:drift-removal:drift-extraction}{1}

Drift je ze signálu extrahován jako lineární funkce, představující úsečku sestrojenou mezi začátkem a koncem signálu obsahujícího čárový kód. Pro zlepšení odolnosti proti šumu je vhodné koncové body určit průměrováním několika sousedních bodů.

\section{Odhad stejnosměrného přenosu PSF}
\label{sec:prep:K-0-estimation}
Odhad stejnosměrného přenosu $K_0$ \zk{zkPSF} je založen na specifických vlastnostech dvouúrovňového signálu. Odhad je prováděn na signálu, z něhož byl stejnosměrný drift již odstraněn.

\subsection{Metoda lokálních extrémů}
Stejnosměrný přenos \zk{zkPSF} obecně nelze zjistit měřením rozkmitu zkresleného signálu, neboť konvoluční zkreslení rozkmit snižuje (viz \ref{fig:theory:convolution-distortion}). Z obr.~\ref{fig:intro:bbce-barcode-analog-output} lze vypozorovat, že výrazná lokální minima jsou zvýšena o přibližně stejnou úroveň jako jsou snížena výrazná lokální maxima.

Stejnosměrný přenos \zk{zkPSF} lze určit jako součet úrovně výrazných lokálních minim s úrovní výrazných lokálním maxim.  Funkčnost metody závisí na druhu symboliky čárového kódu.

\subsection{Metoda střední hodnoty}
\label{sec:prep:K-0-estimation:mean}
U určitých symbolik čárového kódu platí, že střední hodnota nezkresleného signálu ($c_r(t)$ nebo $c(t)$) se blíží $\ifrac{1}{2}$ (součet šířek proužků a mezer je přibližně stejný). Stejnosměrný přenos \zk{zkPSF} lze proto odhadnout jako dvojnásobek střední hodnoty zkresleného (a navzorkovaného) signálu $y[k]$.

Do výpočtu střední hodnoty nesmí být zahrnut prázdný prostor před a za čárovým kódem (jinak je přesnost odhadu degradována). Proto do výpočtu vstupuje pouze vnitřní část čárového kódu (kap.~\ref{sec:prep:detection}).

\section{Odhad šířky PSF}
\label{sec:prep:sigma-estimation}
Pro odhad šířky $\sigma$ \zk{zkPSF} byla vyvinuta \emph{metoda derivací}, jež srovnává strmost hran a amplitudu zkresleného signálu.

\subsection{Odvození}
Vzorec pro odhad bude odvozen pro spojité signály a vychází z modelu \eqref{eq:theory:psf-uncertainity:model}.

Nechť se čárový kód skládá z jedné hrany (náběžné nebo sestupné, $p = 1$ nebo $p = -1$),
\begin{align}
	c(t) = pU(t),	\quad p \in \{-1, 1\}
\end{align}
aplikací konvolučního zkreslení je obdržen integrál \zk{zkPSF}, kterou lze z integrálu extrahovat derivací,
\begin{align}
			y_\text{smooth}(t)				&= (pU \star h)(t) = p\int_{-\infty}^t{}h(\tau)\,\dif\tau = p\int_{-\infty}^t{}K_0\cdot\frac{h_0\left(\frac{\tau}{\sigma}\right)}{\sigma}\,\dif\tau	\Rightarrow\cr
	\Rightarrow	\frac{\dif{}y_\text{smooth}(t)}{\dif{}t}	&= pK_0\frac{h_0\left(\frac{t}{\sigma}\right)}{\sigma},
\end{align}
přičemž \zk{zkPSF} $h(t)$ je vyjádřena pomocí referenční \zk{zkPSF} $h_0(t)$ (viz \eqref{eq:theory:psf-uncertainity:model}). Maximum velikosti derivace konvolučně zkresleného signálu je nepřímo úměrné šířce \zk{zkPSF},
\begin{align}
	\max\left\{\left|\frac{\dif{}y_\text{smooth}(t)}{\dif{}t}\right|\right\} = K_0\frac{\max\left\{h_0(t)\right\}}{\sigma}.	\label{eq:prep:width:max-dy}
\end{align}
Stejnosměrný přenos $K_0$ lze odhadnout pomocí maxima konvolučně zkresleného signálu,
\begin{align}
	K_0 \approx \max\left\{y_\text{smooth}(t)\right\},	\label{eq:prep:width:K-0}
\end{align}
čímž pochopitelně vznikne určitá chyba, které však bude využito.

Vyjádřením $\sigma$ z \eqref{eq:prep:width:max-dy} a dosazením \eqref{eq:prep:width:K-0} vznikne vzorec pro výpočet odhadu šířky \zk{zkPSF}
\begin{align}
	\hat{\sigma}_\text{smooth} \approx \frac{\max\left\{y_\text{smooth}(t)\right\}\cdot\max\left\{h_0(t)\right\}}{\max\left\{\left|\frac{\dif{}y_\text{smooth}(t)}{\dif{}t}\right|\right\}}.	\label{eq:prep:width:formula}
\end{align}

S rostoucí šířkou \zk{zkPSF} dochází v konvolučně zkresleném signálu k prolínání hran, čímž se neúměrně snižuje jejich strmost. Současně však dochází k poklesu amplitudy signálu. Tyto dva jevy se ve vzorci \eqref{eq:prep:width:formula} částečně kompenzují, a tak je zmírněna ztráta přesnosti odhadu.

Dolní index \uv{smooth} značí, že na místo signálu $y_\text{smooth}(t)$ je třeba při praktickém použití dosadit \emph{vyhlazený} zkreslený signál $y(t)$. Vyhlazením je nezbytné pro zajištění odolnosti proti šumu, neboť se ve výpočtu vyskytuje derivace signálu.

Vyhlazení signálu lze provést dolní propustí, což s sebou přináší rozšíření \zk{zkPSF}. Byla-li původní \zk{zkPSF} i impulzní odezva dolní propusti gaussovská, je rozšířená \zk{zkPSF} rovněž gaussovská. Vliv dolní propusti na odhad šířky \zk{zkPSF} lze korigovat následujícím vzorcem,
\begin{align}
	\hat{\sigma}_\text{smooth} = \hat{\sigma}^2 + \hat{\sigma}_\text{filt}^2	\quad\Leftrightarrow\quad	\hat{\sigma} = \sqrt{\hat{\sigma}_\text{smooth}^2 - \sigma_\text{filt}^2},	\label{eq:prep:width:smoothing-correction}
\end{align}
kde $\hat{\sigma}$ je korigovaný odhad a $\sigma_\text{filt}$ je rozptyl impulzní odezvy dolní propusti.

\subsection{Ukázka použití}
Pro odhad šířky \zk{zkPSF} ze zkresleného diskrétního signálu lze modifikací \eqref{eq:prep:width:formula} získat vzorec
\begin{align}
	\hat{\sigma}_\text{smooth} = \frac{\max\{y[k]\}\cdot\max\{h_0(t)\}}{\max\left\{\left|(\Delta{}y_\text{smooth})[k]\right|\right\}},	\label{eq:prep:width:formula-discrete}
\end{align}
kde diference (značená symbolem $\Delta$) nahradila derivaci. Spojitá referenční \zk{zkPSF} $h_0(t)$ nijak nenarušuje práci s diskrétními signály, neboť vzorec vyžaduje znalost pouze její jedné diskrétní hodnoty -- maxima.

Jelikož vzorec \eqref{eq:prep:width:formula-discrete} obsahuje (výše zmíněná) zjednodušení, byla jeho přesnost ověřena pro různé šířky \zk{zkPSF}, přičemž pro každou bylo vygenerováno $1000$ čárových kódů nesoucích náhodný řetězec o šesti číslicích, zakódovaný symbolikou prokládaného kódu 2 z 5\footnote{Prokládaný kód 2 z 5 je určen pro zaznamenání řetězce skládajícího se ze sudého počtu číslic. Každá dvojice číslic je kódována jako vzájemně proložená posloupnost pěti proužků (nesoucí první číslici) a pěti mezer (nesoucí druhou číslici). Číslice je kódována jako různá posloupnost šířek (dva z proužků nebo mezer jsou vždy široké, zbývající tři úzké). Na začátek čárového kódu je přidána posloupnost úzký proužek, úzká mezera, úzký proužek, úzká mezera. Čárový kód je zakončen posloupností široký proužek, úzká mezera, úzký proužek.}. Závislost odhadnuté šířky $\hat{\sigma}$ (po korekci vlivu vyhlazovacího filtru) je na obr.~\ref{fig:prep:width:test}.

\fig{sim/psf-estimation}{Závislost odhadnuté šířky PSF na skutečné šířce}{fig:prep:width:test}{1}
