This file is indexed.

/usr/share/doc/libitpp-dev/html/mimoconv.html is in libitpp-doc 4.3.1-8.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
  <title>Welcome to IT++!</title>
  <link href="doxygen.css" rel="stylesheet" type="text/css">
  <link href="tabs.css" rel="stylesheet" type="text/css">
  <link rel="shortcut icon" href="favicon.ico">
</head>
<body>
<div style="width: 100%; height: 40px; background-color: #ffff00; border: 1px solid #b0b0b0; margin: 5px 5px 5px 0; padding: 2px;">
  <a href="http://itpp.sourceforge.net"><img src="itpp_logo.png" alt="IT++ Logo" style="float: left; border: 0;"></a>
</div>
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
  initMenu('',true,true,'search.php','Search');
  $(document).ready(function() {
    if ($('.searchresults').length > 0) { searchBox.DOMSearchField().focus(); }
  });
});
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div class="header">
  <div class="headertitle">
<div class="title">MIMO (spatial multiplexing) with convolutional coding </div>  </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><p>This example demonstrates how to use the <code>Modulator_ND</code> (MIMO) class for soft-output demodulation. The program simulates a simple convolutionally coded spatial-multiplexing (V-BLAST style) MIMO system with maximum-likelihood, alternatively zero-forcing, demodulation and soft Viterbi decoding, but no iteration between the demodulator and the decoder.</p>
<div class="fragment"><div class="line"><span class="preprocessor">#include &lt;<a class="code" href="itcomm_8h.html">itpp/itcomm.h</a>&gt;</span></div><div class="line"></div><div class="line"><span class="keyword">using namespace </span><a class="code" href="namespaceitpp.html">itpp</a>;</div><div class="line"><span class="keyword">using namespace </span><a class="code" href="namespacestd.html">std</a>;</div><div class="line"></div><div class="line"></div><div class="line"><span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> **argv)</div><div class="line">{</div><div class="line">  <span class="comment">// -- modulation and channel parameters (taken from command line input) --</span></div><div class="line">  <span class="keywordtype">int</span> nC;                    <span class="comment">// type of constellation  (1=QPSK, 2=16-QAM, 3=64-QAM)</span></div><div class="line">  <span class="keywordtype">int</span> nRx;                   <span class="comment">// number of receive antennas</span></div><div class="line">  <span class="keywordtype">int</span> nTx;                   <span class="comment">// number of transmit antennas</span></div><div class="line">  <span class="keywordtype">int</span> Tc;                    <span class="comment">// coherence time (number of channel vectors with same H)</span></div><div class="line"></div><div class="line">  <span class="keywordflow">if</span> (argc != 5) {</div><div class="line">    cout &lt;&lt; <span class="stringliteral">&quot;Usage: cm nTx nRx nC Tc&quot;</span> &lt;&lt; endl &lt;&lt; <span class="stringliteral">&quot;Example: cm 2 2 1 100000 (2x2 QPSK MIMO on slow fading channel)&quot;</span> &lt;&lt; endl;</div><div class="line">    exit(1);</div><div class="line">  }</div><div class="line">  <span class="keywordflow">else</span> {</div><div class="line">    sscanf(argv[1], <span class="stringliteral">&quot;%i&quot;</span>, &amp;nTx);</div><div class="line">    sscanf(argv[2], <span class="stringliteral">&quot;%i&quot;</span>, &amp;nRx);</div><div class="line">    sscanf(argv[3], <span class="stringliteral">&quot;%i&quot;</span>, &amp;nC);</div><div class="line">    sscanf(argv[4], <span class="stringliteral">&quot;%i&quot;</span>, &amp;Tc);</div><div class="line">  }</div><div class="line"></div><div class="line">  cout &lt;&lt; <span class="stringliteral">&quot;Initializing.. &quot;</span> &lt;&lt; nTx &lt;&lt; <span class="stringliteral">&quot; TX antennas, &quot;</span> &lt;&lt; nRx &lt;&lt; <span class="stringliteral">&quot; RX antennas, &quot;</span></div><div class="line">       &lt;&lt; (1 &lt;&lt; nC) &lt;&lt; <span class="stringliteral">&quot;-PAM per dimension, coherence time &quot;</span> &lt;&lt; Tc &lt;&lt; endl;</div><div class="line"></div><div class="line">  <span class="comment">// -- simulation control parameters --</span></div><div class="line">  <span class="keyword">const</span> vec EbN0db = <span class="stringliteral">&quot;-5:0.5:50&quot;</span>;        <span class="comment">// SNR range</span></div><div class="line">  <span class="keyword">const</span> <span class="keywordtype">int</span> Nmethods = 2;                 <span class="comment">// number of demodulators to try</span></div><div class="line">  <span class="keyword">const</span> <span class="keywordtype">int</span> Nbitsmax = 50000000;  <span class="comment">// maximum number of bits to ever simulate per SNR point</span></div><div class="line">  <span class="keyword">const</span> <span class="keywordtype">int</span> Nu = 1000;                   <span class="comment">// length of data packet (before applying channel coding)</span></div><div class="line"></div><div class="line">  <span class="keywordtype">int</span> Nbers, Nfers;              <span class="comment">// target number of bit/frame errors per SNR point</span></div><div class="line">  <span class="keywordtype">double</span> BERmin, FERmin;         <span class="comment">// BER/FER at which to terminate simulation</span></div><div class="line">  <span class="keywordflow">if</span> (Tc == 1) {         <span class="comment">// Fast fading channel, BER is of primary interest</span></div><div class="line">    BERmin = 0.001;      <span class="comment">// stop simulating a given method if BER&lt;this value</span></div><div class="line">    FERmin = 1.0e-10;    <span class="comment">// stop simulating a given method if FER&lt;this value</span></div><div class="line">    Nbers = 1000;        <span class="comment">// move to next SNR point after counting 1000 bit errors</span></div><div class="line">    Nfers = 200;         <span class="comment">// do not stop on this condition</span></div><div class="line">  }</div><div class="line">  <span class="keywordflow">else</span> {               <span class="comment">// Slow fading channel, FER is of primary interest here</span></div><div class="line">    BERmin = 1.0e-15;    <span class="comment">// stop simulating a given method if BER&lt;this value</span></div><div class="line">    FERmin = 0.01;       <span class="comment">// stop simulating a given method if FER&lt;this value</span></div><div class="line">    Nbers = -1;          <span class="comment">// do not stop on this condition</span></div><div class="line">    Nfers = 200;         <span class="comment">// move to next SNR point after counting 200 frame errors</span></div><div class="line">  }</div><div class="line"></div><div class="line">  <span class="comment">// -- Channel code parameters --</span></div><div class="line">  <a class="code" href="classitpp_1_1Convolutional__Code.html">Convolutional_Code</a> code;</div><div class="line">  ivec generator(3);</div><div class="line">  generator(0) = 0133;  <span class="comment">// use rate 1/3 code</span></div><div class="line">  generator(1) = 0165;</div><div class="line">  generator(2) = 0171;</div><div class="line">  <span class="keywordtype">double</span> rate = 1.0 / 3.0;</div><div class="line">  code.<a class="code" href="classitpp_1_1Convolutional__Code.html#ab8ca18ab14b3b6a1e1a1132f0386c84f">set_generator_polynomials</a>(generator, 7);</div><div class="line">  bvec dummy;</div><div class="line">  code.<a class="code" href="classitpp_1_1Convolutional__Code.html#a47230acfea5aa32cb31e63abca1d222e">encode_tail</a>(<a class="code" href="group__randgen.html#ga5aa06887cf1fd3301b040987924068f0">randb</a>(Nu), dummy);</div><div class="line">  <span class="keyword">const</span> <span class="keywordtype">int</span> Nc = <a class="code" href="group__matrix__functions.html#gae48b61b3a51887969bf508abae267292">length</a>(dummy);      <span class="comment">// find out how long the coded blocks are</span></div><div class="line"></div><div class="line">  <span class="comment">// ============= Initialize ====================================</span></div><div class="line"></div><div class="line">  <span class="keyword">const</span> <span class="keywordtype">int</span> Nctx = (int)(2 * nC * nTx * <a class="code" href="group__convertfunc.html#ga21dd9f813dc0a0342a5d0124b5c2ef33">ceil</a>(<span class="keywordtype">double</span>(Nc) / <span class="keywordtype">double</span>(2 * nC * nTx)));   <span class="comment">// Total number of bits to transmit</span></div><div class="line">  <span class="keyword">const</span> <span class="keywordtype">int</span> Nvec = Nctx / (2 * nC * nTx);    <span class="comment">// Number of channel vectors to transmit</span></div><div class="line">  <span class="keyword">const</span> <span class="keywordtype">int</span> Nbitspvec = 2 * nC * nTx;        <span class="comment">// Number of bits per channel vector</span></div><div class="line"></div><div class="line">  <span class="comment">// initialize MIMO channel with uniform QAM per complex dimension and Gray coding</span></div><div class="line">  <a class="code" href="classitpp_1_1ND__UQAM.html">ND_UQAM</a> chan;</div><div class="line">  chan.<a class="code" href="classitpp_1_1ND__UQAM.html#ae52a188982cb681b069e7d6e985a7d06">set_M</a>(nTx, 1 &lt;&lt; (2*nC));</div><div class="line">  cout &lt;&lt; chan &lt;&lt; endl;</div><div class="line"></div><div class="line">  <span class="comment">// initialize interleaver</span></div><div class="line">  <a class="code" href="classitpp_1_1Sequence__Interleaver.html">Sequence_Interleaver&lt;bin&gt;</a> sequence_interleaver_b(Nctx);</div><div class="line">  <a class="code" href="classitpp_1_1Sequence__Interleaver.html">Sequence_Interleaver&lt;int&gt;</a> sequence_interleaver_i(Nctx);</div><div class="line">  sequence_interleaver_b.randomize_interleaver_sequence();</div><div class="line">  sequence_interleaver_i.set_interleaver_sequence(sequence_interleaver_b.get_interleaver_sequence());</div><div class="line"></div><div class="line">  <span class="comment">//  RNG_randomize();</span></div><div class="line"></div><div class="line">  <a class="code" href="classitpp_1_1Array.html">Array&lt;cvec&gt;</a> Y(Nvec);        <span class="comment">// received data</span></div><div class="line">  <a class="code" href="classitpp_1_1Array.html">Array&lt;cmat&gt;</a> H(Nvec / Tc + 1);   <span class="comment">// channel matrix (new matrix for each coherence interval)</span></div><div class="line"></div><div class="line">  ivec Contflag = <a class="code" href="group__specmat.html#ga9130bbac7072b9e18edee4051907a760">ones_i</a>(Nmethods);   <span class="comment">// flag to determine whether to run a given demodulator</span></div><div class="line">  <span class="keywordflow">if</span> (<a class="code" href="group__logexpfunc.html#ga0c42d158b1f623f9b72c1ccde7e2fd09">pow</a>(2.0, nC*2.0*nTx) &gt; 256) {   <span class="comment">// ML decoder too complex..</span></div><div class="line">    Contflag(1) = 0;</div><div class="line">  }</div><div class="line">  <span class="keywordflow">if</span> (nTx &gt; nRx) {</div><div class="line">    Contflag(0) = 0;                  <span class="comment">// ZF not for underdetermined systems</span></div><div class="line">  }</div><div class="line">  cout &lt;&lt; <span class="stringliteral">&quot;Running methods: &quot;</span> &lt;&lt; Contflag &lt;&lt; endl;</div><div class="line"></div><div class="line">  cout.setf(ios::fixed, ios::floatfield);</div><div class="line">  cout.setf(ios::showpoint);</div><div class="line">  cout.precision(5);</div><div class="line"></div><div class="line">  <span class="comment">// ================== Run simulation =======================</span></div><div class="line">  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> nsnr = 0; nsnr &lt; <a class="code" href="group__matrix__functions.html#gae48b61b3a51887969bf508abae267292">length</a>(EbN0db); nsnr++) {</div><div class="line">    <span class="keyword">const</span> <span class="keywordtype">double</span> Eb = 1.0; <span class="comment">// transmitted energy per information bit</span></div><div class="line">    <span class="keyword">const</span> <span class="keywordtype">double</span> N0 = <a class="code" href="group__logexpfunc.html#ga9a4a3d1188d2ec6a6815c237bd3ab2cc">inv_dB</a>(-EbN0db(nsnr));</div><div class="line">    <span class="keyword">const</span> <span class="keywordtype">double</span> sigma2 = N0; <span class="comment">// Variance of each scalar complex noise sample</span></div><div class="line">    <span class="keyword">const</span> <span class="keywordtype">double</span> Es = rate * 2 * nC * Eb; <span class="comment">// Energy per complex scalar symbol</span></div><div class="line">    <span class="comment">// (Each transmitted scalar complex symbol contains rate*2*nC</span></div><div class="line">    <span class="comment">// information bits.)</span></div><div class="line">    <span class="keyword">const</span> <span class="keywordtype">double</span> Ess = <a class="code" href="group__miscfunc.html#gaf559d29ca56ad3396a4284964b01a9b0">sqrt</a>(Es);</div><div class="line"></div><div class="line">    <a class="code" href="classitpp_1_1Array.html">Array&lt;BERC&gt;</a> berc(Nmethods);  <span class="comment">// counter for coded BER</span></div><div class="line">    <a class="code" href="classitpp_1_1Array.html">Array&lt;BERC&gt;</a> bercu(Nmethods); <span class="comment">// counter for uncoded BER</span></div><div class="line">    <a class="code" href="classitpp_1_1Array.html">Array&lt;BLERC&gt;</a> ferc(Nmethods); <span class="comment">// counter for coded FER</span></div><div class="line"></div><div class="line">    <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; Nmethods; i++) {</div><div class="line">      ferc(i).<a class="code" href="classitpp_1_1BLERC.html#a43db2b81f9aada3bb4b0d644fa188f5e">set_blocksize</a>(Nu);</div><div class="line">    }</div><div class="line"></div><div class="line">    <span class="keywordtype">long</span> <span class="keywordtype">int</span> nbits = 0;</div><div class="line">    <span class="keywordflow">while</span> (nbits &lt; Nbitsmax) {</div><div class="line">      nbits += Nu;</div><div class="line"></div><div class="line">      <span class="comment">// generate and encode random data</span></div><div class="line">      bvec inputbits = <a class="code" href="group__randgen.html#ga5aa06887cf1fd3301b040987924068f0">randb</a>(Nu);</div><div class="line">      bvec txbits;</div><div class="line">      code.<a class="code" href="classitpp_1_1Convolutional__Code.html#a47230acfea5aa32cb31e63abca1d222e">encode_tail</a>(inputbits, txbits);</div><div class="line">      <span class="comment">// coded block length is not always a multiple of the number of</span></div><div class="line">      <span class="comment">// bits per channel vector</span></div><div class="line">      txbits = <a class="code" href="namespaceitpp.html#a696b1a48581ac1a8af3069c12b2e55e3">concat</a>(txbits, <a class="code" href="group__randgen.html#ga5aa06887cf1fd3301b040987924068f0">randb</a>(Nctx - Nc));</div><div class="line">      txbits = sequence_interleaver_b.interleave(txbits);</div><div class="line"></div><div class="line">      <span class="comment">// -- generate channel and data ----</span></div><div class="line">      <span class="keywordflow">for</span> (<span class="keywordtype">int</span> k = 0; k &lt; Nvec; k++) {</div><div class="line">        <span class="comment">/* A complex valued channel matrix is used here. An</span></div><div class="line"><span class="comment">           alternative (with equivalent result) would be to use a</span></div><div class="line"><span class="comment">           real-valued (structured) channel matrix of twice the</span></div><div class="line"><span class="comment">           dimension.</span></div><div class="line"><span class="comment">        */</span></div><div class="line">        <span class="keywordflow">if</span> (k % Tc == 0) {   <span class="comment">// generate a new channel realization every Tc intervals</span></div><div class="line">          H(k / Tc) = Ess * <a class="code" href="group__randgen.html#ga3c0042e44132fb903d44e7c5a03f5db3">randn_c</a>(nRx, nTx);</div><div class="line">        }</div><div class="line"></div><div class="line">        <span class="comment">// modulate and transmit bits</span></div><div class="line">        bvec bitstmp = txbits(k * 2 * nTx * nC, (k + 1) * 2 * nTx * nC - 1);</div><div class="line">        cvec x = chan.<a class="code" href="classitpp_1_1Modulator__NCD.html#acde316a829ac70725838616b0e78dd22">modulate_bits</a>(bitstmp);</div><div class="line">        cvec e = <a class="code" href="group__miscfunc.html#gaf559d29ca56ad3396a4284964b01a9b0">sqrt</a>(sigma2) * <a class="code" href="group__randgen.html#ga3c0042e44132fb903d44e7c5a03f5db3">randn_c</a>(nRx);</div><div class="line">        Y(k) = H(k / Tc) * x + e;</div><div class="line">      }</div><div class="line"></div><div class="line">      <span class="comment">// -- demodulate --</span></div><div class="line">      <a class="code" href="classitpp_1_1Array.html">Array&lt;QLLRvec&gt;</a> LLRin(Nmethods);</div><div class="line">      <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; Nmethods; i++) {</div><div class="line">        LLRin(i) = <a class="code" href="group__specmat.html#gaf8d2a13297919881ce5d07b855455014">zeros_i</a>(Nctx);</div><div class="line">      }</div><div class="line"></div><div class="line">      QLLRvec llr_apr = <a class="code" href="group__specmat.html#gaf8d2a13297919881ce5d07b855455014">zeros_i</a>(nC * 2 * nTx);  <span class="comment">// no a priori input to demodulator</span></div><div class="line">      QLLRvec llr_apost = <a class="code" href="group__specmat.html#gaf8d2a13297919881ce5d07b855455014">zeros_i</a>(nC * 2 * nTx);</div><div class="line">      <span class="keywordflow">for</span> (<span class="keywordtype">int</span> k = 0; k &lt; Nvec; k++) {</div><div class="line">        <span class="comment">// zero forcing demodulation</span></div><div class="line">        <span class="keywordflow">if</span> (Contflag(0)) {</div><div class="line">          chan.<a class="code" href="classitpp_1_1Modulator__NCD.html#a38842dd03889ee7f7911053d767af86f">demodulate_soft_bits</a>(Y(k), H(k / Tc), sigma2, llr_apr, llr_apost,</div><div class="line">                                    <a class="code" href="classitpp_1_1Modulator__ND.html#a6e3b4c745f904cdb34301aeb4cc03035ad5798fd18f93f399475392b8aee09cba">ND_UQAM::ZF_LOGMAP</a>);</div><div class="line">          LLRin(0).set_subvector(k*Nbitspvec, llr_apost);</div><div class="line">        }</div><div class="line"></div><div class="line">        <span class="comment">// ML demodulation</span></div><div class="line">        <span class="keywordflow">if</span> (Contflag(1)) {</div><div class="line">          chan.<a class="code" href="classitpp_1_1Modulator__NCD.html#a38842dd03889ee7f7911053d767af86f">demodulate_soft_bits</a>(Y(k), H(k / Tc), sigma2, llr_apr, llr_apost);</div><div class="line">          LLRin(1).set_subvector(k*Nbitspvec, llr_apost);</div><div class="line">        }</div><div class="line">      }</div><div class="line"></div><div class="line">      <span class="comment">// -- decode and count errors --</span></div><div class="line">      <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; Nmethods; i++) {</div><div class="line">        bvec decoded_bits;</div><div class="line">        <span class="keywordflow">if</span> (Contflag(i)) {</div><div class="line">          bercu(i).count(txbits(0, Nc - 1), LLRin(i)(0, Nc - 1) &lt; 0);  <span class="comment">// uncoded BER</span></div><div class="line">          LLRin(i) = sequence_interleaver_i.deinterleave(LLRin(i), 0);</div><div class="line">          <span class="comment">// QLLR values must be converted to real numbers since the convolutional decoder wants this</span></div><div class="line">          vec llr = chan.<a class="code" href="classitpp_1_1Modulator__ND.html#a623adcf6225021dd9aed749c655bfc80">get_llrcalc</a>().<a class="code" href="classitpp_1_1LLR__calc__unit.html#ad64cec52c45ed9e5ddca9fb4bbdf1e2a">to_double</a>(LLRin(i).left(Nc));</div><div class="line">          <span class="comment">//   llr=-llr; // UNCOMMENT THIS LINE IF COMPILING WITH 3.10.5 OR EARLIER (BEFORE HARMONIZING LLR CONVENTIONS)</span></div><div class="line">          code.<a class="code" href="classitpp_1_1Convolutional__Code.html#a9f42d8c8bdb51460ebc7d43deb93bad7">decode_tail</a>(llr, decoded_bits);</div><div class="line">          berc(i).<a class="code" href="classitpp_1_1BERC.html#a539b0c989badff3027d97e4693fc9cd7">count</a>(inputbits(0, Nu - 1), decoded_bits(0, Nu - 1));  <span class="comment">// coded BER</span></div><div class="line">          ferc(i).<a class="code" href="classitpp_1_1BLERC.html#abe58d4abce92b4b53ad614a28aac20e7">count</a>(inputbits(0, Nu - 1), decoded_bits(0, Nu - 1));  <span class="comment">// coded FER</span></div><div class="line">        }</div><div class="line">      }</div><div class="line"></div><div class="line">      <span class="comment">/* Check whether it is time to terminate the simulation.</span></div><div class="line"><span class="comment">       Terminate when all demodulators that are still running have</span></div><div class="line"><span class="comment">       counted at least Nbers or Nfers bit/frame errors. */</span></div><div class="line">      <span class="keywordtype">int</span> minber = 1000000;</div><div class="line">      <span class="keywordtype">int</span> minfer = 1000000;</div><div class="line">      <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; Nmethods; i++) {</div><div class="line">        <span class="keywordflow">if</span> (Contflag(i)) {</div><div class="line">          minber = <a class="code" href="group__miscfunc.html#ga5393221565639e9f60d8ae9c05d1efdd">min</a>(minber, <a class="code" href="group__convertfunc.html#ga14bb8e68d119b1dfa214a77d4b3fd382">round_i</a>(berc(i).get_errors()));</div><div class="line">          minfer = <a class="code" href="group__miscfunc.html#ga5393221565639e9f60d8ae9c05d1efdd">min</a>(minfer, <a class="code" href="group__convertfunc.html#ga14bb8e68d119b1dfa214a77d4b3fd382">round_i</a>(ferc(i).get_errors()));</div><div class="line">        }</div><div class="line">      }</div><div class="line">      <span class="keywordflow">if</span> (Nbers &gt; 0 &amp;&amp; minber &gt; Nbers) { <span class="keywordflow">break</span>;}</div><div class="line">      <span class="keywordflow">if</span> (Nfers &gt; 0 &amp;&amp; minfer &gt; Nfers) { <span class="keywordflow">break</span>;}</div><div class="line">    }</div><div class="line"></div><div class="line">    cout &lt;&lt; <span class="stringliteral">&quot;-----------------------------------------------------&quot;</span> &lt;&lt; endl;</div><div class="line">    cout &lt;&lt; <span class="stringliteral">&quot;Eb/N0: &quot;</span> &lt;&lt; EbN0db(nsnr) &lt;&lt; <span class="stringliteral">&quot; dB. Simulated &quot;</span> &lt;&lt; nbits &lt;&lt; <span class="stringliteral">&quot; bits.&quot;</span> &lt;&lt; endl;</div><div class="line">    cout &lt;&lt; <span class="stringliteral">&quot; Uncoded BER: &quot;</span> &lt;&lt; bercu(0).get_errorrate() &lt;&lt; <span class="stringliteral">&quot; (ZF);     &quot;</span> &lt;&lt; bercu(1).get_errorrate() &lt;&lt; <span class="stringliteral">&quot; (ML)&quot;</span> &lt;&lt; endl;</div><div class="line">    cout &lt;&lt; <span class="stringliteral">&quot; Coded BER:   &quot;</span> &lt;&lt; berc(0).<a class="code" href="classitpp_1_1BERC.html#a4c66254b338ac55bfce1008fff5ce6db">get_errorrate</a>()  &lt;&lt; <span class="stringliteral">&quot; (ZF);     &quot;</span> &lt;&lt; berc(1).<a class="code" href="classitpp_1_1BERC.html#a4c66254b338ac55bfce1008fff5ce6db">get_errorrate</a>()  &lt;&lt; <span class="stringliteral">&quot; (ML)&quot;</span> &lt;&lt; endl;</div><div class="line">    cout &lt;&lt; <span class="stringliteral">&quot; Coded FER:   &quot;</span> &lt;&lt; ferc(0).<a class="code" href="classitpp_1_1BLERC.html#a44bb88606d0018c06c4f7420eaa7e52b">get_errorrate</a>()  &lt;&lt; <span class="stringliteral">&quot; (ZF);     &quot;</span> &lt;&lt; ferc(1).<a class="code" href="classitpp_1_1BLERC.html#a44bb88606d0018c06c4f7420eaa7e52b">get_errorrate</a>()  &lt;&lt; <span class="stringliteral">&quot; (ML)&quot;</span> &lt;&lt; endl;</div><div class="line">    cout.flush();</div><div class="line"></div><div class="line">    <span class="comment">/* Check wheter it is time to terminate simulation. Stop when all</span></div><div class="line"><span class="comment">    methods have reached the min BER/FER of interest. */</span></div><div class="line">    <span class="keywordtype">int</span> contflag = 0;</div><div class="line">    <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; Nmethods; i++) {</div><div class="line">      <span class="keywordflow">if</span> (Contflag(i)) {</div><div class="line">        <span class="keywordflow">if</span> (berc(i).get_errorrate() &gt; BERmin)  {  contflag = 1;  }</div><div class="line">        <span class="keywordflow">else</span> { Contflag(i) = 0; }</div><div class="line">        <span class="keywordflow">if</span> (ferc(i).get_errorrate() &gt; FERmin)  {  contflag = 1;  }</div><div class="line">        <span class="keywordflow">else</span> { Contflag(i) = 0; }</div><div class="line">      }</div><div class="line">    }</div><div class="line">    <span class="keywordflow">if</span> (contflag) { <span class="keywordflow">continue</span>; }</div><div class="line">    <span class="keywordflow">else</span> {<span class="keywordflow">break</span>; }</div><div class="line">  }</div><div class="line"></div><div class="line">  <span class="keywordflow">return</span> 0;</div><div class="line">}</div></div><!-- fragment --><p>To run the program,</p>
<div class="fragment"><div class="line">mimoconv nTx nRx nC Tc</div></div><!-- fragment --><p> where</p><ul>
<li>nTx=number of transmit antennas</li>
<li>nRx=number of receive antennas</li>
<li>nC=constellation (1=QPSK, 2=16-QAM, 3=64-QAM)</li>
<li>Tc=coherence time (channel uses) </li>
</ul>
</div></div><!-- contents -->
<div style="clear: both; width: 100%; height: 31px; background-color: #ffff00; border: 1px solid #b0b0b0; margin: 5px 5px 5px 0; padding: 2px;">
  <p style="padding-left: 10px; font-size: 85%;">Generated on Sat Sep 30 2017 07:04:09 for IT++ by <a href="http://www.doxygen.org/index.html">Doxygen</a> 1.8.13</p>
</div>
</body>
</html>