www.pudn.com > MIMOTest.rar > TestFunction.cpp
#include "stdafx.h"
#include "TestFunction.h"
void Test_STBC(void)
{
MIMO mimo;
QAM qpsk(16);
CSTBC STCoding; //Space-Time Coding
MIMOChannel channel;
const vec EbN0dB = "-5:1:20"; // SNR range
int Number_of_bits;
double Ec, Eb;
vec EbN0, N0, noise_variance, bit_error_rate; //vec is a vector containing double
Ec = 1.0; //The transmitted energy per QPSK symbol is 1.
Eb = Ec / 2.0; //The transmitted energy per bit is 0.5.
//EbN0dB = linspace(0.0,9.0,10); //Simulate for 10 Eb/N0 values from 0 to 9 dB.
EbN0 = inv_dB(EbN0dB); //Calculate Eb/N0 in a linear scale instead of dB.
N0 = Eb * pow(EbN0,-1.0); //N0 is the variance of the (complex valued) noise.
Number_of_bits = 1000000; //One hundred thousand bits is transmitted for each Eb/N0 value
Array beruc(length(EbN0dB)); // counter for uncoded BER
bit_error_rate.set_size(EbN0dB.length(),false);
for (int nsnr=0; nsnr sequence_interleaver_b(Nctx);
Sequence_Interleaver sequence_interleaver_i(Nctx);
sequence_interleaver_b.randomize_interleaver_sequence();
sequence_interleaver_i.set_interleaver_sequence(sequence_interleaver_b.get_interleaver_sequence());
// RNG_randomize();
Array Y(Nvec); // received data
Array H(Nvec/Tc+1); // channel matrix (new matrix for each coherence interval)
ivec Contflag = ones_i(Nmethods); // flag to determine whether to run a given demodulator
if (pow(2.0,nC*2.0*nTx)>256)
{ // ML decoder too complex..
Contflag(1)=0;
}
if (nTx>nRx)
{
Contflag(0)=0; // ZF not for underdetermined systems
}
cout << "Running methods: " << Contflag << endl;
cout.setf(ios::fixed, ios::floatfield);
cout.setf(ios::showpoint);
cout.precision(5);
// ================== Run simulation =======================
for (int nsnr=0; nsnr berc(Nmethods); // counter for coded BER
Array bercu(Nmethods); // counter for uncoded BER
Array ferc(Nmethods); // counter for coded FER
for (int i=0; i LLRin(Nmethods);
for (int i=0; i0 && minber>Nbers) break;
if (Nfers>0 && minfer>Nfers) break;
}
cout << "-----------------------------------------------------" << endl;
cout << "Eb/N0: " << EbN0db(nsnr) << " dB. Simulated " << nbits << " bits." << endl;
cout << " Uncoded BER: " << bercu(0).get_errorrate() << " (ZF); " << bercu(1).get_errorrate() << " (ML)" << endl;
cout << " Coded BER: " << berc(0).get_errorrate() << " (ZF); " << berc(1).get_errorrate() << " (ML)" << endl;
cout << " Coded FER: " << ferc(0).get_errorrate() << " (ZF); " << ferc(1).get_errorrate() << " (ML)" << endl;
cout.flush();
/* Check wheter it is time to terminate simulation. Stop when all
methods have reached the min BER/FER of interest. */
int contflag=0;
for (int i=0; iBERmin) contflag=1;
else { Contflag(i)= 0; }
if (ferc(i).get_errorrate()>FERmin) contflag=1;
else { Contflag(i)= 0; }
}
}
if (contflag) continue;
else break;
}
return 0;
}