/*
* Copyright 2008, 2014 Free Software Foundation, Inc.
*
*
* This software is distributed under the terms of the GNU Affero Public License.
* See the COPYING file in the main directory for details.
*
* This use of this software may be subject to additional restrictions.
* See the LEGAL file in the main directory for details.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
*/
#include "BitVector.h"
#include "ViterbiR204.h"
#include
#include
#include
#include
#include "GSM503Tables.cpp"
#ifndef LOGVAR
#define LOGVAR(var) (" " #var "=") << var
#define LOGVAR2(name,val) " " << name << "=" << (val)
#endif
using namespace std;
// We must have a gConfig now to include BitVector.
//#include "Configuration.h"
//ConfigurationTable gConfig;
void origTest()
{
BitVector v0("0000111100111100101011110000");
cout << v0 << endl;
// (pat) The conversion from a string was inserting garbage into the result BitVector.
// Fixed now so only 0 or 1 are inserted, but lets check:
for (char *cp = v0.begin(); cp < v0.end(); cp++) cout << (int)*cp<<" ";
cout << endl;
BitVector v1(v0);
v1.LSB8MSB();
cout <encode(v1,v2);
if (debug) cout << "v2 " << v2 << endl;
int bec;
unsigned bitErrors;
for (float badness = 0.0; badness <= 1.0; badness += 0.1)
for (int perr = 0; perr <= 50; perr += 10) {
int errsOut = 0;
int errsIn = 0;
// multiple trials smooths out the weirdnesses due to unfortunate positioning of noisy bits
for (unsigned trial = 0; trial < trials; trial++) {
SoftVector sv2(v2);
for (unsigned j = 0; j < sv2.size(); j++) {
if (random() % 100 < perr) {
// (pat) old test, this was not very good because 0.5 always maps to 1.
// sv2[j] = 0.5;
//sv2[j] = 1.0 - sv2[j];
sv2[j] = sv2.bit(j) ? 1.0 - badness : badness;
errsIn++;
}
}
if (debug) cout << "n2 " << sv2 << endl;
BitVector v3(frameSize);
coder->decode(sv2,v3);
bec = coder->getBEC();
if (debug) cout << "v3 " << v3 << endl;
for (unsigned j = 0; j < frameSize; j++) {
if (v1.bit(j) != v3.bit(j)) errsOut++;
}
// Lets try re-encoding it and see what happens.
BitVector try2(resultsize);
coder->encode(v3,try2);
// The try should be equivalent to sv2?
bitErrors = 0;
for (unsigned k = 0; k < try2.size(); k++) {
if (try2[k] != sv2.bit(k)) bitErrors++;
}
}
int pbbo = 100 * errsOut / (frameSize * trials);
//cout << label << ", " << "% ambiguous bits in : % bad bits out = " << perr << " : " << pbbo <unpuncture " << label << " " << (ok ? "ok" : "NOT ok") << endl;
}
int main(int argc, char *argv[])
{
struct timeval tv;
gettimeofday(&tv,NULL);
srandom(tv.tv_usec);
origTest();
testEncodeDecode("ViterbiR204", new ViterbiR2O4(), 378, 2, 4, false);
}