Advertisement
Guest User

KOSELSKI_KOD_INF

a guest
Nov 13th, 2018
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.64 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <math.h>
  4. #include <stdlib.h>
  5. #include <time.h>
  6. #include <locale.h>
  7.  
  8. void wczytajRozmiar(int *rozmiar);
  9. int losuj(int min, int max);
  10. float minimum(float t[], int rozmiar);
  11. float maximum(float t[], int rozmiar);
  12. void zamien(float *a, float*b);
  13. void wczytajWsp(float wsp[4]);
  14. void dziedzina(float *dMin, float *dMax);
  15. void generator(float wsp[], float dMin, float dMax, float wyniki[], int rozmiar);
  16. void losowanieSzumu(float szum[], float wyniki[], int rozmiar);
  17. void zapisuj(float szum[], int rozmiar);
  18. void odczytujDane(float **tablica, int *nowyRoz);
  19. void babelSort(float tab[], int n);
  20. void filtrMedianowy(float *zaszumiona, float *odszumiona, int rozmiar);
  21. void filtrSredniej(float *zaszumiona, float *odszumiona, int rozmiar);
  22.  
  23. int main(int argc, char **argv)
  24. {
  25. FILE* plik;
  26. float wspolczynniki[4];
  27. float *wyniki = NULL, *szum = NULL, *odszum = NULL;
  28. float dolna, gorna;
  29. int rozmiar = 0;
  30. int i, opcja, filtr, stan = 0;
  31. srand((unsigned int)(time(NULL)));
  32. setlocale(LC_ALL, "polish_poland");
  33.  
  34. printf("Wybierz opcje:\n 1) Generacja sygnalu\n 2) Generacja szumu\n 3) Filtrowanie\n 4) Zapisywanie\n 5) Wczytywanie zaszumionego sygnalu\n 6) Koniec programu\n)");
  35. while (scanf("%d", &opcja))
  36. {
  37. switch (opcja)
  38. {
  39. case 1:
  40. if (stan == 1 || stan == 2 || stan == 3 || stan == 4 || stan == 5)
  41. {
  42. printf("Nie mozesz wybrac tej opcji poniewaz wczytales/wygenerowales/filtrowales/zaszumiales juz sygnal\n");
  43. break;
  44. }
  45. printf(" Generacja odbedzie sie na podstawie funkcji y = A * sin(x / B) - C * cos(x) + D\n ");
  46. wczytajRozmiar(&rozmiar);
  47. wyniki = malloc(rozmiar * sizeof(*wyniki));
  48. wczytajWsp(wspolczynniki);
  49. dziedzina(&dolna, &gorna);
  50. generator(wspolczynniki, dolna, gorna, wyniki, rozmiar);
  51. stan = 1;
  52. break;
  53. case 2:
  54. if (stan == 1 || (stan != 2 && stan !=3 && stan != 5))
  55. {
  56. szum = malloc(rozmiar * sizeof(*szum));
  57. losowanieSzumu(szum, wyniki, rozmiar);
  58. stan = 2;
  59. }
  60. else
  61. printf("Jeszcze nie wygerowales/juz zaszumiles sygnal!\n");
  62. break;
  63. case 3:
  64. if (stan == 2 || stan == 5)
  65. {
  66. odszum = malloc(rozmiar * sizeof(*odszum));
  67. printf("Czy chcesz zastosowac filtr Medianowy(wpisz 1) czy filtr Sredniej(wpisz 2)?\n");
  68. scanf("%d", &filtr);
  69. if (filtr == 1)
  70. filtrMedianowy(szum, odszum, rozmiar);
  71. else if (filtr == 2)
  72. filtrSredniej(szum, odszum, rozmiar);
  73. else
  74. {
  75. printf("Nie wybrales dobrej opcji.\nWybierz jeszcze raz Filtrowanie i wybierz dobra opcje!\n");
  76. break;
  77. }
  78. printf("Sygnal zostal odszumiony\n");
  79. stan = 3;
  80. break;
  81. }
  82. else
  83. {
  84. printf("Nie zaszumiles sygnalu/juz zafiltrowales\n");
  85. break;
  86. }
  87. case 4:
  88. if (stan == 3)
  89. {
  90. zapisuj(szum, rozmiar);
  91. plik = fopen("C:\\Users\\Admin\\Desktop\\odszumiony.csv", "w");
  92. if (plik == NULL)
  93. {
  94. printf("Nie udalo sie zapisac do pliku odszumionego sygnalu\n ");
  95. break;
  96. }
  97. for (i = 0; i < rozmiar; i++)
  98. fprintf(plik, "%f\n", odszum[i]);
  99. fclose(plik);
  100. printf("Zapisano odszumiony sygnal\n");
  101. stan = 4;
  102. }
  103. else
  104. printf("Nie mozna zapisac (mozliwe ze juz to zrobiles)! Najpierw zaszum/wczytaj sygnal i filtruj.\n");
  105. break;
  106. case 5:
  107. if (stan == 1 || stan == 2 || stan == 3)
  108. {
  109. printf("Nie mozesz wczytac sygnalu poniewaz zostal wygenerowany\n");
  110. break;
  111. }
  112. odczytujDane(&szum, &rozmiar);
  113. stan = 5;
  114. break;
  115. case 6:
  116. if (wyniki != NULL)
  117. free(wyniki);
  118. if (szum != NULL)
  119. free(szum);
  120. if (odszum != NULL)
  121. free(odszum);
  122. return 0;
  123. default:
  124. printf("Wybierz opcje od 1 do 6.\n");
  125. break;
  126. }
  127. system("pause");
  128. system("cls");
  129. printf(" 1)Generacja sygnalu\n 2)Generacja szumu\n 3)Filtrowanie\n 4)Zapisywanie\n 5)Wczytywanie zaszumionego sygnalu\n 6)Koniec programu\n)");
  130. }
  131. }
  132.  
  133. void wczytajRozmiar(int *rozmiar)
  134. {
  135. printf("Podaj ilosc probek generowanego sygnalu(>5):\n");
  136. scanf("%d", rozmiar);
  137. while (*rozmiar <= 5)
  138. {
  139. printf("Wprowadz wieksza ilosc probek [>5] \n");
  140. scanf("%d", rozmiar);
  141. }
  142. }
  143.  
  144. int losuj(int min, int max)
  145. {
  146. return rand() % (max - min + 1) + min;
  147. }
  148.  
  149. float minimum(float t[], int rozmiar)
  150. {
  151. int i = 0;
  152. int mini = 0;
  153. for (i = 0; i < rozmiar - 1; i++)
  154. {
  155. if (t[i + 1] < t[mini])
  156. mini = i + 1;
  157. }
  158. return t[mini];
  159. }
  160.  
  161. float maximum(float t[], int rozmiar)
  162. {
  163. int i = 0;
  164. int maxi = 0;
  165. for (i = 0; i < rozmiar - 1; i++)
  166. {
  167. if (t[i + 1] > t[maxi])
  168. maxi = i + 1;
  169. }
  170. return t[maxi];
  171. }
  172.  
  173. void zamien(float *a, float*b)
  174. {
  175. float pom = *a;
  176. *a = *b;
  177. *b = pom;
  178. }
  179.  
  180. void wczytajWsp(float wsp[4])
  181. {
  182. printf("Podaj wspolczynnik A\n");
  183. scanf("%f", &wsp[0]);
  184. printf("Podaj wspolczynnik B(!=0):\n");
  185. scanf("%f", &wsp[1]);
  186. while (wsp[1] == 0)
  187. {
  188. printf("Wprowadz inny wspolczynnik B(!=0)\n");
  189. scanf("%f", &wsp[1]);
  190. }
  191. printf("Podaj wspolczynnik C\n");
  192. scanf("%f", &wsp[2]);
  193. printf("Podaj wspolczynnik D\n");
  194. scanf("%f", &wsp[3]);
  195. }
  196.  
  197.  
  198. void dziedzina(float *dMin, float *dMax)
  199. {
  200. printf("Podaj dolny zakres dziedziny:\n");
  201. scanf("%f", dMin);
  202. printf("Podaj gorny zakres dziedziny:\n");
  203. scanf("%f", dMax);
  204. if (*dMin > *dMax)
  205. zamien(dMin, dMax);
  206. else if (*dMin == *dMax)
  207. {
  208. *dMax = *dMax + 1;
  209. printf("Podales takie same granice, gorna zostala zwiekszona o 1\n");
  210. }
  211. }
  212.  
  213. void generator(float wsp[], float dMin, float dMax, float wyniki[], int rozmiar)
  214. {
  215. int i = 0;
  216. float x = dMin;
  217. const float przyrost = (float)((fabs(dMax - dMin)) / rozmiar);
  218. for (i = 0; i < rozmiar; i++)
  219. {
  220. wyniki[i] = (float)(wsp[0] * sin(x / wsp[1]) - wsp[2] * cos(x) + wsp[3]);
  221. x += przyrost;
  222. }
  223. printf("Sygnal zostal wygenerowany\n");
  224. }
  225.  
  226. void losowanieSzumu(float szum[], float wyniki[], int rozmiar)
  227. {
  228. int indeks = 0, i = 0;
  229. int iloscZaszum;
  230. float amplituda, pom, ymin, ymax;
  231. for (i = 0; i < rozmiar; i++)
  232. szum[i] = wyniki[i];
  233. iloscZaszum = losuj((rozmiar * 10) / 100, (rozmiar * 20) / 100); //od 10 do 20 procent zaszumienie
  234. ymin = minimum(szum, rozmiar);
  235. ymax = maximum(szum, rozmiar);
  236. amplituda = ymax - ymin;
  237. for (i = 0; i < iloscZaszum; i++)
  238. {
  239. indeks = rand() % rozmiar;
  240. pom = szum[indeks];
  241. szum[indeks] = (float)(((float)rand() / (float)(RAND_MAX))*(amplituda / 2) - amplituda / 4. + pom);
  242. }
  243. printf("Zaszumiono sygnal\n");
  244. }
  245.  
  246. void zapisuj(float szum[], int rozmiar)
  247. {
  248. FILE* plik;
  249. int i;
  250. plik = fopen("C:\\Users\\Admin\\Desktop\\plik.csv", "w");
  251. if (plik == NULL)
  252. {
  253. printf("Nie mozna otworzyc pliku\n");
  254. }
  255. else
  256. {
  257. for (i = 0; i < rozmiar; i++)
  258. fprintf(plik, "%f\n", szum[i]);
  259. fclose(plik);
  260. printf("Zapisano sygnal zaszumiony\n");
  261. }
  262. }
  263.  
  264. void odczytujDane(float **tablica, int *nowyRoz)
  265. {
  266. int licznik = 0, i = 0;
  267. float *pom = NULL;
  268. FILE* plik;
  269. plik = fopen("C:\\Users\\Admin\\Desktop\\plik.csv", "r");
  270. if (plik == NULL)
  271. {
  272. printf("Nie mozna otworzyc pliku\n");
  273. }
  274. else
  275. {
  276. while (fgetc(plik) != EOF)
  277. {
  278. fseek(plik, -1, SEEK_CUR);
  279. licznik++;
  280. pom = realloc(pom, licznik * sizeof(float));
  281. fscanf(plik, "%f\n", &pom[licznik - 1]);
  282. }
  283. *nowyRoz = licznik;
  284. *tablica = realloc(*tablica, licznik * sizeof(float));
  285. for (i = 0; i < licznik; i++)
  286. (*tablica)[i] = pom[i];
  287. free(pom);
  288. fclose(plik);
  289. printf("Udalo sie wczytac\n");
  290. }
  291. }
  292.  
  293. void babelSort(float tab[], int rozmiar)
  294. {
  295. int i, j;
  296. for (i = 0; i < rozmiar - 1; i++)
  297. for (j = 0; j < rozmiar - i - 1; j++)
  298. if (tab[j] > tab[j + 1])
  299. zamien(&tab[j], &tab[j + 1]);
  300. }
  301.  
  302. void filtrMedianowy(float *zaszumiona, float *odszumiona, int rozmiar)
  303. {
  304. int i;
  305. float *tymczasowa;
  306. float mediana[5];
  307. tymczasowa = malloc(rozmiar * sizeof(float));
  308. for (i = 0; i < rozmiar; i++)
  309. *(tymczasowa + i) = *(zaszumiona + i);
  310. for (i = 2; i < rozmiar - 2; i++)
  311. {
  312. mediana[0] = tymczasowa[i - 2];
  313. mediana[1] = tymczasowa[i - 1];
  314. mediana[2] = tymczasowa[i];
  315. mediana[3] = tymczasowa[i + 1];
  316. mediana[4] = tymczasowa[i + 2];
  317. babelSort(mediana, 5);
  318. odszumiona[i] = mediana[2];
  319. }
  320. //przypadek dla 0 elementu zaszumionej z odbiciem lustrzanym
  321. mediana[0] = tymczasowa[2];
  322. mediana[1] = tymczasowa[1];
  323. mediana[2] = tymczasowa[0];
  324. mediana[3] = tymczasowa[1];
  325. mediana[4] = tymczasowa[2];
  326. babelSort(mediana, 5);
  327. odszumiona[0] = mediana[2];
  328. //przypadek dla 1 elementu zaszumionej z odbiciem lustrzanym
  329. mediana[0] = tymczasowa[0];
  330. mediana[1] = tymczasowa[0];
  331. mediana[2] = tymczasowa[1];
  332. mediana[3] = tymczasowa[2];
  333. mediana[4] = tymczasowa[3];
  334. babelSort(mediana, 5);
  335. odszumiona[1] = mediana[2];
  336. //przypadek dla rozmiar-2 elementu zaszumionej z odbiciem lustrzanym
  337. mediana[0] = tymczasowa[rozmiar - 4];
  338. mediana[1] = tymczasowa[rozmiar - 3];
  339. mediana[2] = tymczasowa[rozmiar - 2];
  340. mediana[3] = tymczasowa[rozmiar - 1];
  341. mediana[4] = tymczasowa[rozmiar - 3];
  342. babelSort(mediana, 5);
  343. odszumiona[rozmiar - 2] = mediana[2];
  344. //przypadek dla rozmiar-1 elementu zaszumionej z odbiciem lustrzanym
  345. mediana[0] = tymczasowa[rozmiar - 3];
  346. mediana[1] = tymczasowa[rozmiar - 2];
  347. mediana[2] = tymczasowa[rozmiar - 1];
  348. mediana[3] = tymczasowa[rozmiar - 2];
  349. mediana[4] = tymczasowa[rozmiar - 3];
  350. babelSort(mediana, 5);
  351. odszumiona[rozmiar - 1] = mediana[2];
  352.  
  353. free(tymczasowa);
  354. }
  355.  
  356. void filtrSredniej(float *zaszumiona, float *odszumiona, int rozmiar)
  357. {
  358. int i;
  359. for (i = 2; i < rozmiar - 2; i++)
  360. {
  361. odszumiona[i] = (float)((zaszumiona[i - 2] + zaszumiona[i - 1] + zaszumiona[i] + zaszumiona[i + 1] + zaszumiona[i + 2]) / 5);
  362. }
  363. odszumiona[0] = zaszumiona[0];
  364. odszumiona[1] = zaszumiona[1];
  365. odszumiona[rozmiar - 1] = zaszumiona[rozmiar - 1];
  366. odszumiona[rozmiar - 2] = zaszumiona[rozmiar - 2];
  367. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement