Εισαγωγή στην αναπαράσταση και επεξεργασία σημάτων συνεχούς και διακριτού χρόνου με Matlab Τμήμα Πληροφορικής και Τηλεπικοινωνιών Κολοβού Αθανασία, ΕΔΙΠ.
Σήματα συνεχούς χρόνου Τα σήματα ταξινομούνται σε σήματα συνεχούς χρόνου και σήματα διακριτού χρόνου. Συνήθως η ανεξάρτητη μεταβλητή είναι ο χρόνος, χωρίς να αποκλείεται η μεταβλητή αυτή να είναι μία άλλη ποσότητα, όπως η θερμοκρασία, η απόσταση κτλ. Σήματα συνεχούς χρόνου καλείται οποιαδήποτε φυσική ποσότητα που μεταβάλλεται με το χρόνο. Υπάρχουν σήματα φωνής ή σήματα ήχου, όπως βλέπουμε στη συνέχεια. Το φώνημα «οh» σε μία λέξη (από το TIDIGITS corpus).5..5..5 -.5 -. -.5 -. 3 4 5 6 7 8 Ή ένα σήμα από μουσική ενός βιολιού (από McGill Master Samples).5..5 -.5 -..5.5.5 3 3.5 4 x 4 Υπάρχουν επίσης σήματα τα οποία περιγράφονται με μία μαθηματική συνάρτηση. Παράδειγμα η συνάρτηση X(t)=5*sin(8*t), την οποία θα σχεδιάσουμε στο διάστημα. Στο Matlab γράφουμε >> t=linspace(,5,5); >> x=5*sin(8*t); >> plot(t,x)
5 4 3 - - -3-4 -5.5.5.5 3 3.5 4 4.5 5 Η για παράδειγμα η παρακάτω συνάρτηση, την οποία θα σχεδιάσουμε Στο Matlab γράφουμε τις παρακάτω εντολές >> t=[:.:5]; >> x=exp(-3*t)-exp(-6*t); >> plot(t,x).5..5..5.5.5.5 3 3.5 4 4.5 5 Ας σχεδιάσουμε στη συνέχεια την x(t) στο διάστημα σε χρονικά διαστήματα Δt=.s. Αν παρατηρήσουμε καλύτερα την x(t), βλέπουμε ότι το σήμα αυτό έχει τιμή για τιμές.
Για να μεριμνήσουμε για αυτό το γεγονός στο γράφημα που θα σχεδιάσουμε, θα χρησιμοποιήσουμε το λογικό τελεστή «<=» με την παρακάτω μορφή. (με την πράξη «<=» που γράφουμε εδώ, φτιάχνουμε ένα νέο πίνακα w, ο οποίος είναι το αποτέλεσμα της λογικής πράξης σύγκρισης το t με το, και παράγεται ένα πίνακας ο οποίος έχει τιμές (true) και (false) )..5 >> t=[-:.:3]; >> w=(t>=); %w is a logical operator >> x=(exp(-3*t)-exp(-6*t)).*w; >> plot(t,x)..5..5 - -.5 - -.5.5.5.5 3 Έστω το σήμα αυτό το οποίο θέλουμε να σχεδιάσουμε στο χρονικό διάστημα το σήμα Το σήμα είναι το ίδιο με αυτό που είχαμε πριν απλά τώρα x(t)= για t>. Στο Matlab γράφουμε >> t=[-:.:3]; >> w=(t>=)&(t<=); >> x=(exp(-3*t)-exp(-6*t)).*w; >> plot(t,x).5..5..5 - -.5 - -.5.5.5.5 3 Βασικά σήματα Ένας αριθμός βασικών σημάτων συνεχούς (η διακριτού) χρόνου πολύ συχνά εμφανίζονται στην ψηφιακή επεξεργασία σήματος και η βασική χρήση τους είναι η δημιουργία άλλων πιο πολύπλοκων σημάτων. Μερικά από αυτά είναι:
, t * Μοναδιαία ή κρουστική συνάρτηση: ( t) ύ * Βηματική συνάρτηση, t u( t) ύ * Μιγαδική εκθετική ακολουθία x(t)=e jωt, όπου ω η γωνιακή συχνότητα στο διάστημα [, π]. * Eκθετικά σήματα x(t)=α t και x(t)=e αt * Μοναδιαία Συνάρτηση ράμπας (αντιπροσωπεύεται από μια μονότονα αύξουσα συνάρτηση που μοιάζει με μια ράμπα) t, t r ( t) t Θα γράψουμε στη συνέχεια συναρτήσεις στο Matlab που υλοποιούν τα παραπάνω βασικά σήματα. Δημιουργούμε αρχικά ένα function στο matlab και στην συνέχεια βλέπουμε τον τρόπο με τον οποίο καλούμε την function για να δούμε και γραφικά την συνάρτηση αυτή. Με αυτόν τον τρόπο μπορούμε να καλούμε την step_function με διαφορετικές παραμέτρους κάθε φορά. Α. Βηματική συνάρτηση function x = step_function(t) x = *(t>=);.8.6.4. >> t=[::]; >> x = step_function(t); >> plot(t,x).8.6.4. 3 4 5 6 7 8 9 Β. Συνάρτηση ράμπας
function x = ramp_function(t) x = t.*(t>=); 9 8 7 6 >> t=[::]; >> x = ramp_function(t); >> plot(t,x) 5 4 3 3 4 5 6 7 8 9 Γ. Χρησιμοποιούμε την βηματική για να φτιάξουμε ένα τετραγωνικό παλμό function x = pulse(t) x = step_function(t+.5)-step_function(t-.5);.9 >> t=[:.:5]; >> x=pulse(t); >> plot(t,x).8.7.6.5.4.3...5.5.5 3 3.5 4 4.5 5 Δ. Εκθετικά σήματα
Amplitude 5 x 8 Exponential Signal 4.5 >> t=:.:; >> y=exp(*t); >> plot(t,y); >> ylabel ('Amplitude'); >> xlabel ('Time Index'); >> title ('Exponential Signal'); 4 3.5 3.5.5.5 3 4 5 6 7 8 9 Time Index 8 >> t=-:.:; >> a=.8; >> a=.; >> subplot();plot(t,a.^t) >> subplot (;plot(t,a.^t) 6 4 - -8-6 -4-4 6 8 8 6 4 - -8-6 -4-4 6 8 Ημιτονοειδή σήματα συνεχούς χρόνου Ένα ημιτονοειδές σήμα συνεχούς χρόνου, μπορεί να εκφραστεί ως εξής x(t)=a*cos(ω*t+θ), όπου Α=πλάτος, Ω=η συχντότητα (rad/sec) και θ=φάση (rad). Ή μπορεί να γραφτεί και ως εξής x(t)=a*cos(*π*f*t+θ), όπου Ω=πF και F είναι η συχνότητα σε Hz.
sine function Παραδείγματα >> x = :pi/3:*pi; % x vector, <= x <= *pi, increments of pi/3 >> y = sin(3*x); % vector of y values >> plot(x,y) % create the plot >> xlabel('x (radians)'); % label the x-axis >> ylabel('sine function'); % label the y-axis >> title('y = sin(3*x)','fontsize', ); y = sin(3*x).8.6.4. -. -.4 -.6 -.8-3 4 5 6 7 x (radians) Συνεχίζοντας μπορούμε να γράψουμε και το παρακάτω >> plot(cos(3*t),sin(*t),'o'); % blue (default) circles.8.6.4. -. -.4 -.6 -.8 - - -.8 -.6 -.4 -...4.6.8 Σημείωση: περισσότερες πληροφορίες για την εντολή plot, μπορείτε να δείτε με help plot. Σήματα διακριτού χρόνου Όταν η εξαρτημένη μεταβλητή παίρνει διακριτές τιμές, τότε τα σήματα λέγονται διακριτού χρόνου. Συμβολίζονται με x(n) όπου n ακέραιος αριθμός
Μοναδιαία ή κρουστική συνάρτηση:, n ( n) ύ, n Βηματική συνάρτηση u( n) ύ Μιγαδική εκθετική ακολουθία x(n)=e jωn, όπου ω η γωνιακή συχνότητα στο διάστημα [, π]. Παράδειγμα. Δημιουργούμε την ακολουθία u(n) για n:,,, 3 και δίνουμε την γραφική της παράσταση. Δημιουργούμε την ακολουθία u(n-) για n:,, 3,, 3 και δίνουμε την γραφική της παράσταση. Δημιουργούμε την ακολουθία u(n)- u(n-5) για n:,, 3,, και δίνουμε την γραφική της παράσταση. Δημιουργούμε την ακολουθία y=cos(5n) για n:,,, 5. Όπως και πριν, στα σήματα συνεχούς χρόνου, θα δημιουργήσουμε συναρτήσεις στο Matlab, για να μπορούμε να δημιουργούμε και άλλα σήματα χρησιμοποιώντας τα βασικά σήματα. Συνάρτηση δ(n) Α τρόπος: Στην γραμμή «n-n==» γίνεται το εξής. Αρχικά υπολογίζεται η πράξη n-n και το αποτέλεσμα είναι ένα διάνυσμα μεγέθους n. Κάθε στοιχείο του διανύσματος αυτού συγκρίνεται με το, και το αποτέλεσμα της σύγκρισης (το οποίο είναι αν η σύγκριση είναι ψευδής και αν είναι αληθής) γράφεται στο διάνυσμα x. function [x,n] = imp(n,n,n) %implulse function %using logical operators n=n:n; x=n-n==; end Α τρόπος
>> [x,n]=imp(3,-5,5); >> stem(n,x).9.8.7.6.5.4.3.. -5-4 -3 - - 3 4 5 Β τρόπος Εδώ φτιάχνουμε ένα πίνακα με μηδενικά, και το σημείο k+ function y=dn(l,k) d=zeros(,l); d(k+)=; y=d; end.9 >> y=dn(5,5); >> stem(y).8.7.6.5.4.3...5.5 3 3.5 4 4.5 5 5.5 6 Βηματική συνάρτηση function [x,n]=un(n,n,n) n=n:n; x=(n-n)>=; end
>> [x,n]=un(7,-,); >> stem(n,x).9.8.7.6.5.4.3.. - -8-6 -4-4 6 8 Ολίσθηση σημάτων >> [x,n]=un(,-,); >> [x,n]=un(4,-,); >> x=x-x; >> stem(n,x).9.8.7.6.5.4.3.. - -8-6 -4-4 6 8 Ημιτονοειδής ακολουθία
>> n=::5; >> y=*cos(5*n); >> stem(n,y) 8 6 4 - -4-6 -8-5 5 5 3 35 4 45 5 Διακριτός μετασχηματισμός Fourier. Αν x(n) ένα διακριτό διάνυσμα το οποίο είναι μη μηδενικό στο διάστημα n Ν- ο διακριτός μετασχηματισμός Fourier (D.F.T.) καθορίζεται ως εξής: X ( k) N n x( n) e jnk/ N κ=,,,ν-. Αν μας δοθεί ο DFT το σήμα μπορεί να ανακατασκευασθεί χρησιμοποιώντας τον αντίστροφο μετασχηματισμό Fourier: x( n) N N k X ( k) e jk / N n=,.,n-. Παραδείγματα Δημιουργούμε ένα διακριτό διάνυσμα της επιλογής μας που να έχει τουλαχιστον δείγματα και υπολογίστε τον D.F.T n σημείων. Απο τον D.F.T. που προέκυψε ανακατασκευάζουμε το αρχικό σας διάνυσμα. Κάνουμε το ίδιο παράδειγμα με ένα μιγαδικό διάνυσμα. Θα χρησιμοποιήσουμε την εντολή fft() του Matlab
h(n).8 h=[ ]; [H]=fft(h,8); subplot(); plot(h);title('h(n)') subplot(); plot(abs(h));title('dft').6.4. 5 5 5 4 3 DFT 4 6 8 4 Στο παραπάνω παράδειγμα χρησιμοποιήσαμε την εντολή fft με την οποία υπολογίζετε ο DFT. Αλλά πριν μιλήσουμε για αυτό ας περιγράψουμε την σχέση το DTF με τον DTFT. Ας δούμε για αρχή έναν τετραγωνικό παλμό x(n)=, <n<m. O DTFT αυτής της συνάρτησης είναι Ας σχεδιάσουμε την Χ(ω) για Μ=8 M = 8; w = linspace(-*pi, *pi, 8); X_dtft = (sin(w*m/)./ sin(w/)).* exp(-j * w * (M-) / ); plot(w, abs(x_dtft)) title(' X(\omega) ') 8 X() 7 6 5 4 3-8 -6-4 - 4 6 8 Η συνάρτηση fft του Matlab υπολογίζει τον DFT. Στην x(n) δηλαδή θα είχαμε
x = ones(, M); X = fft(x) X = 8 Δηλαδή το dft είναι μόνο 8 και τα υπόλοιπα είναι μηδενικά? Αυτό δεν μοιάζει και πολύ σωστό! Αν όμως υπολογίσουμε τον fft στα σωστά σημεία τότε ίσως πάρουμε κάτι πιο σωστό 8 P = 8; w_k = (:P-) * (*pi/p); X = fft(x); plot(w, abs(x_dtft)) hold on plot(w_k, abs(x), 'o') hold off 7 6 5 4 3-8 -6-4 - 4 6 8 Στο γράφημα έχουμε σημειώσει τα 7 μηδενικά του fft τα οποία αντιστοιχούν σε 7 σημεία στα οποία ο DTFT είναι μηδέν. Μπορούμε να υπολογίσουμε περισσότερα σημεία απλά αυξάνοντας το P. Ένας τρόπος να γίνει αυτό είναι με zero-padding. >> x6 = [x, zeros(, 8)] x6 = Columns through Columns through 6 >> P = 6; >> X6 = fft(x6); >> w_k = (:P-) * (*pi/p); >> X = fft(x); >> plot(w, abs(x_dtft)) >> hold on >> plot(w_k, abs(x6), 'o') >> hold off
8 7 6 5 4 3-8 -6-4 - 4 6 8 Ένας άλλος τρόπος για να αυξήσουμε το P είναι να χρησιμοποιήσουμε τον εναλλακτικό τρόπος της συνάρτησης fft(x,p). Όταν χρησιμοποιούμε την συνάρτηση με αυτή τη μορφή προσθέτονται τα αντίστοιχα μηδενικά (zero-padding), και υπολογίζεται ο n-point DFT. P = 5; Xp = fft(x, P); w_k = (:P-) * (*pi/p); X = fft(x); plot(w, abs(x_dtft)) hold on plot(w_k, abs(xp), 'o') hold off 8 7 6 5 4 3-8 -6-4 - 4 6 8 Αν λοιπόν ποτέ είχατε αναρωτηθεί τι εννοούμε με το zero-padding στο Fourier transform, τώρα ξέρετε! Όταν προσθέτουμε μηδενικά σε μία ακολουθία και στη συνέχεια υπολογίζουμε τον DFT, τότε απλά παίρνουμε περισσότερα δείγματα από τον DTFT της αρχικής ακολουθίας.
Δειγματοληψία Εστω x α (t) ένα αναλογικό σήμα. Με τη δειγματοληψία επιδιώκουμε την δημιουργία του διακριτού σήματος x(n): x(n)=x α (nt) T: περίοδος δειγματοληψίας f s : συχνότητα δειγματοληψίας T Ο συνεχής μετασχηματισμός Fourier του x α (t) είναι: X a ( j) x ( t) e jt d Ο μετασχηματισμός Fourier του x(n) είναι: j X ( e ) x( n) e jn Οι δύο μετασχηματισμοί ακολουθούν την εξής σχέση: j j jk X ( e ) X ( ) T T Ο Χ(e jω ) είναι άθροισμα των Χ α (jω/τ+jπk/τ) για k=-,..., +. Για να αποφύγουμε επικαλύψεις των αθροιζόμενων Χ α (jω/τ+jπk/τ) πρέπει να ισχύει: f s f max με f max : Συχνότητα Nyquist. f max : η μέγιστη συχνότητα για την οποία το Χ a (jω). Δηλαδή για Χ a (jω) = για f >f max. Ανακατασκευή Η μετατροπή από διακριτό σήμα σε αναλογικό φαίνεται στο επόμενο σχήμα: y(n) Mετατροπή σε σειρά παλμών s a (t) Αναλογικό φίλτρο y a (t)
X(f) x[t] Για την σειρά παλμών s a (t) ισχύει: sa ( t) y( k) δ ( t kt) k Θεωρώντας τους μετασχηματισμούς Fourier των παραπάνω σημάτων θα ισχύει: Y α (Ω)=Sα(Ω)H α (Ω) Το H α πρέπει να είναι ένα ιδανικό κατωδιαβατό φίλτρο με κέρδος Τ και συχνότητα αποκοπής Ω c =π/τ. t T Το ιδανικό αυτό φίλτρο έχει τη μορφή: ha sin(π / ) πt T Αντί για ιδανικό φίλτρο οι εμπορικοί D/A μετατροπείς εργάζονται με τα επόμενα φίλτρα: zero-order-hold: h α (t)=u(t)-u(t-t) και first-order-hold: h α ( t T t) - t T αν αν - Τ αλλού. t t T %Deigmatolipsia subplot(,,); T=/64; n=:t:3; x=cos(*pi**n+5); stem(n,x); title('sampling'); xlabel('t'); ylabel('x[t]'); subplot(,,); N=length(fft(x)); f=/t*((:n)-n/)/n; plot(f,abs(fftshift(fft(x)))); title('spectrum '); xlabel('f'); ylabel('x(f)');.5 -.5 Sampling -.5.5.5 3 t Spectrum 8 6 4-4 -3 - - 3 4 f
X(f) x[t] X(f) x[t] Για Τ=3 subplot(,,); T=/3; n=:t:3; x=5*sin(*pi*5*n); stem(n,x); title('sampling'); xlabel('t'); ylabel('x[t]'); grid on; subplot(,,); N=length(fft(x)); f=/t*((:n)-n/)/n; plot(f,abs(fftshift(fft(x)))); title('spectrum'); xlabel('f'); ylabel('x(f)'); 5 Sampling -5.5.5.5 3 t Spectrum 8 6 4-8 -6-4 - 4 6 8 f subplot(,,); T=/; n=:t:3; x=5*sin(*pi*5*n); stem(n,x); title('sampling'); xlabel('t'); ylabel('x[t]'); grid on; subplot(,,); N=length(fft(x)); f=/t*((:n)-n/)/n; plot(f,abs(fftshift(fft(x)))); title('spectrum'); xlabel('f'); ylabel('x(f)'); Για Τ= 5 Sampling -5.5.5.5 3 t Spectrum 5 5 - -8-6 -4-4 6 8 f
Εχουμε το σήμα x(t)=sin(πfot+φ), συχνότητα δειγματοληψίας fs=8khz και φ μοίρες. Για τις συχνότητες,5,35,475 Hz και 755,765,7775,79 στη θέση του fo παίρνουμε για το σήμα και το φάσμα του: subplot(,,); f=; Ts=/8; t=:ts:.; x=sin(*pi*f*t+); stem(t,x); title('δειγματοληψία '); xlabel('t'); ylabel('x[t]'); grid on; subplot(,,); N=length(fft(x)); f=/ts*((:n)-n/)/n; plot(f,abs(fftshift(fft(x))) ); title('φάσμα του σήματος με δειγματοληψία '); xlabel('f'); ylabel('x(f)');
f=; f=475; f=5; f=755; f=35; f=765;
f=7775; f=79;
Παράδειγμα (συχνότητα Nyquist) Έστω ότι x(t)=cos(πt)+4sin(π4t+5). Η συχνότητα Nyquist FN είναι max(,4) 8Hz dx( t). 4 sin( t) 3 cos( 4t 5) dt Η συχνότητα Nyquist Fs είναι max(,4) 8Hz. x( t) cos( 4t) 4sin( 8t 5) Η συχνότητα Nyquist Fs είναι max(4,8)*=6hz (διπλάσια της FN). 3. x ( t) cos ( t) 8cos( t) sin( 4t 5) 6sin ( 4t 5) 5 5cos( 4t) 4sin( t 5) 4sin( 6t 5) 8 8cos( 8t ) Η συχνότητα Nyquist είναι 6Hz (διπλάσια της FN ). 4. x (t) 5 5cos( 8t) 4sin( 4t 5) 4sin( t 5) 8 8cos( 6t ) Η συχνότητα Nyquist για αυτό το σήμα είναι 3Hz =4*FN. Παρατηρούμε ότι η συχνότητα Nyquist του x n (kt), είναι ίση με (n+k)fn. Τα παραπάνω αποτελέσματα επιβεβαιώνονται και στο MatLab. (ο κώδικας που τρέχουμε είναι ο παρακάτω μόνο που κάθε φορά αλλάζουμε το χ ή το T) T=/8; t=:/t*; x=*cos(*pi**t*t)+4*sin(*pi* 4*T*t+5); y=fft(x); N=length(y); f=/t*((:n)-n/)/n; plot(f,abs(fftshift(y)));