Διακριτός Μετασχηματισμός Fourier 1 Διακριτός Μετασχηματισμός Fourier Ο μετασχηματισμός Fourier αποτελεί τον ακρογωνιαίο λίθο της επεξεργασίας σήματος αλλά και συχνή αιτία πονοκεφάλου για όσους πρωτοασχολούνται με αυτόν. Μετασχηματισμός Fourier αναλογικού χρόνου, Μετασχηματισμός Fourier διακριτού χρόνου, Διακριτός Μετασχηματισμός Fourier... Έστω για παράδειγμα ότι έχουμε ένα αναλογικό σήμα x(t) με μετασχηματισμό Fourier X F T (Ω) = + x(t)e jωt dt Ο μετασχηματισμός Fourier ως γνωστόν μας φανερώνει το περιεχόμενο ενός σήματος σε συχνότητες. Σχήμα 1: Μετασχηματισμός Fourier Αν η μέγιστη συχνότητα που υπάρχει στο σήμα είναι τα 100 rad/sec τότε για μια σωστή δειγματοληψία του σήματος θα πρέπει η συχνότητα αυτής να είναι τουλάχιστον ίση με 200 rad/sec. 1
Έστω ότι κάνουμε δειγματοληψία με συχνότητα 300 rad/sec. Το σήμα που προκύπτει είναι διακριτό και το συμβολίζουμε με x(n). Για το σήμα αυτό ορίζεται ο μετασχηματισμός Fourier διακριτού χρόνου. X DT F T (ω) = + x(n)e jωn Αφού στην πράξη χρησιμοποιούμε μόνο διακριτά σήματα μας ενδιαφέρει πολύ να ξέρουμε τι σχέση έχει ο X F T (Ω) με τον X DT F T (ω). Η αλήθεια είναι ότι όταν έχουμε κάνει μια καλή δειγματοληψία μοιάζουν εξαιρετικά! Σχήμα 2: Μετασχηματισμός Fourier Διακριτού Χρόνου Αυτό που παρατηρούμε είναι ότι το αρχικό διάστημα [-150,150] rad/sec μετασχηματίστηκε (ή «συμπιέστηκε» αν θέλετε) στο διάστημα [-π,π] rad. (Προσέξτε τη διαφορά στις μονάδες!) Δηλαδή για κάθε συχνότητα Ω στο διάστημα [-150,150] rad/sec υπάρχει μία αντίστοιχη συχνότητα ω στο διάστημα [-π, π] rad και οι δύο συχνότητες συνδέονται με τη σχέση ω = ΩT s όπου T s η περίοδος δειγματοληψίας. H σχέση ω = ΩT s είναι η γέφυρα που συνδέει τον αναλογικό και τον ψηφιακό κόσμο! Περιττό να τονίσω ότι η εκμάθησή της είναι must! Επιπλέον ο X DT F T (ω) είναι 2π-περιοδικός. Αυτό δεν φαίνεται άμεσα από το σχήμα αλλά αν κάναμε τη γραφική παράσταση στα διαστήματα [π, 3π], [3π, 5π], κτλ. ή στα διαστήματα [-3π, -π], [-5π, -3π] κτλ., το αποτέλεσμα θα ήταν ακριβώς το ίδιο. Αρκεί δηλαδή να γνωρίζουμε ένα τμήμα με μήκος 2π από το μετασχηματισμό για να τον καθορίσουμε σε οποιοδήποτε σημείο του. Θυμηθήκαμε λοιπόν τι συμβαίνει με το μετασχηματισμό Fourier των σημάτων που χρησιμοποιούμε στην πράξη δηλαδή των διακριτών σημάτων. Τι πρόβλημα 2
υπάρχει τώρα; O μετασχηματισμός αυτός είναι μια συνεχής συνάρτηση άρα δεν μπορούμε να την απεικονίσουμε άμεσα στο MATLAB το οποίο ως γνωστόν μόνο διακριτές ποσότητες χειρίζεται. Ακολούθως θα δούμε την λύση στο πρόβλημα. 2 Διακριτός Μετασχηματισμός Fourier. Μέρος 2ο Η πραγματικότητα λοιπόν επιβάλλει διακριτά σήματα x(n) πεπερασμένου μήκους Ν. Για τα σήματα αυτά ορίζουμε ως διακριτό μετασχηματισμό Fourier (DFT) τη διακριτή ποσότητα: X DF T (k) = N 1 n=0 2πk j( x(n)e N )n Η ακολουθία X(k) είναι N-περιοδική για k ακέραιο. Κατά συνέπεια αρκεί να γνωρίζουμε Ν σημεία της προκειμένου να την καθορίσουμε πλήρως. Συνήθως επιλέγουμε τις τιμές X DF T (0) έως X DF T (N 1) δηλαδή αφήνουμε το δείκτη k να «τρέξει» από k = 0 έως k = N 1. Αυτή η ποσότητα προφανώς μπορεί να παρασταθεί. Γιατί όμως κάτι τέτοιο είναι χρήσιμο; Ας ρίξουμε μια ματιά στο μετασχηματισμό Fourier διακριτού χρόνου: X DT F T (ω) = + x(n)e jωn = N 1 n=0 x(n)e jωn Από μία σύγκριση των δύο τύπων παρατηρούμε ότι ο DFT δεν είναι τίποτε άλλο από μια δειγματοληψία του συνεχούς φάσματος του διακριτού σήματος:. X DT F T ( 2πk N ) = X DF T (k) Είναι δηλαδή το εργαλείο που χρησιμοποιούμε για να απεικονίσουμε φάσματα και για αυτό το λόγο είναι πολύ σημαντικός. Συνοψίζοντας δηλαδή ο DFT (και ο αντίστροφός του) ορίζονται από τις πιο κάτω σχέσεις: X DF T (k) = N 1 kn n=0 x(n)wn k = 0, 1,, N 1 DFT μετασχηματισμός πεδίο χρόνου πεδίο συχνοτήτων x(n) = 1 N 1 N k=0 X DF T (k)w kn N n = 0, 1,, N 1 IDFT αντίστροφος μετασχηματισμός πεδίο συχνοτήτων πεδίο χρόνου W N = e j 2π N Ένα ακόμα πλεονέκτημα του DFT είναι η δυνατότητα γρήγορου υπολογισμού του μέσω κατάλληλα σχεδιασμένων αλγόριθμων. Οι αλγόριθμοι αυτοί φέρουν το γενικό όνομα FFT (Fast Fourier Transform/Γρήγορος Μετασχηματισμός Fourier). Κατά συνέπεια το όνομα FFT αναφέρεται σ έναν αλγόριθμο και το 3
όνομα DFT στην ποσότητα που ο αλγόριθμος αυτός υπολογίζει. Ας δούμε ένα παράδειγμα: x(t) = cos(20πt) + sin(60πt) + cos(120πt) Είναι φανερό ότι περιέχει τις συχνότητες 10, 30 και 60 Hz αντίστοιχα. Στο MATLAB δημιουργούμε αυτό το σήμα θεωρώντας ως συχνότητα δειγματοληψίας f s =200Hz: fs=200; n=0:1/fs:1; x1=cos(20*pi*n); x2=sin(60*pi*n); x3=cos(120*pi*n); x=x1+x2+x3; Οι γραφικές παραστάσεις των σημάτων καθώς και του συνολικού σήματος παρουσιάζονται ως εξής: subplot(411),plot(n,x1); subplot(412),plot(n,x2); subplot(413),plot(n,x3); subplot(414),plot(n,x); Ο μετασχηματισμός Fourier του σήματος x υπολογίζεται με βάση την συνάρτηση fft του MATLAB: y = fft(x,n) H συνάρτηση αυτή υπολογίζει το διακριτό μετασχηματισμό Fourier της ακολουθίας x. Το n είναι το μήκος του μετασχηματισμού Fourier. Aν η ακολουθία x έχει μήκος μικρότερο από n, τότε συμπληρώνονται στο τέλος τα κατάλληλα μηδενικά. Αν το μήκος του x είναι μεγαλύτερο από n, τότε γίνεται αποκοπή των επιπλέον δειγμάτων. Αν το μήκος του σήματος είναι δύναμη του 2 (n=2k) επιτυγχάνεται αύξηση της ταχύτητας εξαιτίας των αλγορίθμων γρήγορου μετασχηματισμού που χρησιμοποιούνται. Για το σήμα του παραδείγματος έχουμε: X=fft(x); Αν θέλαμε μήκος 256, θα δίναμε την εντολή: X=fft(x,256); Το αποτέλεσμα είναι ένα διάνυσμα μήκους ίσου με το μήκος του x. Γραφικά έχουμε τα εξής: subplot(211),plot(0:length(x)-1,abs(x)),title( Abs(X) ); subplot(212),plot(0:length(x)-1,real(x)),title( Re(X) ); 4
Tο βασικό πρόβλημα που παρατηρείται είναι ότι ο άξονας x δεν εμφανίζει τις συχνότητες όπως θα έπρεπε να το κάνει. Αυτό γίνεται γιατί θα πρέπει πρώτα να υπολογίσουμε τις ψηφιακές συχνότητες και στη συνέχεια να κάνουμε γραφική παράσταση ως προς αυτές. Oι εντολές που συντάσσουμε είναι: k=0:length(x)-1; w=k*(2*pi/length(x))% για τις ψηφιακές κυκλικές % συχνότητες ω plot(w,abs(x)) xlabel( Digital frequency w ) Αυτό που βλέπουμε είναι μια γραφική προσέγγιση του μετασχηματισμού Fourier διακριτού χρόνου του σήματος μας. Επειδή το σήμα είναι ένα άθροισμα ημιτονοειδών η παρουσία των τριών πρώτων κορυφών είναι απόλυτα λογική. Τι συμβαίνει όμως με τις συχνότητες που αντιστοιχούν στο δεύτερο μισό του μετασχηματισμού που υπολογίσαμε; Αυτό οφείλεται καθαρά στη συμμετρία που παρουσιάζει ο μετασχηματισμός Fourier των πραγματικών σημάτων και στο ότι το κομμάτι του μετασχηματισμού που βλέπουμε περιλαμβάνει τις συχνότητες 0 έως 2π. Αν δεν σας είναι προφανής η συμμετρία αυτή, κάντε μια ερώτηση στους διδάσκοντες. Αυτό που πρέπει να τονίσουμε είναι ότι για την περίπτωση πραγματικών σημάτων τα τρία τελευταία ίχνη δεν μας δίνουν καινούργια πληροφορία. Μπορούμε δηλαδή να τυπώσουμε το πρώτο μισό της γραφικής παράστασης και να είμαστε απόλυτα γενικοί: newlen=round(length(x)/2); % Η συνάρτηση round % στρογγυλοποιεί το ορισμά της % στον πλησιέστερο ακέραιο. % Το μήκος newlen είναι μισό του αρχικού newx=x(1:newlen); % Εξάγουμε τις πρώτες μισές από % τις συνιστώσες του Χ newk=0:newlen-1; neww=newk*(2*pi/length(x));% ΠΡΟΣΟΧΗ, χρησιμοποιούμε % length(x) και % όχι newlen. Ρωτήστε αν δεν % καταλαβαίνετε γιατί plot(neww,abs(newx)) xlabel( Digital frequency w ) Μάλιστα στο σημείο αυτό καλό θα ήταν να φτιάξουμε και έναν άξονα με τις αντίστοιχες αναλογικές συχνότητες f σε Hz: W=neww/Ts; f=w/(2*pi); plot(f,abs(newx)) % Αναλογική κυκλική συχνότητα % Αναλογική συχνότητα σε Hz Αυτό που βλέπουμε είναι μια προσέγγιση του φάσματος του αναλογικού μας σήματος. Όπως περιμέναμε διακρίνονται οι συχνότητες των τριών συνιστωσών 10Hz, 30Hz, 60Hz. 5
3 Υπολογισμός συνέλιξης με τη βοήθεια του διακριτού μετασχηματισμού Fourier Από τη θεωρία έχουμε μάθει ότι υπάρχει μια πολύ στενή σχέση μεταξύ της κυκλικής συνέλιξης δύο ακολουθιών και των αντίστοιχων διακριτών μετασχηματισμών Fourier. ή αλλιώς x 1 (n) x 2 (n) DFT X 1 (k)x 2 (k) x 1 (n) x 2 (n) = IDF T (X 1 (k)x 2 (k)) όπου το αριστερό μέλος της σχέσης αντιστοιχεί στην κυκλική συνέλιξη. Θα δούμε με ποιό τρόπο μπορούμε να χρησιμοποιήσουμε αυτή τη σχέση προκειμένου να υπολογίσουμε τη γραμμική συνέλιξη των ακολουθιών. Έστω ότι έχουμε τις ακολουθίες: x=[1 2 2 1]; h=1:3; Η κυκλική συνέλιξη αυτών των ακολουθιών είναι ο αντίστροφος μετασχηματισμός Fourier του γινομένου των μετασχηματισμών Fourier των δύο ακολουθιών. Δηλαδή: Χ=fft(x); H=fft(h); y=ifft(x.*h); Η τελευταία εντολή μας επιστρέφει μήνυμα λάθους. Λογικό αφού οι ακολουθίες Χ και Η δεν έχουν το ίδιο μήκος και ο κυκλικός συγκερασμός απαιτεί ισομήκεις ακολουθίες. Η λύση είναι η προσθήκη ενός μηδενικού στην ακολουθία h. Προγραμματιστικά αυτό μπορεί να γίνει με δύο τρόπους: 1) Παίρνουμε τις αρχικές ακολουθίες και προσθέτουμε μηδενικά στην μικρότερη ώστε και οι δύο να αποκτήσουν το ίδιο μήκος. Δηλαδή: h=[h zeros(1,length(x)-length(h))]; % θυμάστε την εντολή zeros subplot(211),stem(0:length(x)-1,x); subplot(212),stem(0:length(x)-1,h); Οι ακολουθίες x,h μετά την προσθήκη των απαραίτητων μηδενικών (zero padding) X=fft(x); H=fft(h); y=ifft(x.*h); subplot(211),stem(0:length(y)-1,y); 2) Υπολογίζοντας το μετασχηματισμό Fourier των ακολουθιών φροντίζουμε ώστε το μήκος του να είναι ίδιο με το μήκος της κυκλικής συνέλιξης. Στην προκειμένη περίπτωση 4: 6
x=[1 2 2 1]; h=1:3; Χ1=fft(x,4); H1=fft(h,4); y1=ifft(x1.*h1); subplot(212),stem(0:length(y1)-1,y); αν δούμε σε αντιπαραβολή τα δύο αποτελέσματα έχουμε ότι είναι ακριβώς τα ίδια. Δείτε την γραφική παράσταση. Το αποτέλεσμα είναι διαφορετικό από την κυκλική συνέλιξη 8 σημείων. Παρόλο που μέσω του DFT υπολογίζουμε την κυκλική συνέλιξη, μπορούμε ωστόσο για τη γραμμική συνέλιξη να εφαρμόσουμε επίσης την ίδια μέθοδο. Αρκεί να συμπληρώσουμε με τα απαραίτητα μηδενικά τις δύο ακολουθίες ώστε αυτές να φτάσουν σε μήκος το επιθυμητό μήκος της συνέλιξης. Στην ουσία η γραμμική συνέλιξη ισοδυναμεί με την κυκλική η οποία έχει υπολογιστεί αφού έχουμε προσθέσει μηδενικά ή αλλιώς έχοντας κάνει υπολογισμό fft μήκους όσου και η γραμμική συνέλιξη, δηλαδή length(x)+length(h)-1. Παράδειγμα: x=[1 2 2 1]; h=1:3; x(6)=0; % zero padding h(6)=0; X=fft(x); % υπολογισμός μετασχηματισμών Fourier H=fft(h); y=ifft(x.*h); και για να έχουμε μέτρο σύγκρισης χρησιμοποιούμε και την conv: y1=conv(x,h); % σημείωση ότι δεν παίζουν ρόλο τα μηδενικά % στο τέλος των x και h subplot(211),stem(0:5,y),title( συνέλιξη με fft ) subplot(212),stem(0:5,y1),title( συνέλιξη με conv ); Eίναι φανερή η ισοδυναμία μεταξύ των δύο τρόπων. Τι διαφορά έχει με την κυκλική συνέλιξη που είχαμε υπολογίσει αρχικά; Σε αυτή την περίπτωση η συνέλιξη ήταν μήκους 4, τα δε αποτελέσματα ότι το πρώτο στοιχείο της είναι το άθροισμα του 1ου και 5ου στοιχείου της γραμμικής συνέλιξης ενώ το δεύτερο το άθροισμα του 2ου και του 6ου. 7