| ... | ... | @@ -13,7 +13,7 @@ found in the `gr-elen90089` git repo. |
|
|
|
3. [Packet PHY Tx](#packet-phy-tx)
|
|
|
|
- [Header Format CDC](#header-format-cdc)
|
|
|
|
- [CDC Symbol Mapper](#cdc-symbol-mapper)
|
|
|
|
4. [Packet PHY Rx](#packet-phy_rx)
|
|
|
|
4. [Packet PHY Rx](#packet-phy-rx)
|
|
|
|
- [CDC TS Correlator](#cdc-ts-correlator)
|
|
|
|
- [CDC Costas Loop](#cdc-costas-loop)
|
|
|
|
- [CDC Constellation Decoder](#cdc-constellation-decoder)
|
| ... | ... | @@ -41,13 +41,13 @@ demonstrate how to create and configure the link. |
|
|
|
The CDC link is composed of three main functional blocks that implement a single
|
|
|
|
carrier pulse modulation PHY and skeleton MAC layer.
|
|
|
|
|
|
|
|
- [CDC Packet MAC Tx](packet-mac-tx)
|
|
|
|
- [CDC Packet PHY Tx](packet-phy-tx)
|
|
|
|
- [CDC Packet PHY Rx](packet-phy-rx)
|
|
|
|
- [CDC Packet MAC Tx](#packet-mac-tx)
|
|
|
|
- [CDC Packet PHY Tx](#packet-phy-tx)
|
|
|
|
- [CDC Packet PHY Rx](#packet-phy-rx)
|
|
|
|
|
|
|
|
The Tx/Rx PHY blocks are hierarchical blocks composed of standard GNU Radio C++
|
|
|
|
signal processing blocks along with some custom C++ blocks in the `gr-elen90089`
|
|
|
|
OOT. The custom blocks are modified versions of existing GNU Radio block.
|
|
|
|
OOT. The custom blocks are modified versions of existing GNU Radio blocks.
|
|
|
|
|
|
|
|
- [Header Format CDC](#header-format-cdc)
|
|
|
|
- [CDC Symbol Mapper](#cdc-symbol-mapper)
|
| ... | ... | @@ -57,11 +57,12 @@ OOT. The custom blocks are modified versions of existing GNU Radio block. |
|
|
|
|
|
|
|
> **Note**: This page provides a basic overview of individual blocks in the CDC
|
|
|
|
> link. Additional information can be found in documentation of the
|
|
|
|
> `gr-elen90089` OOT. To view this documentation, open a web browser on the
|
|
|
|
> CDC Ubuntu VM and navigate to the following location:
|
|
|
|
> `gr-elen90089` OOT. To view this documentation after building and installing
|
|
|
|
> the OOT, open a web browser on the CDC Ubuntu VM and navigate to the
|
|
|
|
> following location:
|
|
|
|
> [file:///usr/local/share/doc/gr-elen90089/html/index.html]()
|
|
|
|
|
|
|
|
## CDC Packet MAC Tx
|
|
|
|
## Packet MAC Tx
|
|
|
|
|
|
|
|
The *Packet MAC Tx* is implemented as a python block found at the following
|
|
|
|
location:
|
| ... | ... | @@ -89,12 +90,12 @@ These metadata entries will be converted to stream tags within *Packet PHY Tx*. |
|
|
|
The `bps` parameter is then used by downstream blocks to configure the payload
|
|
|
|
modulation constellation (BPSK, QPSK, etc.). The `freq` and `gain` parameters
|
|
|
|
will prompt the bladeRF to update its transmit frequency and gain just prior to
|
|
|
|
transmitting this packet. See bladeRF's
|
|
|
|
transmitting this packet. See `gr-bladeRF-cdc`'s
|
|
|
|
[Stream Tag Interface](stream-tag-interface)
|
|
|
|
for more information on how this process works.
|
|
|
|
|
|
|
|
The *Packet MAC Tx* is a very basic skeleton of a MAC layer which you can
|
|
|
|
update for your particular application.
|
|
|
|
update for your DSA application.
|
|
|
|
|
|
|
|
## Packet PHY Tx
|
|
|
|
|
| ... | ... | @@ -113,9 +114,9 @@ The block has the following configuration parameters. |
|
|
|
The hierarchical block is composed of the following subblock arrangement.
|
|
|
|
|
|
|
|
```
|
|
|
|
pdu > [Async CRC32] > [Protocol Formatter] > [FEC Async Encoder]
|
|
|
|
pdu in > [Async CRC32] > [Protocol Formatter] > [FEC Async Encoder]
|
|
|
|
|
|
|
|
> [CDC Symbol Mapper] > [Burst Shaper] > [Polyphase Arbitrary Resampler] > iq
|
|
|
|
> [CDC Symbol Mapper] > [Burst Shaper] > [Polyphase Arbitrary Resampler] > iq out
|
|
|
|
```
|
|
|
|
|
|
|
|
Functionality for these subblock is as follows.
|
| ... | ... | @@ -135,7 +136,7 @@ independent constellations for the header and payload. See |
|
|
|
[CDC Symbol Mapper](#cdc-symbol-mapper) below.
|
|
|
|
|
|
|
|
**Burst Shaper**: Prepends phasing symbols to the beginning of the transmit
|
|
|
|
burst along with a amplitude ramp up and ramp down. See
|
|
|
|
burst along with an amplitude ramp up and ramp down. See
|
|
|
|
[Burst Shaper](https://wiki.gnuradio.org/index.php/Burst_Shaper).
|
|
|
|
|
|
|
|
**Polyphase Arbitrary Resampler**: upsamples symbol stream and applies RRC
|
| ... | ... | @@ -158,13 +159,14 @@ following fields. |
|
|
|
transmission burst.
|
|
|
|
- counter (16 bits): Packet sequence number incremented for each newly
|
|
|
|
transmitted packet
|
|
|
|
- pkt_len (16 bits): Payload length in number of bytes. Used along with bps by
|
|
|
|
- pktlen (16 bits): Payload length in number of bytes. Used along with bps by
|
|
|
|
receiver to determine how many payload symbols are present in a burst.
|
|
|
|
- bps (8 bits): bits-per-symbol of payload constellation
|
|
|
|
- crc (8 bits): cyclic redundancy check over header fields (counter, pkt_len,
|
|
|
|
- bps (8 bits): Bits-per-symbol of payload constellation
|
|
|
|
- crc (8 bits): Cyclic redundancy check over header fields (counter, pktlen,
|
|
|
|
bps) used by the receiver to check integrity of decoded header
|
|
|
|
|
|
|
|
```
|
|
|
|
# Mapping of fields in CDC Header Format
|
|
|
|
| 0 - 7 | 8 - 15 | 16 - 23 | 24 - 31 |
|
|
|
|
| access code |
|
|
|
|
| access code |
|
| ... | ... | @@ -192,9 +194,9 @@ to be changed on a per packet basis. |
|
|
|
|
|
|
|
## Packet PHY Rx
|
|
|
|
|
|
|
|
The *Packet PHY Rx* block is a GRC hierarchical block that implements packet-
|
|
|
|
based pulse demodulation. The GRC file for this block can be found at the
|
|
|
|
following location.
|
|
|
|
The *Packet PHY Rx* block is a GRC hierarchical block that implements
|
|
|
|
packet-based pulse demodulation. The GRC file for this block can be found
|
|
|
|
at the following location.
|
|
|
|
|
|
|
|
- `./examples/packet_phy_rx.grc`
|
|
|
|
|
| ... | ... | @@ -207,12 +209,12 @@ The block has the following configuration parameters. |
|
|
|
The hierarchical block is composed of the following subblock arrangement.
|
|
|
|
|
|
|
|
```
|
|
|
|
[CDC TS Correlator] > [Mult Tag Value] > [Symbol Sync] > [Header/Payload Demux]
|
|
|
|
iq in > [CDC TS Correlator] > [Mult Tag Value] > [Symbol Sync] > [Header/Payload Demux]
|
|
|
|
|
|
|
|
hdr: > [CDC Costas Loop] > [Constellation Decoder] > [Protocol Parser]
|
|
|
|
hdr > [CDC Costas Loop] > [Constellation Decoder] > [Protocol Parser]
|
|
|
|
|
|
|
|
pld: > [CDC Costas Loop] > [CDC Constellation Decoder] > [FEC Async Decoder]
|
|
|
|
> [Async CRC32] > phy_sdu
|
|
|
|
pld > [CDC Costas Loop] > [CDC Constellation Decoder] > [FEC Async Decoder]
|
|
|
|
> [Async CRC32] > phy_sdu out
|
|
|
|
```
|
|
|
|
|
|
|
|
The first common portion of the receive chain includes the following.
|
| ... | ... | @@ -244,7 +246,8 @@ approach removes any phase ambiguity at the start of each packet burst. See |
|
|
|
[CDC Costas Loop](#cdc-costas-loop) below.
|
|
|
|
|
|
|
|
**Constellation Decoder**: Performs hard decision slicing of the header symbols
|
|
|
|
to the header constellation and then demaps symbols to bits.
|
|
|
|
to the header constellation and then demaps symbols to bits. See
|
|
|
|
[Constellation Decoder](https://wiki.gnuradio.org/index.php?title=Constellation_Decoder).
|
|
|
|
|
|
|
|
**Protocol Parser**: Searches for access code/training sequence within received
|
|
|
|
header bits and parses header fields once found. *Threshold* determines the
|
| ... | ... | @@ -258,13 +261,13 @@ used to determine the phase error of each symbol is updated by `bps` tags found |
|
|
|
in the symbol stream. See [CDC Costas Loop](#cdc-costas-loop) below.
|
|
|
|
|
|
|
|
**CDC Constellation Decoder**: Slices received payload symbols to constellation
|
|
|
|
points where the constellation used is updated by `'bps` tags found in the
|
|
|
|
points where the constellation used is updated by `bps` tags found in the
|
|
|
|
received symbol stream. This is needed to support changing payload modulation
|
|
|
|
on a packet-by-packet basis.
|
|
|
|
|
|
|
|
**FEC Async Decoder**: Dummy FEC decoding of received payload bits. This block
|
|
|
|
is currently present to covert the output format of the *CDC Constellation
|
|
|
|
Decoder* block from soft bits (values between +/-1) to packed bytes. With
|
|
|
|
is currently present to convert the output format of the *CDC Constellation
|
|
|
|
Decoder* block from soft bits (real valued) to packed bytes. With
|
|
|
|
appropriate modifications to the transmitter it could also be used to implement
|
|
|
|
FEC for the payload data.
|
|
|
|
|
| ... | ... | @@ -299,7 +302,7 @@ This block has the following configuration parameters. |
|
|
|
| ------------ | ------------------------------------------------------------- |
|
|
|
|
| symbols | Samples of the modulate training sequence. |
|
|
|
|
| threshold | Normalized correlation value required to declare training sequence found.<br>Values typicially in range [0.0, 1.0] |
|
|
|
|
| mark delay | Offset between peak correlation sample and where output stream is tagged with various parameters. Used to account for delays introduced by the matched filtering performed in the *Symbol Sync* block. |
|
|
|
|
| mark delay | Offset between peak correlation sample and where output stream is tagged with various parameter estimates. Used to account for delays introduced by the matched filtering performed in the *Symbol Sync* block. |
|
|
|
|
|
|
|
|
Once found, this block adds the following tags to the output stream.
|
|
|
|
|
| ... | ... | @@ -307,28 +310,29 @@ Once found, this block adds the following tags to the output stream. |
|
|
|
| ------------ | ------------------------------------------------------------- |
|
|
|
|
| `corr_start` | Marks starting sample of access code in sample stream. |
|
|
|
|
| `corr_est` | Marks starting sample of access code offset by *mark delay*. Value of tag is the normalized correlation result. |
|
|
|
|
| `chan_est` | Inverse LLS channel estimate from training sequence. |
|
|
|
|
| `phase_est` | Hardcoded to zero. This tag is used to reset the phase accumulation of the downstream Costas Loop block. Initial carrier phase offset is included in `chan_est`. |
|
|
|
|
| `time_est` | Estimate of fractional symbol timing offset based on correlation result. This is used to initialize *Symbol Sync's* interpolation at the beginning of each packet. |
|
|
|
|
| `chan_est` | Value of tag is *inverse* LLS channel estimate from training sequence and is used in single-tap equalisation. |
|
|
|
|
| `phase_est` | Value of tag is hardcoded to zero. This tag is used to reset the phase accumulation of the downstream Costas Loop block. Initial carrier phase offset is incorporated in the `chan_est` parameter estimate instead. |
|
|
|
|
| `time_est` | Value of tag is estimate of fractional symbol timing offset based on correlation result. This is used to initialize *Symbol Sync's* interpolation at the beginning of each packet. |
|
|
|
|
|
|
|
|
The channel estimate is a linear least squares (LLS) estimate using the detected
|
|
|
|
training sequence.
|
|
|
|
The channel estimate is a linear least squares (LLS) estimate based on the received
|
|
|
|
training sequence samples.
|
|
|
|
|
|
|
|
```math
|
|
|
|
\hat{h}_\text{LLS} = \frac{t^*}{tt^*} y
|
|
|
|
```
|
|
|
|
|
|
|
|
The value of the $\hat{h}_\text{LLS}$ is inverted in the `chan_est` tag to allow
|
|
|
|
for inversting the channel at the downstream *Multiply by Tag Value* block.
|
|
|
|
The value of $\hat{h}_\text{LLS}$ is inverted in the `chan_est` tag to allow
|
|
|
|
for inverting the channel at the downstream *Multiply by Tag Value* block.
|
|
|
|
|
|
|
|
The fractional symbol timing offset is calculated based on the peak correlation
|
|
|
|
value and its two neighbouring samples.
|
|
|
|
The fractional symbol timing offset of `time_est` is calculated based on the
|
|
|
|
peak correlation value and its two neighbouring samples.
|
|
|
|
|
|
|
|
```math
|
|
|
|
\eta = \frac{R[n-1] + 2*R[n] + 3*R[n+1]}{R[n-1] + R[n] + R[n+1]} - 2
|
|
|
|
\epsilon = \frac{R[n-1] + 2*R[n] + 3*R[n+1]}{R[n-1] + R[n] + R[n+1]} - 2
|
|
|
|
```
|
|
|
|
|
|
|
|
See the block's `work()` method for further algorithmic details.
|
|
|
|
See the block's `work()` method for further algorithmic implementation
|
|
|
|
details.
|
|
|
|
|
|
|
|
### CDC Costas Loop
|
|
|
|
|
| ... | ... | @@ -345,6 +349,9 @@ update the constellation used for determining the current phase error. This is |
|
|
|
only used for payload symbols and allows the payload constellation to be
|
|
|
|
changed on a packet-by-packet basis.
|
|
|
|
|
|
|
|
See [Costas Loop](https://wiki.gnuradio.org/index.php?title=Costas_Loop) for
|
|
|
|
details of the GNU Radio implementation.
|
|
|
|
|
|
|
|
### CDC Constellation Decoder
|
|
|
|
|
|
|
|
<div align="center">
|
| ... | ... | @@ -356,5 +363,13 @@ changed on a packet-by-packet basis. |
|
|
|
The *CDC Constellation Decoder* slices received symbols to constellation points
|
|
|
|
and then maps these points to their corresponding bit values. These bit values
|
|
|
|
can either be soft bits (real valued) or hard bits (0 or 1). The key
|
|
|
|
functionality of this block is that it can adapt the constellation used in
|
|
|
|
functionality of this block is that it can adapt the constellation used for
|
|
|
|
slicing based on `bps` tags encountered in the received symbols stream.
|
|
|
|
|
|
|
|
This block has the following configuration parameters.
|
|
|
|
|
|
|
|
| Parameter | Description |
|
|
|
|
| --------------- | ---------------------------------------- |
|
|
|
|
| Bits per Symb | Sets default symbol constellation used for slicing if no `bps` tag is encountered. |
|
|
|
|
| Soft Decisions | Generate soft (real valued) or hard (0 or 1) bit decisions. |
|
|
|
|
| Length Tag Name | Stream tag indicating start and length a packet's payload symbols. This block will update all tag offsets appropriately based on the bits per symbol of the constellation. | |
|
|
\ No newline at end of file |