Skip to content

Commit

Permalink
Kramdown, again. Using nomarkdown tags.
Browse files Browse the repository at this point in the history
  • Loading branch information
bemasher committed Aug 18, 2016
1 parent 8a9045a commit a23d0b5
Showing 1 changed file with 10 additions and 10 deletions.
20 changes: 10 additions & 10 deletions docs/signal.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,54 +21,54 @@ The ERT protocol is an on-off keyed manchester-coded signal transmitted at bit-r

The signal is made up of interleaved in-phase and quadrature samples, 8-bits per component. The amplitude of each sample is:

<span>
{::nomarkdown}
\$\$\vert z\vert = \sqrt{\Re(z)^2 + \Im(z)^2}\$\$
</span>
{::/nomarkdown}

To meet performance requirements the magnitude computation has two implementations. The first uses a pre-computed lookup table which maps all possible 8-bit values to their floating-point squares. Calculating the magnitude using the lookup table then only involves two lookups, one addition and one square-root.

The second implementation is an approximation known as Alpha-Max plus Beta-Min whose efficiency comes from eliminating the square root operation:

<span>
{::nomarkdown}
\$\$
\begin{aligned}
&\alpha = \frac{2\cos\frac{\pi}{8}}{1+cos\frac{\pi}{8}} \qquad \beta = \frac{2\sin\frac{\pi}{8}}{1+cos\frac{\pi}{8}} \\ \\
\vert z\vert \approx \,&\alpha\cdot\max(\Re(z),\Im(z)) + \beta\cdot\min(\Re(z),\Im(z))
\end{aligned}
\$\$
</span>
{::/nomarkdown}

## Filtering
***

Filtering is required for later bit decision. The ideal filter kernel for a square-wave signal is known as a boxcar and is essentially a moving average. Due to the signal being manchester coded the ideal filter is a step function. Manchester coding mixes data with a clock signal to allow for synchronization and clock recovery while decoding as well as reducing any DC offset that would be present due to content of the data. The symbol length [[N]] is determined by the sampling rate [[F_s]] of the receiver and the data rate [[R]] of the signal.

<span>
{::nomarkdown}
\$\$N = \frac{F_s}{R}\$\$
</span>
{::/nomarkdown}

The maximum sample rate without any sample loss is between 2.4 and 2.56 MHz. To simplify decoding we determine the sample rate from integral symbol lengths. From librtlsdr, the sample rate must satisfy one of two conditions:

<span>
{::nomarkdown}
\$\$
\begin{aligned}
225\text{kHz} \lt \, &F_s \le 300\text{kHz} \\
900\text{kHz} \lt \, &F_s \le 3.2\text{MHz} \\
\end{aligned}
\$\$
</span>
{::/nomarkdown}

From this we can determine all of the valid symbol lengths and their corresponding sample rates. More info [here](https://github.com/bemasher/rtlamr/blob/master/help.md). Filtering can be implemented efficiently by computing the cumulative sum of each sample block and calculating the difference between a pair of subtractions:

<span>
{::nomarkdown}
\$\$
\begin{aligned}
\mathbf{M}_i &= \sum_{j=i}^{i+N} \mathbf{S}_j - \mathbf{S}_{j+N} \\ \\
&= (\mathbf{C}_{i+N} - \mathbf{C}_i) - (\mathbf{C}_{i+2N} - \mathbf{C}_{i+N}) \\ \\
&= 2\mathbf{C}_{i+N}-\mathbf{C}_{i+2 N}-\mathbf{C}_i
\end{aligned}
\$\$
</span>
{::/nomarkdown}

Where [[\mathbf{M}]] is the filtered signal, [[\mathbf{S}]] is the sample vector, [[N]] is the symbol length and [[\mathbf{C}]] is the cumulative or prefix sum of the signal.

Expand Down

0 comments on commit a23d0b5

Please sign in to comment.