Each block undergoes a
constellation mapping , where segments of bits (length B) are represented as single complex values in a constellation.
The mapped blocks are
mirrored to give them conjugate symmetry (which increases their lengths to
2N/B ), then the IFFT of each block is taken.
A
cyclic prefix (length
C ) is inserted at the beginning of each block to combat problems introduced by the channel.
The blocks (now known as
symbols ) are
concatenated to form a length
S(2N/B+C) time domain signal, which is transmitted into the
channel .
On the other side of the
channel , the received signal is again
broken up into
S parallel blocks.
The
cyclic prefixes are removed, the FFT of each block is taken and each is
de-mirrored so that the block length is once again
N/B .
Because the channel filtered the time domain signal and added noise, each block is
equalized through multiplication by the inverse transfer function of the channel (which is known by the receiver).
The complex numbers in each block, which have been distorted by noise, are
approximated by values in the original constellation. A de-constellation mapping then occurs, which converts the complex values back to bits and increases the block length back to
N .
The blocks of bits are
concatenated back into a single bitstream, which then undergoes a
D/A conversion back to a sampled analog signal. This is an approximation of the original signal.
Implementation
We implemented our DMT system through a collection of MATLAB functions. Some of them, such as the IFFT and FFT, were standard built-in functions while others, such as the constellation mapping and approximation routines, were coded from scratch. We directed the use of each function with a separate script,
run.m , which allowed us to easily change input parameters. The MATLAB code for each function can be found below: