Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <fstream>
- #include <bitset>
- #include <ctime>
- #include <cstdlib>
- using namespace std;
- class Random {
- bitset < 8 > randomArray[100];
- public:
- Random(); //Constructor
- void writeToFile(string); //Writes 100 frames to file
- bitset < 8 > Generate(); //Generates 100 random 8-bits frames
- void singleParity(int); //Adds single parity bit for bit=1 if number of 'one's in frame is even
- void writeSingleParity(bitset < 9 > *); //writes 100 frames with single parity bits.
- void singleParityErr(bitset < 9 > *, int); //Generates error-rated frames
- void writeSingleParityErr(bitset < 9 > *); //writes 100 errorized frames with single parity bits.
- int singleParityCheck(bitset < 9 > *);
- void crc1(int);
- void writeCrc1(bitset < 13 > *); //writes 100 frames with single parity bits.
- void crc1Err(bitset < 13 > *, int);
- void writeCrc1Err(bitset < 13 > *);
- int crc1Check(bitset < 13 > *);
- void crc2(int);
- void crc2Err(bitset < 40 > *, int);
- int crc2Check(bitset < 40 > *);
- void crc3(int);
- void crc3Err(bitset < 15 > *, int);
- int crc3Check(bitset < 15 > *);
- };
- Random::Random() {
- int i;
- for (i = 0; i < 100; i++)
- randomArray[i] = Generate();
- }
- void Random::writeToFile(string file_name) {
- int i;
- ofstream outFile;
- outFile.open(file_name.c_str());
- if (!outFile) {
- cout << "Could not open "
- << file_name
- << " file for writing."
- << endl;
- return;
- }
- for (i = 0; i < 100; i++) {
- outFile << randomArray[i];
- outFile << endl;
- }
- outFile.close();
- return;
- }
- bitset < 8 > Random::Generate() {
- bitset < 8 > frame(rand());
- return frame;
- }
- void Random::singleParity(int rate) {
- bitset < 9 > frame2[100];
- int j, count;
- for (int i = 0; i < 100; i++) {
- count = 0;
- for (j = 0; j < 8; j++) {
- frame2[i][j + 1] = randomArray[i][j];
- if (randomArray[i][j] == 1)
- count++;
- }
- // cout << "count: " << count << endl;
- //frame2[i]<<=1;
- if (count % 2 == 0)
- frame2[i][0].flip();
- }
- writeSingleParity(frame2);
- singleParityErr(frame2, rate);
- }
- void Random::writeSingleParity(bitset < 9 > *frame2) {
- int i;
- ofstream outFile;
- outFile.open("SingleParityOriginal.txt");
- if (!outFile) {
- cout << "Could not open file for writing2."
- << endl;
- return;
- }
- for (i = 0; i < 100; i++) {
- outFile << frame2[i];
- outFile << endl;
- }
- outFile.close();
- return;
- }
- void Random::singleParityErr(bitset < 9 > *frame, int rate) {
- int *control = new int [rate];
- int k;
- for (int j = 0; j < rate; j++) {
- control[j] = rand() % 100;
- for (k = 0; k < j; k++)
- if (control[j] == control[k])
- j--;
- }
- for (int i = 0; i < rate; i++) {
- frame[control[i]] = bitset < 9 > (rand());
- }
- writeSingleParityErr(frame);
- int errorCount = singleParityCheck(frame);
- cout << "Single Parity Bit Method Found Errors With A Percentage OF: "
- << float((errorCount * 100) / rate) << endl;
- }
- void Random::writeSingleParityErr(bitset < 9 > *frame) {
- int i;
- ofstream outFile;
- outFile.open("SingleParityError.txt");
- if (!outFile) {
- cout << "Could not open file for writing2."
- << endl;
- return;
- }
- for (i = 0; i < 100; i++) {
- outFile << frame[i];
- outFile << endl;
- }
- outFile.close();
- return;
- }
- int Random::singleParityCheck(bitset < 9 > *frame) {
- int parity, errorCounter = 0, parityCame;
- for (int i = 0; i < 100; i++) {
- parityCame = int(frame[i][0]);
- //cout << parityCame << " - ";
- frame[i] >>= 1;
- parity = int(frame[i].count());
- parity = parity % 2;
- //cout << frame[i] << " - ";
- //cout << parity << endl;
- if (parity == parityCame)
- errorCounter++;
- }
- return errorCounter;
- }
- void Random::crc1(int rate) {
- bitset < 13 > frame2[100];
- int i, j;
- for (i = 0; i < 100; i++) {
- for (j = 0; j < 13; j++) {
- frame2[i][j + 5] = randomArray[i][j];
- }
- }
- // for (int i = 0; i < 100; i++)
- // cout << frame2[i] << endl;
- bitset < 13 > divisor(string("1000010000000"));
- bitset < 13 > divisor2;
- bitset < 1 > controlBit(string("0"));
- // cout << divisor << endl;
- for (i = 0; i < 100; i++) {
- divisor2 = divisor;
- //cout << frame2[i] << endl;
- bitset < 13 > frameOp (frame2[i].to_ulong());
- for (j = 0; j < 8; j++) {
- while (frame2[i][12 - j] == controlBit[0]&&j<13) {
- divisor2 >>= 1;
- j++;
- }
- if (j < 8) {
- frame2[i] = frame2[i]^divisor2;
- divisor2 >>= 1;
- }
- }
- frame2[i] = frame2[i] | frameOp;
- // cout << frame2[i] << endl;
- }
- writeCrc1(frame2);
- crc1Err(frame2, rate);
- }
- void Random::writeCrc1(bitset < 13 > *frame2) {
- int i;
- ofstream outFile;
- outFile.open("CRC-1-Original.txt");
- if (!outFile) {
- cout << "Could not open file for writing2."
- << endl;
- return;
- }
- for (i = 0; i < 100; i++) {
- outFile << frame2[i];
- outFile << endl;
- }
- outFile.close();
- return;
- }
- void Random::crc1Err(bitset<13> *frame, int rate){
- int *control = new int [rate];
- int k;
- for (int j = 0; j < rate; j++) {
- control[j] = rand() % 100;
- for (k = 0; k < j; k++)
- if (control[j] == control[k])
- j--;
- }
- for (int i = 0; i < rate; i++) {
- frame[control[i]] = bitset < 13 > (rand());
- }
- writeCrc1Err(frame);
- int errorCount = crc1Check(frame);
- cout << "Single Parity Bit Method Found Errors With A Percentage OF: "
- << float((errorCount * 100) / rate) << endl;
- }
- void Random::writeCrc1Err(bitset < 13 > *frame) {
- int i;
- ofstream outFile;
- outFile.open("CRC-1Error.txt");
- if (!outFile) {
- cout << "Could not open file for writing2."
- << endl;
- return;
- }
- for (i = 0; i < 100; i++) {
- outFile << frame[i];
- outFile << endl;
- }
- outFile.close();
- return;
- }
- int Random::crc1Check(bitset<13>*frame2){
- int i,j, errorCount=0;
- bitset < 13 > divisor(string("1000010000000"));
- bitset < 13 > divisor2;
- bitset < 1 > controlBit(string("0"));
- bitset <13> controlResult(string("0000000000000"));
- // cout << divisor << endl;
- for (i = 0; i < 100; i++) {
- divisor2 = divisor;
- //cout << frame2[i] << endl;
- // bitset < 13 > frameOp (frame2[i].to_ulong());
- for (j = 0; j < 8; j++) {
- while (frame2[i][12 - j] == controlBit[0]&&j<13) {
- divisor2 >>= 1;
- j++;
- }
- if (j < 8) {
- frame2[i] = frame2[i]^divisor2;
- divisor2 >>= 1;
- }
- }
- // frame2[i] = frame2[i] | frameOp;
- if(frame2[i]!=controlResult){
- errorCount++;
- }
- // cout << frame2[i] << endl;
- }
- cout << "Error Count = " << errorCount << endl;
- return errorCount;
- }
- void Random::crc2(int rate) {
- bitset < 40 > frame2[100];
- int i, j;
- for (i = 0; i < 100; i++) {
- for (j = 0; j < 40; j++) {
- frame2[i][j + 32] = randomArray[i][j];
- }
- }
- // for (int i = 0; i < 100; i++)
- // cout << frame2[i] << endl;
- bitset < 40 > divisor(string("1000001001100000100011101101101110000000"));
- bitset < 40 > divisor2;
- bitset < 1 > controlBit(string("0"));
- // cout << divisor << endl;
- for (i = 0; i < 100; i++) {
- divisor2 = divisor;
- //cout << frame2[i] << endl;
- bitset < 40 > frameOp;
- frameOp =frame2[i];
- for (j = 0; j < 8; j++) {
- while (frame2[i][39 - j] == controlBit[0]&&j<40) {
- divisor2 >>= 1;
- j++;
- }
- if (j < 8) {
- frame2[i] = frame2[i]^divisor2;
- divisor2 >>= 1;
- }
- }
- frame2[i] = frame2[i] | frameOp;
- // cout << frame2[i] << endl;
- }
- crc2Err(frame2, rate);
- }
- void Random::crc2Err(bitset<40> *frame, int rate){
- int *control = new int [rate];
- int k;
- for (int j = 0; j < rate; j++) {
- control[j] = rand() % 100;
- for (k = 0; k < j; k++)
- if (control[j] == control[k])
- j--;
- }
- for (int i = 0; i < rate; i++) {
- frame[control[i]] = bitset < 40 > (rand());
- }
- int errorCount = crc2Check(frame);
- cout << "Single Parity Bit Method Found Errors With A Percentage OF: "
- << float((errorCount * 100) / rate) << endl;
- }
- int Random::crc2Check(bitset<40>*frame2){
- int i,j, errorCount=0;
- bitset < 40 > divisor(string("1000001001100000100011101101101110000000"));
- bitset < 40 > divisor2;
- bitset < 1 > controlBit(string("0"));
- bitset <40> controlResult(string("0000000000000000000000000000000000000000"));
- // cout << divisor << endl;
- for (i = 0; i < 100; i++) {
- divisor2 = divisor;
- //cout << frame2[i] << endl;
- // bitset < 13 > frameOp (frame2[i].to_ulong());
- for (j = 0; j < 8; j++) {
- while (frame2[i][39 - j] == controlBit[0]&&j<40) {
- divisor2 >>= 1;
- j++;
- }
- if (j < 8) {
- frame2[i] = frame2[i]^divisor2;
- divisor2 >>= 1;
- }
- }
- // frame2[i] = frame2[i] | frameOp;
- if(frame2[i]!=controlResult){
- errorCount++;
- }
- // cout << frame2[i] << endl;
- }
- cout << "Error Count = " << errorCount << endl;
- return errorCount;
- }
- void Random::crc3(int rate) {
- bitset < 15 > frame2[100];
- int i, j;
- for (i = 0; i < 100; i++) {
- for (j = 0; j < 15; j++) {
- frame2[i][j + 7] = randomArray[i][j];
- }
- }
- // for (int i = 0; i < 100; i++)
- // cout << frame2[i] << endl;
- bitset < 15 > divisor(string("100010110000000"));
- bitset < 15 > divisor2;
- bitset < 1 > controlBit(string("0"));
- // cout << divisor << endl;
- for (i = 0; i < 100; i++) {
- divisor2 = divisor;
- //cout << frame2[i] << endl;
- bitset < 15 > frameOp;
- frameOp =frame2[i];
- for (j = 0; j < 8; j++) {
- while (frame2[i][14 - j] == controlBit[0]&&j<15) {
- divisor2 >>= 1;
- j++;
- }
- if (j < 8) {
- frame2[i] = frame2[i]^divisor2;
- divisor2 >>= 1;
- }
- }
- frame2[i] = frame2[i] | frameOp;
- // cout << frame2[i] << endl;
- }
- crc3Err(frame2, rate);
- }
- void Random::crc3Err(bitset<15> *frame, int rate){
- int *control = new int [rate];
- int k;
- for (int j = 0; j < rate; j++) {
- control[j] = rand() % 100;
- for (k = 0; k < j; k++)
- if (control[j] == control[k])
- j--;
- }
- for (int i = 0; i < rate; i++) {
- frame[control[i]] = bitset < 15 > (rand());
- }
- int errorCount = crc3Check(frame);
- cout << "Single Parity Bit Method Found Errors With A Percentage OF: "
- << float((errorCount * 100) / rate) << endl;
- }
- int Random::crc3Check(bitset<15>*frame2){
- int i,j, errorCount=0;
- bitset < 15 > divisor(string("100010110000000"));
- bitset < 15 > divisor2;
- bitset < 1 > controlBit(string("0"));
- bitset <15> controlResult(string("000000000000000"));
- // cout << divisor << endl;
- for (i = 0; i < 100; i++) {
- divisor2 = divisor;
- //cout << frame2[i] << endl;
- // bitset < 13 > frameOp (frame2[i].to_ulong());
- for (j = 0; j < 8; j++) {
- while (frame2[i][14 - j] == controlBit[0]&&j<15) {
- divisor2 >>= 1;
- j++;
- }
- if (j < 8) {
- frame2[i] = frame2[i]^divisor2;
- divisor2 >>= 1;
- }
- }
- // frame2[i] = frame2[i] | frameOp;
- if(frame2[i]!=controlResult){
- errorCount++;
- }
- // cout << frame2[i] << endl;
- }
- cout << "Error Count = " << errorCount << endl;
- return errorCount;
- }
- int main(int argc, char** argv) {
- int errorRate = 0, errorType = 0;
- srand((unsigned) time(0));
- Random frameList;
- frameList.writeToFile("frames.txt");
- cout << "Enter Error Rate ( Max. Value = 100 .... (-1) For Exit): ";
- cin >> errorRate;
- while (errorRate != -1) {
- cout << "Enter Error Detection Type:" << endl << "(1)- For Single Parity Bit" << endl << "(2)- For CRC" << endl << "? " ;
- cin >> errorType;
- switch (errorType) {
- case 1:
- frameList.singleParity(errorRate);
- break;
- case 2:
- //cout << errorType << endl;
- frameList.crc1(errorRate);
- break;
- default:
- cout << "Wrong Enter!" << endl;
- }
- cout << "Enter Error Rate ( Max. Value = 100 .... (-1) For Exit): ";
- cin >> errorRate;
- }
- return (EXIT_SUCCESS);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement