/* * 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); }