Later edit: source code added here: https://github.com/BogdanDIA/gr-dvbt
In the previous post I presented the results when using the gnuradio DVB-T transmitter together with the RTL2832U Elonics receiver. Now I’m going to dig into more technical details regarding the actual implementation of the DVB-T standard and I will insist less on transmitter side and more on the receiver side. The standard is defined in ETSI 300 744 and beside that there is doxygen documentation provided with the gnuradio modules.
TX and how to get on the air:
The chain of the transmitter is like the one described in the image below (taken from ETSI):
This is how the GNUradio implementation is done using gnuradio-companion. The majority of the blocks is implemented as new GR blocks as nothing that already exists in GR is fitting into this standard:
It worth talking about each module so here it is:
In order to disperse the energy in the MPEG2-TS source, this block does a xor of the actual data with the output of the PRBS generator. It also creates MUX frames composed of 8 MUX packets of 188bytes. The sync is done by replacing the 0x47 sync byte with 0xb8 at the beginning of the MUX frame.
Outer coder (Reed-Solomon):
Implements RS(188, 204) encoding with t=8 error correcting capability.
The whole point of using an outer coder+interleaver+inner coder is to generate a long codeword.
The inner interleaver is of Ramsey type III (TODO add IEEE paper link here).
This is a convolutional encoder with mother code 1/2 and puncturing rate so that will obtain 2/3, 3/4, 5/6, 7/8 rates.
The inner interleaver is made of symbol interleaver and bitwise interleaver. The result should be prepared for mapping of number of bits to the constellation according to the used modulation type.
Maps the bits to a constellation and this depends not only on the type of modulation but also on whether the hierarchical modulation is used.
Reference signals block:
In order to support the synchronization and equalization at the receiver side, the standard adds three types of pilots: continual pilots, scattered pilots and TPS. Actually TPS (Transmission Parameter Signalling) is a way to send over the transmission parameters and this is done using differential modulation that is immune to phase rotations. Decoding of TPS is the first thing to do at receiver after an initial synchronization.
The COFDM (Coded OFDM) modulation used in DVB-T is creating frequency domain bins and the do an I-FFT to convert them to time domain. 2k, 8k and 4k FFT size can be used.
In order to prevent ISI, ICI in the SFN(single frequency networks) that are usually employed in the DVB-T implementations, a cyclip prefix (CP) of various sizes is used. It consist in copying of the last part of the time domain signal to the beginning of the signal. The fact that the signal becomes periodic helps in synchronizing at the receiver and many algorithms for time and frequency correction are based on CP.
The USRP N210 I’m using as receiver and transmitter has a clock of 100Mhz. Unfortunately, in DVB-T the clock at which the samples are out are at 9.14xxMsps/s and for that we need a resampler. This proved to be the most time consuming block (taken from GR) and probably it needs to be rewritten with another one in the future. I also noted that group delay is having variations so it needs to be investigated.
Processing power when running the transmitter:
I’m using a core i7 processor with 4 HT and 3.4Ghz frequency which consumes on transmitting 170% resources (less than 2 HT cores). This is where the things become interesting as long as there are a lot of improvements to do, e.g. using VOLK, do some calculations at init time with a trade-off between memory and processing. But this should be a chapter for itself at the end.
Finally, I attach a screenshot that shows the constellation and the FFT at tha baseband. Given the fact that the points in the WXwidget are so small I used the options to show the constellation with connected points, hope you like it 🙂
That’s all folks about DVB-T transmitter. Next post: the DVB-T receiver.
73, Bogdan – YO3IIU