Lab 2 — Συνεχή και διακριτά σήματα
Στο θεωρητικό κεφάλαιο για σήματα είδαμε ότι υπάρχουν συνεχούς και διακριτού χρόνου σήματα, άρτια και περιττά, σήματα ενέργειας και σήματα ισχύος, κ.λπ. Εδώ φτιάχνουμε αυτά τα σήματα πραγματικά στο MATLAB.
Χρονικό διάνυσμα — το θεμέλιο
Κάθε σήμα ξεκινά με ένα διάνυσμα χρόνου. Δύο τρόποι:
% Τρόπος 1 — colon notation: ορίζω βήμα Δt
t = 0:0.001:5; % από 0 ως 5, βήμα 1 ms → 5001 σημεία
% Τρόπος 2 — linspace: ορίζω συνολικό αριθμό σημείων
t = linspace(0, 5, 5001); % 5001 σημεία ομοιόμορφα στο [0, 5]
Και τα δύο δίνουν το ίδιο διάνυσμα στο παραπάνω παράδειγμα.
Παράδειγμα 1 — Cosine με 3 παραμέτρους
Το σήμα x(t) = 5·sin(8t) στο διάστημα 0 ≤ t ≤ 5:
t = linspace(0, 5, 500); % 500 δείγματα από 0 ως 5
x = 5 * sin(8 * t);
plot(t, x)
xlabel('t (s)'), ylabel('x(t)'), title('5 sin(8t)')
grid on
Παράδειγμα 2 — Σήματα που ορίζονται κατά τμήματα
Η δουλειά εδώ είναι να σχεδιάσουμε:
για −2 ≤ t ≤ 3.
Το κόλπο είναι να φτιάξεις μια λογική μάσκα t >= 0 που είναι 1 όπου ισχύει η συνθήκη και 0 αλλού, και να πολλαπλασιάσεις:
t = -2:0.01:3;
w = (t >= 0); % logical vector: 1 για t>=0, 0 αλλιώς
x = (exp(-3*t) - exp(-6*t)) .* w; % το .* μηδενίζει για t<0
plot(t, x)
xlabel('t (s)'), ylabel('x(t)'), grid on
Αν θες περιορισμένο διάστημα 0 ≤ t ≤ 1:
w = (t >= 0) & (t <= 1);
x = (exp(-3*t) - exp(-6*t)) .* w;
plot(t, x)
Βασικά σήματα — οι δομικοί λίθοι
Βηματική συνάρτηση u(t)
Δύο τρόποι. Inline σαν λογική:
u = double(t >= 0); % double μετατρέπει το logical σε 0/1 αριθμητικά
plot(t, u)
ή σαν function σε δικό της .m αρχείο για επαναχρησιμοποίηση:
% αρχείο: us.m
function u = us(t)
u = 1 * (t >= 0);
end
% στο command window:
t = -2:0.01:3;
u = us(t);
plot(t, u)
Ράμπα r(t)
function r = ramp(t)
r = t .* (t >= 0); % t για t≥0, 0 αλλιώς
end
Εκθετικά
t = 0:0.1:10;
y1 = exp(2*t); % αύξον εκθετικό
y2 = exp(-0.5*t); % φθίνον εκθετικό
y3 = 0.8.^t; % a^t με a<1 — επίσης φθίνον
y4 = 1.2.^t; % a^t με a>1 — αύξον
subplot(2,2,1), plot(t, y1), title('e^{2t}')
subplot(2,2,2), plot(t, y2), title('e^{-0.5t}')
subplot(2,2,3), plot(t, y3), title('0.8^t')
subplot(2,2,4), plot(t, y4), title('1.2^t')
Ορθογώνιος παλμός
Δύο τρόποι — με λογικές μάσκες ή με συνδυασμό step:
% Τρόπος 1: λογική
t = -2:0.001:2;
rect = double(abs(t) <= 0.5);
plot(t, rect)
% Τρόπος 2: u(t) - u(t-T) (μοναδιαία βήματα)
rect = us(t + 0.5) - us(t - 0.5);
plot(t, rect)
Ημιτονοειδή σήματα συνεχούς χρόνου
Γενική μορφή:
όπου Ω σε rad/s, f σε Hz, και θ σε rad.
A = 2; % πλάτος
f = 5; % συχνότητα σε Hz
theta = pi/4; % φάση σε rad
t = 0:0.001:1; % 1 sec χρονικό διάστημα
x = A * cos(2*pi*f*t + theta);
plot(t, x)
xlabel('t (s)'), ylabel('x(t)'), grid on
title(sprintf('A=%g, f=%g Hz, \\theta=%g rad', A, f, theta))
Διακριτά σήματα
Για ένα διακριτό σήμα x[n] = cos(πn/3):
n = 0:20; % διακριτός χρόνος — ακέραιοι
x = cos(pi*n/3);
stem(n, x, 'filled')
xlabel('n'), ylabel('x[n]'), title('cos(\pin/3)')
grid on
Αριθμητικός υπολογισμός ενέργειας
Από το θεωρητικό κεφάλαιο: η ενέργεια ενός σήματος ορίζεται ως
Στο MATLAB αυτό είναι αριθμητική ολοκλήρωση. Η εντολή trapz (τραπεζοειδής κανόνας):
t = 0:0.001:5;
x = exp(-t); % ένα φθίνον εκθετικό
E = trapz(t, abs(x).^2);
fprintf('E ≈ %.4f\n', E);
% E ≈ 0.5000 (η αναλυτική απάντηση είναι 1/2)
Decomposition σε άρτιο & περιττό
Κάθε σήμα γράφεται ως άθροισμα ενός άρτιου και ενός περιττού:
Στο MATLAB το x(-t) δεν είναι «αυτονόητο» — το διάνυσμα x δεν ξέρει αρνητικό χρόνο. Το κόλπο είναι να αναποδογυρίσεις το διάνυσμα και να φροντίσεις να είναι το t συμμετρικό γύρω από το 0:
t = -3:0.01:3; % συμμετρικό!
x = exp(-t) .* (t >= 0); % ένα one-sided σήμα
x_flipped = fliplr(x); % αυτό είναι το x(-t) επειδή t→-t αντιστρέφει την σειρά
xe = (x + x_flipped) / 2; % άρτιο μέρος
xo = (x - x_flipped) / 2; % περιττό μέρος
subplot(3,1,1), plot(t, x), title('x(t)')
subplot(3,1,2), plot(t, xe), title('x_e(t)')
subplot(3,1,3), plot(t, xo), title('x_o(t)')
Έλεγχος: αν προσθέσεις xe + xo πρέπει να πάρεις πίσω το x. Δοκίμασέ το.
Ασκήσεις από παλιά θέματα εξετάσεων
Quick recap
- Χρονικό διάνυσμα:
t = 0:0.001:5ήlinspace(0, 5, 5001). - Λογικές μάσκες:
(t >= 0),(t >= a) & (t <= b), πολλαπλασιάζονται με σήματα για να «κόψουν» τμήματα. plotγια συνεχή,stemγια διακριτά.trapz(t, abs(x).^2)για αριθμητική ενέργεια.- Μετασχηματισμοί σήματος (
x(at + b)): αντικαθιστάς το όρισμα στον τύπο.
Lab 3 — Γραμμικά συστήματα συνεχούς χρόνου →
Έλεγχος γραμμικότητας & χρονικής αμεταβλητότητας με anonymous functions. Πώς ορίζεις «σύστημα» σαν function στο MATLAB.
Τελείωσες αυτή τη σελίδα;