SHARE
TWEET

123 test

Jykk Jan 23rd, 2020 73 in 3 days
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /******************************************************************************
  2.  
  3.                               Online C++ Compiler.
  4.                Code, Compile, Run and Debug C++ program online.
  5. Write your code in this editor and press "Run" button to compile and execute it.
  6.  
  7. *******************************************************************************/
  8.  
  9. #include <iostream>
  10. #include <string>
  11. #include <random>
  12. #include <cmath>
  13.  
  14. using namespace std;
  15.  
  16. int rank_mat(int** matt, int n, int m){
  17.     bool **mat = new bool*[n];
  18.     for (int i = 0; i < n; i++) {
  19.         mat[i] = new bool [m];
  20.     }
  21.     for (int i = 0; i < n; i++) {
  22.         for (int j = 0; j < m; j++) {
  23.             mat[i][j] = (bool) matt[i][j];
  24.         }
  25.     }
  26.     int rank = n;
  27.     for (int i = 0; i < n; i++){
  28.         if (!mat[i][i]){
  29.             int j;
  30.             for (j = i+1; j < n && !mat[j][i]; j++);
  31.             if (j == n){
  32.                    rank--;
  33.                    continue;
  34.             }
  35.             else
  36.                 for (int k = i; k < m; k++){
  37.                     bool t = mat[i][k];
  38.                     mat[i][k] = mat[j][k];
  39.                     mat[j][k] = t;
  40.                 }
  41.         }
  42.         for (int j = i+1; j < n; j++){
  43.             if (mat[j][i]){
  44.                 for (int k = i; k < m; k++)
  45.                     mat[j][k] = mat[j][k] - mat[i][k];
  46.             }
  47.         }
  48.     }
  49.     return rank;
  50. }
  51.  
  52.  
  53. int lengx(int x) {
  54.     int rez = 0;
  55.     while (x>0) {
  56.         x = x/10;
  57.         rez++;
  58.     }
  59.     return rez;
  60. }
  61.  
  62. int xyz = 1;
  63.  
  64. int DSK (bool* A, int n, double B, int ALF) {
  65.     int XX = B*1000000;
  66.     int rez = 0;
  67.     random_device x;
  68.     int count = 0;
  69.     if (ALF) { //1 - dsk
  70.         //cout <<  "DA ";
  71.         uniform_int_distribution <int> I_dist(0, 1000000);
  72.         for (int i = 0; i < n; i++) {
  73.             rez = I_dist(x);
  74.             if (rez < XX) {
  75.                 A[i] = 1;
  76.                 count++;
  77.             }
  78.             else {
  79.                 A[i] = 0;
  80.             }
  81.         }
  82.     }
  83.     else { //0 - dsk modify
  84.         //cout <<  "    ";
  85.         uniform_int_distribution <int> I_dist(0, n);
  86.         bool buf[n];
  87.         for (int i = 0; i < n; i++) {
  88.             buf[i] = A[i];
  89.         }
  90.         for (int i = 0; i < (int)B; i++) {
  91.             rez = I_dist(x);
  92.             if (buf[rez] == A[rez]) {
  93.                 A[rez] = 1 - A[rez];
  94.                 count++;
  95.             }
  96.             else {
  97.                 i--;
  98.             }
  99.         }
  100.        
  101.         /*
  102.         int buf[n];
  103.         for (int i = 0; i < n; i++) {
  104.             buf[i] = 0;
  105.         }
  106.         for (int i = 0; i < (int)B; i++) {
  107.             rez = I_dist(x);
  108.             bool y = 0;
  109.             for (int j = 0; j < i; j++) {
  110.                 if (buf[j] == rez) {
  111.                     y = 1;
  112.                 }
  113.             }
  114.             if (y == 0) {
  115.                 A[rez] = 1 - A[rez];
  116.                 buf[i] = rez;
  117.                 count++;
  118.             }
  119.             else {
  120.                 buf[i] = rez;
  121.                 i--;
  122.             }
  123.         }
  124.         */
  125.     }
  126.     return count;
  127. }
  128.  
  129. int AWGN (bool* A, int n, double p_signal, double p_noise) {
  130.     double rez = 0;
  131.     int count = 0;
  132.     random_device x;
  133.     //double LR = 0;
  134.     //double sum = 0;
  135.     normal_distribution <double> N_dist(p_signal, p_noise);
  136.     for (int i = 0; i < n; i++) {
  137.         rez = N_dist(x);
  138.         //sum += (rez*rez - 2*p_signal*rez + p_signal*p_signal);
  139.         //cout << rez << endl;
  140.         if (rez <= 0) {
  141.             A[i] = 1;
  142.             count++;
  143.         }
  144.         else {
  145.             A[i] = 0;
  146.         }
  147.     }
  148.     //LR = (-n/2)*log(2*3.1415926*p_noise*p_noise)-sum/(2*p_noise*p_noise);
  149.     //cout << endl << "LR = " << LR;
  150.     //cout << endl << 0.5*(1+erf(-p_signal/(sqrt(2)*p_noise))) << " Q";
  151.     //cout << endl << (double)count/n << " ошибок";  
  152.     return count;
  153. }
  154.  
  155. void ANALIS(bool* Number, int num_length, int error_bits, int itter, bool* Buff) {
  156.     //Buff - значение на прошлой итерации;
  157.     //Number - то куда мы генерим на итерации;
  158.     //num_length - число разрядов
  159.     //error_bits - количество единиц
  160.     //itter - счетчик итераций
  161.     bool flag = 1;  //flag - вспомогательный временный костыль для обхода
  162.     int helper = 1; //helper - вспомогательный временный костыль для обхода
  163.     if (error_bits != 0) {
  164.         if (error_bits > num_length) {
  165.             error_bits = num_length;
  166.         }
  167.         if (error_bits == num_length) {
  168.             for (int i = 0; i < num_length; i++) {
  169.                 Number[i] = 1;
  170.             }
  171.         }
  172.         if (error_bits < num_length) {
  173.             if (error_bits == 1) {
  174.                 if (itter <= num_length) {
  175.                     Number[itter] = 1;
  176.                 }
  177.                 else {
  178.                     xyz = 0;
  179.                 }
  180.             }
  181.             if (error_bits == (num_length - 1)) {
  182.                 for (int i = 0; i < num_length; i++) {
  183.                     if (i != num_length-itter) {
  184.                         Number[i] = 1;
  185.                     }
  186.                 }
  187.             }
  188.             if ((error_bits != (num_length - 1)) && (error_bits != 1)) {
  189.                 if (error_bits > 1) {
  190.                     if (itter == 0) {
  191.                         for (int i = 0; i < error_bits; i++) {
  192.                             Number[i] = 1;
  193.                         }
  194.                     }
  195.                     if (itter > 0) {
  196.                         for (int i = 0; i < num_length; i++) {
  197.                             Number[i] = Buff[i];
  198.                         }
  199.                         if (Buff[num_length-1] != 1) {
  200.                             for (int i = num_length-1; i >= error_bits-1; i--) { //тут используется костыль с флагом
  201.                                 if ((Buff[i] == 1) && (flag == 1)) {
  202.                                     flag = 0;
  203.                                     Number[i] = 0;
  204.                                     Number[i+1] = 1;
  205.                                     i = 0;
  206.                                 }
  207.                             }
  208.                         }
  209.                         if (Buff[num_length-1] == 1) {
  210.                             for (int i = num_length-2; i >= 0; i--) {
  211.                                 if ((Buff[i] == 1) && (flag == 1)) {
  212.                                     helper++;
  213.                                 }
  214.                                 if (Buff[i] == 0) {
  215.                                     flag = 0;
  216.                                 }
  217.                             }
  218.                             flag = 1;
  219.                             if (helper == 1) {
  220.                                 for (int i = num_length-2; i >= error_bits-2; i--) {
  221.                                     if ((Buff[i] == 1) && (flag == 1)) {
  222.                                         flag = 0;
  223.                                         Number[i] = 0;
  224.                                         Number[num_length-1] = 0;
  225.                                         //cout << "H1: " << helper << " ";
  226.                                         Number[i+1] = 1;
  227.                                         Number[i+2] = 1;
  228.                                         i = 0;
  229.                                     }
  230.                                 }
  231.                             }
  232.                             flag = 1;
  233.                             if (helper > 1) {
  234.                                 for (int i = (num_length-helper-1); i >= (error_bits-helper-1); i--) {
  235.                                     if ((Buff[i] == 1) && (flag == 1)) {
  236.                                         flag = 0;
  237.                                         Number[i] = 0;
  238.                                         for (int j = num_length-1; j > num_length-1-helper; j--) {
  239.                                             Number[j] = 0;    
  240.                                         }
  241.                                         for (int j = 1; j <= helper+1; j++) {
  242.                                             Number[i+j] = 1;
  243.                                         }
  244.                                         //cout << "H2: " << helper << " ";
  245.                                         i = 0;
  246.                                     }
  247.                                 }
  248.                             }
  249.                         }
  250.                     }
  251.                 }
  252.             }
  253.         }
  254.         flag = 1;
  255.         int f = 0;
  256.         for (int i = num_length-1; i >= 0; i--) {
  257.             if ((Number[i] == 1) && (flag == 1)) {
  258.                 f++;
  259.             }
  260.             if (Number[i] == 0) {
  261.                 flag = 0;
  262.             }
  263.         }
  264.         flag = 0;
  265.         for (int i = 0, j = 0; i < num_length; i++) {
  266.             if (Number[i] == 1) {
  267.                 j++;
  268.             }
  269.             if (j == num_length) {
  270.                 flag = 1;
  271.             }
  272.         }
  273.         if (((f == error_bits)&&(itter > num_length-3))||flag) {
  274.             xyz = 0;
  275.         }
  276.         for (int i = 0; i < num_length; i++) {
  277.             Buff[i] = Number[i];
  278.         }
  279.     }
  280. }
  281.  
  282. int main()
  283. {
  284.     //КОДЕР
  285.     int SUPREM = 0;
  286.     bool ccc = 1;
  287.     int final = 0;
  288.     int positive = 0;
  289.     double xx = 0.0;
  290.     int yyyy = 0;
  291.     int n = 0, y = 0, k = 0;
  292.     string Vivod, Rez;
  293.     int x_f = 0;
  294.     //cout << "Введите степень 2: ";
  295.     cin >> n;
  296.     int func[n];
  297.     n=n-2;
  298.     int x[32] = {7,31,32,54,301,112,534,1201,1102,5004,32101,33002,30124,300001,
  299.         0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
  300.     string alg[] = {"000", "001", "010", "011", "100", "101", "110", "111"};
  301.     y = x[n];
  302.     for (int i = 0; i < lengx(x[n]); i++) {
  303.         Vivod = Vivod + alg[y%10];
  304.         y = y/10;
  305.     }
  306.     //cout << Vivod << endl;
  307.     for (int i = 0; i < Vivod.length(); i++) {
  308.         if (Vivod[i] == '1') {
  309.             x_f = Vivod.length()-i;
  310.             break;
  311.         }
  312.     }
  313.     for (int i = Vivod.length()-1, j=0; (i > (Vivod.length()-x_f)); i--, j++) {
  314.             func[j] = Vivod[i] - 48;
  315.             //cout << func[j];
  316.     }
  317.     //cout << endl;
  318.     string alg2[] = {"1", "x", "x^2", "x^3", "x^4", "x^5", "x^6", "x^7", "x^8", "x^9",
  319.                      "x^10", "x^11", "x^12", "x^13", "x^14", "x^15", "x^16", "x^17", "x^18", "x^19"};
  320.     for (int i = Vivod.size(); i > 0 ; i--) {
  321.         if (Rez == "") {
  322.             Rez = Rez + alg2[k];
  323.             Vivod.erase(i-1,2);
  324.         }
  325.         else {
  326.             if (Vivod[i-1] == '1') {
  327.                 Rez = Rez + " + " + alg2[k];
  328.                 Vivod.erase(i,1);
  329.             }
  330.         }
  331.         k++;
  332.     }
  333.     //cout << Rez << endl;
  334.     n=n+2;
  335.     int m = 1;
  336.     for (int i = 1; i <= n; i++)
  337.         m *= 2;
  338.     SUPREM = m;
  339.     m--;
  340.     //cout << m << endl;
  341.     //cout << "Circulant (C) matrix:" << endl;
  342.     int **p_circ = new int*[m];
  343.     for (int i = 0; i < m; i++)
  344.         p_circ[i] = new int [n];
  345.     p_circ[0][0] = 1;
  346.     for (int j = 1; j < n; j++)
  347.         p_circ[0][j] = 0;
  348.     //for (int j = 0; j < n; j++)
  349.     //    cout << p_circ[0][j] << " ";
  350.     //cout << endl;
  351.     for (int i = 1; i < m; i++) {
  352.         for (int j = 0; j < n; j++) {
  353.                 if (p_circ[i-1][n-1] != 1) {
  354.                     p_circ[i][j] = p_circ[i-1][(j-1)%n];
  355.                 }
  356.                 else {
  357.                     p_circ[i][0] = 1;
  358.                     for (int jj = 1; jj < n; jj++) {
  359.                         if (func[jj] == 1) {
  360.                             if (p_circ[i-1][jj-1] != p_circ[i-1][n-1]) {
  361.                                 p_circ[i][jj] = 1;
  362.                             }
  363.                             else {
  364.                                 p_circ[i][jj] = 0;
  365.                             }
  366.                         }
  367.                         else {
  368.                             p_circ[i][jj] = p_circ[i-1][jj-1];
  369.                         }
  370.                     }
  371.                 }
  372.             //cout << p_circ[i][j] << " ";
  373.         }
  374.         //cout << endl;
  375.     }
  376.     int **buf = new int*[m];
  377.     for (int i = 0; i < m; i++)
  378.         buf[i] = new int [n];
  379.     for (int i = 0; i < m; i++) {
  380.         int jj = n-1;
  381.         for (int j = 0; j < n; j++) {
  382.             buf[i][j] = p_circ[i][jj];
  383.             jj--;
  384.             //cout << buf[i][j] << " ";
  385.         }
  386.         //cout << endl;
  387.     }
  388.     //cout << "Multiply (M) matrix:" << endl;
  389.     int **p_mult = new int*[m+1];
  390.     int ffflag = 0;
  391.     for (int i = 0; i < m+1; i++)
  392.         p_mult[i] = new int [m+1];
  393.     for (int i = 0; i < m+1; i++) {
  394.         for (int j = 0; j < m+1; j++) {
  395.             if ((i==0) || (j==0)) {
  396.                 p_mult[i][j] = 0;
  397.             }
  398.             else {
  399.                 p_mult[i][j] = (i-1+j-1+1)%(m+1);
  400.                 if ((p_mult[i][j] == 0)||(ffflag == 1)) {
  401.                     ffflag = 1;
  402.                     p_mult[i][j]++;
  403.                 }
  404.             }
  405.             //cout << p_mult[i][j] << " ";
  406.         }
  407.         ffflag = 0;
  408.         //cout <<endl;
  409.     }
  410.     //cout << "Add (A) matrix:" << endl;
  411.     int buff = 0;
  412.     int flag = 0;
  413.     int *p_buff = new int[n];
  414.     int **p_summ = new int*[m+1];
  415.     for (int i = 0; i < m+1; i++)
  416.         p_summ[i] = new int [m+1];
  417.     for (int i = 0; i < m+1; i++) {
  418.         for (int j = 0; j < m+1; j++) {
  419.             for (int jj = 0; jj < n; jj++) {
  420.                 if ((i == j) && (i == 0)) {
  421.                     p_buff[jj] = 0;
  422.                     continue;
  423.                 }
  424.                 if (i==0) {
  425.                     p_buff[jj] = p_circ[j-1][jj];
  426.                     continue;
  427.                 }
  428.                 if (j==0) {
  429.                     p_buff[jj] = p_circ[i-1][jj];
  430.                     continue;
  431.                 }
  432.                 if ((i!=0)&&(j!=0)) {
  433.                 if (i != j)
  434.                     p_buff[jj] = (p_circ[i-1][jj]+p_circ[j-1][jj])%2;
  435.                 else
  436.                     p_buff[jj] = 0;
  437.                 }
  438.             }
  439.             for (int ii = 0; ii < m; ii++) {
  440.                 flag = 0;
  441.                 for (int jj = 0; jj < n; jj++) {
  442.                     if (p_buff[jj] == p_circ[ii][jj]) {
  443.                         flag++;
  444.                     }
  445.                 }
  446.                 if (flag == n) {
  447.                     buff = ii+1;
  448.                     break;
  449.                 }
  450.                 if (ii == m-1) {
  451.                     buff = 0;
  452.                 }
  453.             }
  454.             p_summ[i][j] = buff;
  455.             //cout << p_summ[i][j] << " ";
  456.         }
  457.         //cout << endl;
  458.     }
  459.     //cout << endl << "OLOLO" << endl;
  460.     int bb = 0;
  461.     int b = 0;
  462.     cin >> b;
  463.     STA:
  464.     int s = -1;
  465.     int param1 = m+1;
  466.     int param2 = m+1;
  467.     flag = 0;
  468.     bool safe_f = 0;
  469.     //cout << endl << "Add G-hook? Input 1 or 0:" << endl;
  470.     if (b != 0) {
  471.         flag = 1;
  472.         safe_f = 1;
  473.     }
  474.    
  475.     //cout << endl << "Input param1 and param2 (if use full, input 0 0)" << endl;
  476.     //cin >> b;
  477.     if (bb < param1) {
  478.         param1 -=bb;
  479.     }
  480.     else {
  481.         param1 = 1;
  482.     }
  483.     //cin >> b;
  484.     b = 0;
  485.     if (b < param2) {
  486.         param2 -=b;
  487.     }
  488.     else {
  489.         param2 = 1;
  490.     }
  491.    
  492.     cout << endl << "Param1 = " << param1 << "; Param2 = " << param2;
  493.     int **p_h;
  494.     if (flag == 0) {
  495.         p_h = new int*[(m+1)*param1];
  496.         for (int i = 0; i < ((m+1)*param1); i++)
  497.             p_h[i] = new int [(m+1)*param2];
  498.         //---- ОТЛАДОЧНЫЙ ЦИКЛ ----
  499.         for (int i = 0; i < param1*(m+1); i++) {
  500.             for (int j = 0; j < param2*(m+1); j++) {
  501.                 p_h[i][j] = 0;
  502.             }
  503.         }
  504.         //---- ОТЛАДОЧНЫЙ ЦИКЛ ----
  505.     }
  506.     else {
  507.         p_h = new int*[(m+1)*param1+5];
  508.         for (int i = 0; i < ((m+1)*param1+5); i++)
  509.             p_h[i] = new int [(m+1)*param2+5];
  510.         //---- ОТЛАДОЧНЫЙ ЦИКЛ ----
  511.         for (int i = 0; i < param1*(m+1)+5; i++) {
  512.             for (int j = 0; j < param2*(m+1)+5; j++) {
  513.                 p_h[i][j] = 0;
  514.             }
  515.         }
  516.         //---- ОТЛАДОЧНЫЙ ЦИКЛ ----
  517.     }
  518.     int **p_x = new int*[m+1];
  519.     for (int i = 0; i < m+1; i++)
  520.         p_x[i] = new int [m+1];
  521.     // Обход по M с учетом параметров
  522.     if (flag == 0) {
  523.         //cout << "p_h:" << endl;
  524.         for (int i = 0; i < param1; i++) {
  525.             for (int j = 0; j < param2; j++) {
  526.                 if (p_mult[i][j] != s) {
  527.                     //Обход по A в процессе создания X-вставки
  528.                     //cout << "p_x[" << i << "][" << j << "]:" <<  endl;
  529.                     s = p_mult[i][j];
  530.                     for (int ii = 0; ii < m+1; ii++) {
  531.                         for (int jj = 0; jj < m+1; jj++) {
  532.                             if (p_summ[ii][jj] == s) {
  533.                                 p_x[ii][jj] = 1;
  534.                             }
  535.                             else {
  536.                                 p_x[ii][jj] = 0;
  537.                             }
  538.                             //cout << p_x[ii][jj] << " ";
  539.                         }
  540.                         //cout << endl;
  541.                     }
  542.                 }
  543.                 int ibuf = i*(m+1);
  544.                 int jbuf = j*(m+1);
  545.                 //обход по H
  546.                 for (int ii = ibuf; ii < (ibuf+m+1); ii++) {
  547.                     for (int jj = jbuf; jj < (jbuf+m+1); jj++) {
  548.                         p_h[ii][jj] = p_x[ii-(ibuf)][jj-(jbuf)];
  549.                     }
  550.                 }
  551.             }
  552.         }
  553.         //вывод H
  554.         /*
  555.         for (int i = 0; i < param1*(m+1); i++) {
  556.             for (int j = 0; j < param2*(m+1); j++) {
  557.                 cout << p_h[i][j] << " ";
  558.             }
  559.             cout << endl;
  560.         }
  561.         */
  562.     }
  563.     else {
  564.         //cout << "p_h+G:" << endl;
  565.         //Добавление Г-крюка
  566.         p_h[0][0] = 1;
  567.         for (int i = 0; i < 5; i++) {
  568.             for (int j = 1; j < param2*(m+1)+5; j++) {
  569.                 if ((j > i*4) && (j < (5+(i*4))))
  570.                     p_h[i][j] = 1;
  571.                 else {
  572.                     p_h[i][j] = 0;
  573.                 }
  574.             }
  575.         }
  576.         for (int i = 1; i < param1*(m+1)+5; i++) {
  577.             for (int j = 0; j < 5; j++) {
  578.                 if ((i > j*4) && (i < (5+(j*4))))
  579.                     p_h[i][j] = 1;
  580.                 else {
  581.                     p_h[i][j] = 0;
  582.                 }
  583.             }
  584.         }
  585.         /* Проверка Г-крюка (успешная)
  586.         for (int i = 0; i < param1*(m+1)+5; i++) {
  587.             for (int j = 0; j < param2*(m+1)+5; j++) {
  588.                 cout << p_h[i][j] << " ";
  589.             }
  590.             cout << endl;
  591.         }
  592.         */
  593.         for (int i = 0; i < param1; i++) {
  594.             for (int j = 0; j < param2; j++) {
  595.                 if (p_mult[i][j] != s) {
  596.                     //Обход по A в процессе создания X-вставки
  597.                     //cout << "p_x[" << i << "][" << j << "]:" <<  endl;
  598.                     s = p_mult[i][j];
  599.                     for (int ii = 0; ii < m+1; ii++) {
  600.                         for (int jj = 0; jj < m+1; jj++) {
  601.                             if (p_summ[ii][jj] == s) {
  602.                                 p_x[ii][jj] = 1;
  603.                             }
  604.                             else {
  605.                                 p_x[ii][jj] = 0;
  606.                             }
  607.                             //cout << p_x[ii][jj] << " ";
  608.                         }
  609.                         //cout << endl;
  610.                     }
  611.                 }
  612.                 //cout << "))))))))))" << i << " " << j << endl;
  613.                 int ibuf = i*(m+1);
  614.                 int jbuf = j*(m+1);
  615.                 //обход по H
  616.                 for (int ii = ibuf; ii < (ibuf+m+1); ii++) {
  617.                     for (int jj = jbuf; jj < (jbuf+m+1); jj++) {
  618.                         p_h[ii+5][jj+5] = p_x[ii-(ibuf)][jj-(jbuf)];
  619.                     }
  620.                 }
  621.             }
  622.         }
  623.         //вывод H+G
  624.         /*
  625.         for (int i = 0; i < param1*(m+1)+5; i++) {
  626.             for (int j = 0; j < param2*(m+1)+5; j++) {
  627.                 cout << p_h[i][j] << " ";
  628.             }
  629.             cout << endl;
  630.         }
  631.         */
  632.        
  633.     }
  634.    
  635.     //КАНАЛ
  636.     int nn = 0;
  637.     if (safe_f == 1) {
  638.         n = param2*(m+1)+5;
  639.         nn = (m+1)*param1+5;
  640.     }
  641.     else {
  642.         n = param2*(m+1);
  643.         nn = (m+1)*param1;
  644.     }
  645.     int paramK = 0;
  646.     double R = 0.0;
  647.     R = ((double)nn-(double)rank_mat(p_h, nn, n))/(double)nn;
  648.     cout << endl << "R: " << R << endl;
  649.     cout << "Размер кодового слова: " << n << endl;
  650.     xx = 1+((int)param1/2);
  651.     int hubba = 0;
  652.     if (hubba == 0) {
  653.         cout << endl << "                  Введите вес ошибки : ";
  654.         cout << xx << endl;
  655.         hubba = 1;
  656.     }
  657.     //cout << endl << "         asdasd" << xx << endl;
  658.     //cin >> paramK;
  659.     paramK = 1;
  660. LL:
  661.     double bit_error = 0.0;
  662.     double global_error = 0.0;
  663.     int key = 0;
  664.     final = 0;
  665.     positive = 0;
  666.     //cout << "Выберите канал (1 - DSK, 3 - AWGN, 2 - ANALIS): ";
  667.     bool A[n];
  668.     bool C[n];
  669.     for (int i = 0; i < n; i++) {
  670.             A[i] = 0;
  671.             C[i] = 0;
  672.         }
  673.     if (paramK == 2) {
  674.         cout << "Введите величину ошибки: " << endl;
  675.         cin >> y;
  676.         while (xyz) {
  677.             for (int i = 0; i < n; i++) {
  678.                 A[i] = 0;
  679.             }
  680.             ANALIS(A, n, y, key, C);
  681.             goto YY;
  682.             XX:
  683.             key++;
  684.             if (key % 100 == 0) {
  685.                 cout << "itter = " << key << endl;
  686.             }
  687.         }
  688.         cout << "R: " << R << endl;
  689.         cout << endl << "Успешно = " << final << endl << "Всего: " << key;
  690.         //cout << endl << "Повтор? (1/0)";
  691.         //cin >> yyyy;
  692.         if (yyyy)
  693.         {
  694.             //cout << "\x1B[2J\x1B[H";
  695.             xyz = 1;
  696.             goto LL;
  697.         }
  698.         return 0;
  699.     }
  700.     if (paramK == 1) {
  701.         key = 0;
  702.         //cin >> xx;
  703.         while (xyz) {
  704.             for (int i = 0; i < n; i++) {
  705.                 A[i] = 0;
  706.             }
  707.             //cout << "Ошибка: " <<
  708.             DSK(A, n, xx, 0);
  709.             key++;
  710.             //<< "| ";
  711.             goto YY;
  712.             UU:
  713.             if (final == 25) {
  714.                 xyz = 0;
  715.             }
  716.             if (key == 10000) {
  717.                 xyz = 0;
  718.             }
  719.         }
  720.         cout << "   Ср. кол-во итераций декодирования : " << global_error/key << endl;
  721.         //cout << "                          Оценка BER : " << (double)bit_error/(double)key << endl;
  722.         //cout << "Вероятность ошибочного декодирования : " << (double)(key-positive)/(double)key << endl;
  723.         //cout << endl << "Повтор? (1/0)";
  724.         //cin >> yyyy;
  725.         if (xx < n)
  726.         {
  727.             //cout << "\x1B[2J\x1B[H";
  728.             xx++;
  729.             xyz = 1;
  730.             goto LL;
  731.         }
  732.         if (bb < SUPREM ) {
  733.             /*
  734.             for (int i=0; i < nn; i++) {
  735.                 delete [] p_h[i];
  736.             }
  737.             delete [] p_h;
  738.             for (int i=0; i < nn; i++) {
  739.                 delete [] p_x[i];
  740.             }
  741.             delete [] p_x;
  742.             */
  743.             bb++;
  744.             xyz = 1;
  745.             goto STA;
  746.         }
  747.         return 0;
  748.     }
  749.     if (paramK == 3) {
  750.         double sig = 0;
  751.         double noi = 0;
  752.         cout << "Ввелите величину Мю - Мат.ожидания / Ср. знач. / Сигнала - ";
  753.         cin >> sig;
  754.         cout << "Введите величину Сигма - Дисперсии / Ср. квадратичное откл. / Шума - ";
  755.         cin >> noi;
  756.         cout << "Ошибка: " << (double)AWGN(A,n,sig,noi);
  757.     }
  758.     cout << endl << "Повтор? (1/0)";
  759.     cin >> yyyy;
  760.     if (yyyy)
  761.     {
  762.         cout << "\x1B[2J\x1B[H";
  763.         goto LL;
  764.     }
  765.     cout << "";
  766.     YY:
  767.    
  768.     //cout << endl << "Выход канал:" << endl;
  769.     /*
  770.     for (int i = 0; i < n; i++) {
  771.         cout << A[i] << " ";
  772.     }
  773.     cout << endl;
  774.     */
  775.    
  776.     //ДЕКОДЕР
  777.     int brain = 0;;
  778.     int corr = 0;
  779.     int ccorr = 0;
  780.     bool out = 1;
  781.     int sim1 = 0, sim2 = 0;
  782.     //cout << "r: " << rank_mat(p_h, nn, n) << endl;
  783.     bool Sindrom[nn];
  784.     bool Bu[nn];
  785.     for (int i = 0; i < nn; i++) {
  786.         Sindrom[i] = 0;
  787.         Bu[i] = 0;
  788.     }
  789.     //Формирование синдрома по входному вектору
  790.     for (int j = 0; j < n; j++) {
  791.         if (A[j] == 1) {
  792.             for (int i = 0; i < nn; i++) {
  793.                 Sindrom[i] = Sindrom[i] ^ p_h[i][j];  
  794.             }
  795.         }
  796.     }
  797.     //Начало алгоритма декодирования
  798.     while (out) {
  799.         corr = 0;
  800.         for (int i = 0; i < n; i++) {
  801.             if (Sindrom[i] == 1) {
  802.                 brain++;
  803.             }
  804.         }
  805.         if (brain != 0) {
  806.             for (int j = 0; j < n; j++) {
  807.                 for (int i = 0; i < nn; i++) {
  808.                     Bu[i] = p_h[i][j];
  809.                 }
  810.                 //Bu = Bu ^ Sindrom;
  811.                 for (int i = 0; i < nn; i++) {
  812.                     Bu[i] = Bu[i] ^ Sindrom[i];
  813.                 }
  814.                 for (int i = 0; i < nn; i++) {
  815.                     if (Bu[i] == 1) {
  816.                         sim1++;
  817.                     }
  818.                     if (Sindrom[i] == 1) {
  819.                         sim2++;
  820.                     }
  821.                 }
  822.                 if (sim1 < sim2) {
  823.                     A[j] = 1 - A[j];
  824.                     corr = 1;
  825.                     for (int i = 0; i < nn; i++) {
  826.                         Sindrom[i] = Bu[i];
  827.                         Bu[i] = 0;
  828.                     }
  829.                 }
  830.                 sim1 = 0;
  831.                 sim2 = 0;
  832.             }
  833.         }
  834.         else {
  835.             out = 0;
  836.         }
  837.         if (corr == 0) {
  838.             out = 0;
  839.         }
  840.         else {
  841.             ccorr++;;
  842.         }
  843.     }
  844.     //КОНЕЦ ДЕКОДЕРА
  845.     brain = 0;
  846.     for (int i = 0; i < n; i++) {
  847.         if (A[i] == 1) {
  848.             brain++;
  849.         }
  850.     }
  851.     global_error += ccorr;
  852.     int bit_buf = 0;
  853.     //cout << endl << "HHHHH " << global_error << endl << "KKKK " << key << endl;
  854.     if (brain == 0) {
  855.         /*
  856.         cout << "Выход декодера:";
  857.         for (int i = 0; i < n; i++) {
  858.             cout << A[i] << " ";
  859.         }
  860.         cout << endl << endl;
  861.         //cout << "Было откорректировано " << ccorr << " ошибок.";
  862.         */
  863.         positive++;
  864.         //final = 0;
  865.     }
  866.     else {
  867.         for (int i = 0; i < n; i++) {
  868.             if (A[i] == 1) {
  869.                 bit_buf++;
  870.             }
  871.         }
  872.         //cout << endl << "KKKK " << bit_buf << endl;
  873.         bit_error += (double)bit_buf/(double)n;
  874.         final++;
  875.         /*
  876.         cout << "Выход декодера:" << endl;
  877.         for (int i = 0; i < n; i++) {
  878.             cout << A[i] << " ";
  879.         }
  880.         cout << endl;
  881.         cout << "Принятый вектор содержит ошибки.";
  882.         */
  883.     }
  884.     //cout << endl << "Повтор? (1/0)";
  885.     //cin >> xyz;
  886.     if (paramK == 2) {
  887.         goto XX;
  888.     }
  889.     if (paramK == 1) {
  890.         goto UU;
  891.     }
  892.     cout << endl << "Повтор? (1/0)";
  893.     cin >> yyyy;
  894.     if (yyyy)
  895.     {
  896.         cout << "\x1B[2J\x1B[H";
  897.         goto LL;
  898.     }
  899.     return 0;
  900. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Top