commit 170cef5140d70307b7042353108f6e45975a4f6f parent 85632e5712602f0d11099a408b4327bed9bc09e0 Author: Christos Margiolis <christos@margiolis.net> Date: Wed, 12 May 2021 23:02:54 +0300 i don't know what to write here Diffstat:
32 files changed, 795 insertions(+), 1000 deletions(-)
diff --git a/README b/README @@ -1,4 +1,3 @@ -uni-assignments -=============== - +uni +=== My university programming assignments. diff --git a/c-os2/ex2/Makefile b/c-os2/ex2/Makefile @@ -0,0 +1,12 @@ +all: + cc ex3_server.c -lpthread -o ex3_server + cc ex3_client.c -o ex3_client + +run_srv: all + ./ex3_server + +run_cli: all + ./ex3_client + +clean: + rm -f ex3_server ex3_client *.core *.o diff --git a/c-os2/ex2/ex1_1.c b/c-os2/ex2/ex1_1.c @@ -10,12 +10,12 @@ * Εργαστήριο ΛΣ2 (Δ6) / Εργασία 2: Άσκηση 1.1 / 2020-2021 * Ονοματεπώνυμο: Χρήστος Μαργιώλης * ΑΜ: 19390133 - * Τρόπος μεταγλώττισης: `cc ex1_1.c -lpthread -lrt -o ex1_1` + * Τρόπος μεταγλώττισης: `cc ex1_1.c -lpthread -o ex1_1` */ struct foo { - sem_t mutex; char *str; + sem_t mutex; }; /* Function declarations */ @@ -24,7 +24,7 @@ static void *emalloc(size_t); static void die(const char *); /* Global variables */ -static char *argv0; /* Program name */ +static char *argv0; static const char *nums[] = { /* Each thread will print one of these */ "<one>", "<two>", @@ -37,16 +37,17 @@ tdprint(void *foo) struct foo *f; f = (struct foo *)foo; - sem_wait(&f->mutex); + if (sem_wait(&f->mutex) == -1) + die("sem_wait"); printf("%s", f->str); /* Prevent memory leak from strdup(2). */ free(f->str); - sem_post(&f->mutex); + if (sem_post(&f->mutex) == -1) + die("sem_post"); return NULL; } -/* Error checking malloc(2) */ static void * emalloc(size_t nb) { @@ -54,16 +55,16 @@ emalloc(size_t nb) if ((p = malloc(nb)) == NULL) die("malloc"); + return p; } -/* Die. */ static void die(const char *str) { fprintf(stderr, "%s: ", argv0); perror(str); - exit(EXIT_FAILURE); + exit(1); } int @@ -78,13 +79,19 @@ main(int argc, char *argv[]) argv0 = *argv; len = LEN(nums); f = emalloc(sizeof(struct foo)); + /* + * Instead of hardcoding how many threads we want to have, the + * number of threads is always equal to how many elements the + * `nums` array has. That means in case we want to add/remove + * entries from `nums`, everything will adapt automatically. + */ tds = emalloc(len * sizeof(pthread_t)); - sem_init(&f->mutex, 0, 1); + if (sem_init(&f->mutex, 0, 1) == -1) + die("sem_init"); while (n--) { for (i = 0; i < len; i++) { - /* Get appropriate string. */ - if ((f->str = strdup(nums[i % len])) == NULL) + if ((f->str = strdup(nums[i])) == NULL) die("strdup"); if (pthread_create(&tds[i], NULL, tdprint, (void *)f) != 0) die("pthread_create"); @@ -94,7 +101,7 @@ main(int argc, char *argv[]) } printf("\n"); - sem_destroy(&f->mutex); + (void)sem_destroy(&f->mutex); pthread_exit(NULL); free(tds); free(f); diff --git a/c-os2/ex2/ex3_client.c b/c-os2/ex2/ex3_client.c @@ -0,0 +1,118 @@ +#include <sys/socket.h> +#include <sys/types.h> +#include <sys/un.h> + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +/* + * Εργαστήριο ΛΣ2 (Δ6) / Εργασία 2: Άσκηση 3 (client) / 2020-2021 + * Ονοματεπώνυμο: Χρήστος Μαργιώλης + * ΑΜ: 19390133 + * Τρόπος μεταγλώττισης: `cc ex3_client.c -o ex3_client` + */ + +/* Results from server. */ +struct pack_res { + char str[32]; + float avg; +}; + +static void *emalloc(size_t); +static void die(const char *); + +static char *argv0; + +static void * +emalloc(size_t nb) +{ + void *p; + + if ((p = malloc(nb)) == NULL) + die("malloc"); + + return p; +} + +static void +die(const char *str) +{ + (void)fprintf(stderr, "%s: ", argv0); + perror(str); + exit(1); +} + +int +main(int argc, char *argv[]) +{ + struct pack_res *res; + struct sockaddr_un sun; + char *sockfile = "/tmp/cool.sock"; + int *arr; + int fd, i, n; + char ch; + + argv0 = *argv; + while ((ch = getopt(argc, argv, "s:")) != -1) { + switch (ch) { + case 's': + sockfile = optarg; + break; + case '?': + default: + fprintf(stderr, "usage: %s [-s sockfile]\n", argv0); + break; + } + } + argc -= optind; + argv += optind; + + + if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) + die("socket"); + (void)memset(&sun, 0, sizeof(sun)); + sun.sun_family = AF_UNIX; + (void)strncpy(sun.sun_path, sockfile, sizeof(sun.sun_path) - 1); + if (connect(fd, (struct sockaddr *)&sun, sizeof(struct sockaddr_un)) == -1) + die("connect"); + + res = emalloc(sizeof(struct pack_res)); + + for (;;) { + + /* Remove any previous junk. */ + (void)memset(res, 0, sizeof(struct pack_res)); + + printf("%s> n: ", argv0); + scanf("%d", &n); + /* Flush buffer */ + (void)getchar(); + arr = emalloc(n * sizeof(int)); + for (i = 0; i < n; i++) { + printf("%s> arr[%d]: ", argv0, i); + scanf("%d", &arr[i]); + } + (void)getchar(); + if (send(fd, &n, sizeof(int), 0) == -1) + die("send"); + if (send(fd, arr, n * sizeof(int), 0) == -1) + die("send"); + if (recv(fd, res, sizeof(struct pack_res), 0) == -1) + die("recv"); + printf("response: %s\tavg: %.2f\n", res->str, res->avg); + + printf("%s> continue (y/n)? ", argv0); + ch = getchar(); + if (send(fd, &ch, 1, 0) == -1) + die("send"); + if (ch == 'n') + break; + } + + free(res); + (void)close(fd); + + return 0; +} diff --git a/c-os2/ex2/ex3_server.c b/c-os2/ex2/ex3_server.c @@ -0,0 +1,225 @@ +#include <sys/socket.h> +#include <sys/types.h> +#include <sys/un.h> + +#include <signal.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +/* + * Εργαστήριο ΛΣ2 (Δ6) / Εργασία 2: Άσκηση 3 (server) / 2020-2021 + * Ονοματεπώνυμο: Χρήστος Μαργιώλης + * ΑΜ: 19390133 + * Τρόπος μεταγλώττισης: `cc ex3_server.c -lpthread -o ex3_server` + */ + +/* Results to be sent back to the client. */ +struct pack_res { + char str[32]; + float avg; +}; + +struct foo { + int cfd; + int nsucc; + int ntotal; +}; + +static int srv(struct foo *); +static void sighandler(int); +static void *emalloc(size_t); +static void die(const char *); + +static char *argv0; +static volatile sig_atomic_t f_quit = 0; + +static int +srv(struct foo *foo) +{ + struct foo *f; + struct pack_res *res; + int *arr; + int i, n, sum; + int rc; + char cont = 'y'; + + /* + * The return code is -1 (error) by default so that we don't + * need to set it everytime an error occurs in the main loop. + * If there are no errors, `rc` will be set to 0 (success) right + * after the loop. + */ + rc = -1; + f = (struct foo *)foo; + while (cont != 'n') { + if (recv(f->cfd, &n, sizeof(int), 0) == -1) + goto exit; + arr = emalloc(n * sizeof(int)); + if (recv(f->cfd, arr, n * sizeof(int), 0) == -1) + goto exit; + res = emalloc(sizeof(struct pack_res)); + printf("cfd: %d\tn: %d\n", f->cfd, n); + for (i = 0, sum = 0; i < n; i++) { + printf("cfd: %d\tarr[%d]: %d\n", f->cfd, i, arr[i]); + sum += arr[i]; + } + + if ((res->avg = sum / (float)n) > 10.0f) { + (void)strncpy(res->str, "sequence: ok", + sizeof(res->str) - 1); + f->nsucc++; + } else + (void)strncpy(res->str, "sequence: failed", + sizeof(res->str) - 1); + if (send(f->cfd, res, sizeof(struct pack_res), 0) == -1) + goto exit; + f->ntotal++; + printf("[%s] success: %d: total: %d\n", + argv0, f->nsucc, f->ntotal); + + if (recv(f->cfd, &cont, 1, 0) == -1) + goto exit; + free(arr); + } + rc = 0; + +exit: + printf("[%s] connection with client %d closed\n", argv0, f->cfd); + (void)close(f->cfd); + if (arr != NULL) + free(arr); + if (res != NULL) + free(res); + + return rc; +} + +static void +sighandler(int sig) +{ + f_quit = 1; +} + +static void * +emalloc(size_t nb) +{ + void *p; + + if ((p = malloc(nb)) == NULL) + die("malloc"); + + return p; +} + +static void +die(const char *str) +{ + (void)fprintf(stderr, "%s: ", argv0); + perror(str); + exit(1); +} + +static void +usage(void) +{ + (void)fprintf(stderr, "usage: %s [-b backlog] [-s sockfile]\n", argv0); + exit(1); +} + +int +main(int argc, char *argv[]) +{ + struct sockaddr_un sun; + struct foo *f; + struct sigaction sa; + char *sockfile = "/tmp/cool.sock"; + int sfd; + int backlog = 10; + char ch; + + argv0 = *argv; + if ((ch = getopt(argc, argv, "b:s:")) != -1) { + switch (ch) { + case 'b'; + if ((backlog = atoi(optarg)) < 1) + usage(); + break; + case 's': + sockfile = optarg; + break; + case '?': + default: + usage(); + } + } + argc -= optind; + argv += optind; + + /* + * Handle termination signals so we don't exit abnormally + * (i.e without cleaning up resources). + */ + (void)memset(&sa, 0, sizeof(sa)); + (void)sigemptyset(&sa.sa_mask); + sa.sa_handler = sighandler; + sa.sa_flags = SA_RESTART; + if (sigaction(SIGHUP, &sa, NULL) == -1) + die("sigaction: SIGHUP"); + if (sigaction(SIGINT, &sa, NULL) == -1) + die("sigaction: SIGINT"); + if (sigaction(SIGTERM, &sa, NULL) == -1) + die("sigaction: SIGTERM"); + + if ((sfd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) + die("socket"); + (void)memset(&sun, 0, sizeof(sun)); + sun.sun_family = AF_UNIX; + (void)strncpy(sun.sun_path, sockfile, sizeof(sun.sun_path) - 1); + + if (bind(sfd, (struct sockaddr *)&sun, sizeof(sun)) == -1) + die("bind"); + if (listen(sfd, BACKLOG) == -1) + die("listen"); + + f = emalloc(sizeof(struct foo)); + f->nsucc = 0; + f->ntotal = 0; + + for (;;) { + /* FIXME: blocked by accept */ + if (f_quit) + break; + /* + * accept(2)'s `addr` and `addrlen` arguments can be NULL if + * we don't care about the address information of the client. + */ + if ((f->cfd = accept(sfd, NULL, NULL)) == -1) + continue; + printf("[%s] accepted client: %d\n", argv0, f->cfd); + switch (fork()) { + case -1: + die("fork"); + case 0: + if (srv(f) == -1) + perror("srv"); + _exit(0); + default: + (void)close(f->cfd); + } + + } + + /* Will get here only if a termination signal is caught. */ + (void)close(f->cfd); + (void)close(sfd); + free(f); + /* + * bind(2)'s man page states that the socket should be deleted when + * it's no longer needed. + */ + (void)unlink(sockfile); + + return 0; +} diff --git a/c-os2/lab2_fifo.c b/c-os2/lab2_fifo.c @@ -11,7 +11,7 @@ static void die(const char *str) { perror(str); - exit(EXIT_FAILURE); + exit(1); } int diff --git a/c-os2/lab2_pipe.c b/c-os2/lab2_pipe.c @@ -9,11 +9,14 @@ #define DEFPAGER "/usr/bin/less" +static char *argv0; + static void die(const char *str) { + (void)fprintf(stderr, "%s: ", argv0); perror(str); - exit(EXIT_FAILURE); + exit(1); } int @@ -24,8 +27,11 @@ main(int argc, char *argv[]) pid_t pid; int fd[2], n; - if (argc != 2) - die("usage: foo file"); + argv0 = *argv; + if (argc != 2) { + (void)fprintf(stderr, "usage: %s file\n", argv0); + return 1; + } if ((fp = fopen(argv[1], "r")) == NULL) die("fopen"); if (pipe(fd) < 0) diff --git a/octave-signals-systems/ex1/doc.pdf b/octave-signals-systems/ex1/doc.pdf Binary files differ. diff --git a/octave-signals-systems/ex1/doc.tex b/octave-signals-systems/ex1/doc.tex @@ -1,618 +0,0 @@ -\documentclass{article} -\usepackage[utf8]{inputenc} -\usepackage[greek,english]{babel} -\usepackage{alphabeta} -\usepackage{fancyhdr} -\usepackage{listings} -\usepackage{mathtools} -\usepackage{graphicx} -\usepackage{blindtext} -\usepackage{xcolor} -\usepackage{float} -\usepackage[backend=biber]{biblatex} - -\title{Σήματα και Συστήματα - Εργασία 1} -\author{Χρήστος Μαργιώλης - 19390133} -\date{Μάρτιος 2021} - -% uniwa logo - -\begin{document} - -\begin{titlepage} - \maketitle -\end{titlepage} - -\renewcommand{\contentsname}{Περιεχόμενα} -\tableofcontents - -\section{'Ασκηση 1} - -\begin{itemize} - \item Δημιουργήστε ένα διάνυσμα $a = [0,0.1,0.2,...,10]$ και ένα διάνυσμα - $b = [\cos(0),\cos(0.2),\cos(0.4),...,\cos(20)]$ - \item Να βρεθούν τα: - \begin{itemize} - \item $c = a / b$ - \item $d = a^4$ - \item το εσωτερικό γινόμενο των $a$ και $b$. - \end{itemize} -\end{itemize} - -Για να δημιουργήσουμε ένα διάνυσμα, τού δίνουμε ένα όνομα και στην συνέχεια μέσα -σε [] ορίζουμε τα στοιχεία χωρισμένα είτε με κόμμα είτε με κενά. Το διάνυσμα -που ζητείται από την εκφώνηση έχει την μορφή $0,0.1,0.2...,10$ το οποίο σημαίνει -ότι είναι ένα διάνυσμα με αριθμούς από το 1 έως το 10 με διάστηματα 0.1. Για να -αναπαραστήσουμε κάτι τέτοιο αυτόματα χωρίς να γράψουμε όλους τους αριθμούς μηχανικά, -δηλώνουμε το διάνυσμα ως εξής: αρχή:διάστημα:τέλος. Οπότε: - -\begin{lstlisting}[language=octave] - octave:1> a = 0:0.1:10 -\end{lstlisting} - -Αντίστοιχα για το διάνυσμα $b$, βλέπουμε ότι τα διαστήματα είναι $0.2$ -και σε κάθε αριθμό του διανύσματος υπολογίζεται το συνημίτονο. Θα ορίσουμε -ένα διάνυσμα από το 0 έως το 20 με διαστήματα $0.2$ και θα υπολογίσουμε -τα συνημίτονα όλων των στοιχείων χρησιμοποιώντας την συνάρτηση \lstinline{cos()}: - -\begin{lstlisting}[language=octave] - octave:2> b = cos(0:0.2:20) -\end{lstlisting} - -Για την διαίρεση διανυσμάτων χρησιμοποιούμε το σύμβολο / που χρησιμοποιείται -γενικότερα για διαίρεση, οπότε το $c = a / b$ θα γίνει: - -\begin{lstlisting}[language=octave] - octave:3> c = a / b - c = 0.89415 -\end{lstlisting} - -Προκειμένου να υψώσουμε σε δύναμη όλα τα στοιχεία ενός διανύσματος πρέπει να -χρησιμοποιήσουμε τον τελεστή \lstinline{.^}, οπότε η πράξη $d = a^4$ θα γραφτεί -ως \lstinline{d = a.^4}. Αυτό το statement θα υπολογίσει ουσιαστικά την σειρά -\[d = [a_1^4, a_2^4, a_3^4, ..., a_n^4]\] -Η στοίχηση της εξόδου από το Octave έχει τροποποιηθεί -επειδή είναι πολύ μεγάλη και δεν χωράει σωστά στην σελίδα: - -\begin{lstlisting}[language=octave] - octave:4> d = a.^4 -\end{lstlisting} -\begin{lstlisting}[language=octave,basicstyle=\tiny] - d = - - Columns 1 through 17: - -0.00000 0.00010 0.00160 0.00810 0.02560 0.06250 0.12960 0.24010 -0.40960 0.65610 1.00000 1.46410 2.07360 2.85610 3.84160 5.06250 6.55360 - - Columns 18 through 34: - -8.35210 10.49760 13.03210 16.00000 19.44810 23.42560 27.98410 33.17760 -39.06250 45.69760 53.14410 61.46560 70.72810 81.00000 92.35210 104.85760 118.59210 - - Columns 35 through 51: - -133.63360 150.06250 167.96160 187.41610 208.51360 231.34410 256.00000 -282.57610 311.16960 341.88010 374.80960 410.06250 447.74560 487.96810 -530.84160 576.48010 625.00000 - - Columns 52 through 68: - -676.52010 731.16160 789.04810 850.30560 915.06250 983.44960 1055.60010 -1131.64960 1211.73610 1296.00000 1384.58410 1477.63360 1575.29610 1677.72160 -1785.06250 1897.47360 2015.11210 - - Columns 69 through 85: - -2138.13760 2266.71210 2401.00000 2541.16810 2687.38560 2839.82410 -2998.65760 3164.06250 3336.21760 3515.30410 3701.50560 3895.00810 -4096.00000 4304.67210 4521.21760 4745.83210 4978.71360 - - Columns 86 through 101: - -5220.06250 5470.08160 5728.97610 5996.95360 6274.22410 6561.00000 -6857.49610 7163.92960 7480.52010 7807.48960 8145.06250 8493.46560 -8852.92810 9223.68160 9605.96010 10000.00000 -\end{lstlisting} - -Για να υπολογίσουμε το εσωτερικό γινόμενο του $a$ και $b$, θα χρησιμοποιήσουμε -την συνάρτηση \lstinline{dot()} (Dot Product). Η συνάρτηση αυτή όταν εφαρμοστεί -στα διανύσματα $a$ και $b$, θα υπολογίσει την παρακάτω παράσταση: - -\[x = a_1 \cdot b_1 + a_2 \cdot b_2 + a_3 \cdot b_3 + ... + a_n \cdot b_n\] - -Οπότε: - -\begin{lstlisting}[language=octave] - octave:5> dot(a, b) - ans = 46.051 -\end{lstlisting} - -\section{'Ασκηση 2} - -\begin{itemize} - \item Να γραφεί συνάρτηση (function) η οποία θα παίρνει ως όρισμα - έναν αριθμό σε ακτίνια (rad) και θα επιστρέφει την τιμή του - σε μοίρες. - \item Βρείτε πόσες μοίρες είναι τα $\pi/4$ rad. -\end{itemize} - -Για να δηλώσουμε μία συνάρτηση χρησιμοποιούμε την εντολή \lstinline{function} -ακολουθώμενη από από το όνομα της συνάρτησης. Εάν θέλουμε η συνάρτηση να δέχεται -ορίσματα, τα δηλώνουμε σε παρένθεση μετά το όνομα της συνάρτησης. Στην περίπτωση -που θέλουμε να επιστρέφεται και κάποια τιμή, δηλώνουμε το όνομά της μεταβλητής -που επιστρέφεται πριν το όνομα της συνάρτησης. Τέλος, για να σημάνουμε το τέλος -της συνάρτησης, γράφουμε την εντολή \lstinline{endfunction} - -Για την συνάρτηση μετατροπής ακτινίων σε μοίρες θα χρειαστεί να υλοποιήσουμε -τον τύπο: -\[deg = rad \cdot 180 / \pi\] -Οπότε βάσει τα παραπάνω, η συνάρτηση θα υλοποιηθεί ως εξής: - -\begin{lstlisting}[language=octave] - function ret = deg(rad) - ret = rad * 180 / pi - endfunction -\end{lstlisting} - -Τώρα μπορούμε να καλέσουμε την συνάρτηση δίνοντας της μία τιμή σε ακτίνια. -Τα $\pi / 4$ ακτίνια σε μοίρες είναι: - -\begin{lstlisting}[language=octave] - octave:6> x = deg(pi / 4) - x = 45 -\end{lstlisting} - -\section{'Ασκηση 3} - -\begin{itemize} - \item Να γραφεί συνάρτηση (function) που να σχεδιάζει τη - συνάρτηση: \[\sin c(x) = \frac{\sin(\pi x)}{\pi x}\] - \item Σχεδιάστε τη για το διάστημα $[-2\pi,2\pi]$. -\end{itemize} - -Για να σχεδιάσουμε την συνάρτηση -\[\sin c(x) = \frac{\sin(\pi x)}{\pi x}, -2\pi < x < 2\pi\] -πρέπει να ακολουθήσουμε τα εξής βήματα στο Octave: - -\begin{itemize} - \item Να ορίσουμε το διάστημα $[-2\pi, 2\pi]$ - \item Να υπολογίσουμε το $c(x)$ για κάθε $x$ - \item Να υπολογίσουμε το $\sin c(x)$ -\end{itemize} - -Αρχικά, θα δηλώσουμε το διάστημα $[-2\pi,2\pi]$ με αποστάσεις 0.1 -από τον κάθε αριθμό ώστε να έχουμε μία πιο ακριβή γραφική παράσταση. -Το διάνυσμα που θα προκύψει το αποθηκεύουμε στην μεταβλητή $x$: - -\begin{lstlisting}[language=octave] - octave:7> x = -2*pi:0.1:2*pi -\end{lstlisting} - -'Επειτα υπολογίζουμε την συνάρτηση -\[c(x) = \frac{\sin(\pi x)}{\pi x}\] -Είναι σημαντικό να σημειωθεί ότι -πρέπει να χρησιμοποιηθεί ο τελεστής ./ ώστε να επιστραφεί διάνυσμα -και όχι ένας αριθμός: - -\begin{lstlisting}[language=octave] - octave:8> c = sin(x * pi) ./ (pi * x) -\end{lstlisting} - -Θα υπολογίσουμε το ημίτονο της συνάρτησης $c(x)$ κατευθείαν στην κλήση -της συνάρτησης σχεδίασης - η συναρτήση αυτή είναι η \lstinline{plot()} και παίρνει -ως ορίσματα τις τιμές του άξονα $x$ και $y$ (\lstinline{plot(x, y)}). Στην -προκειμένη περίπτωση θα της δώσουμε ως $x$ το $x$ που υπολογίσαμε στην αρχή, -και ως $y$ το συνημίτονο της συνάρτησης $c(x)$: - -\begin{lstlisting}[language=octave] - octave:9> plot(x, sin(c)) -\end{lstlisting} - -Παρατηρούμε ότι η γραφική παράσταση που προκύπτει έχει ένα \textit{ενδιαφέρον} -σχήμα: - -\begin{figure}[H] - \centering - \includegraphics[width=\linewidth]{res/fig1.jpg} - \caption{$\sin c(x) = \frac{\sin(\pi x)}{\pi x}, -2\pi < x < 2\pi$} -\end{figure} - -\section{'Ασκηση 4} - -\begin{itemize} - \item Να γραφεί συνάρτηση (function) η οποία θα παίρνει ως όρισμα - έναν μιγαδικό αριθμό και θα επιστρέφει: - \begin{itemize} - \item Την φάση. - \item Το μέτρο. - \item Το πραγματικό μέρος. - \item Το φανταστικό μέρος του μιγαδικού. - \end{itemize} - \item Υπολογίστε τα παραπάνω μεγέθη για τους εξής μιγαδικούς: - \begin{itemize} - \item $i$ - \item $-i$ - \item $1$ - \item $e^{3+4i}$ - \end{itemize} -\end{itemize} - -Το Octave (και το Matlab) διαθέτουν συναρτήσεις χειρισμού μιγαδικών αριθμών. - -Για τον υπολογισμό της φάσης ενός μιγαδικού αριθμού χρησιμοποιούμε την συνάρτηση -\lstinline{angle()}. Η συνάρτηση αυτή όταν της δωθεί μιγαδικός αριθμός θα -υπολογίσει τον παρακάτω τύπο: -\[\theta = atan(y, x)\] - -Ο υπολογισμός του μέτρου ενός μιγαδικού αριθμό γίνεται μέσω της συνάρτησης -\lstinline{abs()} η οποία εφαρμόζει τον παρακάτω τύπο: -\[|z| = \sqrt{x^2 + y^2}\] - -Οι συναρτήσεις \lstinline{real()} και \lstinline{imag()} επιστρέφουν το πραγματικό -και φανταστικό αντίστοιχα μέρος ενός μιγαδικού αριθμού. - -Οπότε με την χρήση όλων των παραπάνω συναρτήσεων μπορούμε να υλοποιήσουμε μία -συνάρτηση η οποία υπολογίζει και επιστρέφει κατευθείαν τις τέσσερεις αυτές -τιμές (φάση, μέτρο, πραγματικό μέρος, φανταστικό μέρος): - -\begin{lstlisting}[language=octave] - function imaginary(num) - phase = angle(num) - magnitude = abs(num) - realpart = real(num) - imagpart = imag(num) - endfunction -\end{lstlisting} - -Τώρα μπορούμε να δώσουμε στην συνάρτηση οποιοδήποτε μιγαδικό αριθμό για -επαληθεύσουμε ότι λειτουργεί σωστά. - -Για $i$: -\begin{lstlisting}[language=octave] - octave:10> imaginary(i) - phase = 1.5708 - magnitude = 1 - realpart = 0 - imagpart = 1 -\end{lstlisting} - -Για $-i$: -\begin{lstlisting}[language=octave] - octave:11> imaginary(-i) - phase = -1.5708 - magnitude = 1 - realpart = -0 - imagpart = -1 -\end{lstlisting} - -Για $1$: -\begin{lstlisting}[language=octave] - octave:12> imaginary(1) - phase = 0 - magnitude = 1 - realpart = 1 - imagpart = 0 -\end{lstlisting} - -Για $e^{3 + 4i}$: -\begin{lstlisting}[language=octave] - octave:13> imaginary(e^(3 + 4*i)) - phase = -2.2832 - magnitude = 20.086 - realpart = -13.129 - imagpart = -15.201 -\end{lstlisting} - -\section{'Ασκηση 5} - -\begin{itemize} - \item Διαχωρίστε το διάστημα $[0, 2\pi]$ σε 500 σημεία. - \item Να σχεδιάσετε σε αυτό το διάστημα (στο ίδιο figure) - τα παρακάτω σήματα: - \begin{itemize} - \item $f(x) = xe^{-x}, 0 < x < 2\pi$ - \item $y(x) = 2^{cos(x)}, 0 < x < 2\pi$ - \end{itemize} - \item Βάλτε τίτλο στην γραφική παράσταση (ό,τι θέλετε). - \item Βάλτε ταμπέλες στον $x$ και $y$ άξονα (ό,τι θέλετε). - \item Βάλτε μία επιγραφή για όλες τις καμπύλες με την εντολή - \lstinline{legend}. - \item Να σχεδιάσετε τα δύο παραπάνω σήματα σε ένα δεύτερο figure - αλλά σε \textbf{2 διαφορετικά} παράθυρα. -\end{itemize} - -Για να χωρίσουμε το διάστημα $[0,2\pi]$, απλώς θα διαιρέσουμε το $2\pi$ με -500 ώστε να μας δώσει τις αποστάσεις ανάμεσα στους αριθμούς του διαστήματος. -Το διάνυσμα που θα φτιάξουμε εννοείται ότι θα το χρησιμοποιήσουμε ως $x$. - -\begin{lstlisting}[language=octave] - octave:14> 2 * pi / 500 - ans = 0.012566 -\end{lstlisting} - -Με αυτό το 0.012566 θα φτιάξουμε το διάνυσμα $x$: - -\begin{lstlisting}[language=octave] - octave:15> 0:0.012566:2*pi -\end{lstlisting} - -Τώρα μπορούμε να υπολογίσουμε τα $f(x)$ και $y(x)$. Με παρόμοια λογική όπως -και στην προηγούμενη άσκηση, πρέπει να χρησιμοποιηθεί ο τελεστής \lstinline{.^} -και \lstinline{.*} ώστε να πάρουμε διάνυσμα και όχι αριθμό: - -\begin{lstlisting}[language=octave] - octave:16> f = x.*e.^-x - octave:17> y = 2.^cos(x) -\end{lstlisting} - -Σχεδιάζουμε την γραφική παράσταση της $f(x)$: - -\begin{lstlisting}[language=octave] - octave:18> plot(x, f) -\end{lstlisting} - -Τώρα προκειμένου να σχεδιάσουμε και την γραφική παράσταση της $y(x)$ στο ίδιο -figure πρέπει να δώσουμε στο Octave την εντολή \lstinline{hold on} ώστε να μην -δημιουργήσει νέο παράθυρο για την $y(x)$. Στην συνέχεια σχεδιάζουμε και την $y(x)$: - -\begin{lstlisting}[language=octave] - octave:19> hold on - octave:20> plot(x, y) -\end{lstlisting} - -Σε αυτό το σημείο έχουνε σχεδιαστεί και οι δύο γραφικές παραστάσεις στο ίδιο figure. - -\begin{figure}[H] - \centering - \includegraphics[width=\linewidth]{res/fig2.jpg} - \caption{Μμπλε: $f(x) = xe^{-x}$, Πορτοκαλί: $y(x) = xe^{-x}$} -\end{figure} - -Για να δώσουμε τίτλο στην γραφική παράσταση, χρησιμοποιούμε την συνάρτηση -\lstinline{title()} και σαν όρισμα της δίνουμε ένα string με τον τίτλο που θέλουμε. - -\begin{lstlisting}[language=octave] - octave:21> title("f(x) and y(x)") -\end{lstlisting} - -Για τις ταμπέλες (labels) χρησιμοποιούμε τις συναρτήσεις \lstinline{xlabel()} -και \lstinline{ylabel()} για τους άξονες $x$ και $y$ αντίστοιχα. Σαν όρισμα δέχονται -ένα string με τις ταμπέλες που θέλουμε: - -\begin{lstlisting}[language=octave] - octave:22> xlabel("x") - octave:23> ylabel("y") -\end{lstlisting} - -Για να δώσουμε μία επιγραφή καλούμε την συνάρτηση \lstinline{legend()}. -Εφόσον θέλουμε το legend να περιέχει επιγραφή και για τις δύο συνάρτησεις -που σχεδιάσαμε, θα δώσουμε ως όρισμα στην \lstinline{legend()} τις επιγραφές -κλεισμένες σε αγκύλες και χωρισμένες με κόμμα: - -\begin{lstlisting}[language=octave] - octave:24> legend({"f(x)", "y(x)"}) -\end{lstlisting} - -\begin{figure}[H] - \centering - \includegraphics[width=\linewidth]{res/fig3.jpg} - \caption{$f(x)$ και $y(x)$ με επιγραφές και τίτλο} -\end{figure} - -Για να σχεδιάσουμε σε ξεχωριστά παράθυρα τις συναρτήσεις $f(x)$ και $y(x)$ -θα ακολουθήσουμε την ίδια διακασία με πριν, αλλά χωρίς την εντολή -\lstinline{hold on}. Δηλαδή απλώς θα καλέσουμε δύο φορές την -\lstinline{plot()} - μία με όρισμα την $f(x)$ και μία με την $y(x)$. - -\begin{lstlisting}[language=octave] - octave:25> plot(x, f) -\end{lstlisting} - -\begin{figure}[H] - \centering - \includegraphics[width=\linewidth]{res/fig4.jpg} - \caption{$f(x)$} -\end{figure} - -\begin{lstlisting}[language=octave] - octave:26> plot(x, y) -\end{lstlisting} - -\begin{figure}[H] - \centering - \includegraphics[width=\linewidth]{res/fig5.jpg} - \caption{$f(x)$} -\end{figure} - -\section{'Ασκηση 6} - -\begin{itemize} - \item Υπολογίστε τις μερικές παραγώγους της συνάρτησης: - \[f(x, t) = \cos x + \sin t + e^t\] - \item Υπολογίστε το ολοκλήρωμα: - \[\int_{0}^{\infty} te^tdt\] - \item Υπολογίστε το διπλό αόριστο ολοκλήρωμα: - \[\iint x^3e^tdxdt\] - \item Υπολογίστε το άθροισμα: - \[\sum_{k = 0}^{\infty} \frac{x^k}{k!}\] - \item Μετατρέψτε σε ρητή την παράσταση: - \[f(x) = \frac{3}{x+2} + \frac{x}{x^2+1}\] - \item Να λυθεί η εξίσωση δευτέρου βαθμού: - \[f(x) = x^3 + 2x^2 - x - 2\] -\end{itemize} - -Πρώτα από όλα, για την χρήση συναρτήσεων υπολογισμού παραγώγων και ολοκληρωμάτων, -χρειαζόμαστε το \lstinline{symbolic} πακέτο του Octave - κάτι αντίστοιχο υπάρχει -και στο Matlab. Αφού το εγκατασήσουμε, το φορτώνουμε στο Octave ως εξής: - -\begin{lstlisting}[language=octave] - octave:27> pkg load symbolic -\end{lstlisting} - -\begin{itemize} -\item -Προκειμένου να υπολογίσουμε την μερική παράγωγο της συνάρτησης -\[f(x, t) = \cos x + \sin t + e^t\] -πρέπει να ορίσουμε της συμβολικές μεταβλητές $x$ και $t$: -\begin{lstlisting}[language=octave] - octave:28> syms x t -\end{lstlisting} - -Στην συνέχεια ορίζουμε την συνάρτηση $f(x, t)$: -\begin{lstlisting}[language=octave] - octave:29> y = cos(x) + sin(t) + e^t - y = (sym) -\end{lstlisting} - -Τέλος, υπολογίζουμε την μερική παράγωγο: - -\[\frac{\partial}{\partial x}f(x, t) \Rightarrow -\frac{\partial}{\partial x}(\cos x + \sin t + e^t) \] - -Για τον υπολογισμό της παραγώγου χρησιμοποιούμε την συνάρτηση -\lstinline{diff()}: -\begin{lstlisting}[language=octave] - octave:30> diff(y, x) - ans = (sym) -sin(x) -\end{lstlisting} - -Μπορούμε να επαληθεύσουμε ότι το αποτέλεσμα είναι σωστό εφόσον: -\[\frac{\partial}{\partial x}(\cos x + \sin t + e^t) \Rightarrow -\frac{\partial}{\partial x} \cos x + -\frac{\partial}{\partial x} \sin t + -\frac{\partial}{\partial x} e^t \Rightarrow --\sin x + 0 + 0 \Rightarrow -\sin x\] - -\item -Για να υπολογίσουμε το ολοκλήρωμα -\[\int_{0}^{\infty} te^{-t}dt\] -αρχικά ορίζουμε την συνάρτηση που θέλουμε να ολοκληρώσουμε. Στο πρώτο -μέρος (\lstinline{@(t)}) ορίζουμε την μεταβλητή ως προς την οποία -θέλουμε να ολοκληρώσουμε: -\begin{lstlisting}[language=octave] - octave:31> f = @(t) t *. e .^(-t) -\end{lstlisting} -Μετά με την χρήση της συνάρτησης \lstinline{integral()} υπολογίζουμε το -ολοκλήρωμα. Η συνάρτηση αυτή παίρνει τρία ορίσματα: την συνάρτηση, το πάνω -και το κάτω όριο. Οπότε: -\begin{lstlisting}[language=octave] - octave:32> integral(f, 0, Inf) - ans = 1 -\end{lstlisting} - -\item -Δεν υλοποιήθηκε λόγο απώλειας χρόνου. - -\item -Δεν υλοποιήθηκε λόγο απώλειας χρόνου. - -\item -Δεν υλοποιήθηκε λόγο απώλειας χρόνου. - -\item -Για να λύσουμε την τριτοβάθμια εξίσωση: -\[f(x) = x^3 + 2x^2 - x - 2\] -oρίζουμε αρχικά την συμβολική μεταβλητή $x$ και την συνάρτηση $f(x)$: -\begin{lstlisting}[language=octave] - octave:33> syms x - octave:34> f = x^3 + 2*x^2 - x - 2 -\end{lstlisting} -Βρίσκουμε τις ρίζες της παραπάνω τριτοβάθμιας εξίσωσης με την χρήση της -συνάρτησης \lstinline{solve()}: -\begin{lstlisting}[language=octave] - octave:35> solve(f) - ans = [-2 -1 1] -\end{lstlisting} - -\end{itemize} - -\section{'Ασκηση 7} - -\begin{itemize} - \item Να γραφεί function για τον υπολογισμό των ριζών ενός τριωνύμου. -\end{itemize} - -Προκειμένου να υπολογίσουμε τις ρίζες ενός τριωνύμου χρειάζεται να χρησιμοποιήσουμε -λογικούς τελεστές και \lstinline{if} statements. Ο λόγος που χρειάζονται είναι -διότι υπάρχουνε ορισμένες περιπτώσεις που οι ρίζες του τριωνύμου δεν μπορούνε να -υπολογιστούν, και όταν μπορούν, μπορεί να έχουμε είτε μία είτε δύο ρίζες, οπότε -πρέπει να καλύψουμε όλες τις περιπτώσεις αυτές. - -Ο τρόπος που δουλεύουνε τα \lstinline{if} statements στο Octave είναι ο ίδιος με -τις περισσότερες γλώσσες προγραμματισμού, δηλαδή: -\begin{lstlisting}[language=octave] - if (condition) - code - elseif (condition) - code - else - code - endif -\end{lstlisting} - -Αρχικά η συνάρτηση δέχεται τρία ορίσματα, τα $a$, $b$, και $c$ εφόσον το τριώνυμο -έχει την μορφή: -\[ax^2 + bx + c = 0\] - -'Επειτα πρέπει να σιγουρέψουμε ότι το $a$ \textit{δεν} είναι 0, διότι σε αυτή την -περίπτωση δεν έχουμε δευτεροβάθμια εξίσωση. - -Στην συνέχεια υπολογίζουμε την διακρίνουσα χρησιμοποιώντας τον κλασσικό τύπο: -\[d = b^2 - 4ac\] -και ελέγχουμε τις τιμές της. - -Αν η διακρίνουσα είναι μεγαλύτερη του 0, τότε οι ρίζες είναι: -\[x_1, x_2 = \frac{-b \pm \sqrt d}{2a}\] - -Αν η διακρίνουσα είναι ίση με 0, τότε έχουμε μία ρίζα: -\[x = \frac{-b}{2a}\] - -Αν η διακρίνουσα είναι μικρότερη του 0 δεν έχουμε ρίζες. - -Οπότε ο τελικός κώδικας που θα προκύψει είναι ο παρακάτω: - -\begin{lstlisting}[language=octave] - function quadratic(a, b, c) - if (a != 0) - d = b^2 - 4*a*c - if (d > 0) - x1 = (-b + sqrt(d)) / (2 * a) - x2 = (-b - sqrt(d)) / (2 * a) - elseif (d == 0) - x = -b / (2 * a) - else - printf("no solutions\n") - endif - else - printf("a cannot be 0\n") - endif - endfunction -\end{lstlisting} - -Είναι καλύτερο να γράψουμε ένα αρχείο \lstinline{.m} που να -περιέχει τον παραπάνω κώδικα και να το τρέξουμε μέσα από -το Octave με την εντολή \lstinline{run()}. Αφού διαβαστεί το -αρχείο μπορούμε να καλέσουμε την συνάρτηση κανονικά, για -παράδειγμα: - -\begin{lstlisting}[language=octave] - octave:28> quadratic(2, 2, -4) - d = 36 - x1 = 1 - x2 = -2 -\end{lstlisting} - -\pagebreak -\section{Εργαλεία} -Τα εργαλεία που χρησιμοποιήθηκαν για την υλοποίηση αυτής της εργασίας ήτανε -τα εξής: - -\begin{itemize} - \item Περιβάλλον: GNU Octave 5.2.0 - \item Επιπλέον πακέτα: \lstinline{octave-forge-symbolic} - \item Λειτουργικό σύστημα: FreeBSD 12.2 - \item Κειμενογράφος: Vim - \item Μορφοποίηση κειμένου: \LaTeX -\end{itemize} -\end{document} diff --git a/octave-signals-systems/ex1/res/fig1.jpg b/octave-signals-systems/ex1/res/fig1.jpg Binary files differ. diff --git a/octave-signals-systems/ex1/res/fig2.jpg b/octave-signals-systems/ex1/res/fig2.jpg Binary files differ. diff --git a/octave-signals-systems/ex1/res/fig3.jpg b/octave-signals-systems/ex1/res/fig3.jpg Binary files differ. diff --git a/octave-signals-systems/ex1/res/fig4.jpg b/octave-signals-systems/ex1/res/fig4.jpg Binary files differ. diff --git a/octave-signals-systems/ex1/res/fig5.jpg b/octave-signals-systems/ex1/res/fig5.jpg Binary files differ. diff --git a/octave-signals-systems/ex2/doc.pdf b/octave-signals-systems/ex2/doc.pdf Binary files differ. diff --git a/octave-signals-systems/ex2/doc.tex b/octave-signals-systems/ex2/doc.tex @@ -1,310 +0,0 @@ -\documentclass{article} -\usepackage[utf8]{inputenc} -\usepackage[greek,english]{babel} \usepackage{alphabeta} -\usepackage{fancyhdr} -\usepackage{listings} -\usepackage{mathtools} -\usepackage{xcolor} -\usepackage{graphicx} -\usepackage{float} -\usepackage[backend=biber]{biblatex} - -\title{Σήματα και Συστήματα - Εργασία 2} -\author{Χρήστος Μαργιώλης - 19390133} -\date{Απρίλιος 2021} - -\begin{document} - -\begin{titlepage} - \maketitle - \begin{figure}[t!] - \begin{center} - \includegraphics[scale=0.3]{./res/uniwalogo.png} \\ - \Large - \textbf{Πανεπιστήμιο Δυτικής Αττικής} \\ - \large - Τμήμα Μηχανικών Πληροφορικής και Ηλεκτρονικών Υπολογιστών - \end{center} - \end{figure} -\end{titlepage} - -\renewcommand{\contentsname}{Περιεχόμενα} -\tableofcontents - -\section{'Ασκηση 1} - -\begin{itemize} - \item Να σχεδιαστεί το σήμα - \[x(t) = u(t + 1) - u(t - 2) + u(t + 4)\] -\end{itemize} - -Αρχικά ορίζουμε ένα χρονικό διάστημα $t$ - θα το ορίσουμε από το -5 εώς το 10: -\begin{lstlisting}[language=octave] - octave> t = -5:0.1:10 -\end{lstlisting} - -Με τη χρήση της συνάρτησης \lstinline{heaviside()} θα υπολογίσουμε τις -τιμές των συναρτήσεων $u(t + 1)$, $u(t - 2)$ και $u(t + 4)$. Μπορούμε -για κάθε συνάρτηση να αποθηκεύσουμε την έξοδό της \lstinline{heaviside()} -σε μία προσωρινή μεταβλητή, αλλά για μεγαλύτερη άνεση και εξοικονόμιση -χρόνου θα αποθηκεύσουμε τα πάντα κατευθείαν στο $x$: -\begin{lstlisting}[language=octave] - octave> x = heaviside(t+1)-heaviside(t-2)+heaviside(t+4) -\end{lstlisting} - -Τέλος, σχεδιάζουμε το σήμα $x(t)$ και τροποποιούμε τον άξονα $x$ -για καλύτερη εμφάνιση της γραφικής παράστασης: -\begin{lstlisting}[language=octave] - octave> plot(t, x) - octave> xlim([-5 10]) -\end{lstlisting} - -\begin{figure}[H] - \centering - \includegraphics[width=\linewidth]{res/fig2.png} - \caption{$x(t) = u(t + 1) - u(t - 2) + u(t + 4)$ με τη χρήση της - \lstinline{heaviside()}} -\end{figure} - -\section{'Ασκηση 2} - -\begin{itemize} - \item Να σχεδιαστεί το σήμα - \[x(t) = t\sin(2\pi t)(u(t) - u(t - 3))\] -\end{itemize} - -Αρχικά ορίζουμε το διάστημα το χρονικό διάστημα $t$ από από το -5 ως το 10: -\begin{lstlisting}[language=octave] - octave> t = -5:0.1:10 -\end{lstlisting} - -Για να υπολογίσουμε τις τιμές των μοναδιαίων βηματικών συναρτήσεων $u(t)$ -και $u(t - 3)$ θα χρησιμοποιήσουμε κατευθείαν την συνάρτηση -\lstinline{heaviside()}: -\begin{lstlisting}[language=octave] - octave> x = t.*sin(2*pi*t).*(heaviside(t)-heaviside(t-3)) -\end{lstlisting} - -Τέλος, σχεδιάζουμε το σήμα $x(t)$ και τροποποιούμε τον άξονα $x$ -για καλύτερη εμφάνιση της γραφικής παράστασης: -\begin{lstlisting}[language=octave] - octave> plot(t, x) - octave> xlim([-5 10]) -\end{lstlisting} - -\begin{figure}[H] - \centering - \includegraphics[width=\linewidth]{res/fig3.png} - \caption{$x(t) = t\sin(2\pi t)(u(t) - u(t - 3))$} -\end{figure} - -\section{'Ασκηση 3} - -\begin{itemize} - \item Να σχεδιαστεί το σήμα - \[x(t) = t^3 \cos(10\pi t)p 2(t - 1)\] - όπου $pT(t)$ τετραγωνικός παλμός διάρκειας $T$. -\end{itemize} - -Ο τετραγωνικός παλμός $pT(t)$ ορίζεται ως -\[pT(t) = u(t + \frac{T}{2}) - u(t - \frac{T}{2})\] -Οπότε, με βάση την εκφώνηση και τον παραπάνω τύπο έχουμε ότι: -\[p2(t - 1) \Rightarrow u(t - 1 + \frac{2}{2}) - u(t - 1 - \frac{2}{2}) -\Rightarrow u(t - 1 + 1) - u(t - 1 - 1) \Rightarrow u(t) - u(t - 2)\] - -Τώρα, με την χρήση της συνάρτησης \lstinline{heaviside()} μπορούμε να -υπολογίσουμε τις τιμές του τετραγωνικού παλμού $p2(t - 1)$: -\begin{lstlisting}[language=octave] - octave> p = heaviside(t)-heaviside(t-2) -\end{lstlisting} - -'Εχοντας το $p2(t - 1)$ μπορούμε τώρα να υπολογίσουμε και να σχεδιάσουμε -το σήμα $x(t)$. Επίσης θα τροποποιήσουμε τον άξονα $x$ ώστε να εμφανιστεί -πιο καθαρά η γραφική παράσταση: -\begin{lstlisting}[language=octave] - octave> x = t.^3.*cos(10*pi*t).*p - octave> plot(t, x) - octave> xlim([-5 10]) -\end{lstlisting} - -\begin{figure}[H] - \centering - \includegraphics[width=\linewidth]{res/fig4.png} - \caption{$x(t) = t^3cos(10\pi t)p2(t - 1)$} -\end{figure} - -\section{'Ασκηση 4} - -\begin{itemize} - \item Να εκφταστεί και να σχεδιαστεί το σήμα (φυλλάδιο εργασίας - σελίδα 28) ως άθροισμα μόνο συναρτήσεων ράμπας. -\end{itemize} - -Η συνάρτηση ράμπας ορίζεται ως: -\[r(t) = tu(t)\] -Στο Octave, αυτό υπολογίζεται ως: -\begin{lstlisting}[language=octave] - octave> r = t.*heaviside(t) -\end{lstlisting} -Οπότε θα φτιάξουμε μία συνάρτηση - θα την ονομάσουμε \lstinline{ramp} - -η οποία θα υπολογίζει την συνάρτηση ράμπας. Η συνάρτηση θα δέχεται -ως όρισμα ένα $t$ και θα επιστρέφει τις τιμές της συνάρτησης $r(t)$: -\begin{lstlisting}[language=octave] - function r = ramp(t) - r = t.*heaviside(t) - endfunction -\end{lstlisting} - -Το σήμα που ζητάει η εκφώνηση εκφράζεται ως -\[x(t) = r(t) - r(t-1) - r(t-2)\] -και το χρονικό διάστημα είναι το $t = [-2,3]$. Οπότε: -\begin{lstlisting}[language=octave] - octave> t = -2:0.1:3 - octave> r = ramp(t)-ramp(t-1)-ramp(t-2) - octave> plot(t, r) - octave> ylim([-0.3 1.3]) -\end{lstlisting} - -\begin{figure}[H] - \centering - \includegraphics[width=\linewidth]{res/fig7.png} - \caption{$x(t) = r(t) - r(t-1) - r(t-2)$} -\end{figure} - -\section{'Ασκηση 5} - -\begin{itemize} - \item Δίνεται το σήμα - \[x(t) = te^{-t}, 0 \leq t \leq 5\] - Να σχεδιαστούν: - \begin{itemize} - \item Το σήμα $x(t)$ - \item Το άρτιο σήμα $x_e(t)$ του $x(t)$ - \item Το περιττό σήμα $x_o(t)$ του $x(t)$ - \item Το άθροισμα $x_e(t) + x_o(t)$ - \end{itemize} -\end{itemize} - -Θα σχεδιάσουμε τα τέσσερα ζητούμενα σήματα στο ίδιο παράθυρο με την -χρήση της συνάρτησης \lstinline{subplot()}. - -Αρχικά ορίζουμε το διάστημα $t = [0, 5]$: -\begin{lstlisting}[language=octave] - octave> t = 0:0.1:5 -\end{lstlisting} - -Υπολογίζουμε τις τιμές του σήματος $x(t) = te^{-t}$ και σχεδιάζουμε το σήμα. -Σε όλα τα σήματα που θα σχεδιάσουμε θα τους δώσουμε και επίσης και έναν τίτλο -ώστε να μπορούμε να ξεχωρίσουμε σε ποιο σήμα αντιστοιχεί η κάθε γραφική -παράσταση: -\begin{lstlisting}[language=octave] - octave> x = t.*exp(-t) - octave> sublot(2, 2, 1) - octave> plot(t, x) - octave> title("x(t) = t.*exp(-t)") -\end{lstlisting} - -Το άρτιο μέρος ενός σήματος ορίζεται ως: -\[x_e(t) = \frac{1}{2}(x(t) + x(-t))\] -και το περιττό μέρος ως: -\[x_o(t) = \frac{1}{2}(x(t) - x(t))\] -Για να υπολογίσουμε το $x(-t)$ θα μπορούσαμε να φτιάξουμε μία νέα μεταβλητή -$-t$ η οποία θα κρατάει το διάστημα χρόνου αντιστραμένο - δηλαδή -$-t = [-5, 0]$ - αλλά το Octave παρέχει την συνάρτηση \lstinline{fliplr()} -η οποία μπορεί να αντιστρέψει ένα διάνυσμα. Το αποτέλεσμα της -\lstinline{fliplr()} θα το αποθηκεύσουμε στο διάνυσμα \lstinline{xrev} -ώστε να το χρησιμοποιήσουμε για τον υπολογισμό του αρτίου και περιττού -σήματος: -\begin{lstlisting}[language=octave] - octave> xrev = fliplr(x) - octave> xe = 0.5*(x + xrev) - octave> xo = 0.5*(x - xrev) - octave> subplot(2, 2, 2) - octave> plot(t, xe) - octave> title("x_{even}") - octave> subplot(2, 2, 3) - octave> plot(t, xo) - octave> title("x_{odd}") -\end{lstlisting} - -Για τον υπολογισμό του αθροίσματος, απλώς προσθέτουμε τα σήματα -$x_e(t)$ και $x_o(t)$ που υπολογίσαμε παραπάνω. -\begin{lstlisting}[language=octave] - octave> xeo = xe + xo - octave> subplot(2, 2, 4) - octave> plot(t, xeo) - octave> title("x_{eo}") -\end{lstlisting} - -Παρατηρούμε ότι ισχύει -\[x(t) = x_e + x_o\] -δηλαδή το άθροισμα του αρτίου και του περιττού σήματος είναι ίσο -με το αρχικό σήμα $x(t)$: -\begin{figure}[H] - \centering - \includegraphics[width=\linewidth]{res/fig5.png} - \caption{$x(t)$, $x_e(t)$, $x_o(t)$, $x_e(t) + x_o(t)$} -\end{figure} - -\section{'Ασκηση 6} - -\begin{itemize} - \item 'Εστω το σήμα - \[x(t) = t\cos(2\pi t), 0 \leq t \leq 5\] - Να σχεδιάσετε τα σήματα: - \begin{itemize} - \item $x(t)$ - \item $x(-t)$ - \item $x(t/5)$ - \item $x(1 + 3t)$ - \item $x(-1 - 3t)$ - \end{itemize} -\end{itemize} - -\begin{lstlisting}[language=octave] - octave> t = 0:0.1:5 - octave> x1 = t.*cos(2*pi*t) - octave> x2 = -x1 - octave> x3 = (t/5).*cos(2*pi*(t/5)) - octave> x4 = (1 + 3*t).*cos(2*pi*(1 + 3*t)) - octave> x5 = -x4 - octave> subplot(3, 2, 1) - octave> plot(t, x1) - octave> title("x(t)") - octave> subplot(3, 2, 2) - octave> plot(t, x2) - octave> title("x(-t)") - octave> subplot(3, 2, 3) - octave> plot(t, x3) - octave> title("x(t/5)") - octave> subplot(3, 2, 4) - octave> plot(t, x4) - octave> title("x(1+3*t)") - octave> subplot(3, 2, 5) - octave> plot(t, x5) - octave> title("x(-1-3*t)") -\end{lstlisting} - -\begin{figure}[H] - \centering - \includegraphics[width=\linewidth]{res/fig6.png} - \caption{$x(t)$, $x(-t)$, $x(t/5)$, $x(1+3t)$, $x(-1-3t)$} -\end{figure} - -\pagebreak -\section{Εργαλεία} -Τα εργαλεία που χρησιμοποιήθηκαν για την υλοποίηση αυτής της εργασίας ήτανε -τα εξής: -\begin{itemize} - \item Περιβάλλον: GNU Octave 5.2.0 - \item Επιπλέον πακέτα: - \begin{itemize} - \item \lstinline{octave-forge-symbolic} - \item \lstinline{octave-forge-signal} - \end{itemize} - \item Λειτουργικό σύστημα: FreeBSD 12.2 - \item Κειμενογράφος: Vim - \item Μορφοποίηση κειμένου: \LaTeX -\end{itemize} - -\end{document} diff --git a/octave-signals-systems/ex2/res/fig2.png b/octave-signals-systems/ex2/res/fig2.png Binary files differ. diff --git a/octave-signals-systems/ex2/res/fig3.png b/octave-signals-systems/ex2/res/fig3.png Binary files differ. diff --git a/octave-signals-systems/ex2/res/fig4.png b/octave-signals-systems/ex2/res/fig4.png Binary files differ. diff --git a/octave-signals-systems/ex2/res/fig5.png b/octave-signals-systems/ex2/res/fig5.png Binary files differ. diff --git a/octave-signals-systems/ex2/res/fig6.png b/octave-signals-systems/ex2/res/fig6.png Binary files differ. diff --git a/octave-signals-systems/ex2/res/fig7.png b/octave-signals-systems/ex2/res/fig7.png Binary files differ. diff --git a/octave-signals-systems/ex2/res/uniwalogo.png b/octave-signals-systems/ex2/res/uniwalogo.png Binary files differ. diff --git a/sql-databases/ex1/new_personnel.sql b/sql-databases/ex1_new_personnel.sql diff --git a/sql-databases/ex2_new_personnel.sql b/sql-databases/ex2_new_personnel.sql @@ -0,0 +1,135 @@ +CREATE TABLE DEPT ( + DEPTNO INT(2) NOT NULL, + DNAME VARCHAR, + LOC VARCHAR, + PRIMARY KEY(DEPTNO) +); + +CREATE TABLE EMP ( + EMPNO INT(2) NOT NULL, + ENAME VARCHAR, + JOB VARCHAR, + HIERDATE DATE, + MGR INT(2), + SAL FLOAT(7,2), + COMM FLOAT(7,2), + DEPTNO INT(2) NOT NULL, + PRIMARY KEY(EMPNO), + FOREIGN KEY(DEPTNO) REFERENCES DEPT(DEPTNO) +); + +CREATE TABLE PROJ ( + PROJ_CODE INT(3) NOT NULL, + DESCRIPTION VARCHAR, + PRIMARY KEY(PROJ_CODE) +); + +CREATE TABLE ASSIGN ( + EMPNO INT(2) NOT NULL, + PROJ_CODE INT(3), + A_TIME INT(3), + PRIMARY KEY(EMPNO, PROJ_CODE), + FOREIGN KEY(EMPNO) REFERENCES EMP(EMPNO), + FOREIGN KEY(PROJ_CODE) REFERENCES PROJ(PROJ_CODE) +); + +INSERT INTO DEPT VALUES + (10, 'ACCOUNTING', 'ATHENS'), + (20, 'SALES', 'LONDON'), + (30, 'RESEARCH', 'ATHENS'), + (40, 'PAYROLL', 'LONDON'); + +INSERT INTO EMP VALUES + (10, 'CODD', 'ANALYST', '1989-01-01', 15, 3000, NULL, 10), + (15, 'ELMASRI', 'ANALYST', '1995-05-02', 15, 1200, 150, 10), + (20, 'NAVATHE', 'SALESMAN', '1977-07-07', 20, 2000, NULL, 20), + (30, 'DATE', 'PROGRAMMER', '2004-05-04', 15, 1800, 200, 10); + +INSERT INTO PROJ VALUES + (100, 'PAYROLL'), + (200, 'PERSONELL'), + (300, 'SALES'); + +INSERT INTO ASSIGN VALUES + (10, 100, 40), + (10, 200, 60), + (15, 100, 100), + (20, 200, 100), + (30, 100, 100); + +-- Using SQLite3 syntax +.header on +.mode column + +-- Question 1 +SELECT ENAME, + SAL AS ΜΙΣΘΟΣ, + COMM AS ΠΡΟΜΗΘΕΙΑ, + IFNULL(ROUND(COMM * 100 / SAL, 1) || "%", "0.00%") AS ΠΟΣΟΣΤΟ + FROM EMP; + +-- Question 2 +SELECT ENAME AS ΕΠΩΝΥΜΟ, + SAL AS "ΜΗΝΙΑΙΕΣ ΑΠΟΔΟΧΕΣ", + strftime("%Y", "now") - strftime("%Y", HIERDATE) AS ПРОΥΠΗΡΕΣΙΑ + FROM EMP; + +-- Question 3 +SELECT ENAME AS ΕΠΩΝΥΜΟ, + JOB AS ΘΕΣΗ, + HIERDATE AS ΠΡΟΣΛΗΨΗ + FROM EMP + WHERE strftime("%d", HIERDATE) <= "05"; + +-- Question 4 +SELECT ENAME AS ΕΠΩΝΥΜΟ + FROM EMP + INNER JOIN DEPT ON + DEPT.DEPTNO = EMP.DEPTNO AND + DEPT.DNAME = "ACCOUNTING"; + +-- Question 5 +SELECT ENAME AS ΕΠΩΝΥΜΟ, + MAX( + (strftime("%Y", "now") - strftime("%Y", HIERDATE)) * + 12 * SAL + ) AS "ΣΥΝΟΛΙΚΟΣ ΜΙΣΘΟΣ" + FROM EMP; + + +-- Output + +-- Question 1: +-- ENAME ΜΙΣΘΟΣ ΠΡΟΜΗΘΕΙΑ ΠΟΣΟΣΤΟ +-- ------- ------ --------- ------- +-- CODD 3000.0 0.00% +-- ELMASRI 1200.0 150.0 12.5% +-- NAVATHE 2000.0 0.00% +-- DATE 1800.0 200.0 11.1% + +-- Question 2: +-- ΕΠΩΝΥΜΟ ΜΗΝΙΑΙΕΣ ΑΠΟΔΟΧΕΣ ПРОΥΠΗΡΕΣΙΑ +-- ------- ----------------- ----------- +-- CODD 3000.0 32 +-- ELMASRI 1200.0 26 +-- NAVATHE 2000.0 44 +-- DATE 1800.0 17 + +-- Question 3: +-- ΕΠΩΝΥΜΟ ΘΕΣΗ ΠΡΟΣΛΗΨΗ +-- ------- ---------- ---------- +-- CODD ANALYST 1989-01-01 +-- ELMASRI ANALYST 1995-05-02 +-- DATE PROGRAMMER 2004-05-04 + +-- Question 4: +-- ΕΠΩΝΥΜΟ +-- ------- +-- CODD +-- ELMASRI +-- DATE + +-- Question 5: +-- ΕΠΩΝΥΜΟ ΣΥΝΟΛΙΚΟΣ ΜΙΣΘΟΣ +-- ------- ---------------- +-- CODD 1152000.0 diff --git a/vhdl-digital-design/Makefile b/vhdl-digital-design/Makefile @@ -1,6 +1,6 @@ all: - ghdl -a ${IN}.vhd - ghdl -e ${IN} + ghdl -a --ieee=synopsys ${IN}.vhd + ghdl -e --ieee=synopsys ${IN} ghdl -r ${IN} --vcd=${IN}.vcd sim: diff --git a/vhdl-digital-design/ex2/shift4_tb.vhd b/vhdl-digital-design/ex2/shift4_tb.vhd @@ -1,51 +0,0 @@ -library ieee; -use ieee.std_logic_1164.all; - -entity shift4_tb is -end shift4_tb; - -architecture behav of shift4_tb is - -signal d1: std_logic_vector(3 downto 0); -signal en1: std_logic; -signal load1: std_logic; -signal sin1: std_logic; -signal clk1: std_logic; -signal q1: std_logic_vector(3 downto 0); - -component shift4 is port ( - d: in std_logic_vector(3 downto 0); - en: in std_logic; - load: in std_logic; - sin: in std_logic; - clk: in std_logic; - q: out std_logic_vector(3 downto 0) -); -end component; - -begin - uut: shift4 port map ( - d => d1, - en => en1, - load => load1, - sin => sin1, - clk => clk1, - q => q1 - ); - - process begin - d1 <= "1011"; - load1 <= '1'; - en1 <= '0'; - sin1 <= '1'; - clk1 <= '1'; - wait for 250 ns; - - d1 <= "1011"; - load1 <= '0'; - en1 <= '1'; - sin1 <= '0'; - clk1 <= '1'; - wait for 250 ns; - end process; -end behav; diff --git a/vhdl-digital-design/ex3/Makefile b/vhdl-digital-design/ex3/Makefile @@ -0,0 +1 @@ +include ../Makefile diff --git a/vhdl-digital-design/ex3/regfile.vhd b/vhdl-digital-design/ex3/regfile.vhd @@ -0,0 +1,35 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; +use ieee.numeric_std.all; + +entity regfile is +generic ( + dw: natural := 4; + sz: natural := 4; + addrw: natural := 2 +); +port ( + a: in std_logic_vector(dw-1 downto 0); + addr: in std_logic_vector(addrw-1 downto 0); + we: in std_logic; + clk: in std_logic; + c: out std_logic_vector(dw-1 downto 0) +); +end regfile; + +architecture behav of regfile is + +type regarr is array(sz-1 downto 0) of std_logic_vector(dw-1 downto 0); +signal regf: regarr; + +begin + process (clk) begin + if (falling_edge(clk)) then + if (we = '1') then + regf(to_integer(unsigned(addr))) <= a; + end if; + end if; + end process; + c <= regf(to_integer(unsigned(addr))); +end behav;+ \ No newline at end of file diff --git a/vhdl-digital-design/ex3/regfile_ext.vhd b/vhdl-digital-design/ex3/regfile_ext.vhd @@ -0,0 +1,45 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; +use ieee.numeric_std.all; + +entity regfile_ext is +generic ( + dw: natural := 4; + sz: natural := 4; + addrw: natural := 2 +); +port ( + a: in std_logic_vector(dw-1 downto 0); + raddr1: in std_logic_vector(addrw-1 downto 0); + raddr2: in std_logic_vector(addrw-1 downto 0); + waddr: in std_logic_vector(addrw-1 downto 0); + we: in std_logic; + clk: in std_logic; + rst: in std_logic; + b: out std_logic_vector(dw-1 downto 0); + c: out std_logic_vector(dw-1 downto 0) +); +end regfile_ext; + +architecture behav of regfile_ext is + +type regarr is array(sz-1 downto 0) of std_logic_vector(dw-1 downto 0); +signal regf: regarr; + +begin + process (clk) begin + if (rst = '1') then + regf(0) <= "0000"; + regf(1) <= "0000"; + regf(2) <= "0000"; + regf(3) <= "0000"; + elsif (falling_edge(clk)) then + if (we = '1') then + regf(to_integer(unsigned(waddr))) <= a; + end if; + end if; + end process; + b <= regf(to_integer(unsigned(raddr1))); + c <= regf(to_integer(unsigned(raddr2))); +end behav;+ \ No newline at end of file diff --git a/vhdl-digital-design/ex3/regfile_ext_tb.vhd b/vhdl-digital-design/ex3/regfile_ext_tb.vhd @@ -0,0 +1,106 @@ +library ieee; +use ieee.std_logic_1164.all; + +entity regfile_ext_tb is +end regfile_ext_tb; + +architecture behav of regfile_ext_tb is + +component regfile_ext is +generic ( + dw: natural := 4; + sz: natural := 4; + addrw: natural := 2 +); +port ( + a: in std_logic_vector(dw-1 downto 0); + raddr1: in std_logic_vector(addrw-1 downto 0); + raddr2: in std_logic_vector(addrw-1 downto 0); + waddr: in std_logic_vector(addrw-1 downto 0); + we: in std_logic; + clk: in std_logic; + rst: in std_logic; + b: out std_logic_vector(dw-1 downto 0); + c: out std_logic_vector(dw-1 downto 0) +); +end component; + +signal s_dw: natural := 4; +signal s_sz: natural := 4; +signal s_addrw: natural := 2; +signal s_a: std_logic_vector(s_dw-1 downto 0); +signal s_raddr1:std_logic_vector(s_addrw-1 downto 0); +signal s_raddr2:std_logic_vector(s_addrw-1 downto 0); +signal s_waddr: std_logic_vector(s_addrw-1 downto 0); +signal s_we: std_logic; +signal s_clk: std_logic; +signal s_rst: std_logic; +signal s_b: std_logic_vector(s_dw-1 downto 0); +signal s_c: std_logic_vector(s_dw-1 downto 0); + +begin + uut: regfile_ext port map ( + a => s_a, + raddr1 => s_raddr1, + raddr2 => s_raddr2, + waddr => s_waddr, + we => s_we, + clk => s_clk, + rst => s_rst, + b => s_b, + c => s_c + ); + + process begin + s_we <= '1'; + s_clk <= '0'; + s_rst <= '0'; + s_raddr1 <= "00"; + s_raddr2 <= "01"; + s_waddr <= "00"; + s_a <= "0101"; + wait for 250 ns; + + s_we <= '1'; + s_clk <= '1'; + s_rst <= '1'; + wait for 250 ns; + + s_we <= '1'; + s_clk <= '0'; + s_rst <= '0'; + s_raddr1 <= "01"; + s_raddr2 <= "10"; + s_waddr <= "01"; + s_a <= "1101"; + wait for 250 ns; + + s_we <= '1'; + s_clk <= '1'; + s_rst <= '0'; + wait for 250 ns; + + s_we <= '0'; + s_clk <= '0'; + s_rst <= '0'; + s_raddr1 <= "10"; + s_raddr2 <= "11"; + s_waddr <= "10"; + s_a <= "0010"; + wait for 250 ns; + + s_we <= '1'; + s_clk <= '1'; + s_rst <= '0'; + wait for 250 ns; + + s_we <= '1'; + s_clk <= '0'; + s_rst <= '0'; + s_raddr1 <= "11"; + s_raddr2 <= "01"; + s_waddr <= "11"; + s_a <= "1001"; + wait for 250 ns; + end process; +end behav; diff --git a/vhdl-digital-design/ex3/regfile_tb.vhd b/vhdl-digital-design/ex3/regfile_tb.vhd @@ -0,0 +1,83 @@ +library ieee; +use ieee.std_logic_1164.all; + +entity regfile_tb is +end regfile_tb; + +architecture behav of regfile_tb is + +component regfile is +generic ( + dw: natural := 4; + sz: natural := 4; + addrw: natural := 2 +); +port ( + a: in std_logic_vector(dw-1 downto 0); + addr: in std_logic_vector(addrw-1 downto 0); + we: in std_logic; + clk: in std_logic; + c: out std_logic_vector(dw-1 downto 0) +); +end component; + +signal s_dw: natural := 4; +signal s_sz: natural := 4; +signal s_addrw: natural := 2; +signal s_a: std_logic_vector(s_dw-1 downto 0); +signal s_addr: std_logic_vector(s_addrw-1 downto 0); +signal s_we: std_logic; +signal s_clk: std_logic; +signal s_c: std_logic_vector(s_dw-1 downto 0); + +begin + uut: regfile port map ( + a => s_a, + addr => s_addr, + we => s_we, + clk => s_clk, + c => s_c + ); + + process begin + s_we <= '1'; + s_clk <= '1'; + wait for 250 ns; + + s_we <= '1'; + s_clk <= '0'; + s_addr <= "00"; + s_a <= "0101"; + wait for 250 ns; + + s_we <= '1'; + s_clk <= '1'; + wait for 250 ns; + + s_we <= '1'; + s_clk <= '0'; + s_addr <= "01"; + s_a <= "1101"; + wait for 250 ns; + + s_we <= '1'; + s_clk <= '1'; + wait for 250 ns; + + s_we <= '0'; + s_clk <= '0'; + s_addr <= "10"; + s_a <= "0010"; + wait for 250 ns; + + s_we <= '1'; + s_clk <= '1'; + wait for 250 ns; + + s_we <= '1'; + s_clk <= '0'; + s_addr <= "11"; + s_a <= "1001"; + wait for 250 ns; + end process; +end behav;