This example shows an orthogonal space-time block code (OSTBC) concatenated with trellis-coded modulation (TCM) for information transmission over a multiple-input multiple-output (MIMO) channel with 2 transmit antennas and 1 receive antenna. The example uses communications System objects to simulate this system.
OSTBCs [ 1 ], [ 2 ] are an attractive technique for MIMO wireless communications. They exploit full spatial diversity order and enjoy symbol-wise maximum likelihood (ML) decoding. However, they offer no coding gain. The combiner for OSTBC at the receiver side provides soft information of the transmitted symbols, which can be utilized for decoding or demodulation of an outer code.
TCM [ 3 ] is a bandwidth efficient scheme that integrates coding and modulation to provide a large coding gain. Concatenating TCM with an inner code will usually offer an improved performance.
This example illustrates the advantages of an OSTBC and TCM concatenation scheme: the spatial diversity gain offered by OSTBC and the coding gain offered by TCM. For comparison, two reference systems containing only TCM or OSTBC are also provided. The diversity and coding gains of the concatenation scheme over the reference models can be clearly observed from the simulation results. More discussions about concatenating OSTBC and TCM can be found in, for example, [ 4 ], [ 5 ] and references therein.
% Trellis structure of the TCM modulator trellis = poly2trellis([2, 3], [1, 2, 0; 4, 1, 2]); % Create System objects of the concatenated OSTBC system and set simulation % parameters such as SNR and frame length. configureTCMOSTBCDemo
The PSK TCM modulator System object modulates the random message data to a PSK constellation that has unit average energy. The TrellisStructure property accepts a MATLAB structure to specify the trellis of the TCM. The ModulationOrder property specifies the size of the PSK constellation. This example uses the Ungerboeck TCM scheme for 8-PSK constellation with 8 trellis states [ 3 ], and sets the corresponding TrellisStructure property to the result of poly2trellis([2 3], [1 2 0; 4 1 2]). This object has an output length of 50, as every two input bits produce one symbol.
The PSK TCM demodulator System object uses the Viterbi algorithm for TCM to decode the signals from the OSTBC combiner. The example sets the TerminationMethod property to 'Truncated'; therefore treats each frame independently. The example also sets the TracebackDepth property to 30, which compared to the constraint length of the TCM, is long enough to ensure an almost lossless performance.
hMod = comm.PSKTCMModulator(trellis, ... 'TerminationMethod', 'Truncated')
hMod = System: comm.PSKTCMModulator Properties: TrellisStructure: [1x1 struct] TerminationMethod: 'Truncated' ModulationOrder: 8 OutputDataType: 'double'
hDemod = comm.PSKTCMDemodulator(trellis, ... 'TerminationMethod', 'Truncated', ... 'TracebackDepth', 30, ... 'OutputDataType', 'logical')
hDemod = System: comm.PSKTCMDemodulator Properties: TrellisStructure: [1x1 struct] TerminationMethod: 'Truncated' TracebackDepth: 30 ModulationOrder: 8 OutputDataType: 'logical'
The OSTBC encoder System object encodes the information symbols from the TCM Encoder by using the Alamouti code [ 1 ] for 2 transmit antennas. The output of this object is a 50x2 matrix, where entries on each column correspond to the data transmitted from one antenna.
The OSTBC combiner System object uses a single antenna and decodes the received signal utilizing the channel state information (CSI). The output of the step method of this object represents the estimates of the transmitted symbols, which are then fed into the PSK TCM demodulator. In this example, the CSI is assumed perfectly known at the receiver side.
hAlamoutiEnc = comm.OSTBCEncoder; hAlamoutiDec = comm.OSTBCCombiner;
The 2x1 MIMO fading channel System object simulates the spatially independent flat Rayleigh fading channel from the 2 transmit antennas to the 1 receive antenna.
The example sets the maximumDopplerShift property of the channel object to 30. The reason for using this value is to make the MIMO channel behave like a quasi-static fading channel, i.e., it keeps constant during one frame transmission and varies along multiple frames. The example sets the PathGainsOutputPort property to true to use the channel path gain values as perfect estimates of CSI. The example also sets the RandomStream property to 'mt19937ar with seed' so that the object uses a self-contained random number generator to generate repeatable channel coefficients. The 2x1 MIMO channel has normalized path gains.
hChan = comm.MIMOChannel(... 'SampleRate', 1/Tsamp, ... 'MaximumDopplerShift', maxDopp, ... 'SpatialCorrelation', false, ... 'NumReceiveAntennas', 1, ... 'RandomStream', 'mt19937ar with seed', ... 'PathGainsOutputPort', true)
hChan = System: comm.MIMOChannel Properties: SampleRate: 187500 PathDelays: 0 AveragePathGains: 0 NormalizePathGains: true FadingDistribution: 'Rayleigh' MaximumDopplerShift: 30 DopplerSpectrum: [1x1 struct] SpatialCorrelation: false NumTransmitAntennas: 2 NumReceiveAntennas: 1 AntennaSelection: 'Off' NormalizeChannelOutputs: true RandomStream: 'mt19937ar with seed' Seed: 73 PathGainsOutputPort: true
This section of the code calls the processing loop for a concatenated OSTBC system. The main loop processes the data frame-by-frame, where the transmitter modulates the random data using an 8-PSK TCM modulator and then applies Alamouti coding. The two transmitted signals from the OSTBC encoder pass through the 2x1 MIMO Rayleigh fading channel and are also impaired by AWGN. The OSTBC combiner uses one receive antenna and provides soft inputs to the 8-PSK TCM demodulator. The example compares the output of the demodulator with the generated random data to obtain frame error rate (FER).
fer = zeros(3,1); while (fer(3) < maxNumFrms) && (fer(2) < maxNumErrs) data = logical(randi([0 1], frameLen, 1)); % Generate data modData = step(hMod, data); % Modulate txSignal = step(hAlamoutiEnc, modData); % Apply Alamouti coding [chanOut, chanEst] = step(hChan, txSignal); % 2x1 fading channel rxSignal = step(hAWGN, chanOut); % Add receiver noise modDataRx = step(hAlamoutiDec, rxSignal, ... squeeze(chanEst)); % Decode dataRx = step(hDemod, modDataRx); % Demodulate frameErr = any(dataRx - data); % Check frame error fer = step(hFERData, false, frameErr); % Update frame error rate end
The step method of the error rate measurement System object, hFERData, outputs a 3-by-1 vector containing updates of the measured FER value, the number of errors, and the total number of frame transmissions. Display FER values.
frameErrorRate = fer(1)
frameErrorRate = 0.1481
This section of the example simulates the TCM in the previous concatenation scheme over a single-input single-output (SISO) flat Rayleigh fading channel, without space-time coding. The fading channel has the same specification as one subchannel of the 2x1 MIMO fading channel in the previous system. So this section of the example sets the NumTransmitAntennas property of the fading channel System object to 1 after releasing it. This section of the example also sets the SignalPower property of the AWGN channel System object to 1, as there is only one symbol transmitted per symbol period.
Initialize the processing loop
release(hChan); hChan.NumTransmitAntennas = 1; hAWGN.SignalPower = 1; reset(hFERData) fer = zeros(3,1);
Stream Processing Loop
while (fer(3) < maxNumFrms) && (fer(2) < maxNumErrs) data = logical(randi([0 1], frameLen, 1)); % Generate data modData = step(hMod, data); % Modulate [chanOut, chanEst] = step(hChan, modData); % SISO fading channel rxSignal = step(hAWGN, chanOut); % Add receiver noise modDataRx = (rxSignal.*conj(chanEst)) / ... (chanEst'*chanEst); % Equalize dataRx = step(hDemod, modDataRx); % Demodulate frameErr = any(dataRx - data); % Check frame error fer = step(hFERData, false, frameErr); % Update frame error rate end
This section of the example replaces the TCM in the previous concatenation scheme by a QPSK modulation so that both systems have the same symbol (frame) rate. It uses the same 2x1 flat Rayleigh fading channel as in the TCM-OSTBC concatenation model. The QPSK modulator System object, hQPSKMod, maps the information bits to a QPSK constellation and the QPSK demodulator System object, hQPSKDemod, demodulates the signals from the OSTBC Combiner.
Initialize the processing loop
release(hChan); hChan.NumTransmitAntennas = 2; hAWGN.SignalPower = 2; reset(hFERData) fer = zeros(3,1);
Stream Processing Loop
while (fer(3) < maxNumFrms) && (fer(2) < maxNumErrs) data = logical(randi([0 1], frameLen, 1)); % Generate data modData = step(hQPSKMod, data); % Modulate txSignal = step(hAlamoutiEnc, modData); % Apply Alamouti coding [chanOut, chanEst] = step(hChan, txSignal); % 2x1 fading channel rxSignal = step(hAWGN, chanOut); % Add receiver noise modDataRx = step(hAlamoutiDec, rxSignal, ... squeeze(chanEst)); % Decode dataRx = step(hQPSKDemod, modDataRx); % Demodulate frameErr = any(dataRx - data); % Check frame error fer = step(hFERData, false, frameErr); % Update frame error rate end
You can add a for-loop around the previous processing loops to run simulations for a set of SNR values. Simulations were run offline for SNR values of (10:2:24) dB, target number of errors equal to 1000, and maximum number of transmissions equal to 5e6. The following figure shows the results from this simulation.
This example utilized several System objects to simulate a concatenated OSTBC with TCM over a 2x1 flat Rayleigh fading channel. This base system was modified to model a TCM system over a SISO flat fading channel and an OSTBC system over the same 2x1 flat Rayleigh fading channel. System performance was measured using the FER curves obtained with the error rate measurement System object. This example showed that the concatenation scheme provides a significant diversity gain over the TCM scheme and about 2dB coding gain over the Alamouti code.
This example uses the following script and helper function:
S. M. Alamouti, "A simple transmit diversity technique for wireless communications," IEEE Journal on Selected Areas in Communications, vol. 16, no. 8, pp. 1451-1458, Oct. 1998.
V. Tarokh, H. Jafarkhami, and A. R. Calderbank, "Space-time block codes from orthogonal designs," IEEE Transactions on Information Theory, vol. 45, no. 5, pp. 1456-1467, Jul. 1999.
G. Ungerboeck, "Channel coding with multilevel/phase signals," IEEE Transactions on Information Theory, vol. IT-28, no. 1, pp. 55?67, Jan. 1982.
S. M. Alamouti, V. Tarokh, and P. Poon, "Trellis-coded modulation and transmit diversity: Design criteria and performance evaluation," in Proceedings of IEEE International Conference on Universal Personal Communications (ICUPC'98), Florence, Italy, vol. 1, Oct. 5-9, 1998, pp. 703-707.
Y. Gong and K. B. Letaief, "Concatenated space-time block coding with trellis coded modulation in fading channels," IEEE Transactions on Wireless Communications, vol. 1, no. 4, pp. 580-590, Oct. 2002.