medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις...

141
Γιάννης Καλατζής ΕΠΕΞΕΡΓΑΣΙΑ ΙΑΤΡΙΚΟΥ ΣΗΜΑΤΟΣ Σημειώσεις εργαστηριακού μαθήματος 2017 ΕΡΓΑΣΤΗΡΙΟ Επεξεργασία Ιατρικού Σήματος

Transcript of medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις...

Page 1: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Γιάννης Καλατζής

ΕΠΕΞΕΡΓΑΣΙΑ ΙΑΤΡΙΚΟΥ ΣΗΜΑΤΟΣ

Σημειώσεις εργαστηριακού μαθήματος

2017

ΕΡΓΑΣΤΗΡΙΟ

Επεξεργασία

Ιατρικού Σήματος

Page 2: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...
Page 3: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

ΠΕΡΙΕΧΟΜΕΝΑ

0 Βασικές γνώσεις προγραμματισμού σε MATLAB .................................................................................... 5

0.1 Γενικά ....................................................................................................................................................... 5 0.2 Μεταβλητές .............................................................................................................................................. 5 0.3 Εντολές ..................................................................................................................................................... 6 0.4 Πίνακες ..................................................................................................................................................... 6 0.5 Συναρτήσεις οριζόμενες από το χρήστη ................................................................................................... 7 0.6 Αρχεία ....................................................................................................................................................... 9 0.7 Γραφικά .................................................................................................................................................. 10 0.8 Χρήσιμες ειδικές λειτουργίες και συναρτήσεις του MATLAB .............................................................. 11 Εργαστηριακές ασκήσεις ................................................................................................................................. 12

1 Σήματα διάκριτου χρόνου - Απεικόνιση σημάτων - Διαχείριση αρχείων σημάτων ............................. 15

1.1 Συνοπτική θεωρία ................................................................................................................................... 15 1.2 Εργασίες κατανόησης ............................................................................................................................. 16 1.3 Εργαστηριακές ασκήσεις ........................................................................................................................ 20

2 Βασικά είδη σημάτων ................................................................................................................................ 22

2.1 Συνοπτική θεωρία ................................................................................................................................... 22 2.2 Εργασίες κατανόησης ............................................................................................................................. 23 2.3 Εργαστηριακές ασκήσεις ........................................................................................................................ 26

3 Απόκριση συστήματος - Συνέλιξη ............................................................................................................ 28

3.1 Συνοπτική θεωρία ................................................................................................................................... 28 3.2 Εργασίες κατανόησης ............................................................................................................................. 29 3.3 Εργαστηριακές ασκήσεις ........................................................................................................................ 35

4 Συσχέτιση ................................................................................................................................................... 37

4.1 Συνοπτική θεωρία ................................................................................................................................... 37 4.2 Εργασίες κατανόησης ............................................................................................................................. 37 4.3 Εργαστηριακές ασκήσεις ........................................................................................................................ 43

5 Διάκριτος Μετασχηματισμός Fourier ...................................................................................................... 45

5.1 Συνοπτική θεωρία ................................................................................................................................... 45 5.2 Εργασίες κατανόησης ............................................................................................................................. 46 5.3 Εργαστηριακές ασκήσεις ........................................................................................................................ 51

6 Διάκριτος Μετασχηματισμός Fourier – Εφαρμογές ............................................................................... 53

6.1 Συνοπτική θεωρία ................................................................................................................................... 53 6.2 Εργασίες κατανόησης ............................................................................................................................. 53 6.3 Εργαστηριακές ασκήσεις ........................................................................................................................ 56

7 Συνέλιξη στο πεδίο των συχνοτήτων ........................................................................................................ 59

7.1 Συνοπτική θεωρία ................................................................................................................................... 59 7.2 Εργασίες κατανόησης ............................................................................................................................. 60 7.3 Εργαστηριακές ασκήσεις ........................................................................................................................ 64

8 Φιλτράρισμα στο πεδίο των συχνοτήτων ................................................................................................ 66

8.1 Συνοπτική θεωρία ................................................................................................................................... 66 8.2 Εργασίες κατανόησης ............................................................................................................................. 68 8.3 Εργαστηριακές ασκήσεις ........................................................................................................................ 82

Page 4: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

9 Αποκατάσταση σήματος ........................................................................................................................... 86

9.1 Συνοπτική θεωρία ................................................................................................................................... 86 9.2 Εργασίες κατανόησης ............................................................................................................................. 90 9.3 Εργαστηριακές ασκήσεις ........................................................................................................................ 94

ΛΥΣΕΙΣ ΕΡΓΑΣΤΗΡΙΑΚΩΝ ΑΣΚΗΣΕΩΝ .................................................................................................... 95

Page 5: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

0 Βασικές γνώσεις προγραμματισμού σε MATLAB

Σε αυτήν την ενότητα θα γίνει υπενθύμιση των απαιτούμενων γνώσεων προγραμματισμού σε

MATLAB για το εργαστηριακό μάθημα της Επεξεργασίας Σήματος, και συγκεκριμένα θα

δείτε συνοπτικά:

Μεταβλητές και εντολές.

Πίνακες.

Συναρτήσεις.

Αρχεία.

Γραφικά.

0.1 Γενικά

Εντολές και μεταβλητές: Όπως κάθε γλώσσα προγραμματισμού, το MATLAB λειτουργεί με

εντολές (δηλαδή οδηγίες προς τον υπολογιστή), οι οποίες επεξεργάζονται μεταβλητές (δηλαδή

τιμές στη μνήμη του υπολογιστή), παράγοντας ως αποτέλεσμα νέες τιμές.

Πρόγραμμα: Ένα σύνολο εντολών, ομαδοποιημένες σε ένα αρχείο, αποτελούν ένα πρόγραμμα.

Οι εντολές ενός προγράμματος γράφονται σε ένα απλό αρχείο κειμένου (που στο MATLAB

έχει κατάληξη .m) και αποτελούν τον κώδικα του προγράμαμτος. Όταν το πρόγραμμα εκτελε-

στεί, τότε οι εντολές του μετατρέπονοται σε γλώσσα μηχανής και στη συνέχεια εκτελούνται

διαδοχικά.

Current Folder, Path: Για να μπορεί να εκτελεστεί ένα πρόγραμμα στο MATLAB, πρέπει να

βρίσκεται σ’ ένα φάκελο που λέγεται Current Folder (η διαδρομή του εμφανίζεται στο άνω

μέρος, κάτω από το μενού του MATLAB). Εναλλακτικά, για καλύτερη οργάνωση, τα προ-

γράμματα μπορεί να βρίσκονται σε οποιουσδήποτε φακέλους, αρκεί αυτοί να δηλωθούν σε μια

ειδική ομάδα φακέλων του MATLAB που λέγεται Path (βρίσκεται στο μενού File | Set Path).

Συναρτήσεις, Toolboxes: Στο MATLAB υπάρχουν μια σειρά από συναρτήσεις (δηλαδή σύνολα

εντολών που εμπλουτίζουν τις λειτουργίες του). Οι συναρτήσεις του MATLAB είναι οργανω-

μένες σε ομάδες, κάθε μια σχετική με μια εξειδικευμένη θεματική περιοχή. Κάθε ομάδα τέ-

τοιων συναρτήσεων ονομάζεται Toolbox (π.χ. Statistics Toolbox, Signal Processing Toolbox

κλπ).

0.2 Μεταβλητές

Μια μεταβλητή είναι μια θέση στη μνήμη του υπολογιστή, που έχει ένα όνομα και μια τιμή. Η

περιοχή της μνήμης του MATLAB στην οποία αποθηκεύονται οι μεταβλητές ονομάζεται

Workspace.

Το όνομα μιας μεταβλητής πρέπει να ξεκινάει από λατινικό γράμμα, και μπορεί να περιέχει

μόνο λατινικά γράμματα (a…z, A…Z), αριθμούς (0…9) ή κάτω παύλες (underscore, _).

Ο τύπος μιας μεταβλητής καθορίζει το είδος των τιμών που θα αποθηκεύονται (αριθμοί, χαρα-

κτήρες κλπ), το χώρο στη μνήμη που θα καταλαμβάνει και (στην περίπτωση των αριθμητικών

μεταβλητών) το αν θα έχει δεκαδικά ψηφία ή όχι. Αν δεν οριστούν διαφορετικά, οι αριθμητικές

μεταβλητές που ορίζονται από το χρήστη στο MATLAB είναι τύπου double (κινητής υποδια-

στολής, καταλαμβάνουν χώρο 64bit στη μνήμη, έχουν ακρίβεια 15 δεκαδικών ψηφίων και εύ-

ρος περίπου από -10308 έως +10308).

Στο MATLAB υπάρχουν επίσης κάποιες ενσωματωμένες ειδικές μεταβλητές, όπως το pi, που

είναι προσέγγιση του π με ακρίβεια 14 δεκαδικών ψηφίων (pi = 3. 14159265358979).

Page 6: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

6 Εργαστηριακές Ασκήσεις Επεξεργασίας Ιατρικού Σήματος

0.3 Εντολές

Οι εντολές δίνονται είτε απ’ ευθείας στο Command Window, είτε γράφονται σε κώδικα προ-

γράμματος στον Editor.

Τα αποτελέσματα των εντολών μπορούν είτε να παρουσιαστούν σε μορφή κειμένου στο Com-

mand Window, είτε να αποθηκευτούν σε κάποιο μόνιμο μαγνητικό μέσο (όπως στο σκληρό

δίσκο, σε δισκέτα ή σε μνήμη τύπου flash), είτε να απεικονιστούν με μορφή γραφημάτων σε

ειδικά παράθυρα γραφικών (που λέγονται figures).

Κάθε εντολή τελειώνει με ελληνικό ερωτηματικό (;), κόμμα (,) ή αλλαγή γραμμής ( Enter).

Στην περίπτωση εντολής ανάθεσης (δηλ. όταν ορίζεται μια μεταβλητή ή αλλάζει η τιμή της)

χωρίς ελληνικό ερωτηματικό (;), το αποτέλεσμα απεικονίζεται στο Command Window.

Το σύμβολο «%» σημαίνει σχόλιο (ό,τι ακολουθεί στην ίδια σειρά αγνοείται).

Εντολές εισόδου (από το πληκτρολόγιο) και εξόδου (στο Command Window):

input: Εντολή για είσοδο τιμών σε μεταβλητές από το πληκτρολόγιο: w = input('Weight: '); % Εισαγωγή αριθμού από το πληκτρολόγιο

n = input('Name: ', 's'); % Εισαγωγή string από το πληκτρολόγιο

disp: Εντολή απεικόνισης κειμένου ή τιμής μιας μεταβλητής στο Command Window: disp(x); % Απεικόνιση της τιμής της μεταβλητής x στο Command Window

disp('Hello'); % Απεικόνιση της συμβολοσειράς Hello στο Command Window

fprintf: Εντολή απεικόνισης κειμένου με τιμές μεταβλητών στο Command Window,

π.χ.: fprintf('Patient %s is %dkg and %.2fm\n', n, w, h);

Ειδικοί χαρακτήρες για την fprintf:

%d = απεικόνιση σε μορφή ακεραίου αριθμού

%f = απεικόνιση σε μορφή αριθμού με δεκαδικά ψηφία

%X.Yf = απεικόνιση σε μορφή αριθμού με X συνολικές θέσεις και Υ δεκαδικά ψηφία

%c = απεικόνιση σε μορφή χαρακτήρα

%s = απεικόνιση σε μορφή σειράς χαρακτήρων (συμβολοσειράς, string)

\n = αλλαγή γραμμής, \t = στηλοθέτης (tab).

clc, clear: Πριν την έναρξη των προγραμμάτων συνιστάται η χρήση των εντολών clc και

clear, ώστε να «καθαρίζει» το Command Window καθώς και η μνήμη από τις μεταβλητές.

0.4 Πίνακες

Πίνακας είναι ένα σύνολο μεταβλητών ίδιου τύπου, με κοινό όνομα.

Δημιουργία πινάκων: Τα στοιχεία μιας γραμμής χωρίζονται με κενό ή κόμμα, ενώ οι γραμ-

μές χωρίζονται με ελληνικό ερωτηματικό ή αλλαγή γραμμής (Enter).

Παράδειγμα μονοδιάστατου πίνακα:

>> A = [2 4 3 0] A =

2 4 3 0

Παράδειγμα δισδιάστατου πίνακα: >> B = [2 4 3 0; 3 5 1 4]

B =

2 4 3 0

3 5 1 4

Διαστάσεις πίνακα: Πρώτα αναφέρεται πάντοτε το πλήθος των γραμμών, και μετά των στη-

λών. Π.χ. ο πίνακας A είναι διαστάσεων 1×4 και ο B είναι 2×4.

Στοιχεία πίνακα: Κάθε στοιχείο ενός πίνακα καθορίζεται από τους δείκτες, σε παρένθεση.

Ο πρώτος δείκτης δείχνει πάντα τη γραμμή, ενώ ο δεύτερος τη στήλη. Π.χ. B(2,3) = 1

Χρήσιμες συναρτήσεις πινάκων:

Page 7: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Βασικές γνώσεις προγραμματισμού σε MATLAB 7

length: Πλήθος στοιχείων ενός μονοδιάστατου πίνακα, π.χ. >> length(A) % Μήκος του πίνακα A ans =

4

size: Πλήθος στοιχείων σε κάθε διάσταση ενός πίνακα, π.χ. >> size(B) % Διαστάσεις του πίνακα B ans =

2 4

>> size(B,1) % 1η διάσταση του B (πλήθος γραμμών) ans =

2

>> size(B,2) % 2η διάσταση του B (πλήθος στηλών) ans =

4

0.5 Συναρτήσεις οριζόμενες από το χρήστη

Οι συναρτήσεις είναι προγράμματα του MATLAB (m-files), που εκτελούνται σε δικό τους

χώρο μνήμης και έχουν δυνατότητα για είσοδο και έξοδο μεταβλητών ως παραμέτρων.

Δημιουργία συνάρτησης:

function ορίσματαΕξόδου = όνομαΣυνάρτησης(ορίσματαΕισόδου)

...<κώδικας της συνάρτησης>...

Παράδειγμα δημιουργίας συνάρτησης:

ypoteinoysa.m

function c = ypoteinoysa(a,b)

c = sqrt(a^2 + b^2);

Προσοχή: Το όνομα του αρχείου της συνάρτησης πρέπει να είναι ίδιο με το όνομα της συ-

νάρτησης, το οποίο όμως πρέπει να είναι διαφορετικό από όλες τις υπόλοιπες μεταβλητές

(ορίσματα εισόδου και εξόδου, μεταβλητές που ορίζονται μέσα στη συνάρτηση, μεταβλη-

τές που ορίζονται στο πρόγραμμα που καλεί τη συνάρτηση κλπ).

Κλήση συνάρτησης:

ορίσματαΕξόδου = όνομαΣυνάρτησης(ορίσματαΕισόδου);

Οι συναρτήσεις δεν «τρέχουν» όπως τα απλά προγράμματα (διότι δεν είναι γνωστές οι τιμές

των ορισμάτων εισόδου τους), αλλά «καλούνται» από άλλα προγράμματα ή συναρτήσεις ή

από το Command Window, δίνοντας στα ορίσματα εισόδου τις επιθυμητές τιμές. Η κλήση

μιας συνάρτησης γίνεται με βάση το όνομα του αρχείου της.

Παράδειγμα κλήσης της συνάρτησης ypoteinoysa.m από το Command Window:

>> x = 3;

>> y = 4;

>> z = ypoteinoysa(x,y)

z =

5

Παράδειγμα κλήσης της συνάρτησης ypoteinoysa.m από ένα πρόγραμμα:

program1.m

clc; clear all; disp('ΥΠΟΛΟΓΙΣΜΟΣ ΥΠΟΤΕΙΝΟΥΣΑΣ'); a = input('a? '); b = input('b? '); c = ypoteinoysa(a,b); fprintf('Ypoteinoysa = %.1f');

Page 8: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

8 Εργαστηριακές Ασκήσεις Επεξεργασίας Ιατρικού Σήματος

Υποσυναρτήσεις

Πρόκειται για συναρτήσεις που ορίζονται μέσα σε ένα αρχείο συνάρτησης (η οποία λέγεται

τότε κύρια συνάρτηση). Ο ορισμός μιας υποσυνάρτησης γίνεται στο τέλος της κύριας συ-

νάρτησης και μπορεί να κληθεί μόνο από την κύρια συνάρτηση μέσα στην οποία ορίζεται.

Γενικά, το MATLAB αναζητά μια συνάρτηση (α) πρώτα στο αρχείο μέσα από το οποίο καλείται (σε περίπτωση

υποσυνάρτησης), (β) μετά στον Current Folder, με το όνομα του αρχείου της και (γ) τέλος στους φακέλους του

Path, με τη σειρά που έχουν δηλωθεί εκεί (βλ. File|Set Path…).

Παράδειγμα 1 (συνάρτηση με 1 υποσυνάρτηση):

deyteroba8mia.m

function x = deyteroba8mia(a,b,c)

D = diakrinoysa(a,b,c);

if D>0,

x1 = (-b + sqrt(D)) / (2*a);

x2 = (-b - sqrt(D)) / (2*a);

x = [x1 x2]; % Ένας πίνακας με τις δύο λύσεις

elseif D==0

x = -b/(2*a); % Μία λύση

else

x = []; % Κενός πίνακας (καμία λύση)

end

% ΥΠΟΣΥΝΑΡΤΗΣΗ %

function D = diakrinoysa(a,b,c)

D = b^2 - 4*a*c;

Παράδειγμα 2 (πρόγραμμα-συνάρτηση με 2 υποσυναρτήσεις):

program2.m

function main clc;

disp('ΥΠΟΛΟΓΙΣΜΟΣ ΛΥΣΕΩΝ ΔΕΥΤΕΡΟΒΑΘΜΙΑΣ ΕΞΙΣΩΣΗΣ'); a = input('a? '); b = input('b? '); c = input('c? '); x = deyteroba8mia(a,b,c)

% ΥΠΟΣΥΝΑΡΤΗΣΕΙΣ % function x = deyteroba8mia(a,b,c) D = diakrinoysa(a,b,c); if D>0, x1 = (-b + sqrt(D)) / (2*a); x2 = (-b - sqrt(D)) / (2*a); x = [x1 x2]; % Ένας πίνακας με τις δύο λύσεις elseif D==0 x = -b/(2*a); % Μία λύση else x = []; % Κενός πίνακας (καμία λύση) end

function D = diakrinoysa(a,b,c) D = b^2 - 4*a*c;

Page 9: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Βασικές γνώσεις προγραμματισμού σε MATLAB 9

0.6 Αρχεία

Aρχείο είναι μια ομάδα δεδομένων αποθηκευμένη με ένα όνομα σε ένα φάκελο ενός μόνιμου

αποθηκευτικού μέσου (π.χ. στο σκληρό δίσκο, σε μνήμη flash, σε CD κλπ).

Αρχεία κειμένου είναι τα αρχεία των οποίων τα δεδομένα είναι αποθηκευμένα με μορφή χαρα-

κτήρων του πίνακα ASCII (1 Byte ανά χαρακτήρα) ή Unicode (2 Bytes ανά χαρακτήρα).

Για να γράψουμε δεδομένα σε ένα αρχείο ή να διαβάσουμε από αυτό, πρέπει αρχικά να το

«ανοίξουμε» (δηλ. να δεσμεύσουμε το όνομά του για αποκλειστική χρήση από το πρόγραμμά

μας). Στη συνέχεια, μπορούμε να διαβάσουμε ή να γράψουμε στο αρχείο, και τέλος πρέπει το

«κλείσουμε» (δηλ. να αποδεσμεύσουμε το όνομά του).

fopen: Άνοιγμα αρχείου (= δέσμευση αρχείου για διάβασμα ή γράψιμο)

fid = fopen('όνομαΑρχείου','rt') % άνοιγμα αρχείου κειμένου για διάβασμα

fid = fopen('όνομαΑρχείου','wt') % άνοιγμα αρχείου κειμένου για εγγραφή

fid = fopen('όνομαΑρχείου','at') % άνοιγμα αρχείου κειμένου για προσθήκη

όπου fid είναι το όνομα της μεταβλητής που θα αντιπροσωπεύει το αρχείο.

Π.χ. fid = fopen('test.txt','wt')

fprintf: Εγγραφή σε αρχείο κειμένου fprintf(fid, 'κείμενο με ειδικούς χαρακτήρες',μεταβλητές)

fscanf: Διάβασμα από αρχείο κειμένου μεταβλητή = fscanf(fid,'μορφή',πλήθος)

fclose: Κλείσιμο αρχείου (= αποδέσμευση του αρχείου μετά τη χρήση του)

fclose(fid) % κλείσιμο του αρχείου που είχε ανοίξει προηγουμένως

Παράδειγμα εγγραφής σε αρχείο: Δημιουργήστε το παρακάτω πρόγραμμα, αποθηκεύστε το με

όνομα της επιλογής σας και εκτελέστε το. Το πρόγραμμα εγγράφει τους ακεραίους από 1 έως

10 και τα τετράγωνά τους σε ένα αρχείο κειμένου: clc; clear;

fid = fopen('test.txt', 'wt'); N = 10; for i=1:N fprintf(fid, '%d %d', i, i^2); if i~=N, fprintf(fid, '\n'); end end fclose(fid);

Στη συνέχεια, ανοίξτε από τα Windows το φάκελο του Current Directory, και δείτε τα περιε-

χόμενα του test.txt με το Σημειωματάριο (Notepad) των Windows. Σημείωση: Με τη εντολή « fprintf(fid, '\n'); » εγγράφεται ένας χαρακτήρας αλλαγής γραμμής, με εξαίρεση

στην τελευταία επανάληψη, όπου δεν γίνεται αλλαγή γραμμής (κάτι που ελέγχεται από τη συνθήκη « if i~=N, .

. . end »), ώστε να μη δημιουργείται πρόβλημα στην ανάγνωση του αρχείου στο επόμενο παράδειγμα.

Παράδειγμα ανάγνωσης από αρχείο: Δημιουργήστε το παρακάτω πρόγραμμα, αποθηκεύστε το

με όνομα της επιλογής σας και εκτελέστε το. Το πρόγραμμα διαβάζει όλα τα δεδομένα από το

αρχείο text.txt και τα αποθηκεύει σε ένα πίνακα 2 διαστάσεων:

clc; clear;

fid = fopen('test.txt', 'rt');

i = 0;

while ~feof(fid)

i = i + 1;

a(i,1) = fscanf(fid, '%d', 1);

a(i,2) = fscanf(fid, '%d', 1);

end

fclose(fid);

Σημείωση: Η συνάρτηση feof δίνει έξοδο true αν ο δείκτης θέσης αρχείου βρίσκεται στο

τέλος του αρχείου (διαφορετικά δίνει έξοδο false), ώστε να σταματήσει η ανάγνωση.

Page 10: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

10 Εργαστηριακές Ασκήσεις Επεξεργασίας Ιατρικού Σήματος

0.7 Γραφικά

Η απεικόνιση των γραφικών παραστάσεων και των εικόνων στο MATLAB γίνεται σε ειδικά

παράθυρα που ονομάζονται figures.

Συναρτήσεις για γραφικές παραστάσεις:

plot: Γραφική παράσταση δύο διαστάσεων. plot(x,y)

plot(x,y,'χρώμα και είδος σημείων και γραμμής'), π.χ. plot(x,y,'bo:')

x,y = μονοδιάστατοι πίνακες με συντεταγμένες των σημείων που θα απεικονιστούν

Σύμβολα χρώματος: r g b y c m k w

Σύμβολα είδους σημείων: + o * . x s d p h ^ v > <

Σύμβολα είδους γραμμής: - : -- -.

Προσοχή: Οι εξ ορισμού ιδιότητες είναι: μπλε χρώμα, συνεχόμενη γραμμή, κανένα σύμβολο.

figure: Η εντολή figure δημιουργεί ένα νέο figure ή κάνει ενεργό ένα υπάρχον.

figure = Δημιουργία ενός νέου παραθύρου γραφικών.

figure(n) = Γίνεται ενεργό το παράθυρο γραφικών με αριθμό n («ενεργό» figure σημαίνει

ότι οι επόμενες εντολές απεικόνισης θα εφαρμοστούν σε αυτό).

close = Κλείσιμο των παραθύρων γραφικών.

close = Κλείνει το τρέχoν figure

close all = Κλείνει όλα τα ανοιχτά figures

hold: Επιτρέπει ή αποτρέπει την εκτύπωση περισσοτέρων γραφημάτων στο ίδιο figure

hold on = Η γραφική παράσταση παραμένει, και απεικονίζεται και η επόμενη στο ίδιο figure

hold off = Η τρέχουσα γραφική παράσταση σβήνει, και η επόμενη απεικονίζεται μόνη της

axis = Χειροκίνητος καθορισμός ορίων αξόνων. axis([xmin xmax ymin ymax])

grid: Δημιουργία πλέγματος

grid on = Δημιουργία πλέγματος

grid off = Σβήσιμο πλέγματος

xlabel, ylabel: Τίτλοι αξόνων x και y. xlabel('κείμενο')

xlabel('κείμενο')

title: Τίτλος γραφήματος. title('κείμενο')

legend: Υπόμνημα legend('κείμενο 1', 'κείμενο 2', 'κείμενο 3', ...)

text: Απεικόνιση μηνύματος μέσα σε ένα γράφημα.

text(x,y,'κείμενο') = Απεικόνιση του 'κειμένου' στις συντεταγμένες x,y του γρα-

φήματος.

subplot: Απεικόνιση πολλών διαγραμμάτων σε διαφορετικούς άξονες μέσα στο ίδιο figure..

subplot(m,n,p): Δημιουργία m×n θέσεων απεικόνισης μέσα σε ένα figure (με m γραμμές και

n στήλες) και απεικόνιση στη θέση p (μετρώντας από αριστερά προς τα δεξιά και στη συνέχεια

από πάνω προς τα κάτω).

Παραδείγματα για την απεικόνιση γραφικών παραστάσεων σε figures θα δοθούν στα επόμενα

κεφάλαια.

Page 11: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Βασικές γνώσεις προγραμματισμού σε MATLAB 11

0.8 Χρήσιμες ειδικές λειτουργίες και συναρτήσεις του MATLAB

end: Όταν χρησιμοποιείται σε πίνακα δείχνει τον τελευταίο δείκτη. Π.χ. A(end) είναι το

τελευταίο στοιχείο ενός μονοδιάστατου πίνακα.

max, min: Σε μονοδιάστατους πίνακες, επιστρέφουν τη μέγιστη και την ελάχιστη τιμή

του πίνακα αντίστοιχα. Σε πίνακες δύο διαστάσεων, επιστρέφουν τη μέγιστη και την ελά-

χιστη τιμή κάθε στήλης του πίνακα.

save (απλή μορφή): αποθήκευση μεταβλητής (π.χ. πίνακα) σε αρχείου κειμένου.

Π.χ.: save data.txt A –ascii

όπου data.txt είναι το όνομα του αρχείου κειμένου στο οποίο θα γίνει η αποθήκευση

και A είναι το όνομα του πίνακα που θα εγγραφεί στο αρχείο (-ascii είναι απαραίτητη

παράμετρος ώστε η εγγραφή να γίνει με μορφή κειμένου).

load (απλή μορφή): Διάβασμα αρχείου κειμένου το οποίο περιέχει αριθμητικές τιμές υπό

μορφή πίνακα και αποθήκευσή του σε έναν πίνακα του MATLAB.

Π.χ.: x = load('data.txt')

όπου data.txt είναι το όνομα του αρχείου κειμένου από το οποίο γίνει η ανάγνωση και

x είναι το όνομα του πίνακα του MATLAB στον οποίο που θα αποθηκευτούν οι τιμές

που βρίσκονται στο αρχείο.

Page 12: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

12 Εργαστηριακές Ασκήσεις Επεξεργασίας Ιατρικού Σήματος

Εργαστηριακές ασκήσεις

Ασκήσεις πινάκων.

0.1 Δίνεται ο πίνακας Α = [3, 0, -5, 2; 7, 12, 4, 1; -1, 3, 7, 0]. Να γραφτεί κατάλληλο

πρόγραμμα σε MATLAB το οποίο να υπολογίζει τη μέση τιμή των στοιχείων του πίνακα

Α. Μετά τον υπολογισμό, η μέση τιμή πρέπει να τυπώνεται με ένα δεκαδικό ψηφίο, με

κατάλληλη χρήση της εντολής fprintf.

0.2 Η σχέση μεταξύ των θερμοκρασιών σε βαθμούς Κελσίου και Φαρενάιτ είναι η εξής: 95

F C 32 , όπου C η θερμοκρασία σε βαθμούς Κελσίου και F σε Φαρενάιτ.

Να γραφτεί κατάλληλο πρόγραμμα σε MATLAB στο οποίο:

α) Να δημιουργηθεί ένας δισδιάστατος πίνακας Α του οποίου η πρώτη στήλη θα περιέχει

βαθμούς θερμοκρασίας από 0 έως 100 ανά 5 βαθμούς Κελσίου (0, 5, 10, 15, …, 100),

ενώ η δεύτερη στήλη θα περιέχει τους αντίστοιχους βαθμούς σε Φαρενάιτ (32, 41, 50,

…, 212).

β) Να υπολογιστεί η μέση τιμή των θερμοκρασιών σε βαθμούς Κελσίου και Φαρενάιτ

του πίνακα Α οι οποίες να αποθηκευτούν σε ένα μονοδιάστατο πίνακα Β.

γ) Να απεικονιστούν στο Command Window (i) ο πίνακας Α με disp, και (ii) οι τιμές

του πίνακα Β με fprintf ώστε να εμφανίζεται το παρακάτω μήνυμα: Mean temperature is 50 Celcius or 122 Fahrenheit.

Ασκήσεις συναρτήσεων

0.3 Να γραφτεί κατάλληλη συνάρτηση η οποία να υπολογίζει τη μέση τιμή ενός πίνακα. Υπό-

δειξη: Η συνάρτηση πρέπει να έχει ως όρισμα εισόδου τον πίνακα και ως όρισμα εξόδου

τη μέση τιμή του.

0.4 Να γραφτεί κατάλληλη συνάρτηση η οποία να υπολογίζει τη μέγιστη και την ελάχιστη

τιμή ενός πίνακα. Υπόδειξη: Η συνάρτηση πρέπει να έχει ως όρισμα εισόδου τον πίνακα

και ως ορίσματα εξόδου τη μέγιστη και την ελάχιστη τιμή του.

0.5 Να γραφτεί κατάλληλη συνάρτηση η οποία να υπολογίζει το πλήθος των θετικών και το

πλήθος των αρνητικών στοιχείων ενός πίνακα.

Ασκήσεις αρχείων

0.6 Να γραφτεί κατάλληλο πρόγραμμα με το οποίο να δημιουργείται ένα αρχείο κειμένου με

όνομα "numbers.txt" όπου να γράφονται, σε μία γραμμή, οι ακέραιοι αριθμοί από 1

έως 100, χωρισμένοι ο ένας από τον άλλον με κενό (space).

0.7 Να γραφτεί κατάλληλο πρόγραμμα με το οποίο να «ανοίγει» για ανάγνωση το αρχείο

κειμένου που δημιουργήθηκε στην άσκηση 0 (letters.txt) και να διαβάζονται οι πρώτοι

10 ακέραιοι, οι οποίοι και να αποθηκεύονται στις 10 θέσεις ενός πίνακα.

0.8 Να γραφτεί κατάλληλο πρόγραμμα με το οποίο να αποθηκεύεται στο σκληρό δίσκο ένα

αρχείο κειμένου (temperatures.txt) μια λίστα θερμοκρασιών από 0 έως 100 ανά 5 βαθ-

μών Κελσίου, με τις αντίστοιχες τιμές σε Φαρενάιτ, ως εξής:

0 32

5 41

10 50

100 212

Η σχέση των θερμοκρασιών σε βαθμούς Κελσίου και Φαρενάιτ είναι:

Page 13: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Βασικές γνώσεις προγραμματισμού σε MATLAB 13

32TT C59

F , όπου TC η θερμοκρασία σε βαθμούς Κελσίου και TF σε Φαρενάιτ.

Για την εγγραφή να χρησιμοποιηθεί η συνάρτηση fprintf. Οι θερμοκρασίες σε Κελ-

σίου (πρώτη στήλη) πρέπει να χωρίζονται από τις θερμοκρασίες σε Φαρενάιτ (δεύτερη

στήλη) με στηλοθέτη (tab, \t στην fprintf).

Ασκήσεις γραφικών

0.9 Φθίνουσα ταλάντωση: Η εξίσωση της απόμάκρυνσης x συναρτήσει του χρόνου t σε μια

απλή αρμονική ταλάντωση δίνεται από τη σχέση:

x = A ημωt ή x = A ημ(2πf t) (1)

όπου Α το πλάτος της ταλάντωσης και f η συχνότητά της.

Στις πραγματικές ταλαντώσεις, πάντοτε υπάρχουν τριβές, που συχνά είναι ανάλογες της

ταχύτητας του σώματος. Τότε, το πλάτος ελαττώνεται εκθετικά με το χρόνο:

Α = Α0 e-Λt (2)

όπου Α0 το αρχικό πλάτος και Λ μια σταθερά (σταθερά απόσβεσης).

Συνδυάζοντας τις εξισώσεις (1) και (2), συμπεραίνουμε ότι η εξίσωση της απομάκρυνσης

σε συνάρτηση με το χρόνο σε μια αρμονική ταλάντωση με τριβές δίνεται από τη σχέση:

x = Α0 e-Λt ημ(2πf t) (3)

α) Να γίνει πρόγραμμα όπου να απεικονίζεται γραφικά η απομάκρυνση σε συνάρτηση με

το χρόνο στην περίπτωση μιας αρμονικής ταλάντωσης με τριβές.

Χρησιμοποιήστε τις παρακάτω τιμές:

Αρχικό πλάτος Α0 = 10

Συχνότητα f = 2

Σταθερά απόσβεσης Λ = 0.4

Χρόνος: από 0 έως 5 ανά 0.01

β) Επίσης, στο ίδιο διάγραμμα πρέπει να απεικονίζεται και η εκθετική ελάττωση του

πλάτους, έτσι ώστε το τελικό αποτέλεσμα να είναι όπως στην παρακάτω εικόνα:

Page 14: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

14 Εργαστηριακές Ασκήσεις Επεξεργασίας Ιατρικού Σήματος

0.10 Σύνθεση ταλαντώσεων – Διακρότημα: Θεωρούμε δύο απλές αρμονικές ταλαντώσεις,

χωρίς τριβές, με ίδιο πλάτος Α, των οποίων οι απομακρύνσεις σε συνάρτηση με το χρόνο

t δίνονται από τις σχέσεις:

x1 = A ημ(2πf1 t) (1)

x2 = A ημ(2πf2 t) (2)

όπου Α το πλάτος της ταλάντωσης και f η συχνότητά της.

Αν ένα σώμα εκτελεί ταυτόχρονα και τις δύο ταλαντώσεις, τότε η απομάκρυνσή του είναι

το άθροισμα των δύο απομακρύνσεων:

x = x1 + x2 (3)

Αν οι δύο συχνότητες f1 και f2 διαφέρουν λίγο μεταξύ τους, τότε το αποτέλεσμα της σύν-

θεσης των δύο ταλαντώσεων είναι μια ειδική περίπτωση που ονομάζεται διακρότημα, και

που χαρακτηρίζεται από μια σχετικώς αργή αυξομείωση του πλάτους της συνισταμένης

ταλάντωσης.

α) Να γίνει πρόγραμμα όπου να απεικονίζεται γραφικά η απομάκρυνση σε συνάρτηση με

το χρόνο x(t) στην περίπτωση του διακροτήματος.

Χρησιμοποιήστε τις παρακάτω τιμές:

Πλάτος Α = 1

Συχντότητες f1 = 20 και f1 = 21

Χρόνος: από 0 έως 6 ανά 0.01

β) Επίσης, πρέπει να απεικονίζονται και οι επιμέρους ταλαντώσεις (x1 και x2), έτσι ώστε

το τελικό αποτέλεσμα να είναι όπως στην παρακάτω εικόνα:

Page 15: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

1 Σήματα διάκριτου χρόνου - Απεικόνιση σημάτων - Διαχείριση αρχείων σημάτων

Σε αυτήν την ενότητα θα δείτε τα βασικά περί σημάτων διάκριτου χρόνου, και συγκεκριμένα:

Δημιουργία απλού σήματος (με μονοδιάστατο πίνακα).

Πράξεις μεταξύ σημάτων (πρόσθεση, πολλαπλασιασμός)

Επίσης, θα εξοικειωθείτε με την απεικόνιση σημάτων σε άξονες, καθώς και με τα αρχεία ση-

μάτων σε μαγνητικά μέσα, δηλαδή με:

Απεικόνιση σήματος με μορφή γραφικής παράστασης.

Απεικόνιση πολλών σημάτων στο ίδιο ή σε διαφορετικά γραφήματα.

Αποθήκευση σημάτων σε μαγνητικό μέσο (σκληρό δίσκο, δισκέτα, μνήμη flash).

Διάβασμα σημάτων σε μαγνητικό μέσο.

1.1 Συνοπτική θεωρία

Σήμα διάκριτου χρόνου (x) = ένα σύνολο διαδοχικών αριθμητικών τιμών που αντιστοι-

χούν σε χρονικές στιγμές που έχουν ληφθεί με συγκεκριμένη συχνότητα δειγματοληψίας.

Χρονικές στιγμές (n): Αν θεωρήσουμε αρχική τιμή του χρόνου το 0, τότε οι χρονικές

1στιγμές είναι:

n = [0, 1, 2, …, N-1] (όπου Ν το πλήθος των χρονικών στιγμών).

Ανάλογα με την αρχή μέτρησης του χρόνου, οι χρονικές στιγμές θα μπορούσαν να ξεκι-

νούν από οποτεδήποτε άλλοτε (π.χ. θα μπορούσε n=[1,2,…,N] ή n=[-2,-1,0,1,…,N-3] ).

Συμβολισμός: Ο συμβολισμός που θα χρησιμοποιήσουμε είναι:

Μαθηματικός συμβολισμός:

x(n): x = τιμή σήματος, n = χρονική στιγμή.

Συμβολισμός στον προγραμματισμό:

x(n+1): η τιμή του σήματος για κάθε μία από τις χρονικές στιγμές n=[0:N-1], διότι το

x είναι πίνακας και το n+1 λειτουργεί ως δείκτης του (οι δείκτες των πινάκων στο

MATLAB ξεκινούν από 1, άρα αν το n ξεκινάει από το 0, τότε ο δείκτης του πίνακα

πρέπει να είναι n+1).

Ιδιότητες σημάτων:

1. Άθροισμα σημάτων = x1(n) + x2(n)

2. Γινόμενο σημάτων = x1(n) · x2(n)

3. Γινόμενο σήματος επί αριθμό = a · x1(n)

4. ( ) [ ( ) ( )]k

x n x k n k

όπου δ(n) η συνάρτηση δέλτα ή κρουστική συνάρτηση, που ορίζεται ως:

1, για 0( )

0, για 0

nn

n

ή 1, για( - )

0, για

n an a

n a

Page 16: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

16 Εργαστηριακές Ασκήσεις Επεξεργασίας Ιατρικού Σήματος

1.2 Εργασίες κατανόησης

Εργασία 1.2α

Δημιουργία σήματος διάκριτου χρόνου ως μονοδιάστατο πίνακα.

Απεικόνιση σήματος: plot(x,y,'χρώμα/είδος σημείων/γραμμής')

όπου: x,y = πίνακες με συντεταγμένες των σημείων που θα εκτυπωθούν

Σύμβολα χρώματος: r g b y c m k w

Σύμβολα είδους σημείων: + o * . x s d p h ^ v > <

Σύμβολα είδους γραμμής: - : -- -.

Προσοχή: Τα εξ ορισμού είναι: χρώμα μπλε, γραμμή συνεχόμενη, σύμβολο σημείου κανένα.

- Δημιουργήστε και εκτελέστε το παρακάτω πρόγραμμα (program12a.m):

program12a.m clc; clear all; close all; % Δημιουργία και απεικόνιση τιμών σήματος διάκριτου χρόνου x = [1 0 1 1 5 -3 20 -8 0 0]; % Τιμές σήματος N = length(x); % Μήκος σήματος n = [0:N-1]; % Χρονικές στιγμές disp('Τιμές σήματος:'); x disp('Χρονικές στιγμές:'); n % Μήκος σήματος fprintf('Μήκος σήματος: %d\n', N); % Γραφική παράσταση σήματος plot(n,x,'o:'); xlabel('n'); ylabel('x(n)');

Αποτελέσματα Τιμές σήματος:

x =

1 0 1 1 5 -3 20 -8 0 0

Χρονικές στιγμές:

n =

0 1 2 3 4 5 6 7 8 9

Μήκος σήματος: 10

Page 17: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Σήματα διάκριτου χρόνου - Απεικόνιση σημάτων - Διαχείριση αρχείων σημάτων 17

Εργασία 1.2β

Πολλαπλασιασμός σήματος επί αριθμό (ενίσχυση σήματος): x2(n) = a·x1(n)

Συμβολισμός τιμής σήματος στα μαθηματικά: x(n) (τιμή του σήματος τη χρονική στιγμή n).

Συμβολισμός τιμής σήματος στο MATLAB: x(n+1) (n+1 = δείκτης του πίνακα x, αν το n

ξεκινάει από 0).

Απεικόνιση δύο σημάτων στους ίδιους άξονες: hold

Η εντολή hold on επιτρέπει την απεικόνιση 2 ή περισσοτέρων διαγραμμάτων στους ίδιους

άξονες. Αντίθετα, η hold off έχει ως αποτέλεσμα τη διαγραφή του προηγούμενου διαγράμ-

ματος και την απεικόνιση μόνο του τελευταίου διαγράμματος κάθε φορά.

- Δημιουργήστε και εκτελέστε το παρακάτω πρόγραμμα (program12b.m):

program12b.m clc; clear all; close all; % Δημιουργία 1ου σήματος x1 = [1 0 1 1 5 -3 20 -8 0 0]; % Τιμές σήματος N = length(x1); % Μήκος σήματος

% Δημιουργία 2ου σήματος ως πολλαπλάσιο του πρώτου a = 3; % πολλαπλασιαστικός παράγοντας for i=1:N x2(i) = a*x1(i); end

% Απεικόνιση σημάτων n = [0:N-1]; % Χρονικές στιγμές (απαιτούνται για τη γραφική παράσταση) hold on; plot(n,x1,'b.:'); plot(n,x2,'r*-');

grid on; xlabel('n'); legend('x_1','x_2');

Αποτελέσματα

Page 18: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

18 Εργαστηριακές Ασκήσεις Επεξεργασίας Ιατρικού Σήματος

Εργασία 1.2γ. Εγγραφή (αποθήκευση) σήματος σε μαγνητικό μέσο:

- Δημιουργήστε το παρακάτω αρχείο συνάρτησης (swrite.m). Η συνάρτηση αυτή αποθηκεύει ένα

σήμα (του οποίου οι τιμές βρίσκονται σε ένα μονοδιάστατο πίνακα) σε ένα αρχείο κειμένου στο

Current Directory:

swrite.m function swrite(x,filename) % Writes signal values to a text file. % The file will have one columns (signal values) % Syntax: swrite(x,filename) % where % filename: the name of the file (string variable) % x: an 1D-array with the signal values

fid = fopen(filename,'wt');

N = length(x) for i=1:length(x) fprintf(fid,'%f',x(i));

if i~=N, fprintf(fid, '\n'); end end

fclose(fid);

Σημείωση: Όπως παρατηρείτε, η τελευταία τιμή αποθηκεύεται στο αρχείο χωρίς χαρακτήρα αλ-

λαγής γραμμής (\n). Αυτό γίνεται για να είναι ευκολότερη η ανάγνωση του αρχείου (βλ. επόμενη

Εργασία 1.2δ).

- Δημιουργήστε ένα απλό σήμα στο Command Window. Καλέστε τη συνάρτηση από το Command

Window ώστε να αποθηκεύσετε το σήμα στο δίσκο:

Command Window

>> x = [1 0 1 1 5 -3 20 -8 0 0];

>> swrite(x,'signal.txt');

Αποτελέσματα

(Δημιουργία ενός αρχείου με όνομα signal.txt στο φάκελο Current Directory.)

- Ανοίξτε από τα Windows το φάκελο του Current Directory. Διαπιστώστε την ύπαρξη του αρ-

χείου signal.txt , και κάντε διπλό-κλικ στο εικονίδιό του, ώστε να να δείτε τα περιεχόμενά του.

Page 19: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Σήματα διάκριτου χρόνου - Απεικόνιση σημάτων - Διαχείριση αρχείων σημάτων 19

Εργασία 1.2δ. Ανάγνωση (φόρτωμα) σήματος από μαγνητικό μέσο:

- Δημιουργήστε το παρακάτω αρχείο συνάρτησης (sread.m). Η συνάρτηση αυτή διαβάζει ένα

σήμα από ένα αρχείο κειμένου που βρίσκεται στο Current Directory και το αναθέτει σε ένα μο-

νοδιάστατο πίνακα.

sread.m function x = sread(filename) % Reads signal values from a text file. % Syntax: x = sread(filename) % where % filename: the name of the file (string variable) % x: an 1D-array with the signal values

fid = fopen(filename,'rt'); i = 0; while ~feof(fid) i = i + 1; x(i) = fscanf(fid,'%f',1); end fclose(fid);

- Διαβάστε το σήμα από το αρχείο κειμένου που αποθηκεύσατε με την προηγούμενη εργασία

(signal.txt) Στη συνέχεια εμφανίστε τις τιμές του στο Command Window και απεικονίστε το γρα-

φικά.

Command Window

>> x = sread('signal.txt')

>> n = [0:length(x)-1];

>> plot(n,x,'bo-');

Αποτέλεσμα

x =

1 0 1 1 5 -3 20 -8 0 0

Page 20: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

20 Εργαστηριακές Ασκήσεις Επεξεργασίας Ιατρικού Σήματος

1.3 Εργαστηριακές ασκήσεις

Άσκηση 1.3α

Να γραφτεί πρόγραμμα (program13a.m) στο οποίο:

i) να ορίζονται δύο σήματα x1 και x2 ίδιου μήκους ως μονοδιάστατοι πίνακες της επιλογής σας,

ii) να βρίσκεται η μέγιστη τιμή κάθε σήματος,

iii) να βρίσκεται το σήμα x3 που προκύπτει ως διαφορά των δύο σημάτων (x1-x2 αν η μέγιστη τιμή

του x1 είναι μεγαλύτερη από τη μέγιστη τιμή του x2, αλλιώς το αντίθετο), και

iii) τα τρία αυτά σήματα να απεικονίζονται γραφικά, στο ίδιο figure αλλά σε δύο διαφορετικά

υπογραφήματα (subplot): τα x1 και x2 στο 1ο υπογράφημα και το x3 στο 2ο υπογράφημα.

Αποτέλεσμα του program13a.m (παράδειγμα αναλόγως των x1 και x2)

Σημείωση: Η subplot(m,n,p) χρησιμοποιείται για απεικόνιση σε διαφορετικά «υπογραφή-

ματα» στο ίδιο figure. Αυτό σημαίνει πως ό,τι απεικονιστεί με την επόμενη plot θα απεικονι-

στεί στη θέση p ενός πλέγματος m×n (m γραμμές και n στήλες). Π.χ. για το παραπάνω:

subplot(2,1,1); % Απεικόνιση στο «επάνω» υπογράφημα των x1 και x2 plot(……); hold on; % "hold on" = για απεικόνιση του x2 μαζί με το x1

plot(……);

subplot(2,1,2); % Απεικόνιση στο «κάτω» υπογράφημα του x3 plot(……);

Page 21: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Σήματα διάκριτου χρόνου - Απεικόνιση σημάτων - Διαχείριση αρχείων σημάτων 21

Άσκηση 1.3β

Να γραφτεί πρόγραμμα (program13b.m) με το οποίο:

i) Να διαβαστεί από το δίσκο το σήμα που βρίσκεται στο αρχείο ecg.txt (αφού ελέγξετε ότι το

αρχείο αυτό βρίσκεται στο Current Directory) με τη βοήθεια της συνάρτησης sread.m (Εργασία

1.2δ). Το σήμα να απεικονιστεί.

Αποτέλεσμα του program13b.m (i)

Σημείωση: Το αρχείο ecg.txt είναι ένα προσομοιωμένο ηλεκτροκαδριογραφικό σήμα, που δημιουργήθηκε με τη

βοήθεια του ελεύθερου λογισμικού EEGSYN (http://www.physionet.org/physiotools/ecgsyn/Matlab/).

ii) Na δημιουργηθεί ένα δεύτερο σήμα με τριπλάσιο πλάτος από το πρώτο (ενίσχυση σήματος).

Το δεύτερο σήμα να απεικονιστεί μαζί με το πρώτο (με hold on) ώστε να φανεί η διαφορά στο

πλάτος.

Αποτέλεσμα του program13b.m (ii)

Άσκηση 1.3γ

Να γραφτεί πρόγραμμα (program13c.m) με το οποίο:

i) Να διαβαστεί από το δίσκο το σήμα που βρίσκεται στο αρχείο ecg.txt (αφού ελέγξετε ότι το

αρχείο αυτό βρίσκεται στο Current Directory) με τη βοήθεια της συνάρτησης sread.m (Εργασία

1.2δ).

ii) Το ecg.txt είναι αρκετά μεγάλο σήμα (έχει 4355 τιμές). Na δημιουργήσετε ένα δεύτερο σήμα,

στο οποίο να αποθηκεύσετε τις τιμές από 100 έως 1000 του ecg.txt.. Απεικονίστε το δεύτερο

σήμα.

Page 22: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

2 Βασικά είδη σημάτων

Σε αυτήν την ενότητα θα δείτε τα βασικά είδη σημάτων (ημιτονοειδές, εκθετικό) και πώς δη-

μιουργούνται.

2.1 Συνοπτική θεωρία

Βασικές συναρτήσεις σημάτων διάκριτου χρόνου: (n = χρονικές στιγμές)

Όνομα Συνάρηση Γραφική παράσταση x(n)

Κρουστική

(δέλτα)

συνάρτηση

1, για 0( )

0, για 0

nn

n

1, για( - )

0, για

n an a

n a

a=3

Βηματική

συνάρτηση

1, για 0( )

0, για 0

nu n

n

1, για( - )

0, για

n au n a

n a

a=3

Ημιτονοειδής

συνάρτηση ( ) sin(2 / )x n A f n N

A=1

N=50

f=2

Εκθετική

συνάρτηση

Πραγματική βάση 𝑎 ∈ ℝ

( ) nx n a

Μιγαδική βάση 𝛼 = 𝑟𝑒𝑗𝜃 ∈ ℂ

( )n n j n

x n a r e

πλάτος: rn

φάση: φ(n)=θn

0<a<1

a>1

a=1

φ(n)=θn

Page 23: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Βασικά είδη σημάτων 23

Π.χ. αν σε σήμα διάρκειας 1sec ληφθούν N=10 τιμές,

αυτές είναι οι t = 0, 0.1, 0.2, . . . , n/N, . . . , 0.9 sec.

0 1 2 3 n . . . . . . 9 = N-1

0 1/10 n/N . . . . . . 9/10 2/10 t:

n:

0 20 40 60 80 99-4

-2

0

2

4

n

x

2.2 Εργασίες κατανόησης

Εργασία 2.2α: Δημιουργία ημιτονοειδούς σήματος: ( ) sin(2 / )x n A f n N

Θυμίζουμε ότι η εξίσωση ενός απλού ημιτονικού σήματος είναι:

x = A·ημ(ωt)

όπου t = η χρονική στιγμή και ω = 2πf, όπου f η συχνότητα του σήματος.

Θέτοντας για ευκολία ως μονάδα χρόνου τη συνολική χρονική διάρκεια του σήματος, τότε:

t = n/N, όπου N το πλήθος των δειγμάτων

και n ακέραιος από 0 έως N-1)

η συχνότητα f του σήματος εκφράζει το πλή-

θος των ταλαντώσεων στη μονάδα του χρό-

νου, άρα στη διάρκεια του σήματος (π.χ. στο

διπλανό σήμα, N=100, A=4 και f=2).

Άρα η εξίσωση του διάκριτου ημιτονικού σήματος γίνεται:

x = A·ημ(2πf·n/N)

- Δημιουργήστε και εκτελέστε το παρακάτω πρόγραμμα (program22a.m) που δημιουργεί και α-

πεικονίζει ένα ημιτονικό σήμα 100 τιμών, με συχνότητα 2 και πλάτος 4:

Προσοχή: Αν οι χρονικές στιγμές είναι n=0:N-1, τότε οι δείκτες των πινάκων είναι n+1 ώστε

να κυμαίνονται από 1 έως N (στο MATLAB οι δείκτες των πινάκων ξεκινούν από 1).

program22a.m Αποτέλεσμα

clc; clear; close all;

N = 100; % Πλήθος τιμών σήματος f = 2; % Συχνότητα ημιτονικού σήματος A = 4; % Πλάτος ημιτονικού σήματος

% Δημιουργία ημιτονικού σήματος for n=0:N-1 x(n+1) = A*sin(2*pi*f*n/N); end

% Απεικόνιση σήματος n = [0:N-1]; % Χρονικές στιγμές plot(n,x,'b.');

Σημειώσεις:

α) Το n+1 στον πίνακα x λειτουργεί ως δείκτης (οι δείκτες των πινάκων στο MATLAB ξεκινούν

από 1, οπότε επειδή οι χρονικές στιγμές (n) ξεκινούν από 0, οι δείκτες του πίνακα πρέπει να είναι

n+1).

β) Η εντολή n=[0:N-1] δημιουργεί ένα μονοδιάστατο πίνακα με τιμές από 0 έως Ν-1 (χρονικές

στιγμές) που χρειάζεται για τη γραφική παράσταση (plot).

Page 24: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

24 Εργαστηριακές Ασκήσεις Επεξεργασίας Ιατρικού Σήματος

Εργασία 2.2β: Πρόσθεση σημάτων: x(n) = x1(n) + x2(n):

- Δημιουργήστε και εκτελέστε το παρακάτω πρόγραμμα (program22b.m) που δημιουργεί και α-

πεικονίζει ταυτόχρονα δύο ημιτονικά σήματα καθώς και το άθροισμά τους:

program22b.m Αποτέλεσμα

clc; clear; close all;

N = 100; % Πλήθος τιμών των σημάτων

% Συχνότητες και πλάτη σημάτων f1 = 1; A1 = 4; % 1ο σήμα f2 = 2; A2 = 2; % 2ο σήμα

% Δημιουργία σημάτων for n=0:N-1 x1(n+1) = A1*sin(2*pi*f1*n/N); x2(n+1) = A2*sin(2*pi*f2*n/N); x3(n+1) = x1(n+1) + x2(n+1); end

% Απεικόνιση σημάτων n = [0:N-1]; plot(n,x1,'b'); hold on; plot(n,x2,'r'); plot(n,x3,'k');

grid on; legend('x_1','x_2','x_3');

Εργασία 2.2γ: Δημιουργία εκθετικού σήματος: ( ) nx n a

- Δημιουργήστε και εκτελέστε το παρακάτω πρόγραμμα (program22c.m) στο οποίο δημουργείται

και απεικονίζεται ένα εκθετικό σήμα:

program22c.m Αποτέλεσμα

clc; clear all; close all;

N = 100; % Μήκος σήματος

% Δημιουργία εκθετικού σήματος a = 0.95; % Βάση εκθετικού σήματος

% (a<1: ελάττωση με το χρόνο)

for n=0:N-1 x(n+1) = a^n; end

% Απεικόνιση σήματος n = [0:N-1]; % Χρονικές στιγμές plot(n,x,'b.');

Page 25: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Βασικά είδη σημάτων 25

Εργασία 2.2δ:

Απεικόνιση πολλών διαγραμμάτων στο ίδιο figure σε διαφορετικούς άξονες: subplot

subplot(m,n,p): Δημιουργία m×n θέσεων απεικόνισης μέσα σε ένα figure και απεικόνιση στη

θέση p (μετρώντας από αριστερά προς τα δεξιά και στη συνέχεια από πάνω προς τα κάτω).

- Δημιουργήστε και εκτελέστε το παρακάτω πρόγραμμα (program22d.m), στο οποίο δημουργεί-

ται και απεικονίζεται το γινόμενο ενός ημιτονικου σήματος με ένα εκθετικού:

program22d.m clc; clear all; close all; N = 100; % Μήκος σημάτων f = 5; % Συχνότητα ημιτονοειδούς σήματος a = 0.95; % Βάση εκθετικού σήματος (a<1: ελάττωση με το χρόνο) for n=0:N-1 x1(n+1) = sin(2*pi*f*n/N); % Ημιτονοειδές σήμα (πλάτους = 1) x2(n+1) = a^n; % Εκθετικό σήμα x3(n+1) = x1(n+1) * x2(n+1); % Γινόμενο σημάτων end

% Γραφική παράσταση των x1 και x2 στο 1ο υπογράφημα n = [0:N-1]; % Χρονικές στιγμές (απαραίτητες για τη γραφική παράσταση) subplot(2,1,1); hold on; plot(n,x1,'b'); plot(n,x2,'r'); grid on; legend('x_1','x_2');

% Γραφική παράσταση των x3 και x2 στο 2ο υπογράφημα subplot(2,1,2); hold on; plot(n,x3,'k'); plot(n,x2,'r'); grid on; legend('x_1 * x_2', 'x_2'); xlabel('n');

Αποτελέσματα

Page 26: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

26 Εργαστηριακές Ασκήσεις Επεξεργασίας Ιατρικού Σήματος

2.3 Εργαστηριακές ασκήσεις

Άσκηση 2.3α

Να γραφτεί πρόγραμμα (program23a.m) στο οποίο να δημιουργείται ένα σύνθετο σήμα x3 με

100 τιμές, που να αποτελείται από το γινόμενο:

i) ενός ημιτονικού σήματος x1 πλάτους 1 και συχνότητας ίσης με 7, και

ii) ενός εκθετικού σήματος x2.

Πρέπει να επιλέξετε κατάλληλα τη βάση του εκθετικού σήματος, ώστε το γινόμενο των δύο σημά-

των x3, το οποίο πρέπει να απεικονίσετε μαζί με το εκθετικό x2, να έχει περίπου τη μορφή που

εμφανίζεται στο παρακάτω σχήμα.

Τέλος, το σήμα x3 πρέπει να εγγράφεται (αποθηκεύεται) σε ένα αρχείο στο δίσκο με όνομα της

επιλογής σας.

Αποτέλεσμα του program23a.m

Page 27: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Βασικά είδη σημάτων 27

Άσκηση 2.3β

Να γραφτεί πρόγραμμα (program23b.m) στο οποίο:

i) Αρχικά πρέπει να διαβάζεται από το δίσκο το αρχείο που δημιουργήθηκε στο δίσκο στην ά-

σκηση 2.3α.

ii) Στη συνέχεια, το σήμα αυτό πρέπει να ψαλιδιστεί με τιμή κατωφλίου ίση με t=20 και να γίνει

απεικόνιση του αρχικού και του ψαλιδισμένου σήματος στους ίδιους άξονες. Το αποτέλεσμα πρέ-

πει να είναι όπως στο παρακάτω σχήμα.

Σημείωση: Ψαλιδισμός (clipping) είναι η αποκοπή των τιμών του σήματος που είναι μεγαλύτερες

κατ’ απόλυτη τιμή από ένα κατώφλι (threshold).

Υπόδειξη: Μετά την ανάγνωση του σήματος από το δίσκο, δημιουργείστε ένα δεύτερο σήμα του

οποίου όλες οι τιμές θα είναι ίσες με του πρώτου, εκτός από όσες τιμές είναι μεγαλύτερες από το

κατώφλι t (οι οποίες θα πάρουν την τιμή του κατωφλίου, t), καθώς και από όσες τιμές είναι

μικρότερες του -t (οι οποίες θα πάρουν την τιμή -t). Έτσι, κάθε τιμή του δεύτερου σήματος θα

είναι μικρότερη, κατ’ απόλυτη τιμή, από το κατώφλι t.

Αποτέλεσμα του program23b.m

Page 28: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

3 Απόκριση συστήματος - Συνέλιξη

Σε αυτήν την ενότητα θα εξοικειωθείτε με τα συστήματα σημάτων διάκριτου χρόνου, και συ-

γκεκριμένα με:

την απόκριση και την κρουστική απόκριση ενός συστήματος διάκριτου χρόνου, και

την πράξη της συνέλιξης μεταξύ δύο σημάτων.

3.1 Συνοπτική θεωρία

Σύστημα διάκριτου χρόνου = Συσκευή ή αλγόριθμος που επεξεργάζεται ένα σήμα διάκριτου

χρόνου: Είσοδος: x(n) → [Επεξεργασία με το σύστημα Τ] → Έξοδος: y(n) = T[x(n)]

Απόκριση ενός συστήματος ονομάζουμε το σήμα εξόδου του συστήματος, αφού τροφοδοτηθεί

με ένα σήμα εισόδου.

Γραμμικό σύστημα διάκριτου χρόνου: Όταν το σήμα εξόδου συνδέεται γραμμικά με το σήμα

εισόδου, δηλαδή όταν ισχύουν:

T[a·x(n)] = a·T[x(n)]

T[a·x1(n) + b·x2(n)] = a·T[x1(n)] + b·T[x2(n)]

Σύστημα χρονικά αμετάβλητο: Όταν χρονική μετατόπιση του σήματος εισόδου έχει ως απο-

τέλεσμα ίδια χρονική μετατόπιση του σήματος εξόδου, δηλαδή:

Αν y(n) = T[x(n)] τότε y(n-k) = T[x(n-k)]

Κρουστική απόκριση συστήματος είναι η απόκριση του συστήματος, όταν η είσοδος είναι η

κρουστική συνάρτηση.

h(n) = T[δ(n)]

Η κρουστική απόκριση είναι το χαρακτηριστικότερο στοιχείο ενός συστήματος διότι εκφράζει

την επίδραση του συστήματος σε ένα σήμα.

Ισοδύναμα συστήματα διάκριτου χρόνου: Όταν έχουν την ίδια κρουστική απόκριση.

Συνέλιξη (convolution) των σημάτων x1(n) και x2(n) ονομάζεται η πράξη (*) σύμφωνα με την

οποία:

1 2 1 2( ) ( ) ( ) [ ( ) ( )]k

y n x n x n x k x n k

*

Πρακτικά, για είσοδο σήματος x(n) σε σύστημα με κρουστική απόκριση h(n), ισχύει: 1

0

( ) ( ) ( ) [ ( ) ( )]N

k

y n x n h n x k h n k

* , όπου N = το μήκος του σήματος x

Η συνέλιξη υπολογίζει την επίδραση του ενός σήματος στο άλλο ή, αλλιώς, την αλλοίωση του

σήματος εισόδου x(n) από την κρουστική απόκριση h(n) του συστήματος.

Προσοχή: Μαθηματικός συμβολισμός: «*» = συνέλιξη, « » = πολλαπλασιασμός.

Συμβολισμός στον προγραμματισμό: «*» = πολλαπλασιασμός. Δεν υπάρχει σύμβολο για τη

συνέλιξη (θα χρησιμοποιηθεί η συνάρτηση convolution.m).

Ιδιότητες συνέλιξης:

1. Αντιμεταθετική: x1(n)*x2(n) = x2(n)*x1(n)

2. Προσεταιριστική: [x1(n)*x2(n)]*x3(n) = x1(n)*[x2(n)*x3(n)]

3. Επιμεριστική: x1(n)*[x2(n) + x3(n)] = x1(n)*x2(n) + x1(n)*x3(n)

4. Ουδέτερο στοιχείο: ( ) ( ) [ ( ) ( )] ( )k

x n n x k n k x n

*

Page 29: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Απόκριση συστήματος - Συνέλιξη 29

3.2 Εργασίες κατανόησης

Εργασία 3.2α: Απόκριση γραμμικού συστήματος σε σήμα εισόδου μίας τιμής.

Η επίδραση ενός συστήματος σε μια τιμή ενός σήματος εισόδου υπολογίζεται με το γινόμενο της

τιμής του σήματος με τις τιμές της κρουστικής απόκρισης του συστήματος.

- Δημιουργήστε και εκτελέστε το παρακάτω πρόγραμμα (program32a_1.m), το οποίο βρίσκει

την απόκριση (y) ενός σήματος μίας τιμής (x) σε ένα σύστημα με γνωστή κρουστική απόκριση h:

program32a_1.m clc; clear all; close all; % Κρουστική απόκριση συστήματος (θεωρείται γνωστή): h = [0.5 1 0.5];

% Σήμα εισόδου: x = 2;

% Σήμα εξόδου (επίδραση κρουστικής απόκρισης στο σήμα εισόδου): % Παρατηρούμε το σήμα εισόδου x καθώς εισέρχεται σταδιακά στο σύστημα h: % h1 h2 h3 % x y(1) = x*h(1); % h1 h2 h3 % x y(2) = x*h(2); % h1 h2 h3 % x y(3) = x*h(3);

% Απεικόνιση σήματος εξόδου y

Αποτελέσματα y =

1 2 1

- Στο προηγούμενο πρόγραμμα (program32a_1.m), αντικαταστήστε την εύρεση των τιμών του

y με ένα βρόχο for και αποθηκεύστε το με νέο όνομα (program32a_2.m):

program32a_2.m clc; clear all; close all; % Κρουστική απόκριση συστήματος: h = [0.5 1 0.5];

% Σήμα εισόδου: x = 2;

% Σήμα εξόδου M = 3; % μήκος σήματος εξόδου (χρονικές στιγμές n=0,1,2): for n=0:Μ-1 y(n+1) = x*h(n+1); end

% Απεικόνιση σήματος εξόδου y

Αποτελέσματα y =

1 2 1

Παρατηρούμε ότι τα αποτελέσματα των program32a_1.m και program32a_2.m είναι ίδια.

Page 30: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

30 Εργαστηριακές Ασκήσεις Επεξεργασίας Ιατρικού Σήματος

Εργασία 3.2β: Απόκριση γραμμικού συστήματος σε σήμα εισόδου 2 τιμών.

Το σήμα εξόδου ισούται με το άθροισμα των γινομένων των τιμών του σήματος που αλληλεπι-

δρούν με τις αντίστοιχες τιμές της κρουστικής απόκρισης.

- Δημιουργήστε και εκτελέστε το παρακάτω πρόγραμμα (program32b_1.m), το οποίο βρίσκει

την απόκριση ενός σήματος 2 τιμών σε ένα σύστημα με γνωστή κρουστική απόκριση h:

program32b_1.m clc; clear all; close all; % Κρουστική απόκριση συστήματος: h = [0.5 1 0.5]; % Σήμα εισόδου: x = [2 3]; % Σήμα εξόδου: % Παρατηρούμε το σήμα εισόδου x καθώς εισέρχεται σταδιακά στο σύστημα h: % h1 h2 h3 % x2 x1 y(1) = x(1)*h(1); % h1 h2 h3 % x2 x1 y(2) = x(1)*h(2) + x(2)*h(1); % h1 h2 h3 % x2 x1 y(3) = x(1)*h(3) + x(2)*h(2); % h1 h2 h3 % x2 x1 y(4) = x(2)*h(3); % Απεικόνιση σήματος εξόδου y

Αποτελέσματα y =

1 3.5 4 1.5

- Στο προηγούμενο πρόγραμμα (program32b_1.m), αντικαταστήστε τη διαδικασία εύρεσης των

τιμών του y χρησιμοποιώντας βρόχους for (με τη βοήθεια και του τύπου της συνέλιξης, 1

0

( ) ( ) ( ) [ ( ) ( )]N

k

y n x n h n x k h n k

* ). Αποθηκεύστε το με νέο όνομα (program32b_2.m):

program32b_2.m clc; clear all; close all; % Κρουστική απόκριση συστήματος: h = [0.5 1 0.5]; % Σήμα εισόδου: x = [2 3]; % Σήμα εξόδου (χρονικές στιγμές n=0,1,...,M-1):

% (Συνέλιξη: y(n)= Σ x(k)h(n-k)) M = 4; % Μήκος σήματος εξόδου (χρονικές στιγμές n=0,1,2,3): for n=0:M-1 y(n+1) = 0; for k=0:length(x)-1 if n-k+1>=1 & n-k+1<=length(h) % Εξασφάλιση εγκυρότητας δεικτών του h y(n+1) = y(n+1) + x(k+1)*h(n-k+1); % +1 γιατί οι δείκτες ξεκινούν από 1 end end end % Απεικόνιση σήματος εξόδου y

Αποτελέσματα y =

1 3.5 4 1.5

Παρατηρούμε ότι τα αποτελέσματα των program32b_1.m και program32b_2.m είναι ίδια.

Page 31: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Απόκριση συστήματος - Συνέλιξη 31

Εργασία 3.2γ: Κατασκευή της συνάρτησης υπολογισμού της συνέλιξης.

Συνέλιξη: 1

0

( ) ( ) ( ) [ ( ) ( )]N

k

y n x n h n x k h n k

* , όπου N = το μήκος του σήματος x

- Βασιζόμενοι στους βρόχους for του program32b_2.m, δημιουργήστε το αρχείο συνάρτησης

convolution.m, το οποίο θα βρίσκει τη συνέλιξη μεταξύ δύο σημάτων:

convolution.m function y = convolution(x,h)

% Μήκη σημάτων: N = length(x); % μήκος σήματος εισόδου L = length(h); % μήκος σήματος κρουστικής απόκρισης M = N+L-1; % μήκος σήματος εξόδου συνέλιξης

% Συνέλιξη: y(n)= Σ x(k)h(n-k) for n=0:M-1 y(n+1) = 0; for k=0:N-1 if n-k+1>=1 & n-k+1<=L % Εξασφάλιση εγκυρότητας των δεικτών του πίνακα h y(n+1) = y(n+1) + x(k+1)*h(n-k+1); % +1 γιατί οι δείκτες ξεκινούν από 1 end end end

Εργασία 3.2δ: Χρήση της συνάρτησης της συνέλιξης:

- Εκτελέστε από το Command Window τη συνάρτηση convolution.m που δημιουργήσατε, ώστε

να βρείτε τη συνέλιξη μεταξύ των σημάτων x και h που ορίστηκαν στο program32b_2.m.

Command Window

>> h = [0.5 1 0.5];

>> x = [2 3];

>> y = convolution(x,h)

Αποτέλεσμα

y =

1 3.5 4 1.5

- Στο πρόγραμμα program32b_2.m αντικαταστήστε κατάλληλα τους βρόχους for με τη συνάρ-

τηση convolution.m και αποθηκεύστε το με νέο όνομα (program32b_3.m):

program32b_3.m clc; clear all; close all; % Κρουστική απόκριση συστήματος: h = [0.5 1 0.5]; % Σήμα εισόδου: x = [2 3];

% Σήμα εξόδου (ισοδύναμα με τα program32b_1.m και program32b_2.m, % αλλά με χρήση της συνάρτησης της συνέλιξης): y = convolution(x,h);

% Απεικόνιση σήματος εξόδου y

Αποτελέσματα y =

1 3.5 4 1.5

Page 32: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

32 Εργαστηριακές Ασκήσεις Επεξεργασίας Ιατρικού Σήματος

Παρατηρούμε ότι το αποτέλεσμα είναι ίδιο με τα program32b_1.m και program32b_2.m.

Εργασία 3.2ε: Χρήση της συνέλιξης για αφαίρεση θορύβου: Εξομάλυνση (smoothing).

- Δημιουργήστε και εκτελέστε το παρακάτω πρόγραμμα (program32c.m), το οποίο προκαλεί ε-

ξομάλυνση σε ένα σήμα με σκοπό την αφαίρεση του θορύβου από αυτό.

Στην παρακάτω εργασία, η εξομάλυνση πραγματοποιείται με τη συνέλιξη ενός συστήματος κρου-

στικής απόκρισης ίσης με [0.25 0.5 0.25] (παράδειγμα φίλτρου εξομάλυνσης), σε ένα ημιτονο-

ειδές σήμα στο οποίο έχει προστεθεί τυχαίος θόρυβος.

program32c.m clc; clear all; close all; % Δημιουργία σήματος με θόρυβο N = 1000; % Μήκος σήματος f = 2; % Συχνότητα ημιτονοειδούς σήματος for n=0:N-1 x(n+1) = sin(2*pi*f*n/N); % Ημιτονοειδές σήμα noise = (rand-0.5)/5; % Τυχαίος αριθμός από -0.1 έως +0.1 xnoise(n+1) = x(n+1) + noise; % Ημιτονοειδές σήμα μαζί με τυχαίο θόρυβο end

% Εξομάλυνση (smoothing) σήματος h = [0.25 0.5 0.25]; % Κρουστική απόκριση φίλτρου y = convolution(xnoise,h); % Συνέλιξη σήματος με φίλτρο % Απεικόνιση σημάτων n = [0:length(x)-1]; m = [0:length(y)-1]; % Χρονικές στιγμές subplot(3,1,1); plot(n,x); axis([1 N -1 +1]); title('Ημιτονοειδές σήμα'); subplot(3,1,2); plot(n,xnoise); axis([1 N -1 +1]); title('Σήμα με θόρυβο'); subplot(3,1,3); plot(m,y); axis([1 N -1 +1]); title('Εξομαλυμένο σήμα');

Αποτελέσματα

Page 33: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Απόκριση συστήματος - Συνέλιξη 33

Επεξήγηση της εξομάλυνσης:

Στην περίπτωση της εξομάλυνση με φίλτρα όπως το [0.25 0.5 0.25], κάθε τιμή του σήματος

εξόδου y(n) ισούται με το μέσο όρο της αντίστοιχης τιμής του σήματος εισόδου x(n) μαζί με τόσα

γειτονικά του, όσα προκύπτουν από το πλήθος των τιμών του φίλτρου. Π.χ. για το παραπάνω

φίλτρο, το y(n) ισούται με τη μέση τιμή τριών σημείων, των x(n-1), x(n) και x(n+1).

Οι τιμές του φίλτρου εκφράζουν τη βαρύτητα κάθε σημείου του x(n) κατά τον υπολογισμό της

μέσης τιμής (γι’ αυτό και το άθροισμά τους πρέπει να ισούται με τη μονάδα), π.χ. με το παραπάνω

φίλτρο, κάθε σημείο του y(n) ισούται με 0.25·x(n-1) + 0.5·x(n) +0.25·x(n+1). Όσο μεγαλύτερη

είναι η κεντρική τιμή, τόσο μικρότερη βαρύτητα δίνεται στα γειτονικά σημεία, με αποτέλεσμα

μικρότερη εξομάλυνση –και το αντίστροφο. Για παράδειγμα, το φίλτρο [0.25 0.5 0.25 ] (50%

στο κεντρικό σημείο και 25% σε κάθε γειτονικό), προκαλεί μικρότερη εξομάλυνση από το [1/3

1/3 1/3] (33% βαρύτητα σε κάθε σημείο). Ένα άλλο παράδειγμα φίλτρου εξομάλυνσης τέτοιου

τύπου, που χρησιμοποιεί περισσότερα γειτονικά σημεία, είναι το [0.1 0.2 0.4 0.2 0.1].

Αυτού του τύπου τα συγκεκριμένα απλά φίλτρα κόβουν ή ελαττώνουν το πλάτος των υψηλών

συχνοτήτων του σήματος, γι’ αυτό λειτουργούν ως φίλτρα εξομάλυνσης ελαττώνοντας το θόρυβο

(ο οποίος θεωρείται ότι βρίσκεται στις υψηλές συχνότητες). Για να λειτουργήσουν αποτελεσμα-

τικά έχοντας φυσικό νόημα, πρέπει (α) να έχουν περιττό αριθμό τιμών με άθροισμα ίσο με τη

μονάδα, και (β) οι ακραίες τιμές πρέπει να είναι μικρότερες από την κεντρική τιμή και να είναι

συμμετρικές τιμές ως προς αυτή.

Εργασία 3.2στ: Υπολογισμός κρουστικής απόκρισης και απόκρισης σε σύστημα αναδρομικής ε-

ξάρτησης των τιμών του.

Έστω σύστημα του οποίου οι τιμές εξόδου y(n) εξαρτώνται από τις τιμές εισόδου x(n), σύμφωνα

με την αναδρομική σχέση:

y(n) = 0.5·y(n-1) + x(n)

α) Να γράψετε τη μαθηματική σχέση της κρουστικής απόκρισης του συστήματος.

β) Στο σύστημα εισάγεται σήμα x(n) = {0,0,1,1,1,1,0,0}.

Δημιουργήστε ένα πρόγραμμα σε MATLAB (program32d.m), με το οποίο:

(i) να υπολογίζεται η κρουστική απόκριση h(n) του συστήματος και

(ii) να βρίσκεται η απόκριση y(n) του συστήματος, για το σήμα εισόδου x(n).

Τα σήματα x και y πρέπει να απεικονίζονται στους ίδιους άξονες.

Σχόλιο:

Στο σύστημα αυτό παρατηρούμε ότι κάθε τιμή του σήματος εξόδου εξαρτάται από την προηγού-

μενη τιμή του (αναδρομική εξάρτηση τιμών). Αυτό σημαίνει ότι:

η πρώτη τιμή του σήματος εξόδου είναι ίση με την πρώτη τιμή του σήματος εισόδου (αφού δεν

υπάρχει προηγούμενη τιμή, ώστε να έχει επηρεαστεί).

το μήκος της κρουστικής απόκρισης δεν είναι καθορισμένο, αλλά κάθε φορά είναι ίσο με το

μήκος του σήματος εισόδου.

Λύση:

α) Η κρουστική απόκριση (h) είναι η έξοδος του συστήματος (y), όταν η είσοδος (x) είναι η κρου-

στική συνάρτηση (δ). Άρα, σύμφωνα με τη σχέση του y(n):

h(n) = 0.5·h(n-1) + δ(n)

β) Βλ. τον παρακάτω κώδικα:

Page 34: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

34 Εργαστηριακές Ασκήσεις Επεξεργασίας Ιατρικού Σήματος

program32d.m clc; clear all; close all;

x = [0 0 1 1 1 1 0 0];

% Δημιουργία κρουστικής συνάρτησης δ(n) d(1) = 1; for i=2:length(x) d(i) = 0; end

% Υπολογισμός της συγκεκριμένης κρουστικής απόκρισης h(n) h(1) = d(1); for i=2:length(d) h(i) = 0.5*h(i-1) + d(i); end

% Συνέλιξη y = convolution(x,h);

hold on; plot(x,'bo-'); plot(y,'r.:'); legend('x','y');

Αποτελέσματα

Παρατηρήσεις:

Ερώτημα (i): Χρησιμοποιείται η σχέση του ερωτήματος (α). Η πρώτη τιμή της κρουστικής από-

κρισης δεν επηρεάζεται από κάποια προηγούμενη τιμή, άρα h(1) = d(1).

Ερώτημα (ii): Η απόκριση ενός συστήματος βρίσκεται πάντα με συνέλιξη.

Page 35: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Απόκριση συστήματος - Συνέλιξη 35

3.3 Εργαστηριακές ασκήσεις

Άσκηση 3.3α: Εξομάλυνση καρδιογραφικού σήματος.

Δημιουργήστε ένα πρόγραμμα (program33a.m), το οποίο να προκαλεί εξομάλυνση (smoothing)

σε σήμα καρδιογραφήματος. Η εξομάλυνση πρέπει να πραγματοποιείται με τη συνέλιξη ενός συ-

στήματος κρουστικής απόκρισης ίσης με [0.25 0.5 0.25] στο σήμα ενός προσομοιωμένου καρ-

διογραφήματος (βλ. και Άσκηση 1.3β). Ακολουθήστε τα παρακάτω βήματα:

(i) Φορτώστε το σήμα 'ecg.txt' από το δίσκο (πρέπει να βρίσκεται στο Current Directory).

(ii) Δημιουργείστε ένα φίλτρο εξομάλυνσης, ως σήμα κρουστικής απόκρισης [0.25 0.5 0.25 ].

(iii) Πραγματοποιείστε τη συνέλιξη του φίλτρου με το καρδιογραφικό σήμα.

(iv) Απεικονείστε το αρχικό και το εξομαλυμένο σήμα στους ίδιους άξονες, χρησιμοποιώντας

διαφορετικά χρώματα. Για να δείτε καλύτερα τη διαφορά, δημιουργήστε και απεικονείστε μικρό-

τερα τμήματα των δύο σημάτων (π.χ. για τις χρονικές στιγμές από 50 έως 250).

Το αποτέλεσμα πρέπει να είναι όπως στο παρακάτω σχήμα:

Αποτελέσματα του program33a.m

Μπορείτε να πειραματιστείτε με διαφορετικά φίλτρα, για να παρατηρήσετε τα διαφορετικά απο-

τελέσματα στην εξομάλυνση.

Απαιτούμενα αρχεία για το program33a.m:

ecg.txt: Αρχείο προσομοιωμένου καρδιογραφήματος (βλ. και Άσκηση 1.3β)

sread.m: Συνάρτηση για το διάβασμα του σήματος από το δίσκο (Εργασία 1.2δ).

convolution.m: Συνάρτηση συνέλιξης (Εργασία 3.2γ)

Άσκηση 3.3β (γενίκευση της Εργασίας 3.2στ): Δημιουργία συνάρτησης προσομοίωσης του συστή-

ματος της Εργασίας 3.2στ.

α) Κατασκευάστε στο MATLAB μια συνάρτηση (SystemSimulation.m) που να προσομοιώνει

και να γενικεύει το σύστημα της Εργασίας 3.2στ, δηλαδή να μπορεί να υπολογίσει το σήμα εξόδου

y(n) του συστήματος για οποιοδήποτε σήμα εισόδου x(n).

Υπόδειξη: Βασιστείτε στο program32d.m.

Απαιτούμενο αρχείο: convolution.m (συνάρτηση συνέλιξης, Εργασία 3.2γ)

β) Κατασκευάστε ένα πρόγραμμα σε MATLAB (program33b.m), στο οποίο: (i) Να δημιουργείται

ένα σήμα N=100 τιμών, που να είναι το γινόμενο μιας εκθετικής συνάρτησης βάσης a=0.95 και

μιας συνημιτονοειδούς συνάρτησης συχνότητας f=2 και πλάτους A=1. (ii) Να βρίσκεται η από-

κριση του SystemSimulation.m, όταν εισαχθεί το σήμα του ερωτήματος (i). Τα σήματα εισόδου

και εξόδου να παρασταθούν στους ίδιους άξονες.

Το αποτέλεσμα πρέπει να είναι όπως στο σχήμα της επόμενης σελίδας:

Page 36: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

36 Εργαστηριακές Ασκήσεις Επεξεργασίας Ιατρικού Σήματος

Αποτελέσματα του program33b.m

Άσκηση 3.3γ: Ιδιότητες συνέλιξης

Με χρήση της συνάρτησης της συνέλιξης, να δείξετε με παραδείγματα τις ιδιότητες της συνέλιξης

(βλ. Συνοπτική θεωρία, παράγραφος 3.1), αφού ορίσετε κατάλληλα σήματα της επιλογής σας.

Page 37: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

4 Συσχέτιση

Σε αυτήν την ενότητα θα εξοικειωθείτε με:

την πράξη της συσχέτισης μεταξύ δύο σημάτων.

4.1 Συνοπτική θεωρία

Συσχέτιση (correlation) των σημάτων x(n) και y(n) ονομάζεται η πράξη ( ) σύμφωνα με

την οποία:

( ) ( ) ( ) [ ( ) ( )]k

r n x n y n x k y k n

Η συσχέτιση είναι ένας τρόπος σύγκρισης δύο σημάτων και εκφράζει τη σχέση μεταξύ

τους. Σε περίπτωση που τα σήματα είναι παρόμοια, το σήμα της συσχέτισης αρχικά αυξά-

νεται, παρουσιάζει μέγιστο για n=N (όπου N το κοινό μήκος των δύο σημάτων), και στη

συνέχεια ελαττώνεται.

Αν τα σήματα δεν έχουν ίδιο μήκος, τότε επαυξάνουμε το σήμα με το μικρότερο μήκος με

τόσα μηδενικά ώστε τα μήκη να γίνουν ίσα.

4.2 Εργασίες κατανόησης

Εργασία 4.2α: Συσχέτιση 2 σημάτων.

- Δημιουργήστε και εκτελέστε το παρακάτω πρόγραμμα (program42a_1.m):

program42a_1.m clc; clear all; close all;

% Σήμα A x = [3 1 2];

% Σήμα B y = [2 4];

% Συσχέτιση των δύο σημάτων (πρώτα το μικρότερου μήκους σήμα % "γεμίζει" με 0 ώστε να γίνει ίδιου μήκους με το μεγαλύτερο): y = [2 4 0];

% Παρατηρούμε το σήμα A καθώς συσχετίζεται με το σήμα B: % x1 x2 x3 % y1 y2 y3 r(1) = x(1)*y(3); % x1 x2 x3 % y1 y2 y3 r(2) = x(1)*y(2) + x(2)*y(3); % x1 x2 x3 % y1 y2 y3 r(3) = x(1)*y(1) + x(2)*y(2) + x(3)*y(3); % x1 x2 x3 % y1 y2 y3 r(4) = x(2)*y(1) + x(3)*y(2); % x1 x2 x3 % y1 y2 y3 r(5) = x(3)*y(1);

% Απεικόνιση σήματος εξόδου r

Αποτελέσματα r =

0 12 10 10 4

Page 38: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

38 Εργαστηριακές Ασκήσεις Επεξεργασίας Ιατρικού Σήματος

- Στο προηγούμενο πρόγραμμα (program42a_1.m), αντικαταστήστε τη διαδικασία εύρεσης των

τιμών του r χρησιμοποιώντας βρόχους for (και με τη βοήθεια του τύπου της συσχέτισης, 1

0

( ) ( ) ( ) [ ( ) ( )]N

k

r n x n y n x k y k n

). Αποθηκεύστε το με νέο όνομα (program42a_2.m):

program42a_2.m clc; clear all; close all;

% Σήμα A x = [3 1 2];

% Σήμα B y = [2 4];

% Συσχέτιση των δύο σημάτων (πρώτα το μικρότερου μήκους σήμα % "γεμίζει" με 0 ώστε να γίνει ίδιου μήκους με το μεγαλύτερο): y = [2 4 0];

% Ισοδύναμα με το program42a_1.m, αλλά με βρόχο for: % (Συσχέτιση: r(n)= Σ x(k)y(k-n)) M = 5; % μήκος σήματος εξόδου (χρονικές στιγμές n=0,1,2,3,4): for n=0:M-1 r(n+1) = 0; for k=0:length(x)-1 if k-n+length(y)>=1 & k-n+length(y)<=length(y) r(n+1) = r(n+1) + x(k+1) * y(k-n+length(y)); end end end

% Απεικόνιση αποτελέσματος συσχέτισης r

Αποτελέσματα r =

0 12 10 10 4

Παρατηρούμε ότι τα αποτελέσματα των program42a_1.m και program42a_2.m είναι ίδια.

Page 39: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Συσχέτιση 39

- Στο προηγούμενο πρόγραμμα (program42a_2.m), αντικαταστήστε την εύρεση των τιμών του

r χρησιμοποιώντας τη συνάρτηση της συνέλιξης (convolution.m, της προηγούμενης εργαστηρια-

κής άσκησης), αφού πρώτα αναστρέψτε («δεξιά-αριστερά») το 2ο σήμα. Αποθηκεύστε το πρό-

γραμμα με νέο όνομα (program42a_3.m):

program42a_3.m clc; clear all; close all;

% Σήμα A x = [3 1 2];

% Σήμα B y = [2 4];

% Συσχέτιση των δύο σημάτων (πρώτα το μικρότερου μήκους σήμα % "γεμίζει" με 0 ώστε να γίνει ίδιου μήκους με το μεγαλύτερο): y = [2 4 0];

% Στο program42a_1.m παρατηρούμε ότι η συσχέτιση υπολογίζεται όμοια % με τη συνέλιξη, αλλά με το 2o σήμα ανεστραμένο "δεξιά-αριστερά", % όπως εξάλλου φαίνεται και από τις μαθηματικές σχέσεις των δύο πράξεων: % Συνέλιξη: y(n)= Σ x(k)h(n-k) % Συσχέτιση: r(n)= Σ x(k)y(k-n) % Άρα: % (i) Αναστροφή του 2ου σήματος: for i=1:length(y) z(i) = y(length(y)-i+1); end % (ii) Υπολογισμός συσχέτισης των x,y με συνέλιξη των x,z: r = convolution(x,z);

% Απεικόνιση αποτελέσματος συσχέτισης r

Αποτελέσματα r =

0 12 10 10 4

Παρατηρούμε ότι τα αποτελέσματα των program42a_2.m και program42a_3.m είναι ίδια.

Page 40: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

40 Εργαστηριακές Ασκήσεις Επεξεργασίας Ιατρικού Σήματος

Εργασία 4.2β: Κατασκευή της συνάρτησης υπολογισμού της συσχέτισης.

Συσχέτιση: 1

0

( ) ( ) ( ) [ ( ) ( )]N

k

r n x n y n x k y k n

, όπου N = το μήκος του σήματος x

- Βασιζόμενοι στους βρόχους for του program42a_2.m ή στο program42a_3.m, δημιουργή-

στε το αρχείο συνάρτησης correlation.m, το οποίο θα βρίσκει τη συσχέτιση δύο σημάτων:

correlation.m function r = correlation(x,y)

% Επαύξηση με 0 του μικρότερου σε μήκος σήματος: if length(x)<length(y) for i=length(x)+1:length(y) x(i) = 0; end elseif length(x)>length(y) for i=length(y)+1:length(x) y(i) = 0; end end

% Μήκη σημάτων: N = length(x); % μήκος σημάτων (τα μήκη έχουν εξισωθεί προηγουμένως) M = 2*N-1; % μήκος σήματος συσχέτισης

% Α' τρόπος % Συσχέτιση: r(n)= Σ x(k)y(k-n) for n=0: M-1 r(n+1) = 0; for k=0:N-1 if k-n+N>=1 & k-n+N<=N r(n+1) = r(n+1) + x(k+1) * y(k-n+N); end end end

% Β' τρόπος % Η συσχέτιση των x και y είναι ισοδύναμη με τη συνέλιξη

% του x με το ανεστραμμένο y "δεξιά-αριστερά": % (i) Αναστροφή του 2ου σήματος: for i=1:length(y) z(i) = y(length(y)-i+1); end % (ii) Υπολογισμός συσχέτισης των x,y με συνέλιξη των x,z: r = convolution(x,z);

Σημείωση: Για να ενεργοποιηθεί ο ένας από τους δύο τρόπους υπολογισμού της συσχέτισης (ο Α'

ή ο Β'), αρκεί να βάλουμε σχόλια (%) στον άλλο τρόπο (π.χ. επιλέγουμε με το ποντίκι τις γραμμές

που θέλουμε, και μετά πατάμε Control+R για να βάλουμε σχόλια, ή Control+T για να τα βγά-

λουμε) –ή, φυσικά, να διαγράψουμε τελείως τις γραμμές εντολών που δεν χρειαζόμαστε. Πάντως,

η επαύξηση με 0 του μικρότερου σήματος πρέπει να αφαρμοστεί και στους δύο τρόπους.

Page 41: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Συσχέτιση 41

Εργασία 4.2γ: Χρήση της συνάρτησης της συσχέτισης:

- Εκτελέστε από το Command Window τη συνάρτηση correlation.m που δημιουργήσατε, ώστε να

βρείτε τη συσχέτιση μεταξύ δύο σημάτων x και y.

Command Window

>> x = [3 1 2];

>> y = [2 4];

>> r = correlation(x,y)

Αποτέλεσμα

r =

0 12 10 10 4

- Στο πρόγραμμα program42a_2.m αντικαταστήστε κατάλληλα τους βρόχους for με τη συνάρ-

τηση correlation.m και αποθηκεύστε το με νέο όνομα (program42a_4.m):

program42a_4.m clc; clear all; close all;

% Σήμα A x = [3 1 2];

% Σήμα B y = [2 4];

% Σήμα συσχέτισης (ισοδύναμα με τα program42a_1.m, program42a_2.m

% και program42a_3.m, % αλλά με χρήση της συνάρτησης της συνέλιξης): r = correlation(x,y);

% Απεικόνιση αποτελέσματος συσχέτισης r

Αποτελέσματα r =

0 12 10 10 4

Παρατηρούμε ότι το αποτέλεσμα είναι ίδιο με τα program42a_1.m, program42a_2.m και

program42a_3.m.

Page 42: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

42 Εργαστηριακές Ασκήσεις Επεξεργασίας Ιατρικού Σήματος

Εργασία 4.2δ: Χρήση της συσχέτισης για εντοπισμό σήματος σε περιβάλλον θορύβου.

- Δημιουργήστε και εκτελέστε το παρακάτω πρόγραμμα (program42b.m), το οποίο εντοπίζει

γνωστό σήμα μέσα σε περιβάλλον θορύβου. Παράδειγμα τέτοιας εφαρμογής είναι ο εντοπισμός

του ανακλώμενου ηχητικού σήματος συσκευής υπερήχων.

program42b.m clc; clear all; close all;

% Δημιουργία ημιτονοειδούς σήματος με θόρυβο N = 200; f = 8; % Συχνότητα ημιτονοειδούς σήματος for n=0:N-1 x(n+1) = sin(n*2*pi*f/N); % Ημιτονοειδές σήμα noise(n+1) = 8*(rand-0.5); % Δημιουργία τυχαίου θορύβου xnoise(n+1) = x(n+1) + 8*(rand-0.5); % Ημιτονοειδές σήμα με θόρυβο end

% Συσχέτιση του σήματος με (α) το θορυβώδες σήμα και (β) με το θόρυβο rx_xnoise = correlation(x,xnoise); % Συσχέτιση σήματος με θορυβώδες σήμα rx_noise = correlation(x,noise); % Συσχέτιση σήματος με θόρυβο

% Απεικόνιση σημάτων n = [0:N-1]; % Χρονικές στιγμές subplot(3,2,1); plot(n,x); xlabel('x'); subplot(3,2,2); plot(n,x); xlabel('x'); subplot(3,2,3); plot(n,noise); xlabel('noise'); subplot(3,2,4); plot(n,xnoise); xlabel('x+noise'); subplot(3,2,5); plot([0:2*N-2],rx_noise); xlabel('Correl.: x & noise'); subplot(3,2,6); plot([0:2*N-2],rx_xnoise); xlabel('Correl.: x & x+noise');

% Γιατί οι τιμές του σήματος της συχέτισης είναι από 0 έως 2*N-2;

Αποτελέσματα

Page 43: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Συσχέτιση 43

4.3 Εργαστηριακές ασκήσεις

Άσκηση 4.3α: Συσχέτιση για εντοπισμό σήματος μέσα σε θορυβώδες περιβάλλον

Δημιουργήστε ένα πρόγραμμα (program43a.m), το οποίο να εντοπίζει ένα σήμα καρδιογραφή-

ματος μέσα σε θορυβώδες περιβάλλον. Η συσχέτιση θα γίνεται με ένα γνωστό καρδιογραφικό

σήμα. Ακολουθήστε τα παρακάτω βήματα:

(i) Φορτώστε το καρδιογραφικό σήμα 'ecg.txt' από το δίσκο (πρέπει να βρίσκεται στο Current

Directory).

(ii) Προσθέστε τυχαίο θόρυβο στο σήμα (βλ. και Εργασία 4.2β).

(iii) Δημιουργήστε σήμα που να περιέχει μόνο τυχαίο θόρυβο.

(iv) Απεικονίστε τα τρία σήματα (καρδιογράφημα, καρδιογράφημα+θόρυβος, θόρυβος).

(v) Πραγματοποιείστε συσχέτιση του καρδιογραφήματος με κάθε ένα από τα δύο θορυβώδη σή-

ματα.

(vii) Απεικονίστε τα αποτελέσματα των δύο συσχετίσων, ώστε να κατανοήσετε τη σημασία της

συσχέτισης.

Τα αποτελέσματα μπορεί να είναι όπως στο παρακάτω σχήμα:

Αποτελέσματα του program43a.m

Απαιτούμενα αρχεία για το program43a.m:

ecg.txt: Αρχείο προσομοιωμένου καρδιογραφήματος (βλ. και Άσκηση 1.3β)

sread.m: Συνάρτηση για το διάβασμα του σήματος από το δίσκο (Εργασία 1.2δ).

correlation.m: Συνάρτηση συσχέτισης (Εργασία 4.2β)

Page 44: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

44 Εργαστηριακές Ασκήσεις Επεξεργασίας Ιατρικού Σήματος

Άσκηση 4.3β: Συσχέτιση για εντοπισμό συχνότητας μέσα σε σήμα

Τροποποιήστε το προηγούμενο πρόγραμμα, κάνοντας συσχέτιση του ηλεκτροκαδριογραφικού σή-

ματος με δύο ημιτονοειδή σήματα, τα οποία θα δημιουργήσετε προηγουμένως στη θέση των ση-

μάτων με θόρυβο. Το ένα ημιτονοειδές σήμα πρέπει να έχει κάποια συχνότητα που φαίνεται να

ενυπάρχει στο καρδιογραφικό σήμα (π.χ. μπορεί να είναι ίση με το πλήθος των κορυφών του, 17),

ενώ το άλλο ημιτονοειδές σήμα πρέπει να έχει κάποια άλλη διαφορετική συχνότητα, που δεν φαί-

νεται να υπάρχει μέσα στο καρδιογραφικό σήμα (π.χ. 10).

Ο σκοπός της άσκησης αυτής είναι να δείτε τη συσχέτιση με το ημιτονοειδές σήμα, όταν αυτό έχει

συχνότητα που υπάρχει μέσα στο καρδιογραφικό σήμα.

Τα αποτελέσματα πρέπει να είναι όπως στο παρακάτω σχήμα:

Αποτελέσματα

Απαιτούμενα αρχεία για το program43b.m:

ecg.txt: Αρχείο προσομοιωμένου καρδιογραφήματος (βλ. και Άσκηση 1.3β)

sread.m: Συνάρτηση για το διάβασμα του σήματος από το δίσκο (Εργασία 1.2δ).

correlation.m: Συνάρτηση συσχέτισης (Εργασία 4.2β)

Page 45: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

5 Διάκριτος Μετασχηματισμός Fourier

Στην ενότητα αυτή θα εξοικειωθείτε με το διάκριτο μετασχηματισμό Fourier. Συγκεκριμένα,

θα δείτε:

δημιουργία κώδικα συναρτήσεων για τον ευθύ και αντίστροφο μετασχηματισμό Fourier,

τον υπολογισμό και την απεικόνιση του φάσματος πλάτους ενός σήματος στο πεδίο των

συχνοτήτων, καθώς και τις πληροφορίες που μπορούμε να λάβουμε από το φάσμα πλάτους,

και

την εύρεση ενός σήματος (και των απλών ημιτονοειδών σημάτων που το αποτελούν) στο

πεδίο του χρόνου, αν γνωρίζουμε το φάσμα πλάτους.

5.1 Συνοπτική θεωρία

Σύμφωνα με το θεώρημα Fourier, οποιοδήποτε σήμα μπορεί να αναλυθεί σε ένα άθροισμα

απλών ημιτονοειδών σημάτων με συγκεκριμένες συχνότητες και πλάτη.

Αυτό σημαίνει ότι ένα σήμα μπορεί να απεικονιστεί είτε στο πεδίο του χρόνου (γνωρίζο-

ντας την τιμή του σήματος κάθε χρονική στιγμή), είτε στο πεδίο των συχνοτήτων (γνωρί-

ζοντας το πλάτος κάθε συχνότητας).

Ένα σήμα διάκριτου χρόνου υπολογίζεται στο πεδίο των συχνοτήτων με το Διάκριτο Με-

τασχηματισμό Fourier (Discrete Fourier Transform, DFT): 21

0

1( ) ( )

N j knN

n

Fx k x n eN

όπου x(n) είναι το αρχικό σήμα στο πεδίο του χρόνου, n=0…N-1 οι χρονικές στιγμές, Fx(k)

είναι το μετασχηματισμένο σήμα στο πεδίο των συχνοτήτων και k=0…N-1 είναι οι συχνό-

τητες από τις οποίες αποτελείται το Fx(k) ή, αλλιώς, τα πολλαπλάσια της βασικής συχνότη-

τας που ισούται με 1/Ν).

Ο επανασχηματισμός του αρχικού σήματος στο πεδίο του χρόνου, γνωρίζοντας το Fx(k),

γίνεται με τον Αντίστροφο Διάκριτο Μετασχηματισμό Fourier (Inverse DFT, IDFT): 21

0

( ) ( )N j kn

N

k

x n Fx k e

Σχέση Euler: cos sinje j . Άρα:

22 2

cos sinj kn

Ne kn j knN N

Π.χ.: 2 cos sin 0 12 2

j

e j j j

Το σήμα στο πεδίο των συχνοτήτων Fx(k) αποτελείται από μιγαδικούς αριθμούς (το σύμ-

βολο «j» είναι η φανταστική μονάδα, 1j ή j2=–1), με πραγματικό μέρος ( )RFx k και

φανταστικό μέρος ( )IFx k . Έτσι, υπολογίζονται τα μεγέθη:

Πλάτος: 2 2( ) ( ) ( )Fx k RFx k IFx k (για όλα τα k : φάσμα πλάτους)

Φάση: 1 ( )

( ) tan( )

IFx kk

RFx k

(όπου tan-1 = τόξο εφαπτομένης)

Ισχύς: P(k) = | Fx(k)|2 (για όλα τα k : φάσμα ισχύος)

όπου: Fx(k) = το σήμα στο πεδίο των συχνοτήτων,

RFx(k) και IFx(k) = το πραγματικό και το φανταστικό μέρος του Fx(k),

|Fx(k)|, φ(k) και P(k) = το πλάτος, η φάση και η ισχύς του Fx(k),

k = 0…N-1 οι συχνότητες και Ν = το μήκος του σήματος Fx(k).

IFx

RFx

φ

Fx

Page 46: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

46 Εργαστηριακές Ασκήσεις Επεξεργασίας Ιατρικού Σήματος

5.2 Εργασίες κατανόησης

Εργασία 5.2α: Υπολογισμός σήματος στο πεδίο των συχνοτήτων με DFT:

Το σήμα στο πεδίο των συχνοτήτων υπολογίζεται από τον DFT: 21

0

1( ) ( )

N j knN

n

Fx k x n eN

Όμως, το ( )Fx k είναι μιγαδικός αριθμός και δεν μπορεί να υπολογιστεί απ’ ευθείας. Έτσι, τον

φέρνουμε στη μορφή Fx(k) = RFx(k) + j IFx(k) με τη βοήθεια της σχέσης του Euler (

cos sinje j ) και υπολογίζουμε τα ( )RFx k και ( )IFx k (το πραγματικό και το φανταστικό

μέρος του):

Ισχύει: 21 1

0 0

1 1 2 2( ) ( ) ( ) cos sin

N Nj knN

n n

Fx k x n e x n kn j knN N N N

Άρα: 1 1

0 0

1 2 1 2( ) ( ) cos ( )sin

N N

n n

Fx k x n kn j x n knN N N N

ή, τελικά: Fx(k) = RFx(k) + j IFx(k)

όπου 1

0

1 2( ) ( ) cos

N

n

RFx k x n knN N

και

1

0

1 2( ) ( )sin

N

n

IFx k x n knN N

- Με τη βοήθεια των παραπάνω σχέσεων κατασκευάστε το αρχείο συνάρτησης dft.m για τον

υπολογισμό του μετασχηματισμού Fourier ενός σήματος:

dft.m function [RFx,IFx] = dft(x) % Είσοδος: x = πραγματικό σήμα, στο πεδίο του χρόνου % Έξοδος: RFx, IFx = πραγματικό και φανταστικό μέρος του σήματος % στο πεδίο των συχνοτήτων μετά από το μετασχηματισμό Fourier N = length(x); for k=0:N-1 RFx(k+1) = 0; IFx(k+1) = 0; for n=0:N-1 RFx(k+1) = RFx(k+1) + x(n+1)*cos(2*pi*k*n/N); IFx(k+1) = IFx(k+1) + x(n+1)*sin(2*pi*k*n/N); end RFx(k+1) = RFx(k+1)/N; IFx(k+1) = -IFx(k+1)/N; end

- Xρησιμοποιήστε τη συνάρτηση dft.m στο Command Window για να υπολογίσετε τον ευθύ με-

τασχηματισμό Fourier ενός απλού σήματος (π.χ. x = [1 1 0 0]):

Command Window (εντολές και αποτελέσματα)

>> x = [1 1 0 0]

x =

1 1 0 0

>> [RFx,IFx] = dft(x)

RFx =

0.5 0.25 0 0.25

IFx =

0 -0.25 -3.0616e-017 0.25

Σημείωση: Ο συμβολισμός «-3.061e-017» σημαίνει -3.061·10-17. Τέτοιες πολύ μικρές τιμές

θεωρούνται μηδενικές (η απόκλιση από το 0 οφείλεται στις προσεγγίσεις του pi≈π).

Page 47: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Διακριτός Μετασχηματισμός Fourier 47

Εργασία 5.2β: Υπολογισμός σήματος στο πεδίο του χρόνου με IDFT:

Εδώ θεωρείται γνωστό το ( )Fx k (δηλαδή τα ( )RFx k και ( )IFx k ) και θέλουμε να υπολογίσουμε

το x(n) σύμφωνα με τον IDFT: 21

0

( ) ( )N j kn

N

k

x n Fx k e

Σύμφωνα με τον ανωτέρω τύπο, το x(n) είναι μιγαδικός αριθμός, οπότε θα υπολογίσουμε το

πραγματικό και το φανταστικό του μέρος ( ( )RFx k και ( )IFx k ) ως εξής:

Ισχύει: 21 1

0 0

2 2( ) ( ) ( ) cos sin

N Nj knN

k k

x n Fx k e Fx k kn j knN N

Άρα: 1 1

0 0

2 2( ) ( ) cos ( )sin

N N

k k

x n Fx k kn j Fx k knN N

ή

1 1

0 0

2 2( ) ( ) ( ) cos ( ) ( ) sin

N N

k k

x n RFx k j IFx k kn j RFx k j IFx k knN N

ή 1 1 1 1

2

0 0 0 0

2 2 2 2( ) ( )cos ( )cos ( )sin ( )sin

N N N N

k k k k

x n RFx k kn j IFx k kn j RFx k kn j IFx k knN N N N

ή

ή, τελικά: x(n) = Rx(n) + j Ix(n)

όπου 1

0

2 2( ) ( ) cos ( )sin

N

k

Rx n RFx k kn IFx k knN N

και 1

0

2 2( ) ( )sin ( )cos

N

k

Ix n RFx k kn IFx k knN N

Σημείωση: Στη συνήθη περίπτωση που το σήμα x(n) είναι πραγματικό, τότε απλώς το ( )IFx k

προκύπτει ίσο με το μηδέν.

1 1

0 0

2 2 2 2( ) ( )cos ( )sin ( )sin ( )cos

N N

k k

x n RFx k kn IFx k kn j RFx k kn IFx k knN N N N

Page 48: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

48 Εργαστηριακές Ασκήσεις Επεξεργασίας Ιατρικού Σήματος

- Με τη βοήθεια των παραπάνω σχέσεων κατασκευάστε το αρχείο συνάρτησης idft.m για τον

υπολογισμό του αντίστροφου μετασχηματισμό Fourier ενός σήματος:

idft.m function [Rx,Ix] = idft(RFx,IFx) % Είσοδος: RFx, IFx = πραγματικό και φανταστικό μέρος του σήματος % στο πεδίο των συχνοτήτων % Έξοδος: Rx, Ix = πραγματικό και φανταστικό μέρος του σήματος % στο πεδίο του χρόνου N = length(RFx); for n=0:N-1 Rx(n+1) = 0; Ix(n+1) = 0; for k=0:N-1 Rx(n+1) = Rx(n+1) + ( RFx(k+1)*cos(2*pi*k*n/N) - ... IFx(k+1)*sin(2*pi*k*n/N) ); Ix(n+1) = Ix(n+1) + ( RFx(k+1)*sin(2*pi*k*n/N) + ... IFx(k+1)*cos(2*pi*k*n/N) ); end end

- Xρησιμοποιήστε τη συνάρτηση idft.m στο Command Window για να υπολογίσετε τον αντί-

στροφο μετασχηματισμό Fourier ενός σήματος στο πεδίο των συχνοτήτων (χρησιμοποιήστε το

σήμα με RFx = [0.5 0.25 0 0.25] και IFx = [0 -0.25 0 0.25], που όπως είδαμε προηγουμένως

προέρχεται από τον DFT του σήματος x = [1 1 0 0], ώστε με IDFT να προκύψει ως επιβεβαίωση

το σήμα αυτό):

Command Window (εντολές και αποτελέσματα)

>> [Rx,Ix] = idft(RFx,IFx)

Rx =

1 1 1.9174e-017 5.5511e-017

Ix =

-5.5511e-017 9.5869e-018 1.1102e-016 1.6553e-016

Παρατηρούμε ότι το φανταστικό μέρος του σήματος x(n) προκύπτει ίσο με το μηδέν (ως επιβε-

βαίωση του ότι το αρχικό σήμα x = [1 1 0 0] ήταν πραγματικό).

Page 49: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Διακριτός Μετασχηματισμός Fourier 49

Εργασία 5.2γ: Υπολογισμός φάσματος πλάτους ενός σήματος στο πεδίο των συχνοτήτων:

Πλάτος σήματος στο πεδίο των συχνοτήτων: 2 2( ) ( ) ( )Fx k RFx k IFx k

- Δημιουργήστε και εκτελέστε το παρακάτω πρόγραμμα (program52a.m), στο οποίο:

(i) δημιουργείται ένα σύνθετο σήμα από 2 ημιτονοειδή σήματα γνωστών συχνοτήτων/πλάτους

(ii) το τελικό σήμα μετασχηματίζεται κατά Fourier και απεικονίζεται το φάσμα πλάτους.

program52a.m clc; clear; close all;

%Δημιουργία σήματος (x) από 2 επιμέρους σήματα (x1,x2) στο πεδίο του χρόνου N = 100; % Μήκος σήματος A1 = 20; f1 = 2; % Πλάτος και συχνότητα 1ου σήματος A2 = 12; f2 = 10; % Πλάτος και συχνότητα 2ου σήματος C = 5; % Σταθερός όρος στο 2ο σήμα for n=0:N-1 x1(n+1) = A1*sin(2*pi*n*f1/N); % Σήμα 1 x2(n+1) = C + A2*sin(2*pi*n*f2/N); % Σήμα 2 x(n+1) = x1(n+1) + x2(n+1); % Τελικό σήμα end

% Σήμα στο πεδίο των συχνοτήτων (Fx) [RFx,IFx] = dft(x);

% Πλάτος του σήματος στο πεδίο των συχνοτήτων (AF(k)) for k=0:N-1 AF(k+1) = sqrt( RFx(k+1)^2 + IFx(k+1)^2 ); end

% Γραφικές παραστάσεις επιμέρους σημάτων στο πεδίο του χρόνου x1(n), x2(n) n = [0:N-1]; % Χρονικές στιγμές subplot(3,1,1); plot(n,x1); hold on; plot(n,x2); grid on; xlabel('Χρόνος (n)'); ylabel('Σήματα x_1(n),x_2(n)');

% Γραφική παράσταση τελικού σήματος στο πεδίο του χρόνου x(n) subplot(3,1,2); plot(n,x); grid on; xlabel('Χρόνος (n)'); ylabel('Σήμα x(n)');

% Γραφική παράσταση πλάτους του σήματος στο πεδίο των συχνοτήτων (AF(k)) k = [0:N-1]; % Συχνότητες subplot(3,1,3); stem(k,AF); grid on; xlabel('Συχνότητες (k)'); ylabel('Πλάτος |Fx(k)|');

Page 50: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

50 Εργαστηριακές Ασκήσεις Επεξεργασίας Ιατρικού Σήματος

Αποτελέσματα

Σημείωση:

Για την απεικόνιση των πλατών χρησιμοποιήθηκε η συνάρτηση stem, που είναι περισσότερο

κατάλληλη για τη συγκεκριμένη απεικόνιση (η stem συντάσσεται όπως και η plot, απλώς η

απεικόνιση των σημείων γίνεται με διαφορετικό τρόπο).

Παρατηρήσεις στα αποτελέσματα του program52a.m:

1) Στο φάσμα πλάτους (τρίτο γράφημα) εμφανίζονται οι συχνότητες των επιμέρους σημάτων (2

και 10) με τα αντίστοιχα ημίσεια πλάτη (20/2=10 και 12/2=6).

2) Τα πλάτη εμφανίζονται το ήμισυ, λόγω της ύπαρξης των συζυγών μιγαδικών όρων με ίδια

πλάτη στις συμμετρικές ως προς το μέσον συχνότητες (98 και 90) (δοκιμάστε να τρέξετε το

πρόγραμμα με συχνότητες f1 = 98 και f2 = 90).

3) Παρατηρούμε την εμφάνιση του σταθερού όρου (που είχε εισαχθεί με το 2ο σήμα και ήταν ίσος

με 5) στη συχνότητα f=0 (ο σταθερός όρος –αν υπάρχει– αντιστοιχεί πάντα στη μηδενική συ-

χνότητα, καθώς δεν είναι περιοδικός).

Page 51: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Διακριτός Μετασχηματισμός Fourier 51

5.3 Εργαστηριακές ασκήσεις

Άσκηση 5.3α: Απεικόνιση φασμάτων πλάτους και ισχύος:

Κατασκευάστε πρόγραμμα (program53a.m) στο οποίο:

(i) δημιουργείται ένα σύνθετο σήμα που να αποτελείται από ένα εκθετικό σήμα με βάση 0.95 και

από ένα ημιτονοειδές σήμα πλάτους 1 και συχνότητας 10,

(ii) εκτελείται ο μετασχηματισμός Fourier του σήματος,

(iii) υπολογίζεται το φάσμα πλάτους AF(k) και το φάσμα ισχύος P(k)=AF(k)2 του σήματος στο

πεδίο των συχνοτήτων, και

(iv) απεικονίζεται η γραφική παράσταση του τελικού σήματος στο πεδίο του χρόνου, και των

φασμάτων πλάτους και ισχύος στο πεδίο των συχνοτήτων.

Τα αποτελέσματα της απεικόνισης μπορεί να είναι όπως παρακάτω:

Αποτελέσματα

Page 52: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

52 Εργαστηριακές Ασκήσεις Επεξεργασίας Ιατρικού Σήματος

Άσκηση 5.3β: Μελέτη φάσματος πλάτους σύνθετου σήματος:

Με βάση το φάσμα πλάτους του παρακάτω σχήματος, δημιουργήστε την εξίσωση ενός σύνθετου

σήματος που να αποτελείται από απλά ημιτονοειδή σήματα και που να δίνει αυτό το φάσμα. Στη

συνέχεια, κατασκευάστε πρόγραμμα (program53b.m), το οποίο να δίνει τα αποτελέσματα που

παρουσιάζονται παρακάτω: (Υπόδειξη: Στηριχτείτε στην εργασία 5.2γ (program52a.m).)

Αποτελέσματα του program53a.m

Άσκηση 5.3γ

Γενικεύστε τον κώδικα της συνάρτησης dft.m (βλ. εργασία 5.2α) ώστε να μπορεί να δέχεται ως

είσοδο μιγαδικό σήμα.

Υπόδειξη: Θα χρειαστεί πρώτα να γενικεύσετε τις μαθηματικές σχέσεις και την απόδειξη της ερ-

γασίας 5.2α, θέτοντας ( ) ( ) ( )x n Rx n j Ix n .

Page 53: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

6 Διακριτός Μετασχηματισμός Fourier – Εφαρμογές

Στην ενότητα αυτή θα δείτε μια απλή εφαρμογή του διάκριτου μετασχηματισμού Fourier. Συ-

γκεκριμένα, θα δείτε

ένα απλό φιλτράρισμα στο πεδίο των συχνοτήτων με σκοπό την αφαίρεση θορύβου από ένα

σήμα (ανακατασκευή του σήματος στο πεδίο του χρόνου μετά την αφαίρεση συγκεκριμένων

συχνοτήτων στο πεδίο των συχνοτήτων).

6.1 Συνοπτική θεωρία

Συχνά θεωρείται ότι ο θόρυβος σε ένα σήμα βρίσκεται σε συγκεκριμένη περιοχή συχνοτή-

των, π.χ. στις υψηλές. Κατά συνέπεια, αν ήταν δυνατόν να αφαιρεθούν μόνο οι υψηλές

συχνότητες από ένα σήμα, τότε θα αφαιρούταν και ο θόρυβος.

Μια απλή διαδικασία αφαίρεσης θορύβου από ένα σήμα, μπορεί να είναι η εξής:

α) μετασχηματίζουμε κατά Fourier στο πεδίο των συχνοτήτων με DFT:

x(n) → Fx(k)

β) μηδενίζουμε τις συνιστώσες του Fx που αντιστοιχούν στις συχνότητες όπου υποθέτουμε

ότι υπάρχει θόρυβος (π.χ. τις υψηλές):

Fx(k) → Fx_denoised(k)

γ) ανακατασκευάζουμε το σήμα στο πεδίο του χρόνου με IDFT:

Fx_denoised(k) → x_denoised(n)

6.2 Εργασίες κατανόησης

Εργασία 6.2α: Ανακατασκευή σήματος στο πεδίο του χρόνου, μετά από αφαίρεση θορύβου στο

πεδίο των συχνοτήτων:

- Δημιουργήστε και εκτελέστε το παρακάτω πρόγραμμα (program62a.m), στο οποίο:

(i) δημιουργείται ένα ημιτονοειδές σήμα με προσθετικό τεχνητό θόρυβο (ένα άλλο ημιτονοειδές

σήμα αρκετά υψηλότερης συχνότητας, αλλά μικρότερου πλάτους),

(ii) βρίσκεται το φάσμα πλάτους του σήματος με το θόρυβο, από όπου μπορούμε να «βρούμε»

(αν δεν γνωρίζουμε) την υψηλή συχνότητα που αντιστοιχεί στο θόρυβο,

(iii) η υψηλή συχνότητα που αντιστοιχεί στο θόρυβο αφαιρείται από το σήμα στο πεδίο των συ-

χνοτήτων,

(iv) το σήμα, αφού αφαιρεθεί η υψηλή συχνότητα, ανακατασκευάζεται στο πεδίο του χρόνου με

IDFT, και

(v) γίνεται απεικόνιση του σήματος πριν και μετά την αφαίρεση της υψηλής συχνότητας θορύβου

καθώς και του φάσματος πλάτους.

Page 54: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

54 Εργαστηριακές Ασκήσεις Επεξεργασίας Ιατρικού Σήματος

program62a.m clc; clear; close all; % Δημιουργία σήματος με θόρυβο (xnoise) που αποτελείται από ένα % απλό ημιτονοειδές σήμα (x) με πρόσθεση τεχνητού θορύβου (δηλαδή με % πρόσθεση ενός δεύτερου ημιτονοειδούς σήματος υψηλής συχνότητας (noise), % καθώς ο θόρυβος είναι συνήθως στις υψηλές συχνότητες).

N = 100; % Μήκος σήματος

Ax = 20; fx = 2; % Πλάτος και συχνότητα σήματος Anoise = 5; fnoise = 40; % Πλάτος και συχνότητα θορύβου

% Δημιουργία σήματος με θόρυβο for n=0:N-1 xnoise(n+1) = Ax*sin(2*pi*n*fx/N) + Anoise*sin(2*pi*n*fnoise/N); end

% Σήμα με θόρυβο στο πεδίο των συχνοτήτων (Fxnoise) [RFxnoise,IFxnoise] = dft(xnoise);

% Πλάτος του σήματος με θόρυβο στο πεδίο των συχνοτήτων (AFxnoise(k)) for k=0:N-1 AFxnoise(k+1) = sqrt( RFxnoise(k+1)^2 + IFxnoise(k+1)^2 ); end

% Γραφική παράσταση σήματος με θόρυβο στο πεδίο του χρόνου (xnoise(n)) n = [0:N-1]; % Χρονικές στιγμές subplot(3,1,1); plot(n,xnoise); grid on; xlabel('Χρόνος (n)'); ylabel('xnoise(n)'); axis([0 N-1 -Ax +Ax]);

% Γραφική παράσταση του φάσματος πλάτους του σήματος με θόρυβο AFxnoise(k) % (δηλαδή του πλάτους στο πεδίο των συχνοτήτων) k = [0:N-1]; % Συχνότητες subplot(3,1,2); stem(k, AFxnoise); grid on; xlabel('Συχνότητες (k)'); ylabel('AFxnoise(k)'); % Στη γραφική παράσταση του φάσματος πλάτους παρατηρούμε ότι οι υψηλές % συχνότητες (θόρυβος) είναι οι 40 και 60. % Έτσι, μηδενίζουμε αυτές τις συχνότητες στο πεδίο των συχνοτήτων και % στη συνέχεια ανακατασκευάζουμε το σήμα στο πεδίο του χρόνου.

% Μηδενισμός των συχνοτήτων 40 και 60 του σήματος % (θέσεις στον πίνακα: 41 και 61). RFxnoise(41) = 0; IFxnoise(41) = 0; RFxnoise(61) = 0; IFxnoise(61) = 0;

% Ανακατασκευή του σήματος με τον IDFT, αφού έχουν % αφαιρεθεί οι συχνότητες 40 και 60. [Rx,Ix] = idft(RFxnoise,IFxnoise); x = Rx; % Κανονικά x = Rx + jIx, όμως Ix = 0, άρα x = Rx.

% Γραφική παράσταση του ανακατασκευασμένου σήματου στο πεδίο του χρόνου % (x(n)), δηλαδή μετά από το φιλτράρισμα στο πεδίο των συχνοτήτων. subplot(3,1,3); plot(n,x); grid on; xlabel('Χρόνος (n)'); ylabel('x(n)');

Page 55: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Διακριτός Μετασχηματισμός Fourier - Εφαρμογές 55

Αποτελέσματα

Page 56: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

56 Εργαστηριακές Ασκήσεις Επεξεργασίας Ιατρικού Σήματος

6.3 Εργαστηριακές ασκήσεις

Άσκηση 6.3α: Αφαίρεση θορύβου από ηλεκτροκαρδιογραφικό σήμα:

Στην Άσκηση αυτή θα φορτώσουμε ένα ηλεκτροκαρδιογραφικό σήμα από το δίσκο, θα προσπα-

θήσουμε να εντοπίσουμε τις συχνότητες του θορύβου μέσα σ’ αυτό και στη συνέχεια θα τις μηδε-

νίσουμε ώστε να ελαττώσουμε το θόρυβο από το αρχικό σήμα (όπως κάναμε στην Εργασία 6.2α).

Θα χρειαστούμε τις συναρτήσεις sread.m (Εργασία 1.2δ), dft.m (Εργασία 5.2α) και idft.m (Ερ-

γασία 5.2β).

- Κατασκευάστε πρόγραμμα (program63a.m) στο οποίο να κάνετε τα παρακάτω:

α) Φορτώστε το σήμα ecg.txt από το δίσκο (sread.m, Εργασία 1.2δ) και απεικονίστε το:

β) Το ecg.txt είναι αρκετά μεγάλο σήμα (έχει 4355 τιμές). Για το λόγο αυτό και για λόγους ταχύ-

τητας υπολογισμών, θα εργαστούμε στη συνέχεια μόνο με ένα τμήμα του: Αποθηκεύστε σε έναν

άλλο πίνακα ένα τμήμα του αρχικού σήματος (τις τιμές π.χ. από 100 έως 1000) και απεικονίστε

το:

γ) Υπολογίστε το φάσμα πλάτους του στο πεδίο των συχνοτήτων και απεικονίστε το:

0 500 1000 1500 2000 2500 3000 3500 4000 4500-0.5

0

0.5

1

1.5

n

ecg

0 100 200 300 400 500 600 700 800 900-0.5

0

0.5

1

1.5

n

x

0 100 200 300 400 500 600 700 800 9000

0.02

0.04

0.06

0.08

0.1

k

AF

x

0 100 200 300 400 500 600 700 800 9000

0.02

0.04

0.06

0.08

0.1

k

AF

x (

denois

ed)

0 100 200 300 400 500 600 700 800 900-0.5

0

0.5

1

1.5

n

x (

denois

ed)

0 500 1000 1500 2000 2500 3000 3500 4000 4500-0.5

0

0.5

1

1.5

n

ecg

0 100 200 300 400 500 600 700 800 900-0.5

0

0.5

1

1.5

n

x

0 100 200 300 400 500 600 700 800 9000

0.02

0.04

0.06

0.08

0.1

k

AF

x

0 100 200 300 400 500 600 700 800 9000

0.02

0.04

0.06

0.08

0.1

k

AF

x (

denois

ed)

0 100 200 300 400 500 600 700 800 900-0.5

0

0.5

1

1.5

n

x (

denois

ed)

0 500 1000 1500 2000 2500 3000 3500 4000 4500-0.5

0

0.5

1

1.5

n

ecg

0 100 200 300 400 500 600 700 800 900-0.5

0

0.5

1

1.5

n

x

0 100 200 300 400 500 600 700 800 9000

0.02

0.04

0.06

0.08

0.1

k

AF

x

0 100 200 300 400 500 600 700 800 9000

0.02

0.04

0.06

0.08

0.1

k

AF

x (

denois

ed)

0 100 200 300 400 500 600 700 800 900-0.5

0

0.5

1

1.5

n

x (

denois

ed)

Page 57: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Διακριτός Μετασχηματισμός Fourier - Εφαρμογές 57

δ) Εντοπίστε (οπτικά) στο φάσμα πλάτους τη συχνότητα εκείνη (συχνότητα αποκοπής) πάνω από

την οποία βρίσκεται ο θόρυβος (κατά την κρίση σας, π.χ. 50). Πρέπει (i) να αποκόπτονται αρκετές

υψηλές συχνότητες, που περιέχουν το θόρυβο, αλλά (ii) να παραμένουν επίσης αρκετές χαμηλές

συχνότητες, που περιέχουν τη χρήσιμη πληροφορία του σήματος.

ε) Μηδενίστε τις συνιστώσες του σήματος στο πεδίο των συχνοτήτων που αντιστοιχούν στις συ-

χνότητες που είναι μεγαλύτερες από τη συχνότητα αποκοπής, και απεικονίστε το νέο φάσμα πλά-

τους (προσοχή, πρέπει να μηδενιστούν και οι συζυγείς συχνότητες):

στ) Ανακατασκευάστε το σήμα στο πεδίο του χρόνου. Απεικονίστε το ανακατασκευασμένο σήμα:

Συγκρίνετε το ανακατασκευασμένο με το αρχικό σήμα. Η αφαίρεση του θορύβου είναι επιτυχής

αν το σήμα έχει εξομαλυνθεί αρκετά, διατηρώντας όμως τη γενική μορφή του.

Δοκιμάστε τη διαδικασία με συχνότητες αποκοπής (α) 25 και (β) 200. Τι παρατηρείτε σε κάθε

περίπτωση (i) για την αφαίρεση του θορύβου και (ii) για τη διατήρηση της μορφής του σήματος;

Στην επόμενη σελίδα φαίνεται η συνολική διαδικασία σε ένα figure με subplots.

0 500 1000 1500 2000 2500 3000 3500 4000 4500-0.5

0

0.5

1

1.5

n

ecg

0 100 200 300 400 500 600 700 800 900-0.5

0

0.5

1

1.5

n

x

0 100 200 300 400 500 600 700 800 9000

0.02

0.04

0.06

0.08

0.1

k

AF

x

0 100 200 300 400 500 600 700 800 9000

0.02

0.04

0.06

0.08

0.1

k

AF

x (

denois

ed)

0 100 200 300 400 500 600 700 800 900-0.5

0

0.5

1

1.5

n

x (

denois

ed)

0 500 1000 1500 2000 2500 3000 3500 4000 4500-0.5

0

0.5

1

1.5

n

ecg

0 100 200 300 400 500 600 700 800 900-0.5

0

0.5

1

1.5

n

x

0 100 200 300 400 500 600 700 800 9000

0.02

0.04

0.06

0.08

0.1

k

AF

x

0 100 200 300 400 500 600 700 800 9000

0.02

0.04

0.06

0.08

0.1

k

AF

x (

denois

ed)

0 100 200 300 400 500 600 700 800 900-0.5

0

0.5

1

1.5

n

x (

denois

ed)

0 500 1000 1500 2000 2500 3000 3500 4000 4500-0.5

0

0.5

1

1.5

n

ecg

0 100 200 300 400 500 600 700 800 900-0.5

0

0.5

1

1.5

n

x

0 100 200 300 400 500 600 700 800 9000

0.02

0.04

0.06

0.08

0.1

k

AF

x

0 100 200 300 400 500 600 700 800 9000

0.02

0.04

0.06

0.08

0.1

k

AF

x (

denois

ed)

0 100 200 300 400 500 600 700 800 900-0.5

0

0.5

1

1.5

n

x (

denois

ed)

Page 58: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

58 Εργαστηριακές Ασκήσεις Επεξεργασίας Ιατρικού Σήματος

0500

1000

1500

2000

2500

3000

3500

4000

4500

-0.50

0.51

1.5

n

ecg

0100

200

300

400

500

600

700

800

900

-0.50

0.51

1.5

n

x

0100

200

300

400

500

600

700

800

900

0

0.0

2

0.0

4

0.0

6

0.0

8

0.1

k

AFx

0100

200

300

400

500

600

700

800

900

0

0.0

2

0.0

4

0.0

6

0.0

8

0.1

k

AFx (denoised)

0100

200

300

400

500

600

700

800

900

-0.50

0.51

1.5

n

x (denoised)

Page 59: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

7 Συνέλιξη στο πεδίο των συχνοτήτων

Σε αυτήν την ενότητα θα αναπτυχθεί μια σημαντική εφαρμογή του διάκριτου μετασχηματισμού

Fourier. Συγκεκριμένα, θα δείτε:

πώς πραγματοποιείται η συνέλιξη στο πεδίο των συχνοτήτων με το θεώρημα συνέλιξης.

7.1 Συνοπτική θεωρία

Θεώρημα συνέλιξης (convolution theorem):

«Ο μετασχηματισμός Fourier της συνέλιξης δύο σημάτων ισούται με το γινόμενο των με-

τασχηματισμών Fourier των δύο σημάτων»:

Fy(k) = Fx(k) · Fh(k)

όπου y(n) = x(n) h(n)

Υπολογισμός συνέλιξης χρησιμοποιώντας το θεώρημα της συνέλιξης:

Το θεώρημα αυτό μας δίνει έναν διαφορετικό τρόπο υπολογισμού της συνέλιξης μεταξύ

δύο σημάτων:

Η συνέλιξη μεταξύ δύο σημάτων ισούται με τον αντίστροφο μετασχηματισμό Fourier του

γινομένου των σημάτων στο πεδίο των συχνοτήτων:

( ) ( ) ( ) ( ) ( ) ( )y n x n h n IDFT Fy k IDFT Fx k Fh k *

Πιο αναλυτικά, ο υπολογισμός της συνέλιξης, χρησιμοποιώντας το θεώρημα της συνέλιξης,

γίνεται σε 3 βήματα:

1. Μετασχηματίζουμε κατά Fourier τα αρχικά σήματα (x, h), δημιουργώντας τα σήματα

στο πεδίο των συχνοτήτων (Fx, Fh).

2. Πολλαπλασιάζουμε τα σήματα στο πεδίο των συχνοτήτων, βρίσκοντας (λόγω του θεω-

ρήματος της συνέλιξης) τη συνέλιξη στο πεδίο των συχνοτήτων (Fy).

3. Βρίσκουμε με IDFT τη συνέλιξη στο πεδίο του χρόνου (y).

Η παραπάνω διαδικασία φαίνεται και στο παρακάτω διάγραμμα ροής:

Θεώρημα συσχέτισης (correlation theorem):

Το θεώρημα της συνέλιξης ισχύει με παρόμοιο τρόπο και για τη συσχέτιση, αρκεί να ληφθεί

ο συζυγής μιγαδικός του δεύτερου μετασχηματισμού Fourier:

Αν r(n) = x(n) h(n) , τότε ( ) ( ) ( )Fr k Fx k Fh k

όπου ( )Fh k = συζυγής μιγαδικός του ( )Fh k

Υπολογισμός συσχέτισης χρησιμοποιώντας το θεώρημα της συσχέτισης:

Μπορούμε να υπολογίσουμε τη συσχέτιση χρησιμοποιώντας το παραπάνω θεώρημα:

( ) ( ) ( ) ( ) ( ) ( )r n x n h n IDFT Fr k IDFT Fx k Fh k

Σχηματικά:

DFT

r(n)

x(n)

IDFT

DFT

h(n)

.

DFT

y(n)

x(n)

IDFT

DFT

h(n)

.

Page 60: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

60 Εργαστηριακές ασκήσεις επεξεργασίας σήματος

7.2 Εργασίες κατανόησης

Εργασία 7.2α: Υπολογισμός συνέλιξης με χρήση του θεωρήματος της συνέλιξης:

Κατασκευάστε ένα πρόγραμμα (program72a.m) το οποίο να υπολογίζει τη συνέλιξη μεταξύ δύο

απλών σημάτων με τη βοήθεια του θεωρήματος της συνέλιξης, σε 3 βήματα:

1. Μετασχηματίζουμε κατά Fourier τα αρχικά σήματα (x, h), δημιουργώντας τα σήματα στο

πεδίο των συχνοτήτων (Fx, Fh).

2. Πολλαπλασιάζουμε τα σήματα στο πεδίο των συχνοτήτων, βρίσκοντας (λόγω του θεωρή-

ματος της συνέλιξης) τη συνέλιξη στο πεδίο των συχνοτήτων (Fy).

3. Βρίσκουμε με IDFT τη συνέλιξη στο πεδίο του χρόνου (y).

Παρά την αυξημένη πολυπλοκότητα, ο υπολογισμός της συνέλιξης δύο σημάτων με την διαδι-

κασία αυτή είναι ταχύτερος –για την ακρίβεια, όταν χρησιμοποιείται σε συνδυασμό με ειδικούς

ταχύτατους αλγορίθμους για DFT, γνωστούς ως FFT (Fast Fourier Transform).

Εύρεση του γινομένου των μετασχηματισμών Fourier:

( ) ( ) ( ) ( ) ( ) ( )Fx k Fh k RFx k j IFx k RFh k j IFh k

( ) ( ) ( ) ( ) ( ) ( ) ( ) ( )RFx k RFh k RFx k j IFh k j IFx k RFh k j IFx k j IFh k

( ) ( ) ( ) ( ) ( ) ( ) ( ) ( )RFx k RFh k IFx k IFh k j RFx k IFh k IFx k RFh k

ή, αλλιώς:

( ) ( ) ( ) ( )Fx k Fh k RFy k j IFy k

όπου ( ) ( ) ( ) ( ) ( )RFy k RFx k RFh k IFx k IFh k , το πραγματικό μέρος του ( )Fy k

και ( ) ( ) ( ) ( ) ( )IFy k RFx k IFh k IFx k RFh k , το φανταστικό μέρος του ( )Fy k

Οι δύο τελευταίες σχέσεις χρησιμοποιούνται στο επόμενο πρόγραμμα για την εύρεση του γινο-

μένου των μετασχηματισμών Fourier των δύο σημάτων.

Σημειώσεις για την κατασκευή του κώδικα του program72a.m:

1) Επαύξηση του μήκους των σημάτων έως το μήκος Nx+Nh-1 με μηδενικά σημεία (όπου Nx και

Nh τα μήκη των δύο σημάτων): Ο λόγος που γίνεται αυτή η επαύξηση είναι τριπλός: Καταρχάς,

τα σήματα πρέπει να έχουν ίδιο μήκος για να είναι δυνατή η πράξη του γινομένου στοιχείο-προς-

στοιχείο των μετασχηματισμών Fourier των δύο σημάτων. Επίσης, επειδή ο DFT θεωρεί ότι τα

σήματα επαναλαμβάνονται περιοδικά, προκαλούνται ανεπιθύμητα αποτελέσματα λόγω επικάλυ-

ψης των τελευταίων σημείων του ενός σήματος στην αρχή του άλλου (wrapping effect), κάτι που

μπορεί να αποφευχθεί με την επέκταση των σημάτων με μηδενικά σημεία. Τέλος, το σύνολο αυ-

τών των μηδενικών σημείων πρέπει να είναι τέτοιο, ώστε να δημιουργείται συνολικά το μήκος

της συνέλιξης όπως υπολογίζεται στο πεδίο του χρόνου (το άθροισμα των μηκών των δύο σημά-

των μείον ένα).

2) Πολλαπλασιασμός με το μήκος του σήματος (N): Λόγω της εφαρμογής του μετασχηματισμού

Fourier (πολλαπλασιασμός με 1/N στη σχέση του DFT –παράγραφος 3.1, σελ. 28) και στα δύο

σήματα, κατά το γινόμενό τους έχει τελικά εφαρμοστεί ο πολλαπλασιαστικός παράγοντας

1/N*1/N=1/N2. Το αποτέλεσμα του ενός εκ των δύο 1/Ν αναιρείται από τον αντίστροφο μετα-

σχηματισμό Fourier που θα ακολουθήσει, αλλά για την αναίρεση και του άλλου 1/N, το τελικό

αποτέλεσμα πρέπει να πολλαπλασιαστεί με το μήκος του σήματος (N).

Page 61: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Συνέλιξη στο πεδίο των συχνοτήτων 61

program72a.m

clc; clear all;

% Σήμα εισόδου: x = [2 3]; % Κρουστική απόκριση συστήματος: h = [0.5 1 0.5];

% Συνέλιξη μέσω του πεδίου των συχνοτήτων, με το θεώρημα της συνέλιξης: % y = IDFT(Fx.Fh)

% Προσοχή: Η παραπάνω σχέση υπλογίζει τη συνέλιξη y των x,h σε 3 βήματα:

% α) Υπολογισμός των Fx και Fh, με DFT (ουσιαστικά RFx,IFx και RFh,IFh)

% β) Εύρεση του γινομένου των Fx και Fh

% (δηλ. της συνέλιξης Fy στο πεδίο των συχνοτήτων)

% γ) Υπολογισμός της συνέλιξης y στο πεδίο του χρόνου με IDFT της Fy.

% Επαύξηση με 0 των δύο σημάτων έως το μήκος Nx+Nh-1 Nx = length(x); Nh = length(h); for i=1:Nh-1 x(Nx+i) = 0; end for i=1:Nx-1 h(Nh+i) = 0; end

% α) Μετασχηματισμοί Fourier [RFx,IFx] = dft(x); % DFT του 1ου σήματος [RFh,IFh] = dft(h); % DFT του 2ου σήματος

% β) Γινόμενο των DFT (Εύρεση συνέλιξης στο πεδίο των συχνοτήτων) for k=1:length(RFx) RFy(k) = RFx(k)*RFh(k) - IFx(k)*IFh(k); % (πραγματικό μέρος) IFy(k) = RFx(k)*IFh(k) + IFx(k)*RFh(k); % (φανταστικό μέρος) end

% γ) Υπολογισμός συνέλιξης στο πεδίο του χρόνου [Ry,Iy] = idft(RFy,IFy);

% Επειδή τα x,h είναι έχουν μόνο πραγματικές τιμές, το ίδιο συμβαίνει και

για τη συνέλιξή τους, άρα Iy=0 και y=Ry.

% Όμως, λόγω της Σημείωσης 3 της παραγράφου 7.2, τελικά έχουμε:

y = length(x)*Ry

Αποτέλεσμα

y =

1 3.5 4 1.5

Page 62: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

62 Εργαστηριακές ασκήσεις επεξεργασίας σήματος

Εργασία 7.2β: Κατασκευή και χρήση συνάρτησης για τον υπολογισμό της συνέλιξης μέσω του

πεδίου των συχνοτήτων:

- Βασιζόμενοι στο πρόγραμμα program72a.m, κατασκευάστε τη συνάρτηση convolution_freq.m

για τον υπολογισμό της συνέλιξης μέσω του πεδίου των συχνοτήτων:

convolution_freq.m function y = convolution_freq(x,h)

% -----------------------------------------------------------------------

% Συνέλιξη (μέσω του πεδίου των συχνοτήτων, με το θεώρημα της συνέλιξης): % y = IDFT(Fx.Fh) % -----------------------------------------------------------------------

% Επαύξηση με 0 των δύο σημάτων έως το μήκος Nx+Nh-1 Nx = length(x); Nh = length(h); for i=1:Nh-1 x(Nx+i) = 0; end for i=1:Nx-1 h(Nh+i) = 0; end

% Μετασχηματισμοί Fourier [RFx,IFx] = dft(x); % DFT του 1ου σήματος [RFh,IFh] = dft(h); % DFT του 2ου σήματος

% Γινόμενο των DFT for k=1:length(RFx) RFy(k) = RFx(k)*RFh(k) - IFx(k)*IFh(k); % (πραγματικό μέρος) IFy(k) = RFx(k)*IFh(k) + IFx(k)*RFh(k); % (φανταστικό μέρος) end

% Συνέλιξη (με χρήση του θεωρήματος συνέλιξης) [Ry,Iy] = idft(RFy,IFy);

% Σήμα εξόδου y = length(x)*Ry;

- Χρησιμοποιήστε στο Command Window τη συνάρτηση που κατασκευάσατε

(convolution_freq.m) καθώς και την convolution.m (Εργασία 3.2δ) για να διαπιστώσετε την

ταύτιση των αποτελεσμάτων τους:

Command Window (εντολές και αποτελέσματα)

x = [2 3];

h = [0.5 1 0.5];

y1 = convolution(x,h)

y1 =

1 3.5 4 1.5

>> y2 = convolution_freq(x,h)

y2 =

1 3.5 4 1.5

Page 63: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Συνέλιξη στο πεδίο των συχνοτήτων 63

- Κατασκευάστε πρόγραμμα (program72b.m) που να υπολογίζει τη συνέλιξη δύο σημάτων με 2

τρόπους (ώστε να φανεί ότι παράγονται τα ίδια αποτελέσματα):

α) απ’ ευθείας στο πεδίο του χρόνου (χρησιμοποιώντας τη συνάρτηση convolution.m, Κεφάλαιο

3),

β) μέσω του πεδίου των συχνοτήτων (με τη συνάρτηση convolution_freq.m που δημιουργήσατε

προηγουμένως):

Απαιτούμενες συναρτήσεις: convolution.m (Εργασία 3.2δ), dft.m και idft.m (Εργασίες 5.2α και

5.2β).

program72b.m

clc; clear all;

% Σήμα εισόδου: x = [2 3]; % Κρουστική απόκριση συστήματος: h = [0.5 1 0.5];

% (α) Συνέλιξη στο πεδίο του χρόνου (απ' ευθείας): y1 = convolution(x,h);

% (β) Συνέλιξη μέσω του πεδίου των συχνοτήτων, με το θεώρημα της συνέλιξης: % y = IDFT(Fx.Fh) y2 = convolution_freq(x,h);

% (γ) Απεικόνιση των αποτελεσμάτων y1 και y2 για σύγκριση: disp('Convolution (directly in time domain)'); y1 disp('Convolution (through frequency domain)'); y2

Αποτελέσματα Convolution (directly in time domain)

y1 =

1 3.5 4 1.5

Convolution (through frequency domain)

y2 =

1 3.5 4 1.5

Page 64: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

64 Εργαστηριακές ασκήσεις επεξεργασίας σήματος

7.3 Εργαστηριακές ασκήσεις

Άσκηση 7.3α: Εξομάλυνση καρδιογραφικού σήματος.

Δημιουργήστε ένα πρόγραμμα (program73a.m), το οποίο να προκαλεί εξομάλυνση (smoothing)

σε ένα καρδιογραφικό σήμα. Η εξομάλυνση πρέπει να πραγματοποιείται με τη συνέλιξη ενός συ-

στήματος κρουστικής απόκρισης ίσης με [0.25 0.5 0.25] σε ένα τμήμα ενός προσομοιωμένου

καρδιογραφήματος (βλ. και Άσκηση 1.3β). Η συνέλιξη πρέπει να πραγματοποιείται μέσω του πε-

δίου των συχνοτήτων (χρήση συνάρτησης convolution_freq.m). Ακολουθήστε τα παρακάτω βή-

ματα:

(i) Δημιουργείστε ένα φίλτρο εξομάλυνσης στο πεδίο του χρόνου με κρουστική απόκριση ίση με

[0.25 0.5 0.25].

(ii) Φορτώστε το καρδιογραφικό σήμα 'ecg.txt' από το δίσκο σε έναν πίνακα (πρέπει να βρίσκεται

στο Current Directory).

(iii) Για λόγους ταχύτητας, επιλέξτε μόνο ένα μικρό κομμάτι του σήματος, π.χ. τις χρονικές στιγ-

μές από 50 έως 250, αποθηκεύοντάς τις σε έναν άλλο πίνακα για τη συνέχεια της άσκησης.

(iii) Πραγματοποιείστε τη συνέλιξη του φίλτρου με το τμήμα του καρδιογραφικού σήματος μέσω

του πεδίου των συχνοτήτων χρησιμοποιώντας το θεώρημα συνέλιξης (δηλ. χρησιμοποιώντας τη

συνάρτηση convolution_freq.m).

(iv) Απεικονείστε το αρχικό και το εξομαλυμένο σήμα στους ίδιους άξονες, χρησιμοποιώντας

διαφορετικά χρώματα.

Σημείωση: Το παραγόμενο σήμα της συνέλιξης έχει διπλάσιο μήκος από το αναμενόμενο, λόγω

του διπλασιασμού του μήκους των σημάτων (επαυξάνοντας με 0). Για το λόγο αυτό, μπορεί κανείς

να διατηρήσει μόνο το πρώτο μισό του παραγόμενου σήματος.

Το αποτέλεσμα πρέπει να είναι όπως στο παρακάτω σχήμα:

Αποτέλεσμα του program73a.m

Απαιτούμενα αρχεία για το program73a.m:

ecg.txt: Αρχείο προσομοιωμένου καρδιογραφήματος (βλ. και Άσκηση 1.3β)

sread.m: Συνάρτηση για το διάβασμα του σήματος από το δίσκο (Εργασία 1.2δ).

dft.m.m: Συνάρτηση διάκριτου μετασχηματισμού Fourier (Εργασία 5.2α).

idft.m.m: Συνάρτηση αντίστροφου διάκριτου μετασχηματισμού Fourier (Εργασία 5.2β).

convolution_freq.m: Συνάρτηση συνέλιξης μέσω πεδίου συχνοτήτων (Εργασία 7.2β)

0 20 40 60 80 100 120 140 160 180 200-0.2

-0.1

0

0.1

0.2

0.3

0.4

0.5

Σήμα εισόδου

Φιλτραρισμένο σήμα

Page 65: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Συνέλιξη στο πεδίο των συχνοτήτων 65

Άσκηση 7.3β: Υπολογισμός συσχέτισης με χρήση του θεωρήματος της συσχέτισης:

Με τη βοήθεια του θεωρήματος της συσχέτισης και με μικρές τροποποιήσεις του προγράμματος

program72a.m (Εργασία 7.2α), κατασκευάστε πρόγραμμα (program73b.m), στο οποίο να υπο-

λογίζεται η συσχέτιση μεταξύ δύο σημάτων με τη βοήθεια του θεωρήματος της συσχέτισης.

Να ληφθούν υπ’ όψιν οι σημειώσεις για την κατασκευή του προγράμματος program72a.m (Ερ-

γασία 7.2α), με τη διαφορά ότι κατά το διπλασιασμό του μήκους των δύο σημάτων επαυξάνοντας

με 0 (σημείωση 2) το ένα σήμα πρέπει να επαυξηθεί προς τα δεξιά, ενώ το άλλο προς τ’ αριστερά

(μπορείτε να εξηγήσετε γιατί;).

Απαιτούμενες συναρτήσεις: correlation.m (Εργασία 4.2β), dft.m και idft.m (Εργασίες 5.2α και

5.2β).

Άσκηση 7.3γ: Κατασκευή και χρήση συνάρτησης για τον υπολογισμό της συσχέτισης μέσω του

πεδίου των συχνοτήτων:

Βασιζόμενοι στο πρόγραμμα program73b.m (Άσκηση 7.3β), κατασκευάστε το αρχείο συναρτή-

σεων correlation_freq.m, για τον υπολογισμό της συσχέτισης μέσω του πεδίου των συχνοτήτων.

Στη συνέχεια, χρησιμοποιήστε στο Command Window με απλά σήματα τη συνάρτηση που κατα-

σκευάσατε (correlation_freq.m), καθώς και την correlation.m (Εργασία 4.2β) για να διαπιστώ-

σετε την ταύτιση των αποτελεσμάτων τους.

Page 66: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

8 Φιλτράρισμα στο πεδίο των συχνοτήτων

Σε αυτήν την ενότητα θα εξοικειωθείτε με την υλοποίηση των βασικών ψηφιακών φίλτρων στο

πεδίο των συχνοτήτων, και συγκεκριμένα θα δείτε:

τον τρόπο υλοποίησης βασικών ψηφιακών φίλτρων (Ιδεώδες, Butterworth, Εκθετικό) στο

πεδίο των συχνοτήτων, σε κάθε μία από τις βασικές μορφές τους (Low-pass, High-pass,

Band-Reject, Band-Pass), και

τον τρόπο με τον οποίο γίνεται το φιλτράρισμα ενός ψηφιακού σήματος στο πεδίο των συ-

χνοτήτων, χρησιμοποιώντας τα παραπάνω φίλτρα και το θεώρημα της συνέλιξης.

8.1 Συνοπτική θεωρία

Φιλτράρισμα σήματος = συνέλιξη ενός σήματος x(n) με ένα ειδικά σχεδιασμένο σήμα h(n)

(που ονομάζεται φίλτρο), με σκοπό την αποκοπή ή την ενίσχυση συγκεκριμένων περιοχών

συχνοτήτων του x(n).

y(n) = x(n) h(n)

Φιλτράρισμα σήματος στο πεδίο των συχνοτήτων = όταν το φίλτρο δίνεται απ’ ευθείας στο

πεδίο των συχνοτήτων ( Fh(k) ). Τότε, το φιλτράρισμα (δηλαδή η συνέλιξη του σήματος με

το φίλτρο) εκτελείται σύμφωνα με το θεώρημα της συνέλιξης:

Fy(k) = Fx(k) · Fh(k)

όπου Fx(k), Fy(k) οι μετασχηματισμοί Fourier των x(n), y(n).

Άρα το φιλτραρισμένο σήμα είναι:

( ) ( ) ( )y n IDFT Fx k Fh k

Το φιλτράρισμα ενός σήματος στο πεδίο των συχνοτήτων γίνεται σε 3 βήματα:

1. Μετασχηματίζουμε κατά Fourier το αρχικό σήμα x, δημιουργώντας το Fx.

2. Πολλαπλασιάζουμε το Fx με το φίλτρο Fh, που δίνεται απευθείας στο πεδίο των συ-

χνοτήτων, βρίσκοντας το φιλτραρισμένο σήμα στο πεδίο των συχνοτήτων Fy.

3. Βρίσκουμε με IDFT το φιλτραρισμένο σήμα y στο πεδίο του χρόνου.

Η παραπάνω διαδικασία φαίνεται και στο παρακάτω διάγραμμα ροής:

Φίλτρα μηδενικής φάσης (zero-shift phase): Στην πράξη θα εργαστούμε με φίλτρα στο πε-

δίο των συχνοτήτων τα οποία έχουν μόνο πραγματικό μέρος ( Fh(k) = RFh(k) ). Αυτό ση-

μαίνει ότι το μιγαδικό μέρος αυτών των φίλτρων είναι μηδέν, κατά συνέπεια ταυτίζονται

με το φάσμα πλάτους τους, ενώ επίσης η φάση τους είναι μηδέν (φ(k) = 0):

Στα φίλτρα μηδενικής φάσης ισχύουν τα εξής:

φ(k) = 0 , IFh(k) = 0 , Fh(k) = RFh(k) = Fh(k)

Στην επόμενη σελίδα βρίσκονται οι μαθηματικές σχέσεις ορισμού των συνηθέστερων φίλ-

τρων μηδενικής φάσης στο πεδίο των συχνοτήτων:

Φίλτρο:

Έξοδος: y(n)

Είσοδος: x(n)

IDFT

DFT

.

Page 67: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Φιλτράρισμα στο πεδίο των συχνοτήτων 67

Ιδεώδη φίλτρα Φίλτρα Butterworth Εκθετικά φίλτρα

Low-pass: Αποκοπή υψηλών συχνοτήτων (π.χ. θορύβου)

fco = συχνότητα αποκοπής (cut-off frequency)

1,( )

0,

co

co

k fFh k

k f

2

1( )

1co

nkf

Fh k

n = βαθμός φίλτρου (όσο μεγαλύτερος,

τόσο τείνει προς το ιδεώδες)

ln 2

( )

nk

fcoFh k e

n = βαθμός φίλτρου (όσο μεγαλύτερος,

τόσο τείνει προς το ιδεώδες)

High-pass: Αποκοπή χαμηλών συχνοτήτων

fco = συχνότητα αποκοπής (cut-off frequency)

0,( )

1,

co

co

k fFh k

k f

2

1( )

1 con

f

k

Fh k

n = βαθμός φίλτρου (όσο μεγαλύτερος,

τόσο τείνει προς το ιδεώδες)

ln 2

( )

nfcok

Fh k e

n = βαθμός φίλτρου (όσο μεγαλύτερος,

τόσο τείνει προς το ιδεώδες)

Band-Reject: Αποκοπή μέσων συχνοτήτων

d = κέντρο συχνοτήτων αποκοπής (μετατόπιση προς τα δεξιά κατά d, σε σχέση με το high-pass)

2

2 2

2

1,

( ) 0,

1,

w

w w

w

k d

Fh k d k d

k d

w = εύρος συχνοτήτων αποκοπής

2

1( )

1 con

f

k d

Fh k

n = βαθμός φίλτρου

ln 2

( )

nfco

k dFh k e

n = βαθμός φίλτρου

Band-Pass: Διέλευση μόνο μέσων συχνοτήτων

d = κέντρο συχνοτήτων διέλευσης (μετατόπιση προς τα δεξιά κατά d, σε σχέση με το low-pass)

2

2 2

2

0,

( ) 1,

0,

w

w w

w

k d

Fh k d k d

k d

w = εύρος συχνοτήτων αποκοπής

2

1( )

1co

nk df

Fh k

n = βαθμός φίλτρου

ln 2

( )

nk dfcoFh k e

n = βαθμός φίλτρου

Page 68: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

68 Εργαστηριακές ασκήσεις επεξεργασίας σήματος

8.2 Εργασίες κατανόησης

Εργασία 8.2α: Δημιουργία συνάρτησης φιλτραρίσματος: Κατασκευάστε κατάλληλη συνάρτηση

(convolution_freq_filter0.m) η οποία να εφαρμόζει ένα φίλτρο μηδενικής φάσης (φίλτρο χωρίς

φανταστικό μέρος) σε ένα σήμα (δηλαδή να υπολογίζει τη συνέλιξη ενός πραγματικού σήματος

στο πεδίο του χρόνου x(n) με ένα πραγματικό φίλτρο στο πεδίο των συχνοτήτων Fh(x)):

Το φιλτραρισμένο σήμα είναι: y(n) = IDFT(Fx·Fh)

Η παραπάνω διαδικασία γίνεται σε 3 βήματα:

1. Fx = DFT(x) : Μετασχηματίζουμε κατά Fourier το αρχικό σήμα x, δημιουργώντας το Fx.

2. Fy = Fx·Fh : πολλαπλασιάζουμε το Fx με το φίλτρο Fh, που δίνεται απευθείας στο πεδίο

των συχνοτήτων, βρίσκοντας το φιλτραρισμένο σήμα στο πεδίο των συχνοτήτων Fy:

Fy = Fx·Fh = (RFx + j IFx) · Fh = RFx·Fh + j IFx·Fh

Άρα το πραγματικό και φανταστικό μέρος του Fy είναι: RFy = RFx·Fh και IFy = IFx·Fh

3. y(n) = IDFT(Fy) : Βρίσκουμε με IDFT το φιλτραρισμένο σήμα y στο πεδίο του χρόνου.

Σημείωση:Η εξίσωση του μήκους των σημάτων καθώς ο διπλασιασμός των σημάτων με μηδενικά (δια-

δικασίες που εφαρμόστηκαν στο προηγούμενο κεφάλαιο) δεν έχουν νόημα στην περίπτωση αυτή, διότι

το φίλτρο δεν βρίσκεται στο πεδίο του χρόνου. Αντίθετα, κατασκευάζουμε το φίλτρο απευθείας στο

πεδίο των συχνοτήτων, φροντίζοντας να έχει ίσο μήκος με το σήμα.

Ακολουθώντας τα παραπάνω 3 βήματα κατασκευάζουμε τη συνάρτηση φιλτραρίσματος στο πεδίο

των συχνοτήτων με φίλτρο μηδενικής φάσης:

Απαιτούμενες συναρτήσεις: dft.m και idft.m (Εργασία 5.2γ).

convolution_freq_filter0.m function y = convolution_freq_filter0(x,Fh) % x = σήμα εισόδου (πραγματικό μέρος) στο πεδίο του χρόνου % Fh = φίλτρο (μηδενκής φάσης, δηλαδή πραγματικό) στο πεδίο των συχνοτήτων % (Το Fh πρέπει να έχει δημιουργηθεί έτσι ώστε να έχει ίδιο μήκος με το x) % y = σήμα εξόδου (πραγματικό μέρος) στο πεδίο του χρόνου

% ----------------------------------------------------------------------- % Συνέλιξη (μέσω του πεδίου των συχνοτήτων, με το θεώρημα της συνέλιξης): % y = IDFT(Fx.Fh) % όπου Fx = DFT(x) % και Fh = φίλτρο αποκοπής ή διέλευσης συχνοτήτων % -----------------------------------------------------------------------

% DFT(x): Μετασχηματισμός Fourier του x [RFx,IFx] = dft(x); % Fx.Fh: Γινόμενο των DFT for k=1:length(RFx) RFy(k) = RFx(k)*Fh(k); % (πραγματικό μέρος) IFy(k) = IFx(k)*Fh(k); % (φανταστικό μέρος) end

% y=IDFT(Fx.Fh): Συνέλιξη (με χρήση του θεωρήματος συνέλιξης) [Ry,Iy] = idft(RFy,IFy);

% Σήμα εξόδου (το Iy είναι 0, επειδή τόσο το σήμα εισόδου όσο % και το φίλτρο έχουν μόνο πραγματικό μέρος.) y = Ry;

Page 69: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Φιλτράρισμα στο πεδίο των συχνοτήτων 69

Εργασία 8.2β: Δημιουργία συναρτήσεων φίλτρων: Δημιουργείστε τις συναρτήσεις που ακολου-

θούν, οι οποίες υλοποιούν τα βασικά ψηφιακά φίλτρα (Ιδεώδες, Butterworth, Εκθετικό), σε κάθε

μία από τις βασικές μορφές τους (Low-pass, High-pass, Band-Reject, Band-Pass).

Σημείωση: Ένα ψηφιακό φίλτρο στο πεδίο των συχνοτήτων σχεδιάζεται από k=0 έως k=N/2, και από

N/2 έως N επαναλαμβάνεται το ίδιο (λόγω του θεωρήματος του συζυγούς μιγαδικού).

Αυτό στην πράξη σημαίνει πως ό,τι συμβαίνει για κάποια συχνότητα k, θα συμβαίνει και για την N-k.

Αυτή η παρατήρηση θα μας βοηθήσει να κατασκευάσουμε τον κώδικα για την υλοποίηση των φίλτρων

στο πεδίο των συχνοτήτων.

Ιδεώδες (ideal) φίλτρο (Low-pass και High-pass):

Οι σχέσεις των low-pass και high-pass ιδεωδών φίλτρων παίρνουν την εξής μορφή, ώστε ό,τι

συμβαίνει για κάποια συχνότητα k, να συμβαίνει και για την N-k:

Low-pass: 1, για (ή )

( )0, αλλού

co cok f N k fFh k

όπου fco = συχνότητα αποκοπής (cut-off frequency).

filter_ideal_lowpass.m function Fh = filter_ideal_lowpass(N,fco) % Ideal Low-pass filter % N = filter length (must be equal the signal length) % fco = cut-off frequency

for k=0:N-1 % (k=συχνότητα, k+1=δείκτης πίνακα) if k<=fco | N-k<=fco, Fh(k+1) = 1; else Fh(k+1) = 0; end end

High-pass: 0, για (ή )

( )1, αλλού

co cok f N k fFh k

όπου fco = συχνότητα αποκοπής (cut-off frequency).

filter_ideal_highpass.m function Fh = filter_ideal_highpass(N,fco) % Ideal High-pass filter % N = filter length (must be equal the signal length) % fco = cut-off frequency

for k=0:N-1 % (k=συχνότητα, k+1=δείκτης πίνακα) if k<=fco | N-k<=fco, Fh(k+1) = 0; else Fh(k+1) = 1; end end

Page 70: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

70 Εργαστηριακές ασκήσεις επεξεργασίας σήματος

Ιδεώδες (ideal) φίλτρο (Band-Pass και Band-Reject):

Οι σχέσεις των band-reject και band-pass ιδεωδών φίλτρων παίρνουν την εξής μορφή, ώστε ό,τι

συμβαίνει για κάποια συχνότητα k, να συμβαίνει και για την N-k:

Band-Pass:

𝐹𝑘(𝑘) = {1, 𝑘 > 𝑑 −

𝑤

2 και 𝑘 < 𝑑 +

𝑤

2 (ή: 𝑁 − 𝑘 > 𝑑 −

𝑤

2 και 𝑁 − 𝑘 < 𝑑 +

𝑤

2)

0, αλλού

όπου d = κέντρο συχνοτήτων διέλευσης (μετατόπιση

προς τα δεξιά σε σχέση με το low-pass)

και w = εύρος συχνοτήτων διέλευσης

filter_ideal_bandpass.m function Fh = filter_ideal_bandpass(N,d,w) % Ideal Band-Pass filter % N = filter length (must be equal the signal length) % d = center of the filter % w = width of the filter

for k=0:N-1 % (k=συχνότητα, k+1=δείκτης πίνακα) if (k>d-w/2 & k<d+w/2) | (N-k>d-w/2 & N-k<d+w/2) Fh(k+1) = 1; else Fh(k+1) = 0; end end

Band-Reject:

𝐹𝑘(𝑘) = {0, 𝑘 > 𝑑 −

𝑤

2 και 𝑘 < 𝑑 +

𝑤

2 (ή: 𝑁 − 𝑘 > 𝑑 −

𝑤

2 και 𝑁 − 𝑘 < 𝑑 +

𝑤

2)

1, αλλού

όπου d = κέντρο συχνοτήτων αποκοπής (μετατόπιση

προς τα δεξιά σε σχέση με το high-pass)

και w = εύρος συχνοτήτων αποκοπής

filter_ideal_bandreject.m function Fh = filter_ideal_bandreject(N,d,w) % Ideal Band-Reject filter % N = filter length (must be equal the signal length) % d = center of the filter % w = width of the filter

for k=0:N-1 % (k=συχνότητα, k+1=δείκτης πίνακα) if (k>d-w/2 & k<d+w/2) | (N-k>d-w/2 & N-k<d+w/2) Fh(k+1) = 0; else Fh(k+1) = 1; end end

Page 71: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Φιλτράρισμα στο πεδίο των συχνοτήτων 71

Butterworth φίλτρο (Low-pass και High-pass):

Οι σχέσεις των low-pass και high-pass φίλτρων Butterworth παίρνουν την εξής μορφή, ώστε ό,τι

συμβαίνει για κάποια συχνότητα k, να συμβαίνει και για την N-k:

Low-pass:

22

22

1, για

1( )

1, για

1

co

co

Nn

kf

Nn

N kf

k

Fh k

k

όπου fco = συχνότητα αποκοπής (cut-off frequency)

και n = βαθμός φίλτρου (όσο μεγαλύτερος, τόσο το φίλτρο τείνει προς το ιδεώδες)

filter_butterworth_lowpass.m function Fh = filter_butterworth_lowpass(N,fco,n) % Butterworth Low-pass filter % N = filter length (must be equal the signal length) % fco = cut-off frequency % n = degree

for k=0:N-1 % (k=συχνότητα, k+1=δείκτης πίνακα) if k<N/2 Fh(k+1) = 1 / ( 1+(k/fco)^(2*n) ); else Fh(k+1) = 1 / ( 1+((N-k)/fco)^(2*n) ); end end

High-pass:

22

22

1, για

1( )

1, για

1

co

co

Nn

f

k

Nn

f

N k

k

Fh k

k

όπου fco = συχνότητα αποκοπής (cut-off frequency)

και n = βαθμός φίλτρου (όσο μεγαλύτερος, τόσο το φίλτρο τείνει προς το ιδεώδες)

filter_butterworth_highpass.m function Fh = filter_butterworth_highpass(N,fco,n) % Butterworth Low-pass filter % N = filter length (must be equal the signal length) % fco = cut-off frequency % n = degree

for k=0:N-1 % (k=συχνότητα, k+1=δείκτης πίνακα) if k<N/2 Fh(k+1) = 1 / ( 1+(fco/k)^(2*n) ); else Fh(k+1) = 1 / ( 1+(fco/(N-k))^(2*n) ); end end

Παρατήρηση: Η σημασία ττης fco στο φίλτρο Butterworth είναι ότι για συχνότητα ίση με την fco,

η τιμή του φίλτρου έχει υποδιπλασιαστεί (όπως εύκολα αποδεικνύεται από την εξίσωση του φίλ-

τρου Butterworth).

Page 72: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

72 Εργαστηριακές ασκήσεις επεξεργασίας σήματος

Butterworth φίλτρο (Band-Reject και Band-Pass):

Οι σχέσεις των band-reject και band-pass φίλτρων Butterworth παίρνουν την εξής μορφή, ώστε

ό,τι συμβαίνει για κάποια συχνότητα k, να συμβαίνει και για την N-k:

Band-Reject:

22

22

1, για

1( )

1, για

1

co

co

Nn

f

k d

Nn

f

N k d

k

Fh k

k

όπου fco = συχνότητα αποκοπής (cut-off frequency),

n = βαθμός φίλτρου (όσο μεγαλύτερος, τόσο το φίλτρο τείνει προς το ιδεώδες)

και d = κέντρο συχνοτήτων αποκοπής (μετατόπιση προς τα δεξιά σε σχέση με το high-pass)

filter_butterworth_bandreject.m function Fh = filter_butterworth_bandreject(N,fco,n,d) % Butterworth Band-Reject filter % N = filter length (must be equal the signal length) % fco = cut-off frequency % n = degree % d = shift

for k=0:N-1 % (k=συχνότητα, k+1=δείκτης πίνακα) if k<N/2 Fh(k+1) = 1 / ( 1+(fco/(k-d))^(2*n) ); else Fh(k+1) = 1 / ( 1+(fco/(N-k-d))^(2*n) ); end end

Band-Pass:

22

22

1, για

1( )

1, για

1

co

co

Nn

k df

Nn

N k df

k

Fh k

k

όπου fco = συχνότητα αποκοπής (cut-off frequency),

n = βαθμός φίλτρου (όσο μεγαλύτερος, τόσο το φίλτρο τείνει προς το ιδεώδες)

και d = κέντρο συχνοτήτων διέλευσης (μετατόπιση προς τα δεξιά σε σχέση με το low-pass)

filter_butterworth_bandpass.m function Fh = filter_butterworth_bandpass(N,fco,n,d) % Butterworth Band-Pass filter % N = filter length (must be equal the signal length) % fco = cut-off frequency % n = degree % d = shift

for k=0:N-1 % (k=συχνότητα, k+1=δείκτης πίνακα) if k<N/2 Fh(k+1) = 1 / ( 1+((k-d)/fco)^(2*n) ); else Fh(k+1) = 1 / ( 1+((N-k-d)/fco)^(2*n) ); end end

Page 73: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Φιλτράρισμα στο πεδίο των συχνοτήτων 73

Εργασία 8.2γ: Δημιουργία προγράμματος για επίδειξη φιλτραρίσματος στο πεδίο των συχνοτή-

των:

Δημιουργήστε και εκτελέστε τα προγράμματα που ακολουθούν για επίδειξη φιλτραρίσματος, στα

οποία:

(i) δημιουργείται ένα σύνθετο σήμα από 4 ημιτονοειδή σήματα γνωστών συχνοτήτων/πλάτους

(ii) επιλέγεται ένα φίλτρο καλώντας την κατάλληλη συνάρτηση που το δημιουργεί,

(iii) εκτελείται φιλτράρισμα του σύνθετου σήματος με το φίλτρο που επιλέχθηκε,

(iv) απεικονίζεται το φίλτρο, το αρχικό σήμα καθώς και το αποτέλεσμα του φιλτραρίσματος, μαζί

με τα αντίστοιχα φάσματα πλάτους στο πεδίο των συχνοτήτων.

α) Τα program82a_1.m και program82a_2.m αφορούν στα Ιδεώδη φίλτρα (low-pass/high-

pass και band-pass/band-reject αντίστοιχα).

β) Ta program82b_1.m και program82b_2.m αφορούν στα φίλτρα Butterworth (low-

pass/high-pass και band-reject/band-pass αντίστοιχα).

Σημείωση: Απαιτούνται οι συναρτήσεις δημιουργίας των φίλτρων (filter_….m, Εργασία 8.2β) και

η συνάρηση εφαρμογής των φίλτρων (convolution_freq_filter0.m, Εργασία 8.2α).

Πρόγραμμα program82a_1.m

Εφαρμογή Ιδεωδών φίλτρων low-pass και high-pass:

program82a_1.m

clc; clear all; close all;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% IDEAL LOW-PASS & HIGH-PASS FILTERING %%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Signal N = 100; % Μήκος σήματος A1 = 10; A2 = 4; A3 = 2; A4 = 2; % Πλάτη συνιστώντων σημάτων f1 = 1; f2 = 5; f3 = 30; f4 = 40; % Συχνότητες συνιστώντων σημάτων for n=0:N-1 % (n=συχνότητα, n+1=δείκτης πίνακα) x(n+1) = A1*sin(2*pi*n*f1/N) + A2*sin(2*pi*n*f2/N) + ... A3*sin(2*pi*n*f3/N) + A4*sin(2*pi*n*f4/N); end

% Low-pass Ideal filter fco1 = 20; Fh1 = filter_ideal_lowpass(N,fco1); y1 = convolution_freq_filter0(x,Fh1);

% High-pass Ideal filter fco2 = 20; Fh2 = filter_ideal_highpass(N,fco2); y2 = convolution_freq_filter0(x,Fh2);

% Amplitude spectrums [RFx,IFx] = dft(x); for k=1:N, Ax(k) = sqrt(RFx(k)^2+IFx(k)^2); end [RFy1,IFy1] = dft(y1); for k=1:N, Ay1(k) = sqrt(RFy1(k)^2+IFy1(k)^2); end [RFy2,IFy2] = dft(y2); for k=1:N, Ay2(k) = sqrt(RFy2(k)^2+IFy2(k)^2); end

Page 74: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

74 Εργαστηριακές ασκήσεις επεξεργασίας σήματος

% Plots n=[0:N-1]; k=[0:N-1];

subplot(4,2,1); stem(k,Fh1); title('Low pass Ideal filter');

subplot(4,2,2); stem(k,Fh2); title('High pass Ideal filter');

subplot(4,2,3); hold on; plot(n,x); plot(n,y1,'r'); legend('Original signal','Filtered signal');

subplot(4,2,4); hold on; plot(n,x); plot(n,y2,'r'); legend('Original signal','Filtered signal');

subplot(4,2,5); stem(k,Ax); legend('Original Amplitude Spectrum'); axis([0 N min(Ax) max(Ax)]);

subplot(4,2,6); stem(k,Ax); legend('Original Amplitude Spectrum'); axis([0 N min(Ax) max(Ax)]);

subplot(4,2,7); stem(k,Ay1,'r'); legend('Low-pass filtered Amplitude Spectrum'); axis([0 N min(Ax) max(Ax)]);

subplot(4,2,8); stem(k,Ay2,'r'); legend('High-pass filtered Amplitude Spectrum'); axis([0 N min(Ax) max(Ax)]);

Αποτελέσματα

Page 75: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Φιλτράρισμα στο πεδίο των συχνοτήτων 75

Τι παρατηρούμε από τις γραφικές παραστάσεις:

Στο πρόγραμμα αυτό δημιουργήσαμε ένα σύνθετο σήμα που περιείχε δύο χαμηλές συχνότητες (1

και 5) και δύο υψηλές (30 και 40). Στη συνέχεια, φιλτράραμε το σήμα με Ιδεώδες φίλτρο low-

pass και high-pass (με fco=20 και στις 2 περιπτώσεις).

Όπως αναμενόταν, στο φιλτράρισμα low-pass κόπηκαν οι υψηλές συχνότητες (για την ακρίβεια,

οι υψηλότερες της fco, δηλ. η 30 και η 40) ενώ παρέμειναν οι χαμηλές (1 και 5). Το αποτέλεσμα

μπορούμε να το δούμε τόσο στο φάσμα πλάτους, όσο και στη μορφή του φιλτραρισμένου σήματος,

όπου φαίνεται μια αργή ταλάντωση μιας περιόδου (f=1) πάνω στην οποία υπάρχει μια δεύτερη

ταλάντωση 5 περιόδων (f=5), χωρίς τις μικρές απότομες υψίσυχνες κορυφές που υπάρχουν στο

αρχικό σήμα και που οφείλονται στις υψηλές συχνότητες 30 και 40.

Αντίθετα, στο φιλτράρισμα high-pass κόπηκαν οι χαμηλότερες της fco συχνότητες (1 και 5) και

παρέμειναν οι υψηλές (30 και 40). Το αποτέλεσμα μπορούμε να το δούμε τόσο στο φάσμα πλά-

τους, όσο και στη μορφή του φιλτραρισμένου σήματος, όπου φαίνεται ένα σήμα με γρήγορες αυ-

ξομειώσεις, που οφείλονται στις υψηλές συχνότητες 30 και 40.

Page 76: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

76 Εργαστηριακές ασκήσεις επεξεργασίας σήματος

Πρόγραμμα program82a_2.m

Εφαρμογή Ιδεωδών φίλτρων band-reject και band-pass:

program82a_2.m

clc; clear all; close all;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% IDEAL BAND-PASS & BAND-REJECT FILTERING %%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Signal N = 200; % Μήκος σήματος A1 = 10; A2 = 4; A3 = 4; A4 = 2; % Πλάτη συνιστώντων σημάτων f1 = 1; f2 = 30; f3 = 32; f4 = 50; % Συχνότητες συνιστώντων σημάτων for n=0:N-1 % (n=συχνότητα, n+1=δείκτης πίνακα) x(n+1) = A1*sin(2*pi*n*f1/N) + A2*sin(2*pi*n*f2/N) + ... A3*sin(2*pi*n*f3/N) + A4*sin(2*pi*n*f4/N); end

% Band-Pass Ideal filter d1 = 30; w1=20; Fh1 = filter_ideal_bandpass(N,d1,w1); y1 = convolution_freq_filter0(x,Fh1);

% Band-Reject Ideal filter d2 = 30; w2=20; Fh2 = filter_ideal_bandreject(N,d2,w2); y2 = convolution_freq_filter0(x,Fh2);

% Amplitude spectrums [RFx,IFx] = dft(x); for k=1:N, Ax(k) = sqrt(RFx(k)^2+IFx(k)^2); end [RFy1,IFy1] = dft(y1); for k=1:N, Ay1(k) = sqrt(RFy1(k)^2+IFy1(k)^2); end [RFy2,IFy2] = dft(y2); for k=1:N, Ay2(k) = sqrt(RFy2(k)^2+IFy2(k)^2); end

% Plots n=[0:N-1]; k=[0:N-1];

subplot(4,2,1); stem(k,Fh1); title('Band-Pass Ideal filter');

subplot(4,2,2); stem(k,Fh2); title('Band-Reject Ideal filter');

subplot(4,2,3); hold on; grid on; plot(n,x); plot(n,y1,'r'); legend('Original signal','Filtered signal');

subplot(4,2,4); hold on; grid on; plot(n,x); plot(n,y2,'r'); legend('Original signal','Filtered signal');

subplot(4,2,5); stem(k,Ax); legend('Original Amplitude Spectrum'); axis([0 N min(Ax) max(Ax)]);

Page 77: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Φιλτράρισμα στο πεδίο των συχνοτήτων 77

subplot(4,2,6); stem(k,Ax); legend('Original Amplitude Spectrum'); axis([0 N min(Ax) max(Ax)]);

subplot(4,2,7); stem(k,Ay1,'r'); legend('Band-Pass filtered Amplitude Spectrum'); axis([0 N min(Ax) max(Ax)]);

subplot(4,2,8); stem(k,Ay2,'r'); legend('Band-Reject filtered Amplitude Spectrum'); axis([0 N min(Ax) max(Ax)]);

Αποτελέσματα

Παρατηρήσεις:

Στο πρόγραμμα αυτό δημιουργήσαμε ένα σύνθετο σήμα που περιείχε δύο «ακραίες» συχνότητες

(μια πολύ χαμηλή, 1, και μια πολύ υψηλή, 50) και δύο ενδιάμεσες (30 και 32). Στη συνέχεια,

φιλτράραμε το σήμα με ideal φίλτρο band-reject και band-pass (με κέντρο συχνοτήτων αποκο-

πής/διέλευσης d=30 και εύρος συχνοτήτων αποκοπής/διέλευσης w=20, δηλαδή το εύρος των συ-

χνοτήτων αποκοπής/διέλευσης ήταν από 20 έως 40).

Όπως αναμενόταν, στο φιλτράρισμα band-reject, κόπηκαν οι ενδιάμεσες συχνότητες 30 και 32

και παρέμειναν οι ακραίες 1 και 50. Το αποτέλεσμα μπορούμε να το δούμε τόσο στο φάσμα πλά-

τους, όσο και στη μορφή του φιλτραρισμένου σήματος (μια αργή ταλάντωση μιας περιόδου (f=1)

στην οποία υπάρχει μια δεύτερη υψίσυχνη ταλάντωση, η f=50).

Αντίθετα, στο φιλτράρισμα band-pass παρέμειναν οι ενδιάμεσες συχνότητες 30 και 32 ενώ κόπη-

καν οι δύο ακραίες. Το αποτέλεσμα μπορούμε να το δούμε τόσο στο φάσμα πλάτους, όσο και στη

μορφή του φιλτραρισμένου σήματος (μορφή διακροτήματος, που παράγεται από δύο συχνότητες

που είναι πολύ κοντά η μία στην άλλη, όπως οι 30 και 32).

Page 78: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

78 Εργαστηριακές ασκήσεις επεξεργασίας σήματος

Πρόγραμμα program82b_1.m

Εφαρμογή φίλτρων Butterworth low-pass και high-pass:

program82b_1.m

clc; clear all; close all;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% BUTTERWORTH LOW-PASS & HIGH-PASS FILTERING %%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Signal N = 100; % Μήκος σήματος A1 = 10; A2 = 4; A3 = 2; A4 = 2; % Πλάτη συνιστώντων σημάτων f1 = 1; f2 = 5; f3 = 30; f4 = 40; % Συχνότητες συνιστώντων σημάτων for n=0:N-1 % (n=συχνότητα, n+1=δείκτης πίνακα) x(n+1) = A1*sin(2*pi*n*f1/N) + A2*sin(2*pi*n*f2/N) + ... A3*sin(2*pi*n*f3/N) + A4*sin(2*pi*n*f4/N); end

% Low-pass Butterworth filter fco1 = 25; n1 = 3; Fh1 = filter_butterworth_lowpass(N,fco1,n1); y1 = convolution_freq_filter0(x,Fh1);

% High-pass Butterworth filter fco2 = 25; n2 = 3; Fh2 = filter_butterworth_highpass(N,fco2,n2); y2 = convolution_freq_filter0(x,Fh2);

% Amplitude spectrums [RFx,IFx] = dft(x); for k=1:N, Ax(k) = sqrt(RFx(k)^2+IFx(k)^2); end [RFy1,IFy1] = dft(y1); for k=1:N, Ay1(k) = sqrt(RFy1(k)^2+IFy1(k)^2); end [RFy2,IFy2] = dft(y2); for k=1:N, Ay2(k) = sqrt(RFy2(k)^2+IFy2(k)^2); end

% Plots n=[0:N-1]; k=[0:N-1];

subplot(4,2,1); stem(k,Fh1); title('Low-pass Butterworth filter');

subplot(4,2,2); stem(k,Fh2); title('High-pass Butterworth filter');

subplot(4,2,3); hold on; plot(n,x); plot(n,y1,'r'); legend('Original signal','Filtered signal');

subplot(4,2,4); hold on; plot(n,x); plot(n,y2,'r'); legend('Original signal','Filtered signal');

subplot(4,2,5); stem(k,Ax); legend('Original Amplitude Spectrum'); axis([0 N min(Ax) max(Ax)]);

Page 79: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Φιλτράρισμα στο πεδίο των συχνοτήτων 79

subplot(4,2,6); stem(k,Ax); legend('Original Amplitude Spectrum'); axis([0 N min(Ax) max(Ax)]);

subplot(4,2,7); stem(k,Ay1,'r'); legend('Low-pass filtered Amplitude Spectrum'); axis([0 N min(Ax) max(Ax)]);

subplot(4,2,8); stem(k,Ay2,'r'); legend('High-pass filtered Amplitude Spectrum'); axis([0 N min(Ax) max(Ax)]);

Αποτελέσματα

Παρατηρήσεις:

Στο πρόγραμμα αυτό εργαστήκαμε όπως ακριβώς και στο program82a_1.m, με τη διαφορά ότι

χρησιμοποιήσαμε φίλτρο Butterworth αντί για το Ιδεώδες.

Τα αποτελέσματα είναι παρόμοια με του Ιδεώδους φίλτρου, με τη διαφορά ότι, λόγω της ομαλής

αποκοπής των συχνοτήτων, οι συχνότητες 30 και 40 δεν έχουν αποκοπεί τελείως στο low-pass,

όπως μπορούμε να δούμε στο φάσμα πλάτους (σε αντίθεση με το Ιδεώδες, όπου η αποκοπή είναι

πλήρης μετά την fco). Αντίθετα, στο high-pass οι συχνότητες 30 και 40 έχουν παραμείνει (όπως

είναι αναμενόμενο), αλλά το πλάτος τους είναι κάπως ελαττωμένο.

Page 80: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

80 Εργαστηριακές ασκήσεις επεξεργασίας σήματος

Πρόγραμμα program82b_2.m

Εφαρμογή φίλτρων Butterworth band-reject και band-pass:

program82b_2.m

clc; clear all; close all;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% BUTTERWORTH BAND-PASS & BAND-REJECT FILTERING %%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Signal N = 200; % Μήκος σήματος A1 = 10; A2 = 4; A3 = 4; A4 = 2; % Πλάτη συνιστώντων σημάτων f1 = 1; f2 = 30; f3 = 32; f4 = 50; % Συχνότητες συνιστώντων σημάτων for n=0:N-1 % (n=συχνότητα, n+1=δείκτης πίνακα) x(n+1) = A1*sin(2*pi*n*f1/N) + A2*sin(2*pi*n*f2/N) + ... A3*sin(2*pi*n*f3/N) + A4*sin(2*pi*n*f4/N); end

% Band-Pass Butterworth filter fco1 = 25; n1 = 3; d1 = 30; Fh1 = filter_butterworth_bandpass(N,fco1,n1,d1); y1 = convolution_freq_filter0(x,Fh1);

% Band-Reject Butterworth filter fco2 = 25; n2 = 3; d2 = 30; Fh2 = filter_butterworth_bandreject(N,fco2,n2,d2); y2 = convolution_freq_filter0(x,Fh2);

% Amplitude spectrums [RFx,IFx] = dft(x); for k=1:N, Ax(k) = sqrt(RFx(k)^2+IFx(k)^2); end [RFy1,IFy1] = dft(y1); for k=1:N, Ay1(k) = sqrt(RFy1(k)^2+IFy1(k)^2); end [RFy2,IFy2] = dft(y2); for k=1:N, Ay2(k) = sqrt(RFy2(k)^2+IFy2(k)^2); end

% Plots n=[0:N-1]; k=[0:N-1];

subplot(4,2,1); stem(k,Fh1); title('Band-Pass Butterworth filter');

subplot(4,2,2); stem(k,Fh2); title('Band-Reject Butterworth filter');

subplot(4,2,3); hold on; plot(n,x); plot(n,y1,'r'); legend('Original signal','Filtered signal');

subplot(4,2,4); hold on; plot(n,x); plot(n,y2,'r'); legend('Original signal','Filtered signal');

subplot(4,2,5); stem(k,Ax); legend('Original Amplitude Spectrum'); axis([0 N min(Ax) max(Ax)]);

Page 81: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Φιλτράρισμα στο πεδίο των συχνοτήτων 81

subplot(4,2,6); stem(k,Ax); legend('Original Amplitude Spectrum'); axis([0 N min(Ax) max(Ax)]);

subplot(4,2,7); stem(k,Ay1,'r'); legend('Band-Pass filtered Amplitude Spectrum'); axis([0 N min(Ax) max(Ax)]);

subplot(4,2,8); stem(k,Ay2,'r'); legend('Band-Reject filtered Amplitude Spectrum'); axis([0 N min(Ax) max(Ax)]);

Αποτελέσματα

Παρατηρήσεις:

Στο πρόγραμμα αυτό εργαστήκαμε όπως ακριβώς και στο program82a_2.m, με τη διαφορά ότι

χρησιμοποιήσαμε φίλτρο Butterworth αντί για το Ιδεώδες.

Τα αποτελέσματα είναι παρόμοια με του Ιδεώδους φίλτρου, με μικρές διαφορές. Για παράδειγμα,

ενώ στο Ιδεώδες band-reject φίλτρο η συχνότητα f=50 έχει παραμείνει, εδώ έχει ελαττωθεί ση-

μαντικά, όπως μπορούμε να δούμε στο φάσμα πλάτους. Επίσης, ενώ στο Ιδεώδες band-pass οι

συχνότητες 1 και 50 είχαν «κοπεί», εδώ παραμένουν, αλλά με ελαττωμένο πλάτος.

Page 82: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

82 Εργαστηριακές ασκήσεις επεξεργασίας σήματος

8.3 Εργαστηριακές ασκήσεις

Άσκηση 8.3α: Αφαίρεση θορύβου από ηλεκτροκαρδιογραφικό σήμα:

Ο σκοπός της Άσκησης αυτής είναι η αφαίρεση του θορύβου των υψηλών συχνοτήτων από ένα

ηλεκτροκαρδιογραφικό σήμα (όπως στην Άσκηση 6.3α) χρησιμοποιώντας φίλτρα low-pass.

Θα χρησιμοποιήσουμε το ιδεώδες φίλτρο καθώς και το Butterworth, για να δούμε τις διαφορές

μεταξύ τους. Για να επιλέξουμε την κατάλληλη συχνότητα αποκοπής, θα απεικονίσουμε το σήμα

στο πεδίο των συχνοτήτων, ώστε να εντοπίσουμε οπτικά πού βρίσκονται οι υψηλές συχνότητες.

Απαιτούμενες συναρτήσεις: sread.m (Εργασία 1.2δ), filter_butterworth_lowpass.m και

filter_butterworth_lowpass.m (Εργασία 8.2β), convolution_freq_filter0.m (Εργασία 8.2α).

- Κατασκευάστε πρόγραμμα (program83a.m) στο οποίο να κάνετε τα εξής:

α) Φορτώστε το σήμα ecg.txt από το δίσκο (sread.m, Εργασία 1.2δ). Επειδή το σήμα έχει μεγάλο

μήκος (4355 τιμές, βλ. και Άσκηση 6.3α), να χρησιμοποιήσετε μόνο ένα τμήμα του (π.χ. από 100

έως 600) για επιτάχυνση των υπολογισμών:

β) Υπολογίστε το φάσμα πλάτους στο πεδίο των συχνοτήτων και απεικονίστε το.

γ) Εντοπίστε (οπτικά) στο φάσμα πλάτους τη συχνότητα αποκοπής, ώστε να αποκόπτονται αρκε-

τές υψηλές συχνότητες αλλά να παραμένουν επίσης αρκετές χαμηλότερες συχνότητες, που περιέ-

χουν τη χρήσιμη πληροφορία του σήματος (π.χ. fco=25).

Page 83: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Φιλτράρισμα στο πεδίο των συχνοτήτων 83

δ) Εφαρμόστε στο σήμα τα low-pass φίλτρα ιδεώδες και Butterworth με τη συχνότητα αποκοπής

που εντοπίσατε προηγουμένως. Απεικονίστε τα αποτελέσματα στο πεδίο του χρόνου και στο πεδίο

των συχνοτήτων:

ε) Παρατηρείστε το αποτέλεσμα της φαρμογής των δύο φίλτρων και σχολιάστε τις διαφορές.

Page 84: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

84 Εργαστηριακές ασκήσεις επεξεργασίας σήματος

Άσκηση 8.3β: Υποδιπλασιασμός συχνότητας μέσω φίλτρου Butterworth:

Κατασκευάστε πρόγραμμα (program83b.m) στο οποίο να κάνετε τα εξής:

α) Κατασκευάστε ένα σύνθετο σήμα 200 τιμών που να αποτελείται από τις συχνότητες 10 και 50,

με πλάτη 4 και 2 αντίστοιχα.

β) Φιλτράρετε το παραπάνω σήμα με φίλτρο Butterworth κατάλληλης συχνότητας αποκοπής, ώ-

στε να υποδιπλασιαστεί το πλάτος της χαμηλής συχνότητας. [Υπόδειξη: Βλ. Παρατήρηση στο φίλ-

τρο Butterhworth, στην Εργασία 8.2β.]

γ) Να απεικονιστεί το αρχικό σύνθετο σήμα μαζί με το τελικό (φιλτραρισμένο) στους ίδιους άξονες

στο πεδίο του χρόνου (subplot 1). Επίσης, να απεικονιστούν τα δύο σήματα στο πεδίο των συ-

χνοτήτων (φάσματα πλάτους, subplots 2 & 3).

Άσκηση 8.3γ: Διαδοχική εφαρμογή φίλτρων:

Κατασκευάστε πρόγραμμα (program83c.m) στο οποίο να κάνετε τα εξής:

α) Κατασκευάστε ένα σύνθετο σήμα 200 τιμών που να αποτελείται από τις συχνότητες 10, 40 και

80 με πλάτη ίσα με 10 (όλα).

β) Φιλτράρετε το παραπάνω σήμα με δύο διαδοχικά φίλτρα Butterworth κατάλληλων συχνοτήτων

αποκοπής, ώστε διαδοχικά να υποδιπλασιαστεί πρώτα η χαμηλή και στη συνέχεια η υψηλή συ-

χνότητα. [Υπόδειξη: Εφαρμόστε το δεύτερο φίλτρο στο αποτέλεσμα του πρώτου φιλτραρίσματος.]

γ) Να απεικονιστεί το αρχικό σύνθετο σήμα μαζί με το τελικό στους ίδιους άξονες στο πεδίο του

χρόνου (subplot 1). Επίσης, να απεικονιστούν το αρχικό και το τελικό σήμα στο πεδίο των συ-

χνοτήτων (subplots 2 & 3).

Άσκηση 8.3δ: Κατασκευή εκθετικών φίλτρων (low-pass, high-pass, band-reject, band-pass):

Κατασκευάστε συναρτήσεις που να υλοποιούν τα παρακάτω φίλτρα: εκθετικό low-pass (fil-

ter_exponential_lowpass.m), εκθετικό high-pass (filter_exponential_highpass.m), εκθετικό

band-reject (filter_exponential_badreject.m) και εκθετικό band-pass (filter_exponen-

tial_bandpass.m), όπως στα φίλτρα Butterworth (Εργασία 8.2β).

Υπόδειξη: Γράψτε πρώτα τις μαθηματικές σχέσεις των ανωτέρω εκθετικών φίλτρων.

Άσκηση 8.3ε: Προγράματα εφαρμογής των εκθετικών φίλτρων:

Κατασκευάστε δύο προγράμματα (program83d_1.m και program83d_2.m), στα οποία να γίνε-

ται επίδειξη εφαρμογής των εκθετικών φίλτρων low-pass/high-pass και band-reject/band-pass

αντίστοιχa, κατά το υπόδειγμα των προγραμμάτων εφαρμογής των φίλτρων Butterworth

(program82b_1.m και program82b_2.m, Εργασία 8.2γ).

Άσκηση 8.3στ: Πρόγραμμα φιλτραρίσματος με επιλογή φίλτρου από μενού:

Με βάση τα προγράμματα της Εργασίας 8.2γ και της Άσκησης 8.3β, κατασκευάστε ένα και μονα-

δικό πρόγραμμα (program83e.m) στο οποίο να μπορεί να γίνεται επιλογή του φίλτρου, μέσω

ενός μενού.

Υπόδειξη: Δημιουργείστε στο πρόγραμμα ένα μενού και κάντε την επιλογή της δημιουργίας του

φίλτρου μέσω εντολής switch-case. Ουσιαστικά, το switch-case θα αντικαταστήσει μόνο

την εντολή δημιουργίας του φίλτρου, ενώ κατά τα άλλα το πρόγραμμα θα είναι σχεδόν ίδιο με ένα

από τα ανωτέρω αναφερόμένα προγράμματα (με τη διαφορά ότι θα τυπώνει 4 –και όχι 8- γραφι-

κές παραστάσεις).

Page 85: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Φιλτράρισμα στο πεδίο των συχνοτήτων 85

Παράδειγμα λειτουργίας του προγράμματος program83c.m:

Αποτελέσματα του program83c.m

** FILTER SELECTION MENU **

1. Ideal Low-Pass

2. Ideal High-Pass

3. Ideal Band-Reject

4. Ideal Band-Pass

5. Butterworth Low-Pass

6. Butterworth High-Pass

7. Butterworth Band-Reject

8. Butterworth Band-Pass

9. Exponential Low-Pass

10. Exponential High-Pass

11. Exponential Band-Reject

12. Exponential Band-Pass

Select a filter: 5

Page 86: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

9 Αποκατάσταση σήματος

Σε αυτήν την ενότητα θα εξοικειωθείτε με την υλοποίηση και τη χρήση των βασικών ψηφιακών

φίλτρων αποκατάστασης σήματος (Αντίστροφο, Wiener, Ισχύος).

9.1 Συνοπτική θεωρία

Υποβάθμιση (degradation) σήματος = η ανεπιθύμητη μεταβολή των τιμών ενός σήματος

κατά τη διέλευσή του μέσα από ένα σύστημα. Η υποβάθμιση ενός σήματος μπορεί να ο-

φείλεται:

(α) στην επίδραση της διάταξης καταγραφής του σήματος (η οποία περιγράφεται με την

πράξη της συνέλιξης), και

(β) σε τυχαίο θόρυβο (π.χ. ηλεκτρονικό, θερμικής κίνησης κλπ).

Το τελικό υποβαθμισμένο σήμα ( )y n δίνεται τότε από τη σχέση:

( ) ( )* ( ) ( )y n x n h n d n

όπου ( )x n το αρχικό σήμα,

( )h n η κρουστική απόκριση του συστήματος και

( )d n ο θόρυβος (που εδώ θεωρήθηκε προσθετικός και ανεξάρτητος από τη διάταξη κατα-

γραφής).

Αποκατάσταση (restoration) σήματος = η διέλευση ενός υποβαθμισμένου σήματος y(n)

μέσα από κατάλληλο φίλτρο ( )w kF με σκοπό την ανάκτηση του αρχικού σήματος x(n) ή

έστω μιας όσο το δυνατόν καλύτερης προσέγγισής του, x'(n):

x’(n) = IDFT(Fy(k)·Fw(k))

Η αποκατάσταση ενός σήματος γίνεται με την εφαρμογή σ’ αυτό κατάλληλων φίλτρων, για

την αναίρεση της επίδρασης (α) τόσο της κρουστικής απόκρισης h της διάταξης καταγρα-

φής του σήματος όσο και (β) του θορύβου d.

Η πλήρης αποκατάσταση του αρχικού σήματος δεν είναι σχεδόν ποτέ δυνατή λόγω της

άγνοιας διαφόρων παραγόντων, κυρίως όμως της συνάρτησης κατανομής του θορύβου.

Στη συνέχεια αναπτύσσονται μέθοδοι για την εύρεση κατάλληλων φίλτρων αποκατάστα-

σης σήματος:

Φίλτρο αποκατάστασης:

x’(n)

y(n)

IDFT

DFT

.

Page 87: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Αποκατάσταση σήματος 87

Φίλτρα αποκατάστασης σήματος

Αντίστροφο (inverse) φίλτρο: 1

( )( )

Fw kFh k

Το αντίστροφο φίλτρο αποκαθιστά κυρίως την επίδραση της κρουστικής απόκρισης h της

διάταξης καταγραφής του σήματος.

Γνωρίζοντας το ( )Fw k , το αρχικό σήμα υπολογίζεται προσεγγιστικά ως:

x'(n) = IDFT(Fy(k)·Fw(k))

Σημείωση: Η Fh(k) (που απαιτείται για την εύρεση του Fw(k)) θεωρείται γνωστή, καθώς

μπορούμε να τη λάβουμε ως έξοδο από το σύστημα αν το τροφοδοτήσουμε με την κρου-

στική συνάρτηση.

Από τα παραπάνω συμπεραίνουμε ότι το αντίστροφο φίλτρο είναι μια απλή προσέγγιση,

που μπορεί να χρησιμοποιηθεί μόνο σε περιβάλλον χαμηλού θορύβου. Μια βελτίωση του

αντίστροφου φίλτρου στις υψηλές συχνότητες, όπου ο θόρυβος είναι σχετικά υψηλός ενώ

η Fh(k) έχει μικρές τιμές, προκύπτει με την αντικατάσταση της Fh(k) από μια μικρή στα-

θερά C (ψευδοαντίστροφο φίλτρο):

Ψευδοαντίστροφο φίλτρο:

1 αν ( )

( )( )

1 αν ( )

Fh k CFh k

Fw k

Fh k CC

Το ψευδοαντίστροφο φίλτρο ταυτίζεται με το αντίστροφο αν C = 0.

Φίλτρο Wiener:

2

2

( ) 1( )

( )( )

Fh kFw k

Fh kFh k A

Το φίλτρο Wiener αποκαθιστά τόσο την επίδραση της κρουστικής απόκρισης h της διάτα-

ξης καταγραφής του σήματος όσο και το θόρυβο d (έστω και κατά προσέγγιση).

Ο παράγοντας

2

2

( )

( )

Fd kA

Fx k είναι ο λόγος θορύβου προς σήμα –αντίστροφος του λόγου

σήματος προς θόρυβο (signal-to-noise ratio, SNR), ή A = 1

𝑆𝑁𝑅 .

Γνωρίζοντας πλέον το ( )Fw k , το αρχικό σήμα υπολογίζεται προσεγγιστικά ως:

x’(n) = IDFT(Fy(k)·Fw(k)).

Σημειώσεις:

1) Αν ο λόγος θορύβου προς σήμα

2

2

( )

( )

Fd kA

Fx k είναι πολύ μικρός (π.χ. στις χαμηλές συ-

χνότητες), τότε

2

2

( )1

( )

Fh k

Fh k A

, οπότε το φίλτρο Wiener προσεγγίζει το αντίστροφο.

Page 88: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

88 Εργαστηριακές ασκήσεις επεξεργασίας σήματος

2) Στην περίπτωση που ο λόγος θορύβου προς σήμα

2

2

( )

( )

Fd kA

Fx k είναι σημαντικός (π.χ.

στις υψηλές συχνότητες), τότε

2

2

( )1

( )

Fh k

Fh k A

, οπότε το 'Fx προκύπτει μικρότερο από

ότι στο αντίστροφο φίλτρο, δίνοντας μικρότερη ενίσχυση θορύβου.

3) Στην πράξη, ο παράγοντας 1

( )Fh k αντικαθίσταται από

1

C, αν ( )Fh k C (όπου C μια

μικρή τιμή), για αποφυγή απειρισμών ή πολύ μεγάλων τιμών.

Φίλτρο Ισχύος (Power ή Homomorphic): 2

2

( ) 1( )

( )( )

Fh kFw k

Fh kFh k A

Παρόμοια με το φίλτρο Wiener, ψάχνουμε για κατάλληλη συνάρτηση vF ώστε:

( ) ( ) '( ) ( )Fv k Fy k Fx k Fh k

ή ( ) ( )

'( )( )

Fv k Fy kFx k

Fh k

Στην περίπτωση του φίλτρου Ισχύος απαιτούμε η συνολική ισχύς (στο πεδίο των συχνοτή-

των) του προσεγγιστικού σήματος x'(n) να είναι ίση με αυτήν του αρχικού x(n).

Γνωρίζοντας πλέον το ( )Fw k , το αρχικό σήμα υπολογίζεται προσεγγιστικά ως:

x’(n) = IDFT(Fy(k)·Fw(k))

Σημειώσεις:

Οι σημειώσεις (1), (2) και (3) του φίλτρου Wiener ισχύουν και στο φίλτρο Ισχύος.

4) Επειδή το υπόριζο είναι <1, προκύπτει: '(Wiener) '(Power) '(Inverse)Fx Fx Fx .

Γενικευμένο φίλτρο Wiener:

12

2

( ) 1( )

( )( )

Fh kFw k

Fh kFh k A

Τα τρία προηγούμενα φίλτρα μπορούν να γενικευτούν με την παραπάνω σχέση, όπου:

Αντίστροφο φίλτρο: α=1 β=0

Φίλτρο Wiener: α=0 β=1

Φίλτρο Ισχύος: α=0.5 β=1

και όπου

2

2

( )1

( )

Fd kA SNR

Fx k ο αντίστροφος του λόγου σήματος προς θόρυβο (signal-

to-noise ratio, SNR).

Στην πράξη, ο παράγοντας 1

( )Fh k αντικαθίσταται από

1

C, αν ( ) 0,1Fh k C (όπου C

μια μικρή τιμή), για αποφυγή απειρισμών ή πολύ μεγάλων τιμών.

Page 89: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Αποκατάσταση σήματος 89

Υπολογισμός της σταθεράς A και του λόγου σήματος προς θόρυβο (signal-to-noise ratio,SNR)

Η παράμετρος A των φίλτρων Wiener και Ισχύος αποτελεί τον αντίστροφο του λόγου σή-

ματος προς θόρυβο (signal-to-noise ratio, SNR):

1A SNR , όπου

2

2

( )

( )

Fx kSNR

Fd k

Ο παράγοντας Α μπορεί να προσεγγιστεί ως εξής:

α) με τη μέθοδο δοκιμής και σφάλματος: Δοκιμάζονται διάφορες τιμές, και λαμβάνεται η

τιμή που δίνει την καλύτερη προσέγγιση του σήματος x'(n), π.χ. η τιμή που δίνει το ελάχιστο 1

22

0

'( ) ( )N

k

Fx k Fx k

, ή το ελάχιστο 1

2

0

'( ) ( )N

k

x n x n

β) από ένα τμήμα z του υποβαθμισμένου σήματος στο οποίο θεωρούμε ότι οι αυξομειώ-

σεις οφείλονται μόνο σε θόρυβο (π.χ. ως z θα μπορούσε να ληφθεί η έξοδος του συστήμα-

τος για σταθερό σήμα εισόδου) και υπό την προϋπόθεση ότι οι τιμές του σήματος είναι μη

αρνητικές. Τότε, o SNR προσεγγίζεται ως:

𝑆𝑁𝑅 ≅𝜇

𝜎

όπου i

izN

21 η τυπική απόκλιση των τιμών του z

και N

zi

i η μέση τιμή των τιμών του z

Στις παραπάνω σχέσεις το σήμα zi μπορεί να ληφθεί είτε στο πεδίο του χρόνου z(n) είτε

στο πεδίο των συχνοτήτων Fz(k).

Page 90: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

90 Εργαστηριακές ασκήσεις επεξεργασίας σήματος

9.2 Εργασίες κατανόησης

Η αποκατάσταση ενός σήματος ( )y n γίνεται μέσω της σχέσης:

x’(n) = IDFT(Fy(k)·Fw(k))

όπου ( ) ( ( ))Fy k DFT y n

και ( )Fw k το φίλτρο αποκατάστασης του σήματος στο πεδίο των συχνοτήτων.

Εργασία 9.2α: Κατασκευή συναρτήσεων φίλτρων αποκατάστασης σήματος

Αντίστροφο φίλτρο: 1

( )( )

Fw kFh k

Στην πράξη, το αντίστροφο φίλτρο υλοποιείται ως ψευδοαντίστροφο, δηλαδή ο παράγοντας

1 ( )Fh k αντικαθίσταται από 1 C , αν ( )Fh k C (όπου C μια μικρή τιμή), για αποφυγή απειρι-

σμών ή πολύ μεγάλων αριθμών

Η συνάρτηση του αντίστροφου φίλτρου έχει εισόδους τις ( )Fh k και C και έξοδο την ( )Fw k .

filter_restoration_inverse.m function Fw = filter_restoration_inverse(Fh,C) % Pseudo-Inverse restoration filter function % Fh = Impulse response % C = a small number % Fw = Filter

for i=1:length(Fh) if Fh(i)>C Fw(i) = 1/Fh(i); else Fw(i) = 1/C; end end

Φίλτρο Wiener:

2

2

( ) 1( )

( )( )

Fh kFw k

Fh kFh k A

Στην πράξη, ο παράγοντας 1 ( )Fh k αντικαθίσταται από 1 C , αν ( )Fh k C (όπου C μια μικρή

τιμή), για αποφυγή απειρισμών ή πολύ μεγάλων αριθμών.

Η συνάρτηση του φίλτρου Wiener έχει εισόδους τις ( )Fh k , A και C και έξοδο την ( )Fw k .

filter_restoration_wiener.m function Fw = filter_restoration_wiener(Fh,A,C) % Wiener restoration filter function % Fh = Impulse response % A = Noise to Signal Ratio (squared) % C = a small number % Fw = Filter

for i=1:length(Fh) if Fh(i)>C Fw(i) = (1/Fh(i)) * (Fh(i)^2/(Fh(i)^2+A)); else Fw(i) = (1/C) * (Fh(i)^2/(Fh(i)^2+A)); end end

Page 91: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Αποκατάσταση σήματος 91

Εργασία 9.2β: Πρόγραμμα επίδειξης αποκατάστασης σήματος: Κατασκευάστε κατάλληλο πρό-

γραμμα (program92a.m) στο οποίο: (α) να υποβαθμίζεται τεχνητά ένα σήμα και (β) το υποβαθ-

μισμένο σήμα να αποκαθίσταται χρησιμοποιώντας τα φίλτρα που αναπτύχθηκαν στην Εργασία

9.2α.

Σημείωση: Απαιτούνται οι συναρτήσεις:

filter_restoration_inverse.m και filter_restoration_wiener.m (Εργασία 9.2α),

convolution_freq_filter0.m (Εργασία 8.2α),

dft.m και idft.m (Εργασία 5.2γ),

sread.m (Εργασία 1.2δ), και

το τμήμα προσομοιωμένου ηλεκτροκαρδιογραφικού σήματος ecgtest.txt.

program92a.m clc; clear all; close all;

% Αρχικό σήμα % (Διάβασμα ηλεκτροκαρδιογραφήματος από το δίσκο) x = sread('ecgtest.txt');

% Κρουστική απόκριση συστήματος % (Δημιουργία τεχνητού συστήματος που αποκόπτει τις υψηλές συχνότητες) N = length(x); fco = 10; n = 2; Fh = filter_butterworth_lowpass(N,fco,n);

% Υποβάθμιση σήματος % (Συνέλιξη αρχικού σήματος με σύστημα + θόρυβος) % 1. Συνέλιξη με κρουστική απόκριση συστήματος y = convolution_freq_filter0(x,Fh); % 2. Προσθήκη θορύβου for i=1:length(y) y(i) = y(i) + randn/5; end

% Επιλογή φίλτρου αποκατάστασης % (Αντίστροφο ή Wiener) filter = input('Filter (1=Inverse, 2=Wiener)? '); switch filter case 1 C = 0.1; Fw = filter_restoration_inverse(Fh,C); case 2 C = 0.1; A = 0.05; Fw = filter_restoration_wiener(Fh,A,C); end

% Αποκατάσταση σήματος % (Συνέλιξη υποβαθμισμένου σήματος με φίλτρο) x1 = convolution_freq_filter0(y,Fw);

% Γραφικές παραστάσεις % (Αρχικό σήμα, Υποβαθμισμένο σήμα, Αποκατεστημένο σήμα) hold on; plot(x,'b:'); plot(y,'b'); plot(x1,'r'); legend('Original signal','Degrated signal','Restored signal');

Page 92: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

92 Εργαστηριακές ασκήσεις επεξεργασίας σήματος

Αποτελέσματα

filter = 1 (στη γραμμή 23 του κώδικα)

filter = 2 (στη γραμμή 23 του κώδικα)

Page 93: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Αποκατάσταση σήματος 93

Περιγραφή του προγράμματος program92a.m και παρατηρήσεις:

Δημιουργία σήματος:

Αρχικά φορτώθηκε ένα τμήμα τεχνητού ηλεκτροκαρδιογραφήματος από το δίσκο, που χρησιμο-

ποιήθηκε ως αρχικό σήμα (x).

Υποβάθμιση σήματος:

Το σήμα υποβαθμίστηκε με 2 τρόπους (y = x*h + d):

Κατ’ αρχήν προσομοιώθηκε η δίοδος του σήματος από ένα σύστημα. Ως κρουστική απόκριση του

συστήματος (h) χρησιμοποιήθηκε ένα φίλτρο low-pass, προσομοιώνοντας σύστημα το οποίο υ-

ποβαθμίζει το σήμα αποκόπτοντας τις υψηλές συχνότητες που περιέχει.

Στη συνέχεια, προστέθηκε τυχαίος γκαουσσιανός θόρυβος (d). Για το θόρυβο χρησιμοποιήθηκε

η συνάρτηση randn του MATLAB, η οποία παράγει τυχαίους αριθμούς που ακολουθούν την

κανονική –ή γκαουσσιανή– κατανομή (δηλαδή, πρακτικά, θετικούς και αρνητικούς αριθμούς που

έχουν μικρότερη πιθανότητα να εμφανιστούν όσο απομακρύνονται από το μηδέν).

(Οι τιμές του θορύβου διαιρέθηκαν με το 5 καθώς παρατηρήσαμε ότι ο θόρυβος στο σήμα ήταν

πολύ μεγάλος.)

Αποκατάσταση σήματος:

Στη συνέχεια το πρόγραμμα επιτρέπει την επιλογή φίλτρου αποκατάστασης (αντίστροφο ή Wie-

ner).

Εφαρμόζοντας το αντίστροφο φίλτρο, παρατηρούμε ότι η αποκατάσταση είναι πολύ κακή. Αυτό

οφείλεται στο ότι το υποβαθμισμένο σήμα έχει θόρυβο (ενώ, σύμφωνα με τη θεωρία, το αντί-

στροφο φίλτρο «δουλεύει» καλά μόνο όταν ο θόρυβος είναι πολύ χαμηλός).

Αντίθετα, εφαρμόζοντας το φίλτρο Wiener, παρατηρούμε ότι έχουμε πολύ καλή αποκατάσταση

του αρχικού σήματος.

Page 94: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

94 Εργαστηριακές ασκήσεις επεξεργασίας σήματος

9.3 Εργαστηριακές ασκήσεις

Άσκηση 9.3α: Συνάρτηση φίλτρου Ισχύος:

Να κατασκευαστεί συνάρτηση (filter_restoration_power.m) η οποία να υλοποιεί το φίλτρο ι-

σχύος. Η συνάρτηση αυτή πρέπει να έχει να έχει εισόδους τις ( )Fh k , A και C και έξοδο την

( )w kF (βλ. Συνοπτική θεωρία, παράγραφος 9.1).

Άσκηση 9.3β: Συνάρτηση γενικευμένου φίλτρου Wiener:

Να κατασκευαστεί συνάρτηση (filter_restoration_gwiener.m) η οποία να υλοποιεί το γενικευ-

μένο φίλτρο Wiener. Η συνάρτηση αυτή πρέπει να έχει να έχει εισόδους τις ( )h kF , α, β, A και

C και έξοδο την ( )w kF (βλ. Συνοπτική θεωρία, παράγραφος 9.1), ώστε με κατάλληλες τιμές των

παραμέτρων αυτών να μπορεί να αντικαταστήσει τις συναρτήσεις των φίλτρων Αντίστροφο, Wie-

ner και Ισχύος (Εργασία 9.2α και Άσκηση 9.3α).

Άσκηση 9.3γ: Πρόγραμμα εφαρμογής του γενικευμένου φίλτρου Wiener:

Τροποποιήστε κατάλληλα το program92a.m ώστε να κατασκευάστε ένα άλλο (program93a.m)

στο οποίο να αντικαταστήσετε τις συναρτήσεις των φίλτρων Αντίστροφο, Wiener και Ισχύος με

τη συνάρτηση του γενικευμένου φίλτρου Wiener. Το program93a.m πρέπει να παράγει τα ίδια

αποτελέσματα με το program92a.m, με κατάλληλες τιμές των παραμέτρων α και β.

Άσκηση 9.3δ: Μελέτη φίλτρων αποκατάστασης:

Εκτελέστε τις παρακάτω εργασίες, χρησιμοποιώντας το πρόγραμμα program92a.m:

1. Επίδραση του θορύβου στο αντίστροφο φίλτρο:

Τρέξτε το πρόγραμμα με το Inverse φίλτρο, και στη συνέχεια:

α) Αυξήστε το θόρυβο (π.χ. σβήστε τη διαίρεση με το 5 στην εντολή randn). Τι παρατηρείτε;

Εξηγήστε το με βάση τη θεωρία.

β) Ελαττώστε το θόρυβο (π.χ. διαιρέστε την εντολή randn με 50 αντί για 5). Τι παρατηρείτε;

Εξηγήστε το με βάση τη θεωρία.

γ) Μηδενίστε το θόρυβο (π.χ. βάλτε σε σχόλια (%) τις γραμμές που προσθέτουν το θόρυβο). Τι

παρατηρείτε; Εξηγήστε το με βάση τη θεωρία.

2) Βελτιστοποίηση ανίστροφου φίλτρου:

Να μεταβάλλετε τη σταθερά C ώστε να βρείτε την τιμή εκείνη που δίνει οπτικά καλύτερο απο-

τέλεσμα στο φιλτράρισμα (με μέθοδο δοκιμής και σφάλματος). Να προτείνετε έναν αντικειμε-

νικό τρόπο (δηλ. όχι οπτικό) εκτίμησης των αποτελεσμάτων.

3) Σύγκριση του αντίστροφου φίλτρου με το φίλτρο Wiener:

Μηδενίστε το θόρυβο καθώς και τη σταθερά A. Στη συνέχεια τρέξτε το πρόγραμμα και με τα

δύο φίλτρα. Τι παρατηρείτε; Εξηγήστε το με βάση τη θεωρία.

4) Επίδραση του θορύβου στο φίλτρο Wiener:

Χρησιμoποιήστε σήμα με μεσαίο επίπεδο θορύβου (π.χ. randn/5) και εφαρμόστε το φίλτρο

Wiener θέτοντας την παράμετρο θορύβου προς σήμα A=0.05. Στη συνέχεια μεγαλώστε το θό-

ρυβο (π.χ. σβήστε τη διαίρεση με το 5). Τι μεταβολή πρέπει να κάνετε στην παράμετρο A,

σύμφωνα με τη θεωρία; Διαπιστώστε το και πειραματικά, αυξάνοντας και ελαττώνοντας την

τιμή του A στο πρόγραμμα και παρατηρώντας τα αποτελέσματα.

Page 95: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

ΛΥΣΕΙΣ ΕΡΓΑΣΤΗΡΙΑΚΩΝ ΑΣΚΗΣΕΩΝ

Οι λύσεις που ακολουθούν δεν είναι οι μοναδικές.

1 Σήματα διάκριτου χρόνου - Απεικόνιση σημάτων - Διαχείριση αρχείων σημάτων

(Λύσεις εργαστηριακών ασκήσεων)

Άσκηση 1.3α

Να γραφτεί πρόγραμμα (program13a.m) στο οποίο:

i) να ορίζονται δύο σήματα x1 και x2 ίδιου μήκους ως μονοδιάστατοι πίνακες της επιλογής σας,

ii) να βρίσκεται η μέγιστη τιμή κάθε σήματος,

iii) να βρίσκεται το σήμα x3 που προκύπτει ως διαφορά των δύο σημάτων (x1-x2 αν η μέγιστη τιμή

του x1 είναι μεγαλύτερη από τη μέγιστη τιμή του x2, αλλιώς το αντίθετο), και

iii) τα τρία αυτά σήματα να απεικονίζονται γραφικά, στο ίδιο figure αλλά σε δύο διαφορετικά

υπογραφήματα (subplot): στο 1ο υπογράφημα θα βρίσκεται το σήμα x3, ενώ τα σήματα x1 και

x2 θα βρίσκονται στο 2ο υπογράφημα.

iv) το σήμα x3 να εγγράφεται στο δίσκο.

program13a.m clc; clear all; close all; % Ορισμός 2 σημάτων x1 = [1 0 20 5 -3 -8 0 1 2 1]; % Τιμές σήματος 1 x2 = [2 1 3 3 4 -1 10 -4 1 1]; % Τιμές σήματος 2 N = length(x1); % Μήκος σήματος n = [0:N-1]; % Χρονικές στιγμές

% Εύρεση μεγίστων max1 = x1(1); for i=1:N if x1(i)>max1, max1 = x1(i); end end max2 = x2(1); for i=1:N if x2(i)>max2, max2 = x2(i); end end % Αφαίρεση σημάτων ανάλογα με ποιο μέγιστο είναι μεγαλύτερο if max1>max2 for i=1:N x3(i) = x1(i) - x2(i); end else for i=1:N x3(i) = x2(i) - x1(i); end end

% Γραφική παράσταση των δύο αρχικών σημάτων στο 1ο υπογράφημα subplot(2,1,1); hold on; plot(n,x1,'bo-'); plot(n,x2,'r*-'); grid on; legend('x_1','x_2'); % Γραφική παράσταση της διαφοράς στο 2ο υπογράφημα subplot(2,1,2); plot(n,x3,'ko-'); grid on; legend('x_3');

% Αποθήκευση του x3 στο δίσκο swrite(x3,'signal.txt');

Page 96: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

96 Εργαστηριακές ασκήσεις επεξεργασίας σήματος

Αποτελέσματα

Page 97: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Λύσεις εργαστηριακών ασκήσεων 97

Άσκηση 1.3β

Να γραφτεί πρόγραμμα (program13b.m) με το οποίο:

i) Να διαβάζεται από το δίσκο το σήμα που βρίσκεται στο αρχείο ecg.txt (αφού ελέγξετε ότι το

αρχείο αυτό βρίσκεται στο Current Directory). Το σήμα να απεικονίζεται.

ii) Na δημιουργείται ένα δεύτερο σήμα με τριπλάσιο πλάτος από το πρώτο (ενίσχυση σήματος).

Το δεύτερο σήμα να απεικονίζεται μαζί με το πρώτο (με hold on) ώστε να φανεί η διαφορά στο

πλάτος.

iii) Το δεύτερο (ενισχυμένο) σήμα να αποθηκεύεται στο δίσκο.

program13b.m

clc; clear all; close all; % Διάβασμα 1ου σήματος από το δίσκο x1 = sread('ecg.txt'); N = length(x1); % Μήκος σήματος

% Δημιουργία 2ου σήματος (ενισχυμένου) for i=1:N x2(i) = 3*x1(i); end

% Απεικόνιση των δύο σημάτων n = [0:N-1]; % Χρονικές στιγμές hold on; plot(n,x1,'b'); plot(n,x2,'r'); grid on; xlabel('Time'); ylabel('Amplitude'); title('Simulated ECG'); legend('Original', 'Amplified');

Αποτελέσματα

i) Γραφική παράσταση του ecg.txt.

.ii) Γραφική παράσταση στους ίδιους άξονες.

iii)

Δημιουργία ενός αρχείου με όνομα ecg2.txt στο Current Directory.

Page 98: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

98 Εργαστηριακές ασκήσεις επεξεργασίας σήματος

Άσκηση 1.3γ

Να γραφτεί πρόγραμμα (program13c.m) με το οποίο:

i) Να διαβαστεί από το δίσκο το σήμα που βρίσκεται στο αρχείο ecg.txt (αφού ελέγξετε ότι το

αρχείο αυτό βρίσκεται στο Current Directory) με τη βοήθεια της συνάρτησης sread.m (Εργασία

1.2δ).

ii) Το ecg.txt είναι αρκετά μεγάλο σήμα (έχει 4355 τιμές). Na δημιουργήσετε ένα δεύτερο σήμα,

στο οποίο να αποθηκεύσετε τις τιμές από 100 έως 1000 του ecg.txt. Απεικονίστε το δεύτερο

σήμα.

program13c.m

clc; clear all; close all; % Διάβασμα 1ου σήματος από το δίσκο x1 = sread('ecg.txt'); N = length(x1); % Μήκος σήματος

% Δημιουργία 2ου σήματος (τμήματος του 1ου) j = 0; for i=100:1000 j = j + 1; % Δείκτες (από 1 έως 901) του x2 x2(j) = x1(i); end

% Απεικόνιση του τμήματος n = [100:1000]; % Χρονικές στιγμές για την απεικόνιση plot(n,x2); grid on; xlabel('Time'); ylabel('Amplitude');

Αποτελέσματα

100 200 300 400 500 600 700 800 900 1000-0.5

0

0.5

1

1.5

Time

Am

plit

ude

Page 99: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Λύσεις εργαστηριακών ασκήσεων 99

2 Βασικά είδη σημάτων

(Λύσεις εργαστηριακών ασκήσεων)

Άσκηση 2.3α

Να γραφτεί πρόγραμμα (program23a.m) στο οποίο να δημιουργείται ένα σύνθετο σήμα x3 με

100 τιμές, που να αποτελείται από το γινόμενο:

i) ενός ημιτονικού σήματος x1 πλάτους 1 και συχνότητας ίσης με 7, και

ii) ενός εκθετικού σήματος x2.

Πρέπει να επιλέξετε κατάλληλα τη βάση του εκθετικού σήματος, ώστε το γινόμενο των δύο σημά-

των x3, το οποίο πρέπει να απεικονίσετε μαζί με το εκθετικό x2, να έχει περίπου τη μορφή που

εμφανίζεται στο παρακάτω σχήμα.

Τέλος, το σήμα x3 πρέπει να εγγράφεται (αποθηκεύεται) σε ένα αρχείο στο δίσκο με όνομα της

επιλογής σας.

program23a.m clc; clear all; close all;

N = 100; % Μήκος σήματος

% 1ο σήμα (ημιτονοειδές) f = 7; % Συχνότητα ημιτονοειδούς σήματος for n=0:N-1 x1(n+1) = sin(2*pi*f*n/N); end

% 2ο σήμα (εκθετικό) a = 1.05; % Βάση εκθετικού σήματος (>1 σημαίνει αύξηση με το χρόνο) for n=0:N-1 x2(n+1) = a^n; end

% Πολλαπλασιασμός σημάτων for n=0:N-1 x3(n+1) = x1(n+1) * x2(n+1); end

% Γράφ. παράσταση του εκθετικού και του τελικού σήματος στους ίδιους άξονες n = [0:N-1]; % Χρονικές στιγμές plot(n,x2,'k.-'); hold on; plot(n,x3,'b.-'); grid on; legend('x_2', 'x_1 * x_2', 'location', 'NW'); % το 'location' δείχνει τη θέση του legend ('NW' =North West=πάνω αριστερά)

% Εγγραφή του x3 στο δίσκο swrite(x3,'signal2.txt');

Page 100: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

100 Εργαστηριακές ασκήσεις επεξεργασίας σήματος

Αποτελέσματα

iv) Γραφική παράσταση στους ίδιους άξονες

v)

Δημιουργία ενός αρχείου με όνομα signal2.txt στο φάκελο Current Directory.

Page 101: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Λύσεις εργαστηριακών ασκήσεων 101

Άσκηση 2.3β

Να γραφτεί πρόγραμμα (program23b.m) στο οποίο:

i) Αρχικά πρέπει να διαβάζεται από το δίσκο το αρχείο που δημιουργήθηκε στο δίσκο στην ά-

σκηση 2.3α.

ii) Στη συνέχεια, το σήμα αυτό πρέπει να ψαλιδιστεί με τιμή κατωφλίου ίση με t=20 και να γίνει

απεικόνιση του αρχικού και του ψαλιδισμένου σήματος στους ίδιους άξονες. Το αποτέλεσμα πρέ-

πει να είναι όπως στο παρακάτω σχήμα.

Σημείωση: Ψαλιδισμός (clipping) είναι η αποκοπή των τιμών του σήματος που είναι μεγαλύτερες

κατ’ απόλυτη τιμή από ένα κατώφλι (threshold).

Υπόδειξη: Μετά την ανάγνωση του σήματος από το δίσκο, δημιουργείστε ένα δεύτερο σήμα του

οποίου όλες οι τιμές θα είναι ίσες με του πρώτου, εκτός από όσες τιμές είναι μεγαλύτερες από το

κατώφλι t (οι οποίες θα πάρουν την τιμή του κατωφλίου, t), καθώς και από όσες τιμές είναι

μικρότερες του -t (οι οποίες θα πάρουν την τιμή -t). Έτσι, κάθε τιμή του δεύτερου σήματος θα

είναι μικρότερη, κατ’ απόλυτη τιμή, από το κατώφλι t.

program23b.m clc; clear all; close all;

% Διάβασμα σήματος από το δίσκο x = sread('signal2.txt');

% Ψαλιδισμός (clipping) έτσι ώστε η απόλυτη τιμή του πλάτους του σήματος % να μην ξεπεράσει ένα κατώφλι (threshold). t = 20; % τιμή κατωφλίου for i=1:length(x) if x(i)>t y(i) = t; elseif x(i)<-t y(i) = -t; else y(i) = x(i); end end

% Γραφική παράσταση σήματος n = [0:length(x)-1]; hold on; plot(n,x,'b.-'); plot(n,y,'r.-'); grid on; titlestring = sprintf('Clipping with threshold t = %d',t); title(titlestring); legend('Original signal', 'Clipped signal', 'location', 'NW');

Page 102: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

102 Εργαστηριακές ασκήσεις επεξεργασίας σήματος

Αποτελέσματα

Page 103: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Λύσεις εργαστηριακών ασκήσεων 103

3 Απόκριση συστήματος - Συνέλιξη

(Λύσεις εργαστηριακών ασκήσεων)

Άσκηση 3.3α: Εξομάλυνση καρδιογραφικού σήματος.

Δημιουργήστε ένα πρόγραμμα (program33a.m), το οποίο να προκαλεί εξομάλυνση (smoothing)

σε σήμα καρδιογραφήματος. Η εξομάλυνση πρέπει να πραγματοποιείται με τη συνέλιξη ενός συ-

στήματος κρουστικής απόκρισης ίσης με [0.25 0.5 0.25] στο σήμα ενός προσομοιωμένου καρ-

διογραφήματος (βλ. και Άσκηση 1.3β). Ακολουθήστε τα παρακάτω βήματα:

(i) Φορτώστε το καρδιογραφικό σήμα 'ecg.txt' από το δίσκο (πρέπει να βρίσκεται στο Current

Directory).

(ii) Δημιουργείστε ένα φίλτρο εξομάλυνσης, ως σήμα κρουστικής απόκρισης [0.25 0.5 0.25 ].

(iii) Πραγματοποιείστε τη συνέλιξη του φίλτρου με το καρδιογραφικό σήμα.

(iv) Απεικονείστε το αρχικό και το εξομαλυμένο σήμα στους ίδιους άξονες, χρησιμοποιώντας

διαφορετικά χρώματα. Για να δείτε καλύτερα τη διαφορά, δημιουργήστε και απεικονείστε μικρό-

τερα τμήματα των δύο σημάτων (π.χ. για τις χρονικές στιγμές από 50 έως 250).

Απαιτούμενα αρχεία για το program33a.m:

ecg.txt: Αρχείο προσομοιωμένου καρδιογραφήματος (βλ. και Άσκηση 1.3β)

sread.m: Συνάρτηση για το διάβασμα του σήματος από το δίσκο (Εργασία 1.2δ).

convolution.m: Συνάρτηση συνέλιξης (Εργασία 3.2γ)

program33a.m clc; clear all; close all; % Σήμα εισόδου: x = sread('ecg.txt'); % Κρουστική απόκριση: h = [0.25 0.5 0.25]; % Συνέλιξη: y = convolution(x,h);

% Δημιουργία μικρότερων τμημάτων των σημάτων για καλύτερη απεικόνιση: n1 = 50; n2 = 250; i = 0; for n=n1:n2 i = i + 1; x1(i) = x(n); y1(i) = y(n); end % Γραφικές παραστάσεις των x1, y1: hold on;

Nx = length(x1); Ny = length(y1);

nx = [0:Nx-1]; ny = [0:Ny-1]; plot(nx,x1,'b-'); plot(ny,y1,'r-'); legend('Σήμα εισόδου','Σήμα εξόδου'); grid on

Αποτελέσματα

Πειραματιστείτε με διαφορετικά φίλτρα για να δείτε τις διαφορές.

Page 104: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

104 Εργαστηριακές ασκήσεις επεξεργασίας σήματος

Άσκηση 3.3β (γενίκευση της Εργασίας 3.2στ): Δημιουργία συνάρτησης προσομοίωσης του συστή-

ματος της Εργασίας 3.2στ.

α) Κατασκευάστε στο MATLAB μια συνάρτηση (SystemSimulation.m) που να προσομοιώνει το

σύστημα της Εργασίας 3.2στ,, δηλαδή να μπορεί να υπολογίσει το σήμα εξόδου y(n) του συστή-

ματος για οποιοδήποτε σήμα εισόδου x(n). Υπόδειξη: Βασιστείτε στο program32d.m.

SystemSimulation.m function y = SystemSimulation(x)

% Υπολογισμός κρουστικής συνάρτησης δ(n) d(1) = 1; for i=2:length(x) d(i) = 0; end

% Υπολογισμός κρουστικής απόκρισης h(n) h(1) = d(1); for i=2:length(d) h(i) = 0.5*h(i-1) + d(i); end

% Συνέλιξη y = convolution(x,h);

β) Κατασκευάστε ένα πρόγραμμα σε MATLAB (program33b.m), στο οποίο: (i) Να δημιουργείται

ένα σήμα N=100 τιμών, που να είναι το γινόμενο μιας εκθετικής συνάρτησης βάσης a=0.95 και

μιας συνημιτονοειδούς συνάρτησης συχνότητας f=2 και πλάτους A=1. (ii) Να βρίσκεται η από-

κριση του SystemSimulation.m, όταν εισαχθεί το σήμα του ερωτήματος (i). Τα σήματα εισόδου

και εξόδου να παρασταθούν στους ίδιους άξονες.

program33b.m clc; clear all; close all;

N = 100; f = 2; for n=0:N-1 x(n+1) = 0.95^n * cos(2*pi*f*n/N); end

y = SystemSimulation(x);

hold on; plot(x,'b.-'); plot(y,'r.-'); legend('x','y');

Page 105: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Λύσεις εργαστηριακών ασκήσεων 105

Αποτελέσματα

Page 106: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

106 Εργαστηριακές ασκήσεις επεξεργασίας σήματος

Άσκηση 3.3γ

Με χρήση της συνάρτησης της συνέλιξης, να δείξετε με παραδείγματα τις ιδιότητες της συνέλιξης

(βλ. Συνοπτική θεωρία, παράγραφος 3.1), αφού ορίσετε κατάλληλα σήματα της επιλογής σας.

program33c.m clc; clear all;

x1 = [2 3 4 2 1]; x2 = [-1 3 0]; x3 = [1 0 -2];

disp('Αντιμεταθετική ιδιότητα: x1*x2 = x2*x1'); convolution(x1,x2) convolution(x2,x1)

disp(' '); disp('Προσεταιριστική ιδιότητα: (x1*x2)*x3 = x1*(x2*x3)'); convolution( convolution(x1,x2), x3 ) convolution( x1, convolution(x2,x3) )

disp(' '); disp('Επιμεριστική ιδιότητα: x1*(x2+x3) = x1*x2 + x1*x3'); convolution(x1,x2+x3) convolution(x1,x2) + convolution(x1,x3)

disp(' '); disp('Ουδέτερο στοιχείο: x*δ = x'); delta = [1]; x1 convolution(x1,delta)

Αποτελέσματα Αντιμεταθετική ιδιότητα: x1*x2 = x2*x1

ans =

-2 3 5 10 5 3 0

ans =

-2 3 5 10 5 3 0

Προσεταιριστική ιδιότητα: (x1*x2)*x3 = x1*(x2*x3)

ans =

-2 3 9 4 -5 -17 -10 -6 0

ans =

-2 3 9 4 -5 -17 -10 -6 0

Επιμεριστική ιδιότητα: x1*(x2+x3) = x1*x2 + x1*x3

ans =

0 6 5 6 -2 -1 -2

ans =

0 6 5 6 -2 -1 -2

Ουδέτερο στοιχείο: x*δ = x

x1 =

2 3 4 2 1

ans =

2 3 4 2 1

Page 107: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Λύσεις εργαστηριακών ασκήσεων 107

4 Συσχέτιση

(Λύσεις εργαστηριακών ασκήσεων)

Άσκηση 4.3α: Συσχέτιση για εντοπισμό σήματος μέσα σε θορυβώδες περιβάλλον

Δημιουργήστε ένα πρόγραμμα (program43a.m), το οποίο να εντοπίζει ένα σήμα καρδιογραφή-

ματος μέσα σε θορυβώδες περιβάλλον. Η συσχέτιση θα γίνεται με ένα γνωστό καρδιογραφικό

σήμα. Ακολουθήστε τα παρακάτω βήματα:

(i) Φορτώστε το καρδιογραφικό σήμα 'ecg.txt' από το δίσκο (πρέπει να βρίσκεται στο Current

Directory).

(ii) Προσθέστε τυχαίο θόρυβο στο σήμα (βλ. και Εργασία 4.2β).

(iii) Δημιουργήστε σήμα που να περιέχει μόνο τυχαίο θόρυβο.

(iv) Απεικονίστε τα τρία σήματα (καρδιογράφημα, καρδιογράφημα+θόρυβος, θόρυβος).

(v) Πραγματοποιείστε συσχέτιση του καρδιογραφήματος με κάθε ένα από τα δύο θορυβώδη σή-

ματα.

(vii) Απεικονίστε τα αποτελέσματα των δύο συσχετίσων, ώστε να κατανοήσετε τη σημασία της

συσχέτισης.

Απαιτούμενα αρχεία για το program43a.m:

ecg.txt: Αρχείο προσομοιωμένου καρδιογραφήματος (βλ. και Άσκηση 1.3β)

sread.m: Συνάρτηση για το διάβασμα του σήματος από το δίσκο (Εργασία 1.2δ).

correlation.m: Συνάρτηση συσχέτισης (Εργασία 4.2β)

program43a.m clc; clear all; close all;

% Διάβασμα ηλεκτροκαρδιογραφήματος (ECG) από το δίσκο x = sread('ecg.txt'); N = length(x); % Μήκος ECG

% Δημιουργία (α) ECG με θόρυβο & (β) σήματος τυχαίου θορύβου for n=0:N-1 xNoise(n+1) = x(n+1) + 4*(rand-0.5); % ECG με θόρυβο Noise(n+1) = 4*(rand-0.5); % Σήμα τυχαίου θορύβου end

% Συσχέτιση του ECG με % (α) το θορυβώδες ECG και % (β) με το σήμα τυχαίου θορύβου r1 = correlation(x,xNoise); % Συσχέτιση ECG με θορυβώδες ECG r2 = correlation(x,Noise); % Συσχέτιση ECG με σήμα τυχαίου θορύβου

% Απεικόνιση σημάτων

n = [0:N-1];

subplot(3,2,1); plot(n,x); xlabel('ECG'); subplot(3,2,2); plot(n,x); xlabel('ECG');

n = [0:N-1];

subplot(3,2,3); plot(n,xNoise); xlabel('ECG + noise'); subplot(3,2,4); plot(n,Noise); xlabel('Random noise');

n = [0;2*N-2];

subplot(3,2,5); plot(n,r1); xlabel('Correlation of ECG with ECG + noise'); subplot(3,2,6); plot(n,r2); xlabel('Correlation of ECG with Random noise');

Page 108: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

108 Εργαστηριακές ασκήσεις επεξεργασίας σήματος

Αποτελέσματα

Μπορείτε να πειραματιστείτε με διαφορετικά επίπεδα θορύβου (π.χ. αντί για πολλαπλασιαστικό

παράγοντα 4, να δώσετε 2 ή 8), ώστε να δείτε (α) την επίδρασή του στο αποτέλεσμα και (β) μέχρι

ποιο επίπεδο μπορούμε να επιτύχουμε εντοπισμό του αρχικού σήματος μέσα στο θόρυβο.

Page 109: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Λύσεις εργαστηριακών ασκήσεων 109

Άσκηση 4.3β: Συσχέτιση για εντοπισμό συχνότητας μέσα σε σήμα

Τροποποιήστε το προηγούμενο πρόγραμμα, κάνοντας συσχέτιση του ηλεκτροκαδριογραφικού σή-

ματος με δύο ημιτονοειδή σήματα, τα οποία θα δημιουργήσετε προηγουμένως στη θέση των ση-

μάτων με θόρυβο. Το ένα ημιτονοειδές σήμα πρέπει να έχει κάποια συχνότητα που φαίνεται να

ενυπάρχει στο καρδιογραφικό σήμα (π.χ. μπορεί να είναι ίση με το πλήθος των κορυφών του, 17),

ενώ το άλλο ημιτονοειδές σήμα πρέπει να έχει κάποια άλλη διαφορετική συχνότητα, που δεν φαί-

νεται να υπάρχει μέσα στο καρδιογραφικό σήμα (π.χ. 10).

Ο σκοπός της άσκησης αυτής είναι να δείτε τη συσχέτιση με το ημιτονοειδές σήμα, όταν αυτό έχει

συχνότητα που υπάρχει μέσα στο καρδιογραφικό σήμα.

Απαιτούμενα αρχεία για το program43b.m:

ecg.txt: Αρχείο προσομοιωμένου καρδιογραφήματος (βλ. και Άσκηση 1.3β)

sread.m: Συνάρτηση για το διάβασμα του σήματος από το δίσκο (Εργασία 1.2δ).

correlation.m: Συνάρτηση συσχέτισης (Εργασία 4.2β)

program43b.m clc; clear all; close all;

% Διάβασμα ηλεκτροκαρδιογραφήματος (ECG) από το δίσκο x = sread('ecg.txt'); N = length(x); % Μήκος ECG

f1 = 17; f2 = 10; % Δημιουργία δύο ημιτονοειδών σημάτων for n=0:N-1 y1(n+1) = sin(2*pi*f1*n/N); y2(n+1) = sin(2*pi*f2*n/N); end

% Συσχέτιση... r1 = correlation(x,y1); % ...του ECG με το πρώτο ημιτονοειδές σήμα r2 = correlation(x,y2); % ...του ECG με το δεύτερο ημιτονοειδές σήμα

% Απεικόνιση σημάτων n = [0:N-1];

subplot(3,2,1); plot(n,x); xlabel('ECG'); subplot(3,2,2); plot(n,x); xlabel('ECG');

n = [0:N-1];

subplot(3,2,3); plot(n,y1); xlabel(['Sin wave, f=', num2str(f1)]); subplot(3,2,4); plot(n,y2); xlabel(['Sin wave, f=', num2str(f2)]);

n = [0:2*N-2];

subplot(3,2,5);plot(n,r1); xlabel(['Correlation with Sin f=',num2str(f1)]); subplot(3,2,6);plot(n,r2); xlabel(['Correlation with Sin f=',num2str(f2)]);

Page 110: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

110 Εργαστηριακές ασκήσεις επεξεργασίας σήματος

Αποτελέσματα

Μπορείτε να πειραματιστείτε με ημιτονοειδή σήματα διαφόρων συχνοτήτων (π.χ. ίσως μπορούμε

να διακρίνουμε μια χαμηλή συχνότητα μέσα στο καρδιογραφικό σήμα, περίπου ίση με 4 ή 4.5).

Page 111: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Λύσεις εργαστηριακών ασκήσεων 111

5 Διακριτός Μετασχηματισμός Fourier

(Λύσεις εργαστηριακών ασκήσεων)

Άσκηση 5.3α: Απεικόνιση φασμάτων πλάτους και ισχύος:

Κατασκευάστε πρόγραμμα (program53a.m) στο οποίο:

(i) δημιουργείται ένα σύνθετο σήμα που να αποτελείται από ένα εκθετικό σήμα με βάση 0.95 και

από ένα ημιτονοειδές σήμα πλάτους 1 και συχνότητας 10,

(ii) εκτελείται ο μετασχηματισμός Fourier του σήματος,

(iii) υπολογίζεται το φάσμα πλάτους AF(k) και το φάσμα ισχύος P(k)=AF(k)2 του σήματος στο

πεδίο των συχνοτήτων, και

(iv) απεικονίζεται η γραφική παράσταση του τελικού σήματος στο πεδίο του χρόνου, και των

φασμάτων πλάτους και ισχύος στο πεδίο των συχνοτήτων.

program53a.m clc; clear; close all;

% Δημιουργία σήματος από 2 επιμέρους σήματα στο πεδίο του χρόνου N = 100; % Μήκος σήματος a = 0.95; % Βάση εκθετικού σήματος f = 10; % Συχνότητα ημιτονοειδούς σήματος for n=0:N-1 x1(n+1) = a^n; x2(n+1) = sin(2*pi*n*f/N); x(n+1) = x1(n+1)*x2(n+1); end

% Σήμα στο πεδίο των συχνοτήτων (Fx(k)) [RFx,IFx] = dft(x);

% Πλάτος και Ισχύς του σήματος στο πεδίο των συχνοτήτων (A(k) και P(k)) for k=1:N A(k) = sqrt( RFx(k)^2 + IFx(k)^2 ); P(k) = A(k)^2; end

% Γραφικές παραστάσεις:

% Σήμα στο πεδίο του χρόνου (x(n))

n = [0:N-1]; % Χρονικές στιγμές subplot(3,1,1); plot(n,x); grid on; xlabel('Χρόνος (n)'); ylabel('Σήμα x(n)');

% Φάσμα πλάτους του σήματος στο πεδίο των συχνοτήτων (A(k)) k = [0:N-1]; % Συχνότητες subplot(3,1,2); stem(k,A); grid on; xlabel('Συχνότητες (k)'); ylabel('Πλάτος |Fx(k)|');

% Φάσμα ισχύος του σήματος στο πεδίο των συχνοτήτων (P(k)) subplot(3,1,3); stem(k,P); grid on; xlabel('Συχνότητες (k)'); ylabel('Ισχύς Ρ(k)');

Page 112: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

112 Εργαστηριακές ασκήσεις επεξεργασίας σήματος

Αποτελέσματα

Άσκηση 5.3β

Με βάση το φάσμα πλάτους που βλέπουμε στην επομένη σελίδα, δημιουργήστε την εξίσωση ενός

σύνθετου σήματος που να αποτελείται από απλά ημιτονοειδή σήματα και που να δίνει αυτό το

φάσμα. Στη συνέχεια, κατασκευάστε πρόγραμμα (program53b.m), το οποίο να δίνει τα αποτε-

λέσματα που παρουσιάζονται στην επόμενη σελίδα.

Υπόδειξη: Στηριχτείτε στην εργασία 5.2a (program52a.m).

Λύση:

Στο φάσμα πλάτους που απεικονίζεται στο σχήμα της επόμενης σελίδας. βλέπουμε ότι το σύν-

θετο σήμα (x) αποτελείται από 3 συχνότητες (5, 10 και 20), με πλάτη 0.5×2=1, 1×2=2 και

1.5×2=3. Επίσης, βλέπουμε ότι το μήκος του σήματος είναι N=100.

Άρα η εξίσωση του σήματος είναι η:

1 1 2 2 3 3

2 2 2( ) sin sin sinx n A n f A n f A n f

N N N

με n=0…N-1, όπου N=100 και A1=1, A2=2, A3=3, f 1=5, f 2=10 και f3=20.

Με βάση τα προηγούμενα, κατασκευάζουμε το program53b.m ως ακολούθως:

Page 113: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Λύσεις εργαστηριακών ασκήσεων 113

program53b.m clc; clear; close all; % Δημιουργία σήματος (x) από 3 ημιτονοειδή σήματα στο πεδίο του χρόνου N = 100; % Μήκος σήματος A1 = 1; f1 = 5; % Πλάτος και συχνότητα 1ου ημιτονοειδούς σήματος A2 = 2; f2 = 10; % Πλάτος και συχνότητα 2ου ημιτονοειδούς σήματος A3 = 3; f3 = 20; % Πλάτος και συχνότητα 2ου ημιτονοειδούς σήματος for n=0:N-1 x(n+1) = A1*sin(2*pi*n*f1/N) + ... A2*sin(2*pi*n*f2/N) + ... A3*sin(2*pi*n*f3/N); end

% Σήμα στο πεδίο των συχνοτήτων (Fx(k)) [RFx,IFx] = dft(x);

% Πλάτος του σήματος στο πεδίο των συχνοτήτων (A(k)) for k=1:N A(k) = sqrt( RFx(k)^2 + IFx(k)^2 ); end

% Γραφικές παραστάσεις: % Σήμα στο πεδίο του χρόνου (x(n))

n = [0:N-1]; % Χρονικές στιγμές subplot(2,1,1); plot(n,x); grid on; xlabel('Χρόνος (n)'); ylabel('Σήμα x(n)'); % Πλάτος του σήματος στο πεδίο των συχνοτήτων (A(k)) k = [0:N-1]; % Συχνότητες subplot(2,1,2); stem(k,A); grid on; xlabel('Συχνότητες (k)'); ylabel('Πλάτος |Fx(k)|');

Αποτελέσματα

Page 114: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

114 Εργαστηριακές ασκήσεις επεξεργασίας σήματος

Άσκηση 5.3γ

Γενικεύστε τον κώδικα της συνάρτησης dft.m (βλ. εργασία 5.2α) ώστε να μπορεί να δέχεται ως

είσοδο μιγαδικό σήμα.

Υπόδειξη: Θα χρειαστεί πρώτα να γενικευτούν οι μαθηματικές σχέσεις και η απόδειξη της εργα-

σίας 5.2α, θέτοντας x(n) = Rx(n) + Ix(n).

Λύση:

Εργαζόμαστε όπως στην εργασία 5.2α, με τη διαφορά ότι θεωρούμε το σήμα x(n) μιγαδικό,

δηλαδή: ( ) ( ) ( )x n Rx n jIx n

Το σήμα στο πεδίο των συχνοτήτων υπολογίζεται από τον DFT: 21

0

1( ) ( )

N j knN

n

Fx k x n eN

Πρέπει να φέρουμε το Fx(k) στη μορφή ( ) ( ) ( )Fx k RFx k jIFx k , ώστε να μπορούν να υπο-

λογιστούν τα RFx(k) και IFx(k) (δηλ. το πραγματικό και το φανταστικό μέρος του):

Θα χρησιμοποιηθεί επίσης η σχέση Euler: cos sinje j

Έχουμε: 21 1

0 0

1 1 2 2( ) ( ) ( ) cos sin

N Nj knN

n n

Fx k x n e x n kn j knN N N N

ή:

1 1

0 0

1 2 1 2( ) ( )cos ( )sin

N N

n n

Fx k x n kn j x n knN N N N

ή:

1 1

0 0

1 2 1 2( ) ( ) ( ) cos ( ) ( ) sin

N N

n n

Fx k Rx n jIx n kn j Rx k jIx k knN N N N

ή: 1 1

0 0

1 2 2 1 2 2( ) ( )cos ( )cos ( )sin ( )sin

N N

n n

Fx k Rx n kn jIx n kn j Rx n kn jIx n knN N N N N N

ή: 1 1

0 0

1 2 2 1 2 2( ) ( )cos ( )sin ( )sin ( )cos

N N

n n

Fx k Rx n kn Ix n kn j Rx n kn Ix n knN N N N N N

ή, τελικά:

( ) ( ) ( )Fx k RFx k jIFx k

όπου 1

0

1 2 2( ) ( )cos ( )sin

N

n

RFx k Rx n kn Ix n knN N N

και 1

0

1 2 2( ) ( )sin ( )cos

N

n

IFx k Rx n kn Ix n knN N N

Σημείωση: Στην περίπτωση που το σήμα x(n) είναι πραγματικό, μπορούμε να θέσουμε Ix(n)=0

και Rx(n)=x(n) στις προηγούμενες σχέσεις, οπότε για τα RFx(k) και IFx(k) θα προκύψουν α-

κριβώς οι σχέσεις της εργασίας 5.2α.

Με βάση τις προηγούμενες σχέσεις, μπορούμε να γράψουμε τον κώδικα της ακόλουθης συ-

νάρτηση dft_general.m, ως γενίκευση της dft.m:

Page 115: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Λύσεις εργαστηριακών ασκήσεων 115

dft_general.m function [RFx,IFx] = dft_general(Rx, Ix) % Είσοδος: Rx, Ix = πραγματικό και φανταστικό μέρος του σήματος, % στο πεδίο του χρόνου % Έξοδος: RFx, IFx = πραγματικό και φανταστικό μέρος του σήματος % στο πεδίο των συχνοτήτων μετά από το μετασχηματισμό Fourier N = length(Rx); for k=1:N RFx(k) = 0; IFx(k) = 0; for n=1:N RFx(k) = RFx(k) + ( Rx(n)*cos(2*pi*(k-1)*(n-1)/N) + ... Ix(n)*sin(2*pi*(k-1)*(n-1)/N) ); IFx(k) = IFx(k) - ( Rx(n)*sin(2*pi*(k-1)*(n-1)/N) - ... Ix(n)*cos(2*pi*(k-1)*(n-1)/N) ); end RFx(k) = RFx(k)/N; IFx(k) = IFx(k)/N; end

Page 116: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

116 Εργαστηριακές ασκήσεις επεξεργασίας σήματος

6 Διακριτός Μετασχηματισμός Fourier - Εφαρμογές

(Λύσεις εργαστηριακών ασκήσεων)

Άσκηση 6.3α: Αφαίρεση θορύβου από ηλεκτροκαρδιογραφικό σήμα:

Στην Άσκηση αυτή θα φορτώσουμε ένα ηλεκτροκαρδιογραφικό σήμα από το δίσκο, θα προσπα-

θήσουμε να εντοπίσουμε τις συχνότητες του θορύβου μέσα σ’ αυτό και στη συνέχεια θα τις μηδε-

νίσουμε ώστε να ελαττώσουμε το θόρυβο από το αρχικό σήμα (όπως κάναμε στην Εργασία 6.2α).

Θα χρειαστούμε τις συναρτήσεις sread.m (Εργασία 1.2δ), dft.m (Εργασία 5.2α) και idft.m (Ερ-

γασία 5.2β).

- Κατασκευάστε πρόγραμμα (program63a.m) στο οποίο να κάνετε τα παρακάτω:

α) Φορτώστε το σήμα ecg.txt από το δίσκο (sread.m, Εργασία 1.2δ) και απεικονίστε το.

β) Το ecg.txt είναι αρκετά μεγάλο σήμα (έχει 4355 τιμές). Για το λόγο αυτό και για λόγους ταχύ-

τητας υπολογισμών, θα εργαστούμε στη συνέχεια μόνο με ένα τμήμα του: Αποθηκεύστε σε έναν

άλλο πίνακα ένα τμήμα του αρχικού σήματος (τις τιμές π.χ. από 100 έως 1000) και απεικονίστε

το.

γ) Υπολογίστε το φάσμα πλάτους του στο πεδίο των συχνοτήτων και απεικονίστε το.

δ) Εντοπίστε (οπτικά) στο φάσμα πλάτους τη συχνότητα εκείνη (συχνότητα αποκοπής) πάνω από

την οποία βρίσκεται ο θόρυβος (κατά την κρίση σας, π.χ. 50). Πρέπει να αποκόπτονται αρκετές

υψηλές συχνότητες αλλά να παραμένουν επίσης αρκετές χαμηλότερες, που περιέχουν τη χρήσιμη

πληροφορία του σήματος.

ε) Μηδενίστε τις συνιστώσες του σήματος στο πεδίο των συχνοτήτων που αντιστοιχούν στις συ-

χνότητες που είναι μεγαλύτερες από τη συχνότητα αποκοπής, και απεικονίστε το νέο φάσμα πλά-

τους:

στ) Ανακατασκευάστε το σήμα στο πεδίο του χρόνου. Απεικονίστε το ανακατασκευασμένο σήμα:

Συγκρίνετε το ανακατασκευασμένο με το αρχικό σήμα. Τι παρατηρείτε;

Μπορείτε να δοκιμάσετε με διαφορετικές συχνότητες αποκοπής ώστε να δείτε τις διαφορές.

Page 117: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Λύσεις εργαστηριακών ασκήσεων 117

program63a.m clc; clear; close all;

% Φόρτωμα σήματος από το δίσκο ecg = sread('ecg.txt'); N = length(ecg); % Μήκος σήματος n = [0:N-1]; % Χρονικές στγμές subplot(3,2,1:2); plot(n,ecg,'k'); grid on; xlabel('n'); ylabel('ecg');

% Επιλογή τμήματος του ecg i = 0; for n=100:1000 i = i + 1; x(i) = ecg(n); end N = length(x); % Μήκος σήματος n = [0:N-1]; % Χρονικές στγμές subplot(3,2,3); plot(n,x,'b'); grid on; xlabel('n'); ylabel('x');

% Σήμα στο πεδίο των συχνοτήτων [RFx,IFx] = dft(x);

% Φάσμα πλάτους και γραφική του παράσταση for k=0:N-1 AFx(k+1) = sqrt( RFx(k+1)^2 + IFx(k+1)^2 ); end k = [0:N-1]; % Συχνότητες subplot(3,2,4); stem(k,AFx,'b'); grid on; xlabel('k'); ylabel('AFx');

% Εντοπίζουμε κατά την κρίση μας μια συχνότητα πέρα από την οποία % βρίσκεται ο θόρυβος και θα γίνει η αποκοπή (cut-off frequency). fco = 50; subplot(3,2,4); hold on; plot([fco fco],[0 0.1],'r'); plot([N-fco N-fco],[0 0.1],'r');

% Μηδενισμός των συνιστωσών με συχνότητες >=fco % (μέχρι την κατοπτρική της σε σχέση με το N/2). for k=fco:length(RFx)-fco RFx(k+1) = 0; IFx(k+1) = 0; end % Νέο φάσμα πλάτους και γραφική του παράσταση for k=0:N-1 AFx(k+1) = sqrt( RFx(k+1)^2 + IFx(k+1)^2 ); end k = [0:N-1]; % Συχνότητες subplot(3,2,6); stem(k,AFx,'r'); grid on; xlabel('k'); ylabel('AFx (denoised)');

% Ανακατασκευή του σήματος με τον IDFT, μετά την αποκοπή % των ανεπιθύμητων συχνοτήτων. [Rx,Ix] = idft(RFx,IFx); xnew = Rx; % Κανονικά xnew = Rx + jIx, όμως Ix = 0, άρα xnew = Rx. n = [0:N-1]; % Χρονικές στγμές subplot(3,2,5); plot(n,xnew,'r'); grid on; xlabel('n'); ylabel('x (denoised)');

Αποτελέσματα

Page 118: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

118 Εργαστηριακές ασκήσεις επεξεργασίας σήματος

Page 119: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Λύσεις εργαστηριακών ασκήσεων 119

7 Συνέλιξη στο πεδίο των συχνοτήτων

(Λύσεις εργαστηριακών ασκήσεων)

Άσκηση 7.3α: Εξομάλυνση καρδιογραφικού σήματος.

Δημιουργήστε ένα πρόγραμμα (program73a.m), το οποίο να προκαλεί εξομάλυνση (smoothing)

σε ένα καρδιογραφικό σήμα. Η εξομάλυνση πρέπει να πραγματοποιείται με τη συνέλιξη ενός συ-

στήματος κρουστικής απόκρισης ίσης με [0.25 0.5 0.25] σε ένα τμήμα ενός προσομοιωμένου

καρδιογραφήματος (βλ. και Άσκηση 1.3β). Η συνέλιξη πρέπει να πραγματοποιείται μέσω του πε-

δίου των συχνοτήτων (χρήση συνάρτησης convolution_freq.m). Ακολουθήστε τα παρακάτω βή-

ματα:

(i) Δημιουργείστε ένα φίλτρο εξομάλυνσης στο πεδίο του χρόνου με κρουστική απόκριση ίση με

[0.25 0.5 0.25].

(ii) Φορτώστε το καρδιογραφικό σήμα 'ecg.txt' από το δίσκο σε έναν πίνακα (πρέπει να βρίσκεται

στο Current Directory).

(iii) Για λόγους ταχύτητας, επιλέξτε μόνο ένα μικρό κομμάτι του σήματος, π.χ. τις χρονικές στιγ-

μές από 50 έως 250, αποθηκεύοντάς τις σε έναν άλλο πίνακα για τη συνέχεια της άσκησης.

(iii) Πραγματοποιείστε τη συνέλιξη του φίλτρου με το τμήμα του καρδιογραφικού σήματος μέσω

του πεδίου των συχνοτήτων χρησιμοποιώντας το θεώρημα συνέλιξης (δηλ. χρησιμοποιώντας τη

συνάρτηση convolution_freq.m).

(iv) Απεικονείστε το αρχικό και το εξομαλυμένο σήμα στους ίδιους άξονες, χρησιμοποιώντας

διαφορετικά χρώματα.

Σημείωση: Το παραγόμενο σήμα της συνέλιξης έχει διπλάσιο μήκος από το αναμενόμενο, λόγω

του διπλασιασμού του μήκους των σημάτων (επαυξάνοντας με 0). Για το λόγω αυτό, μπορεί κα-

νείς να διατηρήσει μόνο το πρώτο μισό του παραγόμενου σήματος.

Απαιτούμενα αρχεία για το program73a.m:

ecg.txt: Αρχείο προσομοιωμένου καρδιογραφήματος (βλ. και Άσκηση 1.3β)

sread.m: Συνάρτηση για το διάβασμα του σήματος από το δίσκο (Εργασία 1.2δ).

convolution_freq.m: Συνάρτηση συνέλιξης μέσω πεδίου συχνοτήτων (Εργασία 7.2β)

program73a.m clc; clear all; close all; % Κρουστική απόκριση φίλτρου: h = [0.25 0.5 0.25]; % Σήμα εισόδου: x = sread('ecg.txt'); % Δημιουργία μικρότερου τμήματος του σήματος i = 0; for n=50:250 i = i + 1; x1(i) = x(n); end % Συνέλιξη μέσω πεδίου συχνοτήτων: y = convolution_freq(x1,h); % Διατήρηση μόνο του 1ου μισού του y (το υπόλοιπο είναι 0) for i=1:length(y)/2 y1(i) = y(i); end

% Γραφικές παραστάσεις των x, y: hold on; plot([0:length(x1)-1],x1,'b-'); plot([0:length(y1)-1],y1,'r-'); legend('Σήμα εισόδου','Φιλτραρισμένο σήμα'); grid on

Page 120: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

120 Εργαστηριακές ασκήσεις επεξεργασίας σήματος

Αποτελέσματα

0 20 40 60 80 100 120 140 160 180 200-0.2

-0.1

0

0.1

0.2

0.3

0.4

0.5

Σήμα εισόδου

Φιλτραρισμένο σήμα

Page 121: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Λύσεις εργαστηριακών ασκήσεων 121

Άσκηση 7.3β: Υπολογισμός συσχέτισης με χρήση του θεωρήματος της συσχέτισης:

Με τη βοήθεια του θεωρήματος της συσχέτισης και με μικρές τροποποιήσεις του προγράμματος

program72a.m (Εργασία 7.2α), κατασκευάστε πρόγραμμα (program73b.m), στο οποίο να υπο-

λογίζεται η συσχέτιση μεταξύ δύο σημάτων με τη βοήθεια του θεωρήματος της συσχέτισης.

Να ληφθούν υπ’ όψιν οι σημειώσεις για την κατασκευή του προγράμματος program72a.m (Ερ-

γασία 7.2α), με τη διαφορά ότι κατά το διπλασιασμό του μήκους των δύο σημάτων επαυξάνοντας

με 0 (σημείωση 2) το ένα σήμα πρέπει να επαυξηθεί προς τα δεξιά, ενώ το άλλο προς τ’ αριστερά

(μπορείτε να εξηγήσετε γιατί;).

Απαιτούμενες συναρτήσεις: correlation.m (Εργασία 4.2β), dft.m και idft.m (Εργασίες 5.2α και

5.2β).

program73b.m

clc; clear all;

% 1ο σήμα: x = [3 1 2]; % 2ο σήμα: h = [2 4];

% Συσχέτιση μέσω του πεδίου των συχνοτήτων,με το θεώρημα της συσχέτισης % r = IDFT(Fx.Fh*)

% Εξίσωση μήκους σημάτων (επαυξάνοντας με 0 το μικρότερου μήκους σήμα) if length(x)<length(h) for i=length(x)+1:length(h), x(i) = 0; end elseif length(x)>length(h) for i=length(h)+1:length(x), h(i) = 0; end end

% Διπλασιασμός μήκους σημάτων (επαυξάνοντας με 0 και τα δύο σήματα) % (το ένα σήμα επαυξάνεται προς τα δεξιά και το άλλο προς τ' αριστερά) N = length(x); for i=1:N x(N+i) = 0; end for i=1:N h(N+i) = h(i); h(i) = 0; end

% Μετασχηματισμοί Fourier [RFx,IFx] = dft(x); % DFT του 1ου σήματος [RFh,IFh] = dft(h); % DFT του 2ου σήματος cIFh = -IFh; % Συζυγής μιγαδικός του 2ου σήματος

% Γινόμενο των DFT for k=1:length(RFx) RFr(k) = RFx(k)*RFh(k) - IFx(k)*cIFh(k); % (πραγματικό μέρος) IFr(k) = RFx(k)*cIFh(k) + IFx(k)*RFh(k); % (φανταστικό μέρος) end

% Συσχέτιση (με χρήση του θεωρήματος συσχέτισης) [Rr,Ir] = idft(RFr,IFr); r2 = length(x)*Rr

Αποτέλεσμα r =

-4.6629e-015 -9.992e-016 12 10 10 4

Page 122: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

122 Εργαστηριακές ασκήσεις επεξεργασίας σήματος

Άσκηση 7.3γ: Κατασκευή και χρήση συνάρτησης για τον υπολογισμό της συσχέτισης μέσω του

πεδίου των συχνοτήτων:

Βασιζόμενοι στο πρόγραμμα program73b.m (Άσκηση 7.3β), κατασκευάστε το αρχείο συναρτή-

σεων correlation_freq.m, για τον υπολογισμό της συσχέτισης μέσω του πεδίου των συχνοτήτων.

Στη συνέχεια, χρησιμοποιήστε στο Command Window με απλά σήματα τη συνάρτηση που κατα-

σκευάσατε (correlation_freq.m), καθώς και την correlation.m (Εργασία 4.2β) για να διαπιστώ-

σετε την ταύτιση των αποτελεσμάτων τους.

correlation_freq.m function r = correlation_freq (x,h)

% -------------------------------------------------------------------------

% Συσχέτιση (μέσω του πεδίου των συχνοτήτων, με το θεώρημα της συσχέτισης): % r = IDFT(Fx.Fh*) % -------------------------------------------------------------------------

% Εξίσωση μήκους σημάτων (επαυξάνοντας με 0 το μικρότερου μήκους σήμα) if length(x)<length(h) for i=length(x)+1:length(h), x(i) = 0; end elseif length(x)>length(h) for i=length(h)+1:length(x), h(i) = 0; end end

% Διπλασιασμός μήκους σημάτων (επαυξάνοντας με 0 και τα δύο σήματα) % (το ένα σήμα επαυξάνεται προς τα δεξιά και το άλλο προς τ' αριστερά) N = length(x); for i=1:N x(N+i) = 0; end for i=1:N h(N+i) = h(i); h(i) = 0; end

% Μετασχηματισμοί Fourier [RFx,IFx] = dft(x); % DFT του 1ου σήματος [RFh,IFh] = dft(h); % DFT του 2ου σήματος cIFh = -IFh; % Συζυγής μιγαδικός του 2ου σήματος

% Γινόμενο των DFT for k=1:length(RFx) RFr(k) = RFx(k)*RFh(k) - IFx(k)*cIFh(k); % (πραγματικό μέρος) IFr(k) = RFx(k)*cIFh(k) + IFx(k)*RFh(k); % (φανταστικό μέρος) end

% Συσχέτιση (με χρήση του θεωρήματος συσχέτισης) [Rr,Ir] = idft(RFr,IFr); r = length(x)*Rr;

Command Window (εντολές και αποτελέσματα)

>> x = [3 1 2]; h = [2 4];

>> correlation(x,h), correlation_freq(x,h)

ans =

0 12 10 10 4

ans =

-4.6629e-015 -9.992e-016 12 10 10 4

>>

Page 123: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Λύσεις εργαστηριακών ασκήσεων 123

8 Φιλτράρισμα σήματος στο πεδίο των συχνοτήτων

(Λύσεις εργαστηριακών ασκήσεων)

Άσκηση 8.3α: Αφαίρεση θορύβου από ηλεκτροκαρδιογραφικό σήμα:

Ο σκοπός της Άσκησης αυτής είναι η αφαίρεση του θορύβου των υψηλών συχνοτήτων από ένα

ηλεκτροκαρδιογραφικό σήμα (όπως στην Άσκηση 6.3α) χρησιμοποιώντας φίλτρα low-pass.

Θα χρησιμοποιήσουμε τόσο το ιδεώδες φίλτρο όσο και το Butterworth για να δούμε τις διαφορές.

Για να επιλέξουμε την κατάλληλη συχνότητα αποκοπής, θα απεικονίσουμε το σήμα στο πεδίο των

συχνοτήτων, ώστε να εντοπίσουμε οπτικά πού βρίσκονται οι υψηλές συχνότητες.

Απαιτούμενες συναρτήσεις: sread.m (Εργασία 1.2δ), filter_butterworth_lowpass.m και

filter_butterworth_lowpass.m (Εργασία 8.2β), convolution_freq_filter0.m (Εργασία 8.2α).

- Κατασκευάστε πρόγραμμα (program83a.m) στο οποίο να κάνετε τα εξής:

α) Φορτώστε το σήμα ecg.txt από το δίσκο (sread.m, Εργασία 1.2δ). Επειδή το σήμα έχει μεγάλο

μήκος (4355 τιμές, βλ. και Άσκηση 6.3α), να χρησιμοποιήσετε μόνο ένα τμήμα του (π.χ. από 100

έως 1000) για επιτάχυνση των υπολογισμών.

β) Υπολογίστε το φάσμα πλάτους στο πεδίο των συχνοτήτων και απεικονίστε το.

γ) Εντοπίστε (οπτικά) στο φάσμα πλάτους τη συχνότητα αποκοπής, ώστε να αποκόπτονται αρκε-

τές υψηλές συχνότητες αλλά να παραμένουν επίσης αρκετές χαμηλότερες συχνότητες, που περιέ-

χουν τη χρήσιμη πληροφορία του σήματος (π.χ. fco=50).

δ) Εφαρμόστε στο σήμα τα low-pass φίλτρα ιδεώδες και Butterworth με τη συχνότητα αποκοπής

που εντοπίσατε προηγουμένως. Απεικονίστε το αποτέλεσμα στο πεδίο του χρόνου και στο πεδίο

των συχνοτήτων:

0 100 200 300 400 500 600 700 800 900-0.5

0

0.5

1

1.5

Πρω

τότυ

πο

Σήματα στο πεδίο του χρόνου

0 100 200 300 400 500 600 700 800 900-0.5

0

0.5

1

1.5

...μ

ε ιδεώ

δες

0 100 200 300 400 500 600 700 800 900-0.4

-0.2

0

0.2

0.4

0.6

0.8

1

...μ

ε B

utt

ew

ort

h

Χρονικές στιγμές

0 100 200 300 400 500 600 700 800 9000

0.02

0.04

0.06

0.08

0.1

Πρω

τότυ

πο

Σήματα στο πεδίο των συχνοτήτων (φάσματα πλάτους)

0 100 200 300 400 500 600 700 800 9000

0.02

0.04

0.06

0.08

0.1

...μ

ε ιδεώ

δες

0 100 200 300 400 500 600 700 800 9000

0.02

0.04

0.06

0.08

0.1

...μ

ε B

utt

ew

ort

h

Συχνότητες

Page 124: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

124 Εργαστηριακές ασκήσεις επεξεργασίας σήματος

program83a.m clc; clear; close all;

% Φόρτωμα σήματος από το δίσκο ecg = sread('ecg.txt');

% Επιλογή μικρού τμήματος του ecg i = 0; for n=100:1000 i = i + 1; x(i) = ecg(n); end N = length(x); % Μήκος σήματος

% Επιλογή συχνότητας αποκοπής και δημιουργία φίλτρων fco = 50; Fh1 = filter_ideal_lowpass(N,fco); % Low-pass Ideal n = 3; Fh2 = filter_butterworth_lowpass(N,fco,n); % Low-pass Butterworth

% Εφαρμογή φίλτρων y1 = convolution_freq_filter0(x,Fh1); y2 = convolution_freq_filter0(x,Fh2);

% Σήματα στο πεδίο των συχνοτήτων - Φάσματα πλάτους [RFx,IFx] = dft(x); for k=0:N-1 AFx(k+1) = sqrt( RFx(k+1)^2 + IFx(k+1)^2 ); end [RFy1,IFy1] = dft(y1); for k=0:N-1 AFy1(k+1) = sqrt( RFy1(k+1)^2 + IFy1(k+1)^2 ); end [RFy2,IFy2] = dft(y2); for k=0:N-1 AFy2(k+1) = sqrt( RFy2(k+1)^2 + IFy2(k+1)^2 ); end

% Γραφικές παραστάσεις n = [0:N-1]; % Χρονικές στγμές subplot(3,2,1); plot(n,x,'k'); grid on; ylabel('Πρωτότυπο'); title('Σήματα στο πεδίο του χρόνου'); subplot(3,2,3); plot(n,y1,'b'); grid on; ylabel('...με ιδεώδες'); subplot(3,2,5); plot(n,y2,'r'); grid on; ylabel('...με Butteworth'); xlabel('Χρονικές στιγμές');

k = [0:N-1]; % Συχνότητες subplot(3,2,2); stem(k,AFx,'k'); grid on; ylabel('Πρωτότυπο'); title('Σήματα στο πεδίο των συχνοτήτων (φάσματα πλάτους)'); subplot(3,2,4); stem(k,AFy1,'b'); grid on; ylabel('...με ιδεώδες'); subplot(3,2,6); stem(k,AFy2,'r'); grid on; ylabel('...με Butteworth'); xlabel('Συχνότητες');

Page 125: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Λύσεις εργαστηριακών ασκήσεων 125

Άσκηση 8.3β: Υποδιπλασιασμός συχνότητας μέσω φίλτρου Butterworth:

Κατασκευάστε πρόγραμμα (program83b.m) στο οποίο να κάνετε τα εξής:

α) Κατασκευάστε ένα σύνθετο σήμα 200 τιμών που να αποτελείται από τις συχνότητες 10 και 50,

με πλάτη 4 και 2 αντίστοιχα.

β) Φιλτράρετε το παραπάνω σήμα με φίλτρο Butterworth κατάλληλης συχνότητας αποκοπής, ώ-

στε να υποδιπλασιαστεί το πλάτος της χαμηλής συχνότητας. [Υπόδειξη: Βλ. Παρατήρηση στο φίλ-

τρο Butterhworth, στην Εργασία 8.2β.]

γ) Να απεικονιστεί το αρχικό σύνθετο σήμα μαζί με το τελικό (φιλτραρισμένο) στους ίδιους άξονες

στο πεδίο του χρόνου (subplot 1). Επίσης, να απεικονιστούν τα δύο σήματα στο πεδίο των συ-

χνοτήτων (φάσματα πλάτους, subplots 2 & 3).

program83b.m clc; clear all; close all;

% Signal N = 200; % Μήκος σήματος A1 = 4; A2 = 2; % Πλάτη συνιστώντων σημάτων f1 = 10; f2 = 50; % Συχνότητες συνιστώντων σημάτων for n=0:N-1 % (n=συχνότητα, n+1=δείκτης πίνακα) x(n+1) = A1*sin(2*pi*n*f1/N) + A2*sin(2*pi*n*f2/N); end

% High-pass Butterworth filter fco = 10; n = 3; % Επιλογή της fco=10 ώστε να υποδιπλασιαστεί η συχνότητα

f1=10 Fh = filter_butterworth_highpass(N,fco,n); y = convolution_freq_filter0(x,Fh);

% Amplitude spectrums [RFx,IFx] = dft(x); for k=1:N, Ax(k) = sqrt(RFx(k)^2+IFx(k)^2); end [RFy,IFy] = dft(y); for k=1:N, Ay(k) = sqrt(RFy(k)^2+IFy(k)^2); end

% Plots n=[0:N-1]; k=[0:N-1];

subplot(3,1,1); hold on; plot(n,x); plot(n,y,'r'); grid on; xlabel('time (n)'); ylabel('signals');

subplot(3,1,2); hold on; stem(k,Ax); xlabel('frequency (k)'); axis([0 N min(Ax) max(Ax)]);

subplot(3,1,3); hold on; stem(k,Ay); xlabel('frequency (k)'); axis([0 N min(Ax) max(Ax)]);

Page 126: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

126 Εργαστηριακές ασκήσεις επεξεργασίας σήματος

Αποτελέσματα

0 20 40 60 80 100 120 140 160 180 200-10

0

10

time (n)

sig

nals

0 20 40 60 80 100 120 140 160 180 200

0.5

1

1.5

2

frequency (k)

0 20 40 60 80 100 120 140 160 180 200

0.5

1

1.5

2

frequency (k)

Page 127: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Λύσεις εργαστηριακών ασκήσεων 127

Άσκηση 8.3γ: Διαδοχική εφαρμογή φίλτρων:

Κατασκευάστε πρόγραμμα (program83c.m) στο οποίο να κάνετε τα εξής:

α) Κατασκευάστε ένα σύνθετο σήμα 200 τιμών που να αποτελείται από τις συχνότητες 10, 40 και

80 με πλάτη ίσα με 10 (όλα).

β) Φιλτράρετε το παραπάνω σήμα με δύο διαδοχικά φίλτρα Butterworth κατάλληλων συχνοτήτων

αποκοπής, ώστε διαδοχικά να υποδιπλασιαστεί πρώτα η χαμηλή και στη συνέχεια η υψηλή συ-

χνότητα. [Υπόδειξη: Εφαρμόστε το δεύτερο φίλτρο στο αποτέλεσμα του πρώτου φιλτραρίσματος.]

γ) Να απεικονιστεί το αρχικό σύνθετο σήμα μαζί με το τελικό στους ίδιους άξονες στο πεδίο του

χρόνου (subplot 1). Επίσης, να απεικονιστούν το αρχικό και το τελικό σήμα στο πεδίο των συ-

χνοτήτων (subplots 2 & 3).

program83c.m clc; clear all; close all;

% Signal N = 200; % Μήκος σήματος A1 = 10; A2 = 10; A3 = 10; % Πλάτη συνιστώντων σημάτων f1 = 10; f2 = 40; f3 = 80; % Συχνότητες συνιστώντων σημάτων for n=0:N-1 % (n=συχνότητα, n+1=δείκτης πίνακα) x(n+1) = A1*sin(2*pi*n*f1/N) + A2*sin(2*pi*n*f2/N) + A3*sin(2*pi*n*f3/N); end

% High-pass Butterworth filter fco = 10; n = 3; % Επιλογή της fco=10 ώστε να υποδιπλασιαστεί η f1=10 Fh = filter_butterworth_highpass(N,fco,n); % High-pass για διατήρηση υψηλών y = convolution_freq_filter0(x,Fh); % x --(φιλτράρισμα)--> y

% Low-pass Butterworth filter fco = 80; n = 3; % Επιλογή της fco=80 ώστε να υποδιπλασιαστεί η f3=80 Fh = filter_butterworth_lowpass(N,fco,n); % Low-pass για διατήρηση χαμηλών z = convolution_freq_filter0(y,Fh); % y --(φιλτράρισμα)--> z

% Amplitude spectrums [RFx,IFx] = dft(x); for k=1:N, Ax(k) = sqrt(RFx(k)^2+IFx(k)^2); end %Αρχικό [RFy,IFy] = dft(z); for k=1:N, Ay(k) = sqrt(RFy(k)^2+IFy(k)^2); end %Τελικό

% Plots n=[0:N-1]; k=[0:N-1];

subplot(3,1,1); hold on; plot(n,x); plot(n,y,'r'); grid on; xlabel('time (n)'); ylabel('signals');

subplot(3,1,2); hold on; stem(k,Ax); xlabel('frequency (k)'); axis([0 N min(Ax) max(Ax)]);

subplot(3,1,3); hold on; stem(k,Ay); xlabel('frequency (k)'); axis([0 N min(Ax) max(Ax)]);

Page 128: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

128 Εργαστηριακές ασκήσεις επεξεργασίας σήματος

Αποτελέσματα

0 20 40 60 80 100 120 140 160 180 200-50

0

50

time (n)

sig

nals

0 20 40 60 80 100 120 140 160 180 200

12345

frequency (k)

0 20 40 60 80 100 120 140 160 180 200

12345

frequency (k)

Page 129: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Λύσεις εργαστηριακών ασκήσεων 129

Άσκηση 8.3δ: Κατασκευή εκθετικών φίλτρων (low-pass, high-pass, band-reject, band-pass):

Κατασκευάστε συναρτήσεις που να υλοποιούν τα παρακάτω φίλτρα: εκθετικό low-pass (fil-

ter_exponential_lowpass.m), εκθετικό high-pass (filter_exponential_highpass.m), εκθετικό

band-reject (filter_exponential_badreject.m) και εκθετικό band-pass (filter_exponen-

tial_bandpass.m), όπως στα φίλτρα Butterworth (Εργασία 8.2β).

Υπόδειξη: Γράψτε πρώτα τις μαθηματικές σχέσεις των ανωτέρω εκθετικών φίλτρων.

Λύση:

Οι μαθηματικές σχέσεις των ανωτέρω εκθετικών φίλτρων είναι:

Εκθετικό

Low-pass:

όπου fco = συχνότητα αποκοπής (cut-off frequency)

και n = βαθμός φίλτρου (όσο μεγαλύτερος, τόσο το φίλτρο τείνει προς το ιδεώδες)

Εκθετικό

High-pass:

όπου fco = συχνότητα αποκοπής (cut-off frequency)

και n = βαθμός φίλτρου (όσο μεγαλύτερος, τόσο το φίλτρο τείνει προς το ιδεώδες)

Εκθετικό

Band-Reject:

όπου fco = συχνότητα αποκοπής (cut-off frequency),

n = βαθμός φίλτρου (όσο μεγαλύτερος, τόσο το φίλτρο τείνει προς το ιδεώδες)

και d = κέντρο συχνοτήτων αποκοπής (μετατόπιση προς τα δεξιά σε σχέση με το high-pass)

Εκθετικό

Band-Pass:

όπου fco = συχνότητα αποκοπής (cut-off frequency),

n = βαθμός φίλτρου (όσο μεγαλύτερος, τόσο το φίλτρο τείνει προς το ιδεώδες)

και d = κέντρο συχνοτήτων διέλευσης (μετατόπιση προς τα δεξιά σε σχέση με το low-pass)

ln 2

2

ln 2

2

, για ( )

, για

nk

fco

nN kfco

N

N

e kFh k

e k

ln 2

2

ln 2

2

, για ( )

, για

nfcok

nfco

N k

N

N

e kFh k

e k

ln 2

2

ln 2

2

, για ( )

, για

nfco

k d

nfco

N k d

N

N

e kFh k

e k

ln 2

2

ln 2

2

, για ( )

, για

nk dfco

nN k d

fco

N

N

e kFh k

e k

Page 130: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

130 Εργαστηριακές ασκήσεις επεξεργασίας σήματος

Κατά συνέπεια τα εκθετικά φίλτρα υλοποιούνται ως εξής:

filter_exponential_lowpass.m function Fh = filter_exponential_lowpass(N,fco,n) % Exponential Low-pass filter % N = filter length (must be equal the signal length) % fco = cut-off frequency % n = degree

for k=0:N-1 % (k=συχνότητα, k+1=δείκτης πίνακα) if k<N/2 Fh(k+1) = exp(-log(2)*(k/fco)^n); else Fh(k+1) = exp(-log(2)*((N-k)/fco)^n); end end

filter_exponential_highpass.m function Fh = filter_exponential_highpass(N,fco,n) % Exponential High-pass filter % N = filter length (must be equal the signal length) % fco = cut-off frequency % n = degree

for k=0:N-1 % (k=συχνότητα, k+1=δείκτης πίνακα) if k<N/2 Fh(k+1) = exp(-log(2)*(fco/k)^n); else Fh(k+1) = exp(-log(2)*(fco/(N-k))^n); end end

filter_exponential_bandreject.m function Fh = filter_exponential_bandreject(N,fco,n,d) % Exponential Band-Reject filter % N = filter length (must be equal the signal length) % fco = cut-off frequency % n = degree

% d = shift

for k=0:N-1 % (k=συχνότητα, k+1=δείκτης πίνακα) if k<N/2 Fh(k+1) = exp(-log(2)*(fco/(k-d))^n); else Fh(k+1) = exp(-log(2)*(fco/(N-k-d))^n); end end

filter_exponential _bandpass.m function Fh = filter_exponential_bandpass(N,fco,n,d) % Exponential Band-Pass filter % N = filter length (must be equal the signal length) % fco = cut-off frequency % n = degree % d = shift

for k=0:N-1 % (k=συχνότητα, k+1=δείκτης πίνακα) if k<N/2 Fh(k+1) = exp(-log(2)*((k-d)/fco)^n); else Fh(k+1) = exp(-log(2)*((N-k-d)/fco)^n); end end

Page 131: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Λύσεις εργαστηριακών ασκήσεων 131

Άσκηση 8.3ε: Προγράματα εφαρμογής των εκθετικών φίλτρων:

Κατασκευάστε δύο προγράμματα (program83d_1.m και program83d_2.m), στα οποία να γίνε-

ται επίδειξη εφαρμογής των εκθετικών φίλτρων low-pass/high-pass και band-reject/band-pass

αντίστοιχa, κατά το υπόδειγμα των προγραμμάτων εφαρμογής των φίλτρων Butterworth

(program82b_1.m και program82b_2.m, Εργασία 8.2γ).

program83d_1.m

clc; clear all; close all;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% EXPONENTIAL LOW-PASS & HIGH-PASS FILTERING %%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Signal N = 100; % Μήκος σήματος A1 = 10; A2 = 4; A3 = 2; A4 = 2; % Πλάτη συνιστώντων σημάτων f1 = 1; f2 = 5; f3 = 30; f4 = 40; % Συχνότητες συνιστώντων σημάτων for n=0:N-1 % (n=συχνότητα, n+1=δείκτης πίνακα) x(n+1) = A1*sin(2*pi*n*f1/N) + A2*sin(2*pi*n*f2/N) + ... A3*sin(2*pi*n*f3/N) + A4*sin(2*pi*n*f4/N); end

% Low-pass Exponential filter fco1 = 25; n1 = 3; Fh1 = filter_exponential_lowpass(N,fco1,n1); y1 = convolution_freq_filter0(x,Fh1);

% High-pass Exponential filter fco2 = 25; n2 = 3; Fh2 = filter_exponential_highpass(N,fco2,n2); y2 = convolution_freq_filter0(x,Fh2);

% Amplitude spectrums [RFx,IFx] = dft(x); for k=1:N, Ax(k) = sqrt(RFx(k)^2+IFx(k)^2); end [RFy1,IFy1] = dft(y1); for k=1:N, Ay1(k) = sqrt(RFy1(k)^2+IFy1(k)^2); end [RFy2,IFy2] = dft(y2); for k=1:N, Ay2(k) = sqrt(RFy2(k)^2+IFy2(k)^2); end

% Plots n=[0:N-1]; k=[0:N-1];

subplot(4,2,1); stem(k,Fh1); title('Low-pass Exponential filter');

subplot(4,2,2); stem(k,Fh2); title('High-pass Exponential filter');

subplot(4,2,3); hold on; plot(n,x); plot(n,y1,'r'); legend('Original signal','Filtered signal');

subplot(4,2,4); hold on; plot(n,x); plot(n,y2,'r'); legend('Original signal','Filtered signal');

Page 132: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

132 Εργαστηριακές ασκήσεις επεξεργασίας σήματος

subplot(4,2,5); stem(k,Ax); legend('Original Amplitude Spectrum'); axis([0 N min(Ax) max(Ax)]);

subplot(4,2,6); stem(k,Ax); legend('Original Amplitude Spectrum'); axis([0 N min(Ax) max(Ax)]);

subplot(4,2,7); stem(k,Ay1,'r'); legend('Low-pass filtered Amplitude Spectrum'); axis([0 N min(Ax) max(Ax)]);

subplot(4,2,8); stem(k,Ay2,'r'); legend('High-pass filtered Amplitude Spectrum'); axis([0 N min(Ax) max(Ax)]);

Αποτελέσματα

Παρατηρήσεις:

Στο πρόγραμμα αυτό εργαστήκαμε όπως ακριβώς και στο program82b_1.m, με τη διαφορά ότι

χρησιμοποιήσαμε Εκθετικό φίλτρο αντί για Butterworth. Τα αποτελέσματα είναι παρόμοια, σχε-

δόν χωρίς διαφορές, λόγω της παρόμοιας μορφής των δύο φίλτρων.

Page 133: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Λύσεις εργαστηριακών ασκήσεων 133

program83d_2.m

clc; clear all; close all;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% EXPONENTIAL BAND-PASS & BAND-REJECT FILTERING %%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Signal N = 200; % Μήκος σήματος A1 = 10; A2 = 4; A3 = 4; A4 = 2; % Πλάτη συνιστώντων σημάτων f1 = 1; f2 = 30; f3 = 32; f4 = 50; % Συχνότητες συνιστώντων σημάτων for n=0:N-1 % (n=συχνότητα, n+1=δείκτης πίνακα) x(n+1) = A1*sin(2*pi*n*f1/N) + A2*sin(2*pi*n*f2/N) + ... A3*sin(2*pi*n*f3/N) + A4*sin(2*pi*n*f4/N); end

% Band-Pass Exponential filter fco1 = 25; n1 = 2; d1 = 30; Fh1 = filter_exponential_bandpass(N,fco1,n1,d1); y1 = convolution_freq_filter0(x,Fh1);

% Band-Reject Exponential filter fco2 = 25; n2 = 2; d2 = 30; Fh2 = filter_exponential_bandreject(N,fco2,n2,d2); y2 = convolution_freq_filter0(x,Fh2);

% Amplitude spectrums [RFx,IFx] = dft(x); for k=1:N, Ax(k) = sqrt(RFx(k)^2+IFx(k)^2); end [RFy1,IFy1] = dft(y1); for k=1:N, Ay1(k) = sqrt(RFy1(k)^2+IFy1(k)^2); end [RFy2,IFy2] = dft(y2); for k=1:N, Ay2(k) = sqrt(RFy2(k)^2+IFy2(k)^2); end

% Plots n=[0:N-1]; k=[0:N-1];

subplot(4,2,1); stem(k,Fh1); title('Band-Pass Exponential filter');

subplot(4,2,2) stem(k,Fh2); title('Band-Reject Exponential filter');

subplot(4,2,3); hold on; plot(n,x); plot(n,y1,'r'); legend('Original signal','Filtered signal');

subplot(4,2,4); hold on; plot(n,x); plot(n,y2,'r'); legend('Original signal','Filtered signal');

subplot(4,2,5); stem(k,Ax); legend('Original Amplitude Spectrum'); axis([0 N min(Ax) max(Ax)]);

subplot(4,2,6); stem(k,Ax); legend('Original Amplitude Spectrum');

Page 134: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

134 Εργαστηριακές ασκήσεις επεξεργασίας σήματος

axis([0 N min(Ax) max(Ax)]);

subplot(4,2,7); hold on; stem(k,Ay1,'r'); legend('Band-Pass filtered Amplitude Spectrum'); axis([0 N min(Ax) max(Ax)]);

subplot(4,2,8); stem(k,Ay2,'r'); legend('Band-Reject filtered Amplitude Spectrum'); axis([0 N min(Ax) max(Ax)]);

Αποτελέσματα

Παρατηρήσεις:

Στο πρόγραμμα αυτό εργαστήκαμε όπως ακριβώς και στο program82b_2.m, με τη διαφορά ότι

χρησιμοποιήσαμε Εκθετικό φίλτρο αντί για Butterworth. Τα αποτελέσματα είναι παρόμοια, σχε-

δόν χωρίς διαφορές, λόγω της παρόμοιας μορφής των δύο φίλτρων.

Page 135: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Λύσεις εργαστηριακών ασκήσεων 135

Άσκηση 8.3στ: Πρόγραμμα φιλτραρίσματος με επιλογή φίλτρου από μενού:

Με βάση τα προγράμματα της Εργασίας 8.2γ και της Άσκησης 8.3β, κατασκευάστε ένα και μονα-

δικό πρόγραμμα (program83e.m) στο οποίο να μπορεί να γίνεται επιλογή του φίλτρου, μέσω

ενός μενού.

Υπόδειξη: Δημιουργείστε στο πρόγραμμα ένα μενού και κάντε την επιλογή της δημιουργίας του

φίλτρου μέσω εντολής switch-case. Ουσιαστικά, το switch-case θα αντικαταστήσει μόνο

την εντολή δημιουργίας του φίλτρου, ενώ κατά τα άλλα το πρόγραμμα θα είναι σχεδόν ίδιο με ένα

από τα ανωτέρω αναφερόμένα προγράμματα (με τη διαφορά ότι θα τυπώνει 4 –και όχι 8- γραφι-

κές παραστάσεις).

program83e.m clc; clear all; close all;

% Signal construction N = 100; % Μήκος σήματος A1 = 10; A2 = 4; A3 = 2; A4 = 2; A5 = 1; % Πλάτη συνιστώντων σημάτων f1 = 1; f2 = 5; f3 = 30; f4 = 32; f5 = 50; % Συχνότητες συνιστώντων σημάτων for n=0:N-1 % (n=συχνότητα, n+1=δείκτης πίνακα) x(n+1) = A1*sin(2*pi*n*f1/N) + A2*sin(2*pi*n*f2/N) + ... A3*sin(2*pi*n*f3/N) + A4*sin(2*pi*n*f4/N) + A5*sin(2*pi*n*f5/N); end

% Filter selection disp('*** FILTER SELECTION MENU ***'); disp(' '); disp(' 1. Ideal Low-Pass filter'); disp(' 2. Ideal High-Pass filter'); disp(' 3. Ideal Band-Reject filter'); disp(' 4. Ideal Band-Pass filter'); disp(' 5. Butterworth Low-Pass filter'); disp(' 6. Butterworth High-Pass filter'); disp(' 7. Butterworth Band-Reject filter'); disp(' 8. Butterworth Band-Pass filter'); disp(' 9. Exponential Low-Pass filter'); disp('10. Exponential High-Pass filter'); disp('11. Exponential Band-Reject filter'); disp('12. Exponential Band-Pass filter'); disp(' '); selection = input('Select a filter: ');

switch selection case 1 % Low-pass Ideal fco = 20; Fh = filter_ideal_lowpass(N,fco); filtername = 'Ideal Low-Pass'; case 2 % High-pass Ideal fco = 20; Fh = filter_ideal_highpass(N,fco); filtername = 'Ideal High-Pass'; case 3 % Band-Reject Ideal filter d = 30; w=20; Fh = filter_ideal_bandreject(N,d,w); filtername = 'Ideal Band-Reject'; case 4 % Band-Pass Ideal filter d = 30; w=20; Fh = filter_ideal_bandpass(N,d,w);

Page 136: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

136 Εργαστηριακές ασκήσεις επεξεργασίας σήματος

filtername = 'Ideal Band-Pass'; case 5 % Low-pass Butterworth filter fco = 25; n = 3; Fh = filter_butterworth_lowpass(N,fco,n); filtername = 'Butterworth Low-Pass'; case 6 % High-pass Butterworth filter fco = 25; n = 3; Fh = filter_butterworth_highpass(N,fco,n); filtername = 'Butterworth High-Pass'; case 7 % Band-Reject Butterworth filter fco = 25; n = 3; d = 30; Fh = filter_butterworth_bandreject(N,fco,n,d); filtername = 'Butterworth Band-Reject'; case 8 % Band-Pass Butterworth filter fco = 25; n = 3; d = 30; Fh = filter_butterworth_bandpass(N,fco,n,d); filtername = 'Butterworth Band-Pass'; case 9 % Low-pass Exponential filter fco = 25; n = 3; Fh = filter_exponential_lowpass(N,fco,n); filtername = 'Exponential Low-Pass'; case 10 % High-pass Exponential filter fco = 25; n = 3; Fh = filter_exponential_highpass(N,fco,n); filtername = 'Exponential High-Pass'; case 11 % Band-Reject Exponential filter fco = 25; n = 2; d = 30; Fh = filter_exponential_bandreject(N,fco,n,d); filtername = 'Exponential Band-Reject'; case 12 % Band-Pass Exponential filter fco = 25; n = 2; d = 30; Fh = filter_exponential_bandpass(N,fco,n,d); filtername = 'Exponential Band-Pass'; end

% Filtering y = convolution_freq_filter0(x,Fh);

% Amplitude spectrums [RFx,IFx] = dft(x); for k=1:N, Ax(k) = sqrt(RFx(k)^2+IFx(k)^2); end [RFy,IFy] = dft(y); for k=1:N, Ay(k) = sqrt(RFy(k)^2+IFy(k)^2); end

% Plots n=[0:N-1]; k=[0:N-1];

subplot(4,1,1); stem(k,Fh); title([filtername ' filter']);

subplot(4,1,2); hold on; plot(n,x); plot(n,y,'r'); legend('Original signal','Filtered signal'); title('Signal filtering');

Page 137: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Λύσεις εργαστηριακών ασκήσεων 137

subplot(4,1,3); hold on; stem(k,Ax); axis([0 N min(Ax) max(Ax)]); legend('Amplitude Spectrum (original signal)');

subplot(4,1,4); hold on; stem(k,Ay,'r'); axis([0 N min(Ax) max(Ax)]); legend('Amplitude Spectrum (filtered signal)');

Αποτελέσματα

** FILTER SELECTION MENU **

1. Ideal Low-Pass

2. Ideal High-Pass

3. Ideal Band-Reject

4. Ideal Band-Pass

5. Butterworth Low-Pass

6. Butterworth High-Pass

7. Butterworth Band-Reject

8. Butterworth Band-Pass

9. Exponential Low-Pass

10. Exponential High-Pass

11. Exponential Band-Reject

12. Exponential Band-Pass

Select a filter: 5

Page 138: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

138 Εργαστηριακές ασκήσεις επεξεργασίας σήματος

9 Αποκατάσταση σήματος

(Λύσεις εργαστηριακών ασκήσεων)

Άσκηση 9.3α: Συνάρτηση φίλτρου Ισχύος:

Να κατασκευαστεί συνάρτηση (filter_restoration_power.m) η οποία να υλοποιεί το φίλτρο ι-

σχύος. Η συνάρτηση αυτή πρέπει να έχει να έχει εισόδους τις ( )Fh k , A και C και έξοδο την

( )Fw k (βλ. Συνοπτική θεωρία, παράγραφος 9.1).

Λύση:

Το φίλτρο Ισχύος είναι:

2

2

( ) 1( )

( )( )

Fh kFw k

Fh kFh k A

Στην πράξη, ο παράγοντας 1 ( )Fh k αντικαθίσταται από 1 C , αν ( )Fh k C (όπου C μια μικρή

τιμή), για αποφυγή απειρισμών ή πολύ μεγάλων αριθμών.

Η συνάρτηση του φίλτρου Ισχύος έχει εισόδους τις ( )Fh k , A και C και έξοδο την ( )Fw k .

filter_restoration_power.m function Fw = filter_restoration_power(Fh,A,C) % Power restoration filter function % Fh = Impulse response % A = Noise to Signal Ratio (squared) % C = a small number % Fw = Filter

for i=1:length(Fh) if Fh(i)>C Fw(i) = (1/Fh(i)) * sqrt(Fh(i)^2/(Fh(i)^2+A)); else Fw(i) = (1/C) * sqrt(Fh(i)^2/(Fh(i)^2+A)); end end

Page 139: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Λύσεις εργαστηριακών ασκήσεων 139

Άσκηση 9.3β: Συνάρτηση γενικευμένου φίλτρου Wiener:

Να κατασκευαστεί συνάρτηση (filter_restoration_gwiener.m) η οποία να υλοποιεί το γενικευ-

μένο φίλτρο Wiener. Η συνάρτηση αυτή πρέπει να έχει να έχει εισόδους τις ( )Fh k , α, β, A και

C και έξοδο την ( )Fw k (βλ. Συνοπτική θεωρία, παράγραφος 9.1), ώστε με κατάλληλες τιμές των

παραμέτρων αυτών να μπορεί να αντικαταστήσει τις συναρτήσεις των φίλτρων Αντίστροφο, Wie-

ner και Ισχύος (Εργασία 9.2α και Άσκηση 9.3α).

Λύση:

Το γενικευμένο φίλτρο Wiener είναι:

12

2

( ) 1( )

( )( )

Fh kFw k

Fh kFh k A

Από το γενικευμένο φίλτρο Wiener μπορούμε να πάρουμε το αντίστροφο, το Wiener και το φίλτρο

ισχύος με τις ακόλουθες τιμές των παραμέτρων α και β::

Αντίστροφο φίλτρο: α=1 β=0

Φίλτρο Wiener: α=0 β=1

Φίλτρο Ισχύος: α=0.5 β=1

Στην πράξη, όπως και στο ψευδοαντίστροφο φίλτρο, ο παράγοντας 1 ( )Fh k αντικαθίσταται από

1 C , αν ( )Fh k C (όπου C μια μικρή τιμή), για αποφυγή απειρισμών ή πολύ μεγάλων αριθμών.

Η συνάρτηση του γενικευμένου φίλτρου Wiener πρέπει να έχει εισόδους τις ( )Fh k , α, β, A και

C και έξοδο την ( )Fw k .

filter_restoration_gwiener.m function Fw = filter_restoration_gwiener(Fh,a,b,A,C) % Generalized Wiener restoration filter function % Fh = Impulse response % a,b,A = free parameters % C = a small number % Fw = Filter

for i=1:length(Fh) if Fh(i)>C Fw(i) = (1/Fh(i)) * (Fh(i)^2/(Fh(i)^2+b*A))^(1-a); else Fw(i) = (1/C) * (Fh(i)^2/(Fh(i)^2+b*A))^(1-a); end end

Page 140: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

140 Εργαστηριακές ασκήσεις επεξεργασίας σήματος

Άσκηση 9.3γ: Πρόγραμμα εφαρμογής του γενικευμένου φίλτρου Wiener:

Τροποποιήστε κατάλληλα το program92a.m ώστε να κατασκευάστε ένα άλλο (program93a.m)

στο οποίο να αντικαταστήσετε τις συναρτήσεις των φίλτρων Αντίστροφο, Wiener και Ισχύος με

τη συνάρτηση του γενικευμένου φίλτρου Wiener. Το program93a.m πρέπει να παράγει τα ίδια

αποτελέσματα με το program92a.m, με κατάλληλες τιμές των παραμέτρων α και β.

Λύση:

program93a.m clc; clear all; close all;

% Αρχικό σήμα % (Διάβασμα ηλεκτροκαρδιογραφήματος από το δίσκο) x = load('ecgtest.txt');

% Κρουστική απόκριση συστήματος % (Δημιουργία τεχνητού συστήματος που αποκόπτει τις υψηλές συχνότητες) N = length(x); fco = 10; n = 2; Fh = filter_butterworth_lowpass(N,fco,n);

% Υποβάθμιση σήματος % (Συνέλιξη αρχικού σήματος με σύστημα + θόρυβος) % 1. Συνέλιξη με κρουστική απόκριση συστήματος y = convolution_freq_filter0(x,Fh); % 2. Προσθήκη θορύβου for i=1:length(y) y(i) = y(i) + randn/5; end

% Επιλογή φίλτρου αποκατάστασης disp('* MENU *'); disp('1. Inverse filter'); disp('2. Wiener filter'); disp('3. Power filter'); disp('4. User defined filter'); filter = input('Select a restoration filter: '); switch filter case 1 % Inverse filter a = 1; b = 0; case 2 % Wiener filter a = 0; b = 1; case 3 % Power filter a = 0.5; b = 1; case 4 % User defined filter a = input('a? '); b = input('b? '); end C = 0.1; A = 0.05; Fw = filter_restoration_gwiener(Fh,a,b,A,C);

% Αποκατάσταση σήματος % (Συνέλιξη υποβαθμισμένου σήματος με φίλτρο) x1 = convolution_freq_filter0(y,Fw);

% Γραφικές παραστάσεις % (Αρχικό σήμα, Υποβαθμισμένο σήμα, Αποκατεστημένο σήμα) hold on; plot(x,'b:'); plot(y,'b'); plot(x1,'r'); legend('Original signal','Degrated signal','Restored signal');

Page 141: medisp.bme.uniwa.gr¥ΛΙΚΟ... · ΠΕΡΙΕΧΟΜΕΝΑ 0 Βαικές γνώ 1ις προγραμμαιμού MATLAB ...

Λύσεις εργαστηριακών ασκήσεων 141

Άσκηση 9.3δ: Μελέτη φίλτρων αποκατάστασης:

Εκτελέστε τις παρακάτω εργασίες, χρησιμοποιώντας το πρόγραμμα program92a.m:

1. Επίδραση του θορύβου στο αντίστροφο φίλτρο:

Τρέξτε το πρόγραμμα με το Inverse φίλτρο, και στη συνέχεια:

α) Αυξήστε το θόρυβο (π.χ. σβήστε τη διαίρεση με το 5 στην εντολή randn). Τι παρατηρείτε;

Εξηγήστε το με βάση τη θεωρία.

β) Ελαττώστε το θόρυβο (π.χ. διαιρέστε την εντολή randn με 50 αντί για 5). Τι παρατηρείτε;

Εξηγήστε το με βάση τη θεωρία.

γ) Μηδενίστε το θόρυβο (π.χ. βάλτε σε σχόλια (%) τις γραμμές που προσθέτουν το θόρυβο). Τι

παρατηρείτε; Εξηγήστε το με βάση τη θεωρία.

2) Βελτιστοποίηση ανίστροφου φίλτρου:

Να μεταβάλλετε τη σταθερά C ώστε να βρείτε την τιμή εκείνη που δίνει οπτικά καλύτερο απο-

τέλεσμα στο φιλτράρισμα (με μέθοδο δοκιμής και σφάλματος). Να προτείνετε έναν αντικειμε-

νικό τρόπο (δηλ. όχι οπτικό) εκτίμησης των αποτελεσμάτων.

3) Σύγκριση του αντίστροφου φίλτρου με το φίλτρο Wiener:

Μηδενίστε το θόρυβο καθώς και τη σταθερά A. Στη συνέχεια τρέξτε το πρόγραμμα και με τα

δύο φίλτρα. Τι παρατηρείτε; Εξηγήστε το με βάση τη θεωρία.

4) Επίδραση του θορύβου στο φίλτρο Wiener:

Χρησιμoποιήστε σήμα με μεσαίο επίπεδο θορύβου (π.χ. randn/5) και εφαρμόστε το φίλτρο

Wiener θέτοντας την παράμετρο θορύβου προς σήμα A=0.05. Στη συνέχεια μεγαλώστε το θό-

ρυβο (π.χ. σβήστε τη διαίρεση με το 5). Τι μεταβολή πρέπει να κάνετε στην παράμετρο A,

σύμφωνα με τη θεωρία; Διαπιστώστε το και πειραματικά, αυξάνοντας και ελαττώνοντας την

τιμή του A στο πρόγραμμα και παρατηρώντας τα αποτελέσματα.