Advertisement
Guest User

Untitled

a guest
Jun 27th, 2017
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 13.87 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <fstream>
  4. #include <bitset>
  5. #include <ctime>
  6. #include <cstdlib>
  7.  
  8. using namespace std;
  9.  
  10. class Random {
  11.     bitset < 8 > randomArray[100];
  12.  
  13. public:
  14.     Random(); //Constructor
  15.     void writeToFile(string); //Writes 100 frames to file
  16.     bitset < 8 > Generate(); //Generates 100 random 8-bits frames
  17.     void singleParity(int); //Adds single parity bit for bit=1 if number of 'one's in frame is even
  18.     void writeSingleParity(bitset < 9 > *); //writes 100 frames with single parity bits.
  19.     void singleParityErr(bitset < 9 > *, int); //Generates error-rated frames
  20.     void writeSingleParityErr(bitset < 9 > *); //writes 100 errorized frames with single parity bits.
  21.     int singleParityCheck(bitset < 9 > *);
  22.     void crc1(int);
  23.     void writeCrc1(bitset < 13 > *); //writes 100 frames with single parity bits.
  24.     void crc1Err(bitset < 13 > *, int);
  25.     void writeCrc1Err(bitset < 13 > *);
  26.     int crc1Check(bitset < 13 > *);
  27.     void crc2(int);
  28.     void crc2Err(bitset < 40 > *, int);
  29.     int crc2Check(bitset < 40 > *);
  30.     void crc3(int);
  31.     void crc3Err(bitset < 15 > *, int);
  32.     int crc3Check(bitset < 15 > *);
  33. };
  34.  
  35. Random::Random() {
  36.  
  37.     int i;
  38.     for (i = 0; i < 100; i++)
  39.         randomArray[i] = Generate();
  40.  
  41. }
  42.  
  43. void Random::writeToFile(string file_name) {
  44.  
  45.     int i;
  46.  
  47.     ofstream outFile;
  48.  
  49.     outFile.open(file_name.c_str());
  50.  
  51.     if (!outFile) {
  52.         cout << "Could not open "
  53.                 << file_name
  54.                 << " file for writing."
  55.                 << endl;
  56.         return;
  57.     }
  58.  
  59.     for (i = 0; i < 100; i++) {
  60.         outFile << randomArray[i];
  61.         outFile << endl;
  62.  
  63.     }
  64.  
  65.     outFile.close();
  66.     return;
  67.  
  68. }
  69.  
  70. bitset < 8 > Random::Generate() {
  71.  
  72.     bitset < 8 > frame(rand());
  73.  
  74.     return frame;
  75.  
  76. }
  77.  
  78. void Random::singleParity(int rate) {
  79.  
  80.     bitset < 9 > frame2[100];
  81.  
  82.     int j, count;
  83.  
  84.     for (int i = 0; i < 100; i++) {
  85.         count = 0;
  86.         for (j = 0; j < 8; j++) {
  87.             frame2[i][j + 1] = randomArray[i][j];
  88.  
  89.             if (randomArray[i][j] == 1)
  90.                 count++;
  91.  
  92.         }
  93.  
  94.         //        cout << "count: " << count << endl;
  95.  
  96.         //frame2[i]<<=1;
  97.         if (count % 2 == 0)
  98.             frame2[i][0].flip();
  99.  
  100.     }
  101.  
  102.     writeSingleParity(frame2);
  103.  
  104.     singleParityErr(frame2, rate);
  105.  
  106.  
  107. }
  108.  
  109. void Random::writeSingleParity(bitset < 9 > *frame2) {
  110.  
  111.     int i;
  112.  
  113.     ofstream outFile;
  114.  
  115.     outFile.open("SingleParityOriginal.txt");
  116.  
  117.     if (!outFile) {
  118.         cout << "Could not open file for writing2."
  119.                 << endl;
  120.         return;
  121.     }
  122.  
  123.     for (i = 0; i < 100; i++) {
  124.         outFile << frame2[i];
  125.         outFile << endl;
  126.  
  127.     }
  128.  
  129.     outFile.close();
  130.     return;
  131.  
  132. }
  133.  
  134. void Random::singleParityErr(bitset < 9 > *frame, int rate) {
  135.  
  136.     int *control = new int [rate];
  137.     int k;
  138.  
  139.     for (int j = 0; j < rate; j++) {
  140.  
  141.         control[j] = rand() % 100;
  142.         for (k = 0; k < j; k++)
  143.             if (control[j] == control[k])
  144.                 j--;
  145.     }
  146.  
  147.     for (int i = 0; i < rate; i++) {
  148.  
  149.         frame[control[i]] = bitset < 9 > (rand());
  150.  
  151.     }
  152.  
  153.     writeSingleParityErr(frame);
  154.  
  155.     int errorCount = singleParityCheck(frame);
  156.  
  157.     cout << "Single Parity Bit Method Found Errors With A Percentage OF: "
  158.             << float((errorCount * 100) / rate) << endl;
  159.  
  160. }
  161.  
  162. void Random::writeSingleParityErr(bitset < 9 > *frame) {
  163.  
  164.     int i;
  165.  
  166.     ofstream outFile;
  167.  
  168.     outFile.open("SingleParityError.txt");
  169.  
  170.     if (!outFile) {
  171.         cout << "Could not open file for writing2."
  172.                 << endl;
  173.         return;
  174.     }
  175.  
  176.     for (i = 0; i < 100; i++) {
  177.         outFile << frame[i];
  178.         outFile << endl;
  179.  
  180.     }
  181.  
  182.     outFile.close();
  183.     return;
  184.  
  185. }
  186.  
  187. int Random::singleParityCheck(bitset < 9 > *frame) {
  188.  
  189.     int parity, errorCounter = 0, parityCame;
  190.  
  191.     for (int i = 0; i < 100; i++) {
  192.  
  193.         parityCame = int(frame[i][0]);
  194.         //cout << parityCame << "  -  ";
  195.         frame[i] >>= 1;
  196.         parity = int(frame[i].count());
  197.         parity = parity % 2;
  198.         //cout << frame[i] << "  -  ";
  199.         //cout << parity << endl;
  200.         if (parity == parityCame)
  201.             errorCounter++;
  202.  
  203.     }
  204.  
  205.     return errorCounter;
  206.  
  207. }
  208.  
  209. void Random::crc1(int rate) {
  210.  
  211.     bitset < 13 > frame2[100];
  212.  
  213.     int i, j;
  214.  
  215.     for (i = 0; i < 100; i++) {
  216.  
  217.         for (j = 0; j < 13; j++) {
  218.             frame2[i][j + 5] = randomArray[i][j];
  219.  
  220.         }
  221.     }
  222. //  for (int i = 0; i < 100; i++)
  223. //      cout << frame2[i] << endl;
  224.  
  225.     bitset < 13 > divisor(string("1000010000000"));
  226.     bitset < 13 > divisor2;
  227.     bitset < 1 > controlBit(string("0"));
  228. //    cout << divisor << endl;
  229.  
  230.  
  231.     for (i = 0; i < 100; i++) {
  232.         divisor2 = divisor;
  233.         //cout << frame2[i] << endl;
  234.         bitset < 13 > frameOp (frame2[i].to_ulong());
  235.  
  236.         for (j = 0; j < 8; j++) {
  237.  
  238.             while (frame2[i][12 - j] == controlBit[0]&&j<13) {
  239.                 divisor2 >>= 1;
  240.                 j++;
  241.             }
  242.  
  243.             if (j < 8) {
  244.                 frame2[i] = frame2[i]^divisor2;
  245.                 divisor2 >>= 1;
  246.             }
  247.  
  248.         }
  249.         frame2[i] = frame2[i] | frameOp;
  250. //        cout << frame2[i] << endl;
  251.  
  252.     }
  253.  
  254.     writeCrc1(frame2);
  255.  
  256.     crc1Err(frame2, rate);
  257.  
  258. }
  259.  
  260. void Random::writeCrc1(bitset < 13 > *frame2) {
  261.  
  262.     int i;
  263.  
  264.     ofstream outFile;
  265.  
  266.     outFile.open("CRC-1-Original.txt");
  267.  
  268.     if (!outFile) {
  269.         cout << "Could not open file for writing2."
  270.                 << endl;
  271.         return;
  272.     }
  273.  
  274.     for (i = 0; i < 100; i++) {
  275.         outFile << frame2[i];
  276.         outFile << endl;
  277.  
  278.     }
  279.  
  280.     outFile.close();
  281.     return;
  282.  
  283. }
  284.  
  285. void Random::crc1Err(bitset<13> *frame, int rate){
  286.     int *control = new int [rate];
  287.     int k;
  288.  
  289.     for (int j = 0; j < rate; j++) {
  290.  
  291.         control[j] = rand() % 100;
  292.         for (k = 0; k < j; k++)
  293.             if (control[j] == control[k])
  294.                 j--;
  295.     }
  296.  
  297.     for (int i = 0; i < rate; i++) {
  298.  
  299.         frame[control[i]] = bitset < 13 > (rand());
  300.  
  301.     }
  302.  
  303.     writeCrc1Err(frame);
  304.  
  305.     int errorCount = crc1Check(frame);
  306.  
  307.     cout << "Single Parity Bit Method Found Errors With A Percentage OF: "
  308.             << float((errorCount * 100) / rate) << endl;
  309. }
  310.  
  311. void Random::writeCrc1Err(bitset < 13 > *frame) {
  312.  
  313.     int i;
  314.  
  315.     ofstream outFile;
  316.  
  317.     outFile.open("CRC-1Error.txt");
  318.  
  319.     if (!outFile) {
  320.         cout << "Could not open file for writing2."
  321.                 << endl;
  322.         return;
  323.     }
  324.  
  325.     for (i = 0; i < 100; i++) {
  326.         outFile << frame[i];
  327.         outFile << endl;
  328.  
  329.     }
  330.  
  331.     outFile.close();
  332.     return;
  333.  
  334. }
  335.  
  336. int Random::crc1Check(bitset<13>*frame2){
  337.  
  338.     int i,j, errorCount=0;
  339.  
  340.     bitset < 13 > divisor(string("1000010000000"));
  341.     bitset < 13 > divisor2;
  342.     bitset < 1 > controlBit(string("0"));
  343.     bitset <13> controlResult(string("0000000000000"));
  344. //    cout << divisor << endl;
  345.  
  346.  
  347.     for (i = 0; i < 100; i++) {
  348.         divisor2 = divisor;
  349.         //cout << frame2[i] << endl;
  350. //        bitset < 13 > frameOp (frame2[i].to_ulong());
  351.  
  352.         for (j = 0; j < 8; j++) {
  353.  
  354.             while (frame2[i][12 - j] == controlBit[0]&&j<13) {
  355.                 divisor2 >>= 1;
  356.                 j++;
  357.             }
  358.  
  359.             if (j < 8) {
  360.                 frame2[i] = frame2[i]^divisor2;
  361.                 divisor2 >>= 1;
  362.             }
  363.  
  364.         }
  365. //        frame2[i] = frame2[i] | frameOp;
  366.         if(frame2[i]!=controlResult){
  367.             errorCount++;
  368.         }
  369. //        cout << frame2[i] << endl;
  370.  
  371.     }
  372.  
  373.     cout << "Error Count = " << errorCount << endl;
  374.  
  375.     return errorCount;
  376.  
  377. }
  378.  
  379. void Random::crc2(int rate) {
  380.  
  381.     bitset < 40 > frame2[100];
  382.  
  383.     int i, j;
  384.  
  385.     for (i = 0; i < 100; i++) {
  386.  
  387.         for (j = 0; j < 40; j++) {
  388.             frame2[i][j + 32] = randomArray[i][j];
  389.  
  390.         }
  391.     }
  392. //  for (int i = 0; i < 100; i++)
  393. //      cout << frame2[i] << endl;
  394.  
  395.     bitset < 40 > divisor(string("1000001001100000100011101101101110000000"));
  396.     bitset < 40 > divisor2;
  397.     bitset < 1 > controlBit(string("0"));
  398. //    cout << divisor << endl;
  399.  
  400.  
  401.     for (i = 0; i < 100; i++) {
  402.         divisor2 = divisor;
  403.         //cout << frame2[i] << endl;
  404.         bitset < 40 > frameOp;
  405.         frameOp =frame2[i];
  406.  
  407.         for (j = 0; j < 8; j++) {
  408.  
  409.             while (frame2[i][39 - j] == controlBit[0]&&j<40) {
  410.                 divisor2 >>= 1;
  411.                 j++;
  412.             }
  413.  
  414.             if (j < 8) {
  415.                 frame2[i] = frame2[i]^divisor2;
  416.                 divisor2 >>= 1;
  417.             }
  418.  
  419.         }
  420.         frame2[i] = frame2[i] | frameOp;
  421. //        cout << frame2[i] << endl;
  422.  
  423.     }
  424.  
  425.     crc2Err(frame2, rate);
  426.  
  427. }
  428.  
  429. void Random::crc2Err(bitset<40> *frame, int rate){
  430.     int *control = new int [rate];
  431.     int k;
  432.  
  433.     for (int j = 0; j < rate; j++) {
  434.  
  435.         control[j] = rand() % 100;
  436.         for (k = 0; k < j; k++)
  437.             if (control[j] == control[k])
  438.                 j--;
  439.     }
  440.  
  441.     for (int i = 0; i < rate; i++) {
  442.  
  443.         frame[control[i]] = bitset < 40 > (rand());
  444.  
  445.     }
  446.  
  447.     int errorCount = crc2Check(frame);
  448.  
  449.     cout << "Single Parity Bit Method Found Errors With A Percentage OF: "
  450.             << float((errorCount * 100) / rate) << endl;
  451. }
  452.  
  453. int Random::crc2Check(bitset<40>*frame2){
  454.  
  455.     int i,j, errorCount=0;
  456.  
  457.     bitset < 40 > divisor(string("1000001001100000100011101101101110000000"));
  458.     bitset < 40 > divisor2;
  459.     bitset < 1 > controlBit(string("0"));
  460.     bitset <40> controlResult(string("0000000000000000000000000000000000000000"));
  461. //    cout << divisor << endl;
  462.  
  463.  
  464.     for (i = 0; i < 100; i++) {
  465.         divisor2 = divisor;
  466.         //cout << frame2[i] << endl;
  467. //        bitset < 13 > frameOp (frame2[i].to_ulong());
  468.  
  469.         for (j = 0; j < 8; j++) {
  470.  
  471.             while (frame2[i][39 - j] == controlBit[0]&&j<40) {
  472.                 divisor2 >>= 1;
  473.                 j++;
  474.             }
  475.  
  476.             if (j < 8) {
  477.                 frame2[i] = frame2[i]^divisor2;
  478.                 divisor2 >>= 1;
  479.             }
  480.  
  481.         }
  482. //        frame2[i] = frame2[i] | frameOp;
  483.         if(frame2[i]!=controlResult){
  484.             errorCount++;
  485.         }
  486. //        cout << frame2[i] << endl;
  487.  
  488.     }
  489.  
  490.     cout << "Error Count = " << errorCount << endl;
  491.  
  492.     return errorCount;
  493.  
  494. }
  495.  
  496. void Random::crc3(int rate) {
  497.  
  498.     bitset < 15 > frame2[100];
  499.  
  500.     int i, j;
  501.  
  502.     for (i = 0; i < 100; i++) {
  503.  
  504.         for (j = 0; j < 15; j++) {
  505.             frame2[i][j + 7] = randomArray[i][j];
  506.  
  507.         }
  508.     }
  509. //  for (int i = 0; i < 100; i++)
  510. //      cout << frame2[i] << endl;
  511.  
  512.     bitset < 15 > divisor(string("100010110000000"));
  513.     bitset < 15 > divisor2;
  514.     bitset < 1 > controlBit(string("0"));
  515. //    cout << divisor << endl;
  516.  
  517.  
  518.     for (i = 0; i < 100; i++) {
  519.         divisor2 = divisor;
  520.         //cout << frame2[i] << endl;
  521.         bitset < 15 > frameOp;
  522.         frameOp =frame2[i];
  523.  
  524.         for (j = 0; j < 8; j++) {
  525.  
  526.             while (frame2[i][14 - j] == controlBit[0]&&j<15) {
  527.                 divisor2 >>= 1;
  528.                 j++;
  529.             }
  530.  
  531.             if (j < 8) {
  532.                 frame2[i] = frame2[i]^divisor2;
  533.                 divisor2 >>= 1;
  534.             }
  535.  
  536.         }
  537.         frame2[i] = frame2[i] | frameOp;
  538. //        cout << frame2[i] << endl;
  539.  
  540.     }
  541.  
  542.     crc3Err(frame2, rate);
  543.  
  544. }
  545.  
  546. void Random::crc3Err(bitset<15> *frame, int rate){
  547.     int *control = new int [rate];
  548.     int k;
  549.  
  550.     for (int j = 0; j < rate; j++) {
  551.  
  552.         control[j] = rand() % 100;
  553.         for (k = 0; k < j; k++)
  554.             if (control[j] == control[k])
  555.                 j--;
  556.     }
  557.  
  558.     for (int i = 0; i < rate; i++) {
  559.  
  560.         frame[control[i]] = bitset < 15 > (rand());
  561.  
  562.     }
  563.  
  564.     int errorCount = crc3Check(frame);
  565.  
  566.     cout << "Single Parity Bit Method Found Errors With A Percentage OF: "
  567.             << float((errorCount * 100) / rate) << endl;
  568. }
  569.  
  570. int Random::crc3Check(bitset<15>*frame2){
  571.  
  572.     int i,j, errorCount=0;
  573.  
  574.     bitset < 15 > divisor(string("100010110000000"));
  575.     bitset < 15 > divisor2;
  576.     bitset < 1 > controlBit(string("0"));
  577.     bitset <15> controlResult(string("000000000000000"));
  578. //    cout << divisor << endl;
  579.  
  580.  
  581.     for (i = 0; i < 100; i++) {
  582.         divisor2 = divisor;
  583.         //cout << frame2[i] << endl;
  584. //        bitset < 13 > frameOp (frame2[i].to_ulong());
  585.  
  586.         for (j = 0; j < 8; j++) {
  587.  
  588.             while (frame2[i][14 - j] == controlBit[0]&&j<15) {
  589.                 divisor2 >>= 1;
  590.                 j++;
  591.             }
  592.  
  593.             if (j < 8) {
  594.                 frame2[i] = frame2[i]^divisor2;
  595.                 divisor2 >>= 1;
  596.             }
  597.  
  598.         }
  599. //        frame2[i] = frame2[i] | frameOp;
  600.         if(frame2[i]!=controlResult){
  601.             errorCount++;
  602.         }
  603. //        cout << frame2[i] << endl;
  604.  
  605.     }
  606.  
  607.     cout << "Error Count = " << errorCount << endl;
  608.  
  609.     return errorCount;
  610.  
  611. }
  612.  
  613. int main(int argc, char** argv) {
  614.  
  615.     int errorRate = 0, errorType = 0;
  616.  
  617.     srand((unsigned) time(0));
  618.     Random frameList;
  619.     frameList.writeToFile("frames.txt");
  620.  
  621.     cout << "Enter Error Rate ( Max. Value = 100 .... (-1) For Exit): ";
  622.         cin >> errorRate;
  623.  
  624.     while (errorRate != -1) {
  625.         cout << "Enter Error Detection Type:" << endl << "(1)- For Single Parity Bit" << endl << "(2)- For CRC" << endl << "?   " ;
  626.         cin >> errorType;
  627.  
  628.         switch (errorType) {
  629.             case 1:
  630.                 frameList.singleParity(errorRate);
  631.                 break;
  632.             case 2:
  633.                 //cout << errorType << endl;
  634.                 frameList.crc1(errorRate);
  635.                 break;
  636.             default:
  637.                 cout << "Wrong Enter!" << endl;
  638.  
  639.         }
  640.         cout << "Enter Error Rate ( Max. Value = 100 .... (-1) For Exit): ";
  641.         cin >> errorRate;
  642.     }
  643.     return (EXIT_SUCCESS);
  644. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement