I implemented a differential STBC as another useful MIMO scheme for GNU Radio.

As in SISO systems, a differential modulation makes the presence of CSI at the receiver redundant. The price we are paying for this enormous simplification of the receiver is a loss of approximately 3dB in SNR.

The algorithm of this implementation follows [1]. Basically this is the Alamouti STBC which is expanded about its differential feature. The rough idea of this algorithm is as follows:

**Transform**each input sequences (= a pair of complex input samples) from the standard basis {(1 0), (0 1)}**to a new orthonormal basis**{(*a b*), (*-b* a**)} where*a*and*b*are normalized PSK constellation points (like the input samples). The input sequences can be identified by two weighting coefficients*A*and*B*which describe the proportion of each basis vector to the sequence.*A*and*B*can be calculated over a dot product of the input sequence with the basis vectors.**Differentially encode**the transformed input sequences and distribute the resulting output sequence among the 2 antennas. The differential operation can be done by a complex multiplication.- Use
**Alamouti’s scheme**to produce an orthogonal sequence to the generated output sequence which is appended to the output sequence. Summarizing, one input sequence of 2 complex samples results in one output sequence of 2 complex samples at each of the 2 antennas, respectively. This equals a code rate of r=1.

**Implementation**

Before we implement the described algorithm into a GNU Radio block, we have to answer 2 fundamental design questions:

**Which type of input samples are valid?**

→ Generally, the algorithm qualifies a complex PSK constellation of any constellation order as valid input. The encoder does not even has to know the modulation order, because it has now effect on the algorithm.

But however, the encoder and decoder need at least one input sample to generate a valid basis vector. While the encoder could just grab the first two incoming samples and set them to be the basis vector, the decoder initially has no such input samples. We know, that the normalized constellation points are located on the unit circle of the complex plane. The only missing information for the generation of a valid sample is therefore its phase. This information has to be provided to the encoder block from remote in form of an input argument.*‘phase_offset’*describes this phase shift related to the real axis and is fed to the encoder block as an input argument.**Is a synchronous data stream possible?**

(Or: Can we use a GNU Radio ‘sync’ block?)

→The differential scheme does not allow a direct mapping of a single input data sequence to an encoded sequence and of a received data sequence to the decoded data sequence.

To encode a sequence, we need the current input sequence as well as the previously encoded sequence. We are therefore producing one sequence for each consumed sequence (that is a sync block after definition), but we need memory of one sequence. This predecessor is defined for all sequences except the very first one. For this first sequence, we define a random ‘dummy’ sequence (in this implementation this sequence equals the defined basis vector). This makes the**encoder practically a sync block**although the very first transmitted sequence does not contain any useful information.

The situation for the decoder is data stream wise similar to the one of the encoder. Despite, I implemented the**decoder with a general block**. This has to reasons:

1.) The use of a ‘dummy’ sequence at the beginning of a reception leads to a wrong decoded first sequence. We don’t want to produce false data at the decoder.

2.) A fully fleshed receiver includes much more than just a MIMO receiver. There are synchronizers for time and frequency synchronization and the data is maybe structured in different data blocks. This leads to very many situations that are equal to a new beginning of a transmission and therefore to the argument of 1.).

To handle this issue, I introduced stream tags to the decoder block, tagging the start of a new data ‘block’ (= integer number of data sequences). When a new block begins, the decoder consumes the first sequence without producing one, only storing the sequence in his memory. For the following sequences of the block, the decoder works data synchronously.

The encoder and decoder block are each validated with extensive QA tests in python. In addition, a loopback flowgraph tests both blocks against each other.

**Outlook**

Looking at the list of milestones for the first phase of GSoC, there is only missing the planned **in-tree top-level documentation**. I am planning to start with the documentation next week, by an introduction to MIMO in general and a description and explanation (tutorial, ‘how to use’) of the already finished MIMO algorithms and blocks.

Luca

[1] V. Tarokh and H. Jafarkhani, ”A differential detection scheme for transmit diversity,” in IEEE Journal on Selected Areas in Communications, vol. 18, no. 7, pp. 1169-1174, July 2000.

You probably meant “extensive” q&a, meaning covering many cases. “Excessive” means essentially “more than necessary”.

LikeLike

Thank you for pointing out that typo.

LikeLike