Facebook
From Anorexic Hamerkop, 9 Years ago, written in C.
Embed
Download Paste or View Raw
Hits: 703
  1. //zalaczanie bibliotek
  2. #define _CRT_SECURE_NO_WARNINGS
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <math.h>
  6.  
  7. //deklaracja struktury
  8. struct sygnal
  9.         {
  10.          double amp, fs, ts, *taby, *tabx;
  11.          int fp, lp;
  12.         };
  13. //prototypy funkcji
  14. double szum();
  15. void wykres(int, double*, double*, char*);
  16. double funkcja (double, double);
  17. void zamien (double*, double*);
  18. void sortuj(int);
  19. void odszum(double*, int t, int, int);
  20.  
  21. int main ()
  22. {
  23.         //deklaracje zmiennych
  24.          struct sygnal s;
  25.          char rs;
  26.          int i, a, t;    
  27.          double T, tm, tn;
  28.          int o=0;
  29.          
  30.          //program działa w petli, dopoki uzytkownik nie zdecyduje o zakonczeniu dzialania
  31.          while(1)
  32.          {
  33.          s.amp=0;
  34.          s.fp=0;
  35.          s.ts=0;
  36.          s.fs=0;
  37.        
  38.         //uzytkownik wybiera sygnal badz konczy dzialanie programu
  39.         printf("Wybierz rodzaj sygnal do narysowania: \n a - sygnal nr 10;\n b - sygnal nr 15\n x - zakoncz dzialanie programu\n\n ");
  40.         scanf (" %c",&rs);
  41.         printf("\n");
  42.  
  43.         //warunek wyjścia z pętli
  44.         if(rs=='x') break;
  45.  
  46.         //pobranie wartosci zmiennych od uzytkownika
  47.         printf ("Podaj amplitude\n");
  48.         scanf ("%lf", &s.amp);
  49.         printf ("Podaj czestotliwosc probkowania\n");
  50.         scanf ("%d", &s.fp);
  51.         printf ("Podaj czas sygnalu\n");
  52.         scanf ("%lf", &s.ts);
  53.         printf ("Podaj czestotliwosc sygnalu\n");
  54.     scanf ("%lf", &s.fs);
  55.         printf (" amp=%lf\n fp=%d\n fs=%lf\n ts=%lf\n\n",s.amp, s.fp, s.fs, s.ts);
  56.        
  57.         //obliczanie potrzebnych wartosci
  58.         s.lp=(int)s.ts*s.fp+1;
  59.         T=1/s.fs; // okres sygnału, upraszcza zapis
  60.         a=s.amp*s.fs*4;// współczynik kierunkowy prostej będącej fragmentem sygnału
  61.  
  62.         //dynamiczna allokacja pamięci
  63.         s.tabx=(double*)malloc(s.lp*sizeof(double));
  64.         s.taby=(double*)malloc(s.lp*sizeof(double));
  65.  
  66.         //pentla zapisujaca wartosci argumentow do tablicy
  67.         for (i=0; i<s.lp; i++)
  68.         {
  69.                 s.tabx[i]=(double)i*(1.0)/(double)s.fp;
  70.                 printf("x%d = %lf\n", i, s.tabx[i]);
  71.         }
  72.         printf("\n\n");
  73.  
  74. //obliczanie wartosci dla argumetow w zaleznosci od wybranego sygnalu
  75.         switch (rs){
  76.                
  77.                 case 'a':
  78.                        
  79.                         //pentla "liczy" numer okresu, w którym maja byc liczone wartosci
  80.                         for (o=0; o<=(s.ts*s.fs); o++)
  81.                 {
  82.                         for (i=0; i<s.lp; i++)
  83.                         {
  84.                                 //warunek przedziału, dla którego wartości są liczone wg odpowiedniej funkcji
  85.                             if ((s.tabx[i]>=0+(T*o)) && (s.tabx[i]<(T/4)+(T*o)))
  86.                                 {
  87.                                         //wywołanie funkcji liczącej wartości dla argumentów z tabx i zapisującej je w taby
  88.                                         printf("y(%lf) = %lf\n", s.tabx[i], s.taby[i]=funkcja(a, (s.tabx[i]-(T*o))));
  89.                                 }
  90.                        
  91.                                 if ((s.tabx[i]>=(T/4)+(T*o)) && (s.tabx[i]<(T/2+T*o)))
  92.                                 {
  93.                                         printf("y(%lf) = %lf\n", s.tabx[i], s.taby[i]=(-s.amp));
  94.                                 }
  95.                                
  96.                                 if ((s.tabx[i]>=(T/2)+(T*o)) && (s.tabx[i]<(3*T/4)+(T*o)))
  97.                                 {
  98.                                         printf("y(%lf) = %lf\n", s.tabx[i], s.taby[i]=funkcja(a, (s.tabx[i]-(T/2)-(T*o))));
  99.                                 }
  100.                                
  101.                                 if ((s.tabx[i]>=(3*T/4)+(T*o)) && (s.tabx[i]<(7*T/8)+(T*o)))
  102.                                 {
  103.                                         printf("y(%lf) = %lf\n", s.tabx[i], s.taby[i]=(2*funkcja((-a), (s.tabx[i]-(3*T/4)-T*o))));
  104.                                 }
  105.                                
  106.                                 if ((s.tabx[i]>=(7*T/8)+(T*o)) && (s.tabx[i]<=(T+T*o)))
  107.                                 {
  108.                                         printf("y(%lf) = %lf\n", s.tabx[i], s.taby[i]=(2*funkcja(a, (s.tabx[i]-T-T*o))));
  109.                                 }
  110.                                
  111.                         }
  112.                 }
  113.                 printf("\n\n");
  114.                 break;
  115.  
  116.                 case 'b':
  117.                
  118.                 for (o=0; o<=(s.ts*s.fs); o++)
  119.                 {
  120.                         for (i=0; i<s.lp; i++)
  121.                         {
  122.                                 if (s.tabx[i]>=(0+T*o) && s.tabx[i]<((T/2)+T*o))
  123.                                 {
  124.                                         printf("y(%lf) = %lf\n", s.tabx[i], s.taby[i]=(funkcja((a/2), (s.tabx[i]-T*o))));
  125.                                 }
  126.                                 if (s.tabx[i]>=((T/2)+T*o) && s.tabx[i]<=(T*(o+1)))
  127.                                 {
  128.                                         s.taby[i]=s.amp*(-sin((s.tabx[i]-T*o-T/2)*3.14*2/T));
  129.                                         printf("y(%lf) = %lf\n", s.tabx[i], s.taby[i]);
  130.  
  131.                                 }
  132.                         }
  133.                        
  134.                 }
  135.  
  136.        
  137.        
  138.                
  139.                 printf("\n\n");
  140.                 break ;
  141.             }
  142.  
  143.         printf (" amp=%lf\n fp=%d\n fs=%lf\n ts=%lf\n\n",s.amp, s.fp, s.fs, s.ts);
  144.  
  145.  
  146.         //wywołanie funkcji rysującej wykres
  147.         wykres(s.lp, s.tabx, s.taby,"wykres.html");
  148.         printf("\n\n");
  149.  
  150.         //petla podczas ktorej do wartosci taby[i] dodawana jest losowa wartosc, zaszumia wykres
  151.         for(i=0; i<s.lp; i++)
  152.         {
  153.                 s.taby[i]=s.taby[i]+szum();
  154.         }
  155.  
  156.         //wywołanie funkcji rysującej wykres zaszumiony
  157.         wykres(s.lp, s.tabx, s.taby,"wykres_zaszumiony.html");
  158.         printf("\n\n");
  159.  
  160.         //pobranie od uzytkownika liczby probek do odszumiania
  161.         printf ("Podaj liczbe probek do odszumiania\n");
  162.         scanf ("%d", &t);
  163.  
  164.         //wywolanie funkcji odszumajacej wykres
  165.         odszum (s.taby, t, s.lp, s.fp);
  166.  
  167.  
  168.        
  169.         free(s.tabx); //zwolnienie pamięci
  170.         free(s.taby);
  171.        
  172.         printf ("\n\n");
  173.  
  174. }
  175.  
  176.  
  177.          system ("pause");
  178.          return 0;
  179.         }
  180.  
  181. // DEKLARACJE FUNKCJI  
  182.  
  183. //funkcja zaszumiajaca wykres
  184. double szum()
  185. {
  186.         double z=0;
  187.         int i;
  188.         for (i=0; i<12; i++)
  189.         {
  190.                 z+=((rand()%100)-50);
  191.         }
  192.         z=z/600;
  193.         return z;
  194. }
  195.  
  196. //funkcja "rysująca prostą o zadanym kącie nachylenia"
  197. double funkcja (double a, double tx)
  198. {
  199.         double ty;
  200.         ty = a * (tx);
  201.         return ty;
  202. }
  203.  
  204. //funkcjia zamieniajaca miejscami 2 liczby, konieczna do sortowania
  205. void zamien(double *m, double *n)
  206. {
  207. double temp;
  208. temp=*m;
  209. *m=*n;
  210. *n=temp;
  211. }
  212.  
  213. //funkcja sortujaca tablice t-elementowa
  214. void sortuj (int t, double tx[])
  215. {
  216.         int i, j;
  217.         for (j=0; j<t; j++)
  218.         {
  219.                 for (i=0; i<t-1; i++)
  220.                 {
  221.                         //jezeli wartosc po "lewej stronie" tablicy jest wieksza nastepuje zamiana miejsc
  222.                         if (tx[i]>tx[i+1])
  223.                         {
  224.                                 zamien (&tx[i], &tx[i+1]);
  225.                         }
  226.                 }
  227.         }
  228. }
  229.  
  230. //funkcja odzszumiajaca wykres
  231. void odszum (double *ty, int t, int lp, int fp)
  232. {
  233.         double *ntx, *nty, *sty;
  234.         int i,j;
  235.  
  236. //allokacja dodatkowych tablic
  237.         ntx=(double*)malloc((lp-t+1)*sizeof(double));
  238.         nty=(double*)malloc((lp-t+1)*sizeof(double));
  239.         sty=(double*)malloc(t*sizeof(double));
  240.  
  241. /*petle, w których do tablicy sty wpisywanych jest, w kazdym przebiegu zewnetrzenej petli,
  242.  t-kolejnych wartosci z tablicy ty, a mediana z nich jest zapisywana po kolei do tabeli nty*/
  243.         for (i=0; i<(lp-t+1); i++)
  244.         {
  245.                 for (j=0; j<t; j++)
  246.                 {
  247.                         sty[j]=ty[i+j];
  248.                 }
  249.                 sortuj(t, sty);
  250.                 ntx[i]=(double)i/fp;
  251.                 if (t%2==0) nty[i]=(sty[t/2-1]+sty[t/2+1])/2;
  252.                 else nty[i]=sty[t/2];
  253.         }
  254.  
  255.         // wygenerowanie odszumionego wykresu
  256.         wykres (lp-t+1, ntx, nty, "wykres_odszumiony.html");
  257.         //zwolnienie pa
  258.         free(ntx);
  259.         free(nty);
  260. }
  261.  
  262.  
  263. //funkcja generujaca kod html dla wykresu Google Chart
  264. void wykres(int l,double *tx, double *ty, char nazwa[]){  
  265.         FILE *fp;
  266.         int i;
  267.  
  268.         printf("Rysuj %s\n",nazwa);
  269.         fp = fopen(nazwa,"w");
  270.  
  271.         fprintf(fp,"<html>\n");
  272.         fprintf(fp,"<head>\n");
  273.         fprintf(fp,"<script type=\"text/javascript\" src=\"https://www.google.com/jsapi\"></script>\n");
  274.         fprintf(fp,"<script type=\"text/javascript\">\n");
  275.         fprintf(fp,"google.load(\"visualization\", \"1\", {packages:[\"corechart\"]});\n");
  276.         fprintf(fp,"google.setOnLoadCallback(drawChart);\n");
  277.         fprintf(fp,"function drawChart() {\n");
  278.         fprintf(fp,"var data = google.visualization.arrayToDataTable([\n");
  279.  
  280.         fprintf(fp,"['i', 'Wartosc'],\n");
  281.         for(i=0;i<l;i++){
  282.                 fprintf(fp,"[%lf, %lf],\n",tx[i],ty[i]);  
  283.         }
  284.         fprintf(fp,"[%lf, %lf]\n",tx[i-1],ty[i-1]);
  285.         fprintf(fp,"]);\n");
  286.  
  287.         fprintf(fp,"var options = {\n");
  288.         fprintf(fp,"title: 'Wybrany sygnal'\n");
  289.         fprintf(fp,"};\n");
  290.  
  291.         fprintf(fp,"var chart = new google.visualization.LineChart(document.getElementById('chart_div'));\n");
  292.         fprintf(fp,"chart.draw(data, options);\n");
  293.         fprintf(fp,"}\n");
  294.         fprintf(fp,"</script>\n");
  295.         fprintf(fp,"</head>\n");
  296.         fprintf(fp,"<body>\n");
  297.         fprintf(fp,"<div id=\"chart_div\" style=\"width: 900px; height: 500px;\"></div>\n");
  298.         fprintf(fp,"</body>\n");
  299.         fprintf(fp,"</html>\n");
  300.  
  301.         fclose(fp);
  302.  
  303.         system(nazwa);      
  304. }