Advertisement
Hadix

przetwarzanie sygnalow 3

Nov 3rd, 2018
194
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.61 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <math.h>
  6. #include <time.h>
  7. #include <locale.h>
  8.  
  9.  
  10. #define SIZE 2
  11.  
  12. int *wczytywanieWspolczynnikow();
  13. int *wczytywanieZakresuDziedziny();
  14. float *generaowaniePrzebiegu();
  15. int wczytanieRozmiaruTablicyWyinikowej();
  16. void zapisywanieDoPliku();
  17. float *wczytywanieszumu();
  18. void odczytZpliku();
  19. void filtry();
  20.  
  21. int main()
  22. {
  23.     setlocale(LC_ALL, "polish_poland");
  24.     char uzyt;                //znak wpisany przez uzytkownika
  25.     int wybor;
  26.     puts("MENU");
  27.     puts("Wcisnij 1 - Kreator sygnalu");
  28.     do {
  29.         scanf("%s", &uzyt);
  30.     } while (uzyt != '1');
  31.     switch (uzyt) {
  32.         case '1':
  33.             wybor = 1;
  34.             break;
  35.     }
  36.  
  37.     float *tab3;                              //tablica pobierajaca dane
  38.     float *tab2;
  39.     float *mediany;
  40.     float *srednie;
  41.     float *zaszumiona;
  42.     int tab[SIZE];                            //rozmiar tablicy zawierajacej wspolczynniki A i B
  43.     int tab1[SIZE];                          //rozmiar tablicy zawierajacej elementy okreslajace zakres dziedziny
  44.     if (wybor == 1) {
  45.         int *ab = wczytywanieWspolczynnikow(tab);
  46.         int *dz = wczytywanieZakresuDziedziny(tab1);
  47.         int roz = wczytanieRozmiaruTablicyWyinikowej();   //wywołanie funkcji wczytujace rozmiar tablicy wynikowej
  48.         tab2 = malloc(roz * sizeof(int));
  49.         mediany = malloc((roz) * sizeof(int));
  50.         srednie = malloc((roz) * sizeof(int));
  51.         float *val = generaowaniePrzebiegu(ab, *dz, *(dz + 1), tab2, roz);
  52.         //float *zaszumiona;
  53.         zaszumiona = malloc(roz * sizeof(int));
  54.         for (int i = 0; i < roz; i++)
  55.             *(zaszumiona + i) = *(tab2 + i);
  56.         wczytywanieszumu(zaszumiona, roz);
  57.         //for (int j = 0; j < 100; j++)
  58.         //printf("%.3f \n", zaszumiona[j]);
  59.         filtry(zaszumiona, roz, mediany, srednie);
  60.         zapisywanieDoPliku(zaszumiona, roz, mediany, srednie);
  61.     }
  62.         free(zaszumiona);
  63.     //odczytZpliku();
  64.  
  65.  
  66. }
  67.  
  68.  
  69. float *generaowaniePrzebiegu(int x, int y, int z, float *arr2, int siz)   //funkcja pobiera tablice wspolczynnikow, dwa parametry określające dziedzine,
  70.                                                                           //tablice wynikową, rozmiar tablicy wynikowej
  71. {
  72.     int *a = x;                                                                //sprawdzenie czy zostaly przkazane prawidlowe parametry
  73.     int  b = y;
  74.     int  c = z;
  75.     int siiz = siz;       //rozmiar tablicy wynikowej
  76.     float *war;
  77.     war = arr2;
  78.     for (int i = 0; i < siiz; i++) {
  79.         *(war + i) = *a*sin(*(a + 1)*(b + i));
  80.         //printf("%.3f\n", *(war + i));
  81.     }
  82.     return war;
  83.  
  84.  
  85. }
  86.  
  87. int *wczytywanieWspolczynnikow(int arr[SIZE])
  88. {
  89.     int *wsp;
  90.     wsp = arr;
  91.     puts("Podaj wspolczynnik A:");
  92.     scanf("%d", wsp);
  93.     puts("Podaj wspolczynnik B:");
  94.     scanf("%d", (wsp + 1));
  95.     return wsp;
  96.  
  97. }
  98.  
  99. int *wczytywanieZakresuDziedziny(int arr1[SIZE])
  100.  
  101. {
  102.     int *wsp1;
  103.     wsp1 = arr1;
  104.     int a = 1;
  105.     int b = 100;
  106.     *wsp1 = a;
  107.     *(wsp1 + 1) = b;
  108.     return wsp1;
  109. }
  110.  
  111. int wczytanieRozmiaruTablicyWyinikowej()
  112. {
  113.     int rozmiar;
  114.     puts("Podaj rozmiar tablicy wynikowej");
  115.     scanf("%d", &rozmiar);
  116.     return rozmiar;
  117. }
  118.  
  119. float *wczytywanieszumu(float *szum, int size)
  120. {
  121.     int numer, amplituda;
  122.     int roz = size;
  123.     float *tmp;
  124.     tmp = szum;
  125.     srand(time(NULL));
  126.     int iloscp = rand() % roz;
  127.     for (int i = 0; i < iloscp; i++) {
  128.         numer = rand() % 100;
  129.         amplituda = -5 + rand() % 9;
  130.         *(tmp + numer) += amplituda;
  131.     }
  132. }
  133.  
  134. void odczytZpliku()
  135. {
  136.     int x = 0;
  137.     int h = 0;
  138.     float *owyn = malloc(sizeof(float));
  139.     int *kol = malloc(sizeof(int));
  140.     FILE* plik = fopen("G:/dopobrania.csv", "r");
  141.     while (fscanf(plik, "%d;%f", &*(kol + x), &*(owyn + x)) != EOF)
  142.     {
  143.         printf("%d %f\n", *(kol + x), *(owyn + x));
  144.         owyn = realloc(owyn, (x + 1) * sizeof(float*));
  145.         kol = realloc(kol, (x + 1) * sizeof(int));
  146.         x++;
  147.     }
  148. }
  149.  
  150. void filtry(float *szum, int roz, float *med, float *sred)
  151. {
  152.     float *dof = szum; //wskaznik tablicy do filtracji
  153.     int size = roz;
  154.     float temp;
  155.     float pomoc[5];
  156.     int x = 0;
  157.     int wyborf = 0;
  158.     float suma = 0;
  159.     puts("Filtr medianowy wcisnij 1");
  160.     puts("Filtr sredniej ruchomej wcisnij 2");
  161.     do {
  162.         scanf("%d", &wyborf);
  163.     } while (wyborf != 1 && wyborf != 2);
  164.  
  165.     switch (wyborf) {
  166.  
  167.     case 1:
  168.         puts("Filtr medianowy");
  169.         for (int h = 0; h < size; h++) {
  170.             printf("%d %.3f\n", h, dof[h]);
  171.         }
  172.         med[0] = dof[0];
  173.         med[1] = dof[1];
  174.         med[size - 1] = dof[size - 1];
  175.         med[size - 2] = dof[size - 2];
  176.         for (int i = 0; i < size - 4; i++) {
  177.             x = 0;
  178.             for (int j = i; j < 5 + i; j++, x++)
  179.                 pomoc[x] = dof[j];
  180.  
  181.             for (int q = 0; q < 5; q++) {
  182.                 for (int w = 0; w < 4; w++) {
  183.                     if (pomoc[w] > pomoc[w + 1]) {
  184.                         temp = pomoc[w];
  185.                         pomoc[w] = pomoc[w + 1];
  186.                         pomoc[w + 1] = temp;
  187.  
  188.                     }
  189.                 }
  190.             }
  191.             med[i + 2] = pomoc[2];
  192.         }
  193.         for (int t = 0; t < size; t++) {
  194.             printf("%.3f", med[t]);
  195.         }
  196.         break;
  197.     case 2:
  198.         puts("Filtr sredniej ruchomej");
  199.         sred[0] = dof[0];
  200.         sred[1] = dof[1];
  201.         sred[size - 1] = dof[size - 1];
  202.         sred[size - 2] = dof[size - 2];
  203.         for (int i = 0; i < size - 4; i++) {
  204.             x = 0;
  205.             suma = 0;
  206.             for (int j = i; j < 5 + i; j++, x++) {
  207.                 pomoc[x] = dof[j];
  208.                 suma += pomoc[x];
  209.             }
  210.             sred[i + 2] = suma / 5;
  211.             //printf("%.3f\n", sred[i + 2]);
  212.         }
  213.         for (int h = 0; h < size; h++) {
  214.             printf("%.3f\n", sred[h]);
  215.         }
  216.         break;
  217.     }
  218. }
  219.  
  220. void zapisywanieDoPliku(float *wyn, int size, float *med, float *sred)
  221. {
  222.     int roz1 = size;
  223.     float *sum = wyn;
  224.     //printf("%.3f", *(sum));
  225.     FILE* plik;
  226.     plik = fopen("G:\wykres.csv", "w");
  227.     //fprintf(plik, "%.3f", *(sum));
  228.     for (int i = 0; i < roz1; i++) {
  229.         fprintf(plik, "%d;%.3f\n", i, *(sum + i));
  230.     }
  231.     for (int j = 0; j < size; j++) {
  232.         fprintf(plik, "%d;%.3f\n", j, med[j]);
  233.     }
  234.     for (int h = 0; h < size; h++) {
  235.         fprintf(plik, "%d;%.3f\n", h, sred[h]);
  236.     }
  237.     fclose(plik);
  238. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement