Advertisement
Guest User

Untitled

a guest
Nov 19th, 2017
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.51 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <math.h>
  5. #include <stdio.h>
  6. #include <malloc.h>
  7. #include <iostream>
  8. #define PI 3.141592654
  9. #include <ctime>
  10. #include <cstdlib>
  11. #include <fstream>
  12.  
  13. //(28,23)
  14. //Kamil Grądzki 149192
  15. //Aleksandra Kusztal 149247
  16.  
  17.  
  18. float gauss(float mean, float sigma);
  19. float licz_BER(int il_bit, int *ciag_a, int *ciag_b);  //Funkcja liczaca Bit Error Rate
  20.  
  21. //************************************************************************
  22.  
  23. // Na wejsciu wartosci binarne (0/1) na wyjsciu wartosci w postaci zmiennych rzeczywistych
  24. // Funkcja kanal zamienia wartości binarne na symbole -1/+1 i dodaje szum
  25. //es_n0 - Es/N0, dl_kan - liczba bitow wejsciowych *wej-wektor wejsciowy *wyj-wektor wyjsciowy
  26. void kanal(float es_n0, long dl_kan, int *wej, float *wyj)
  27. {
  28.     float mean = 0;
  29.     float es = 1;
  30.     float sygnal;
  31.     float sigma;
  32.     float s_n;
  33.     long y;
  34.  
  35.     s_n = (float)pow(10, (es_n0 / 10));
  36.     sigma = (float)sqrt(es / (2 * s_n));
  37.  
  38.     for (y = 0; y<dl_kan; y++)
  39.     {
  40.         sygnal = 2 * *(wej + y) - 1; // zamiana z wart binarnej 0/1 na symbole -1/+1
  41.         *(wyj + y) = sygnal + gauss(mean, sigma);  // dodanie szumu
  42.     }
  43. }
  44. //**********************************************************************
  45. float gauss(float mean, float sigma)
  46. {
  47.     double x;
  48.     double z;
  49.  
  50.     z = (double)rand() / RAND_MAX;
  51.     if (z == 1.0) z = 0.9999999;
  52.     x = sigma*sqrt(2.0*log(1.0 / (1.0 - z)));
  53.  
  54.     z = (double)rand() / RAND_MAX;
  55.     if (z == 1.0) z = 0.9999999;
  56.     return((float)(mean + x*cos(2 * PI*z)));
  57. }
  58. //*******************************************************************
  59.  
  60. float licz_BER(int il_bit, int *ciag_a, int *ciag_b)
  61. {
  62.     float BER = 0;
  63.     for (int i = 0; i < il_bit; i++)
  64.     {
  65.         if (ciag_a[i] != ciag_b[i]) {
  66.             BER++;
  67.         }
  68.         else {
  69.             BER = BER;
  70.         }
  71.     }
  72.  
  73.     BER = BER / il_bit;
  74.  
  75.     return BER;
  76. }
  77.  
  78.  
  79.  
  80. using namespace std;
  81.  
  82. int main()
  83. {
  84.     float szum_min, szum_max, szum_krok;
  85.     int ilosc_bitow;
  86.     float BER = 0, BER_bk = 0;
  87.     int pozycja_bledu;
  88.  
  89.  
  90. //Kodowanie korekcyjne (28,23)
  91.     int n = 28; // dl. slowa kodowego
  92.     int k = 23; // dl. bloku wejsciowego
  93.  
  94. //Macierze testow i generujaca
  95.     int gen[23][28] = {
  96.         { 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  97.         { 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  98.         { 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  99.         { 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  100.         { 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  101.         { 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  102.         { 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  103.         { 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  104.         { 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  105.         { 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  106.         { 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  107.         { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  108.         { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  109.         { 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  110.         { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
  111.         { 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 },
  112.         { 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
  113.         { 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 },
  114.         { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
  115.         { 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 },
  116.         { 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 },
  117.         { 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 },
  118.         { 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }
  119.     };
  120.     int Ht[28][5] = { { 1,0,0,0,0 },{ 0,1,0,0,0 },{ 1,1,0,0,0 },{ 0,0,1,0,0 },{ 1,0,1,0,0 },{ 0,1,1,0,0 },{ 1,1,1,0,0 },{ 0,0,0,1,0 },
  121.     { 1,0,0,1,0 },{ 0,1,0,1,0 },{ 1,1,0,1,0 },{ 0,0,1,1,0 },{ 1,0,1,1,0 },{ 0,1,1,1,0 },{ 1,1,1,1,0 },{ 0,0,0,0,1 },
  122.     { 1,0,0,0,1 },{ 0,1,0,0,1 },{ 1,1,0,0,1 },{ 0,0,1,0,1 },{ 1,0,1,0,1 },{ 0,1,1,0,1 },{ 1,1,1,0,1 },{ 0,0,0,1,1 },
  123.     { 1,0,0,1,1 },{ 0,1,0,1,1 },{ 1,1,0,1,1 },{ 0,0,1,1,1 } };
  124.  
  125.  
  126.     cout << "Podaj ilosc bitow w ciagu informacyjnym: ";
  127.     cin >> ilosc_bitow;
  128.     cout << endl << "Podaj maksymalne Es/E0...: ";
  129.     cin >> szum_max;
  130.     cout << endl << "Podaj minimalne Es/E0....: ";
  131.     cin >> szum_min;
  132.     cout << endl << "Podaj krok Es/E0.........: ";
  133.     cin >> szum_krok;
  134.  
  135.  
  136. //Uzupelnianie bitow aby ich ilosc byla wielokrotnoscia k = 23
  137.     for (int i = 1; i < 23; i++)
  138.     {
  139.         if (ilosc_bitow % k == i) {
  140.             ilosc_bitow = ilosc_bitow + (k - ilosc_bitow % k);
  141.         }
  142.     }
  143.  
  144.     //Deklaracje ciagow wykorzystywanych w projekcie
  145.     int * ciag_wej = new int[ilosc_bitow]; // ciag bitow wejscioweych
  146.     int * ciag_zakodowany = new int[(ilosc_bitow*n) / k]; // ciag bitow zakodowanych
  147.     float * ciag_kanal = new float[(ilosc_bitow*n) / k]; // ciag bitow zakodowanych po przejsciu przez kanal (+szum)
  148.     int * ciag_decyzyjny = new int[(ilosc_bitow*n) / k];   // ciag zakodowany w dekoderze po podjeciu decyzji o nadaniu 1 lub 0
  149.     int * ciag_decyzyjny_bk = new int[ilosc_bitow]; // ciag niezakodowany w dekoderze po podjeciu decyzji o nadaniu 1 lub 0
  150.     int * synd = new int[(5 * ilosc_bitow) / k];  //ciag z syndromami
  151.     float * ciag_kanal_bk = new float[ilosc_bitow]; // ciag bitow niezakodowanych po przejsciu przez kanal (+szum)
  152.     int * ciag_kon = new int[ilosc_bitow]; // ciag bit po korekcji
  153.  
  154.  
  155. // petla wypelniajaca ciagi ciag_zakodowany oraz synd zerami
  156.     for (int i = 0; i < ((ilosc_bitow*n) / k); i++) {
  157.         ciag_zakodowany[i] = 0;
  158.         if (i<(5 * ilosc_bitow) / k) {
  159.             synd[i] = 0;
  160.         }
  161.     }
  162.  
  163.     int pomocnicza = 0; // zmienna pomocniczaocnicza
  164.     srand(time(0));
  165.  
  166. //generacja ciagu pseudoprzypadkowego
  167.     for (int i = 0; i < ilosc_bitow; i++)
  168.     {
  169.         ciag_wej[i] = rand() % 2;
  170.     }
  171.  
  172.     cout << "\n\n\n";
  173.  
  174.  
  175. //Kodujemy ciag wejsciowy przy pomocy macierzy generujacej
  176.     pomocnicza = 0;
  177.     for (int i = 0; i < (ilosc_bitow) / k; i++) {
  178.         for (int j = 0; j < n; j++) {
  179.             for (int l = 0; l < k; l++) {
  180.                 ciag_zakodowany[(n*i) + j] += (ciag_wej[(k*i) + l] * gen[l][j]);
  181.                 ciag_zakodowany[(n*i) + j] %= 2;
  182.             }
  183.         }
  184.     }
  185.  
  186.     cout << "\n\n";
  187.    
  188. //Zapis danych do pliku wynik.txt
  189.     ofstream fout("wynik.txt");
  190.     fout << "ilosc bitow wej: " << ilosc_bitow << endl;
  191.  
  192. //Analizujemy BER dla kodowania korekcyjnego i BER bez kodowania dla roznych warosci szumu
  193.     for (int szum = szum_min; szum <= szum_max; szum += szum_krok) {
  194.         int dl_kan = (ilosc_bitow*n) / k;
  195.         kanal(szum, dl_kan, ciag_zakodowany, ciag_kanal);
  196.         kanal(szum, ilosc_bitow, ciag_wej, ciag_kanal_bk);
  197.         fout << "Wartosc szumu: " << szum << endl;
  198.         for (int j = 0; j < ilosc_bitow; j++)
  199.         {
  200.             if (ciag_kanal_bk[j] >= 0) {
  201.                 ciag_decyzyjny_bk[j] = 1;
  202.             }
  203.             else {
  204.                 ciag_decyzyjny_bk[j] = 0;
  205.             }
  206.         }
  207.  
  208. //zerowanie syndromu
  209.         for (int j = 0; j < 5 * ilosc_bitow / k; j++) {
  210.             synd[j] = 0;
  211.         }
  212.  
  213. //Liczymy BER dla ciagu bitow bez kodowania korekcyjnego
  214.         BER_bk = licz_BER(ilosc_bitow, ciag_wej, ciag_decyzyjny_bk);
  215.  
  216.         fout << "BER bez korekcji: " << BER_bk << endl;
  217.         cout << "BER bez korekcji dla szumu[" << szum << "]...: " << BER_bk << endl;
  218.         pomocnicza = 0;
  219.  
  220.  
  221. //Dokonujemy decyzji o nadaniu 1/0 na podstawie zaszumianego odebranego ciagu z kodowaniem korekcyjnym
  222.         for (int j = 0; j < (ilosc_bitow*n) / k; j++) {
  223.             if (ciag_kanal[j] >= 0) {
  224.                 ciag_decyzyjny[j] = 1;
  225.             }
  226.             else {
  227.                 ciag_decyzyjny[j] = 0;
  228.             }
  229.         }
  230.  
  231. //Liczymy syndromy dla odebranego ciagu bitow z wykorzystaniem macierzy testow Ht
  232.         pomocnicza = 0;
  233.         for (int m = 0; m < (ilosc_bitow) / k; m++) {
  234.             pozycja_bledu = 0;
  235.  
  236.             for (int j = 0; j < (n - k); j++) {
  237.                 for (int l = 0; l < n; l++) {
  238.                     synd[((n - k)*m) + j] += (ciag_decyzyjny[(n*m) + l] * Ht[l][j]);
  239.                     synd[((n - k)*m) + j] %= 2;
  240.                 }
  241.  
  242. //Ustalanie pozycji bledu dzieki syndromowi
  243.                 if (synd[(n - k)*m + j] == 1 && j == 0) {
  244.                     pozycja_bledu++;
  245.                 }
  246.                 else if (synd[(n - k)*m + j] == 1 && j == 1) {
  247.                     pozycja_bledu += 2;
  248.                 }
  249.                 else if (synd[(n - k)*m + j] == 1 && j == 2) {
  250.                     pozycja_bledu += 4;
  251.                 }
  252.                 else if (synd[(n - k)*m + j] == 1 && j == 3) {
  253.                     pozycja_bledu += 8;
  254.                 }
  255.                 else if (synd[(n - k)*m + j] == 1 && j == 4) {
  256.                     pozycja_bledu += 16;
  257.                 }
  258.                 else {
  259.                     pozycja_bledu = pozycja_bledu;
  260.                 }
  261.             }
  262. //Zamieniamy bledy bit wg syndromu
  263.             if (pozycja_bledu != 0) {
  264.                 ciag_decyzyjny[n*m + pozycja_bledu - 1] = (ciag_decyzyjny[n*m + pozycja_bledu - 1] + 1) % 2;
  265.             }
  266.  
  267.         }
  268. //Usuwamy bity parzystosci z zkorygowanego odebranego ciagu kodowego
  269.         int przesuniecie = 0;
  270.         for (int i = 0; i < ilosc_bitow / k; i++) {
  271.             for (int j = 0; j < n; j++) {
  272.                 if (j != 0 && j != 1 && j != 3 && j!=7 && j!=15) {
  273.                     ciag_kon[przesuniecie] = ciag_decyzyjny[i*n + j];
  274.                     przesuniecie++;
  275.                 }
  276.             }
  277.         }
  278. // Liczy BER dla kodu z korekcja i zapisuje do pliku wynik.txt
  279.         BER = licz_BER(ilosc_bitow, ciag_wej, ciag_kon);
  280.         fout << "BER z korekcja: " << BER << "\n" << endl;
  281.         cout << "BER z korekcja dla szumu[" << szum << "].....: " << BER << "\n" << endl;
  282.     }
  283.  
  284.     cout << "\n\n";
  285.     system("PAUSE");
  286. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement