Εργαστηριακή Άσκηση 1 Υλοποίηση FIR Φίλτρων 1. Εισαγωγή Στα πλαίσια αυτής της άσκησης θα υλοποιηθούν ψηφιακά FIR φίλτρα στην αναπτυξιακή κάρτα TMS320C6711 DSK. Ο σκοπός της άσκησης συνοψίζεται στα ακόλουθα σηµεία : Εξοικείωση µε το περιβάλλον προγραµµατισµού του επεξεργαστή σήµατος κινητής υποδιαστολής TMS320C6711. Εξοικείωση µε το χειρισµό των περιφερειακών συσκευών του. Υλοποίηση FIR φίλτρων σε πραγµατικό χρόνο. 2. H TMS320C6711 DSK Κάρτα και το CCS v2.2 2.1. Περιφερειακές Συσκευές του Επεξεργαστή TMS320C6711 O επεξεργαστής κινητής υποδιαστολής TMS320C6711, στον οποίο βασίζεται η αναπτυξιακή κάρτα που φαίνεται στο Σχήµα 1, συνδέεται µε τις ακόλουθες περιφερειακές συσκευές: 1. Switches 2. LEDs 3. Expansion Peripheral Interface 4. Expansion Memory Interface 5. Συσκευή AD535 Ο επεξεργαστής διασυνδέεται µε τις παραπάνω περιφερειακές συσκευές µέσω της θύρας memory expansion και των δύο σειριακών θυρών McBSP0 και McBSP1 (Multichannel Buffered Serial Ports). Πάνω στη σειριακή θύρα McBSP0 είναι συνδεδεµένη η περιφερειακή συσκευή AD535, στην οποία υπάρχουν οι µετατροπείς Αναλογικό-σε-Ψηφιακό (Α-Ψ) και Ψηφιακό σε Αναλογικό (Ψ-Α), οι οποίοι βασίζονται στη διαµόρφωση Σίγµα- έλτα (για περισσότερες λεπτοµέρειες δες το Εγχειρίδιο Χρήστη του DSK). Η συσκευή AD535 µπορεί να χρησιµοποιηθεί για είσοδο και έξοδο ακουστικών σηµάτων (mono), χρησιµοποιεί µια σταθερή συχνότητα δειγµατοληψίας 8 KHz και µήκος λέξης 16 bits. 1 η Εργαστηρική Άσκηση - Υλοποίηση FIR Φίλτρων -1-
Σχήµα 1 : Άποψη της Αναπτυξιακής κάρτας DSP Starter Kit (DSK). 2.2. Αρχικοποίηση & Έλεγχος Σωστής Λειτουργίας της Κάρτας Για να γίνουν οι σωστές αρχικοποιήσεις (Initialization) του επεξεργαστή και όλων των περιφερειακών συσκευών του χρειάζεται να εκτελέσετε τα ακόλουθα απλά βήµατα : 1. Συνδέστε τη κάρτα DSK, µέσω της παράλληλης θύρας, στο host PC και στην τροφοδοσία ρεύµατος. Μετά την τροφοδοσία, τα LEDs θα πρέπει να αναβοσβήνουν επιβεβαιώνοντας έτσι την ορθή λειτουργία της. 2. Επιλέγοντας το εικονίδιο CCS 2 (C 6000) στην επιφάνεια εργασίας ενεργοποιείται το Code Composer Studio. Πρόκειται για ένα ολοκληρωµένο περιβάλλον ανάπτυξης λογισµικού για ψηφιακούς επεξεργαστές της εταιρείας Texas Instruments. Επισηµαίνεται ότι αν χρειαστεί να γίνει reset η κάρτα θα πρέπει, ανάλογα µε το αν το CCS είναι ή δεν είναι σε κατάσταση run, να κάνετε µία από τις παρακάτω ενέργειες : 1) Αν το CCS είναι σε κατάσταση run, επιλέγουµε : Debug > Reset DSP. 2) Αν το CCS δεν είναι σε κατάσταση run, κλείνουµε το CCS και κάνουµε reset την κάρτα είτε πατώντας το πλήκτρο reset, είτε διακόπτοντας την τροφοδοσία της κάρτας για µερικά δευτερόλεπτα και ενεργοποιώντας στη συνεχεια το CSS. 3. Για τον έλεγχο της ορθής λειτουργίας του DSK επιλέγουµε στο CCS περιβάλλον: GEL > Check DSK > QuickTest. Κατά τη διάρκεια αυτού του ελέγχου τα LEDs στην κάρτα θα πρέπει να αναβοσβήνουν κι ο επεξεργαστής βρίσκεται σε κατάσταση self-test. 1 η Εργαστηρική Άσκηση - Υλοποίηση FIR Φίλτρων -2-
2.3. ηµιουργία Αρχείου Project Για να δηµιουργήσετε στο CCS περιβάλλον ένα αρχείο project (επέκταση.pjt) θα πρέπει να ακολουθήσετε την παρακάτω διαδικασία : 1) ηµιουργείστε ένα νέο project µε την ονοµασία askisi_1.pjt, επιλέγοντας: Project > New και αποθηκεύστε το, µε το όνοµα askisi1, στο directory C:\E_PS_E_S. Σαν Project Type: θέτουµε Executable (.out) ενώ ως Target επιλέγουµε TMS320C67XX. 2) Για τη σωστή εκτέλεση της άσκησης, θα πρέπει να αντιγράψετε τα αρχεία που υπάρχουν στον φάκελο C:\E_PS_E_S\yliko1 στο φάκελο C:\E_PS_E_S\askisi1. 3) Στη συνέχεια επιλέξτε: Project > Add Files to Project... και στο παράθυρο που ανοίγει πάµε στο directory C:\E_PS_E_S\askisi1. Στο πεδίο Files of type: επιλέγουµε C Source Files (*.c,*.ccc) και στο πεδίο File name: το αρχείο loopback. 4) Επαναλάβετε δύο (2) φορές το Βήµα 3 και: 4.1) τη πρώτη φορά στο πεδίο Files of type: επιλέξτε Asm Source Files (*.a*) και File name: vectors 4.2) τη δεύτερη, στο πεδίο Files of type: Linker Command File (*.cmd) ενώ στο πεδίο File name: lnk. 5) Για να ολοκληρώσετε τη δηµιουργία του αρχείου project, επιλέξτε Project > Scan All Dependencies. 2.4. Οι ιαδικασίες Build, Load και Run Για να κάνουµε Build το project χρειάζονται να εκτελέσουµε τις διαδικασίες compile και link. Για το σκοπό αυτό, επιλέγουµε : Project > Rebuild All. Μόλις το CCS ολοκληρώσει επιτυχώς τα δύο παραπάνω βήµατα, θα δηµιουργηθεί το εκτελέσιµο αρχείο askisi1.out το οποίο αποθηκεύεται στον υποκατάλογο C:\E_PS_E_S\askisi1\Debug. (Ουσιαστικά το.out αρχείο είναι το µεταγλωττισµένο εκτελέσιµο αρχείο σε γλώσσα κατανοητή από τον DSP). Επόµενο βήµα στη διαδικασία για την εκτέλεση του προγράµµατος µας είναι να γίνει Load το εκτελέσιµο πρόγραµµα askisi1.out που δηµιουργήσαµε. Αυτό γίνεται ακολουθώντας τη παρακάτω διαδικασία: 1 η Εργαστηρική Άσκηση - Υλοποίηση FIR Φίλτρων -3-
1. Επιλέγουµε : File > Load Program... και επιλέγουµε το αρχείο askisi1.out που δηµιουργήσαµε προηγουµένως. 2. Τρέχουµε το πρόγραµµα, επιλέγοντας : Debug > Run. 3. Η εκτέλεση του προγράµµατος σταµατά επιλέγοντας : Debug > Halt. Επισηµαίνεται ότι σε περίπτωση τροποποίησης του προγράµµατος θα πρέπει να ξαναγίνει η διαδικασία Build που περιγράφηκε και να ακολουθήσουµε την επιλογή: File > Reload Program. 3. Το πρόγραµµα loopback Το πρώτο πρόγραµµα που θα εκτελέσετε στα πλαίσια της άσκησης αυτής θα υλοποιεί ένα σύστηµα δειγµατοληψίας και ανακατασκευής ενός ακουστικού σήµατος. Για το σκοπό αυτό θα χρησιµοποιηθούν οι µετατροπείς Α-Ψ και Ψ-Α της συσκευής AD535. Είναι προφανές ότι στην περίπτωση αυτή ο DSP δεν θα κάνει καµία επεξεργασία στο σήµα εισόδου και θα περιοριστεί µόνο στην εργασία του διακοµιστή. Το πρόγραµµα που υλοποιεί το παραπάνω σύστηµα είναι το πρόγραµµα loopback το οποίο και θα σας δοθεί. Στη συνέχεια θα αναλύσουµε τον κώδικα αυτού του προγράµµατος, µε την βοήθεια του οποίου θα γίνουν κατανοητές κάποιες βασικές λειτουργίες της αναπτυξιακής πλατφόρµας επεξεργασίας σήµατος. Πριν γίνει οποιαδήποτε επεξεργασία των δεδοµένων, θα πρέπει να γίνουν κάποιες απαραίτητες αρχικοποιήσεις (θα πρέπει να δοθούν κάποιες συγκεκριµένες τιµές) στους απαραίτητους καταχωρητές µέσω των οποίων καθορίζεται η µετέπειτα λειτουργία, συµπεριφορά και επικοινωνία της κάρτας. Έτσι στο βρόχο της συνάρτησης main( ), αρχικά ορίζεται ένας πίνακας (out) του οποίου οι 16 πρώτες τιµές (οι οποίες και παρατίθενται παρακάτω) θα αποτελέσουν τις τιµές αρχικοποίησης των καταχωρητών ελέγχου της περιφερειακής συσκευής AD535. Οι καταχωρητές αυτοί διαβάζονται ή γράφονται κατά τη δευτερεύουσα σειριακή επικοινωνία και προγραµµατίζουν τόσο τις επιλογές όσο και τις ρυθµίσεις του κυκλώµατος του codec είτε για το κανάλι φωνής, ή για το κανάλι δεδοµένων. Συγκεκριµένα µέσω των τιµών του out[3] = 0x0386 και του out[7] = 0x0306 εγγράφεται ο καταχωρητής ελέγχου 3 (Control Register 3). Ο καταχωρητής 3 καθορίζει κάποιες παραµέτρους αρχικοποίησης για τη µετάδοση και την επικοινωνία στο κανάλι φωνής, καθώς και κάποια τεχνικά χαρακτηριστικά του codec π.χ. επιλέγεται προενίσχυση της εισόδου του µετατροπέα A-Ψ κατά τη χρήση µικροφώνου. Στη συνέχεια µέσω του out[11] = 0x400 εγγράφεται ο καταχωρητής ελέγχου 4 (Control Register 4) από τις τιµές του οποίου καθορίζονται οι παράµετροι για την ADC είσοδο του καναλιού φωνής. Συγκεκριµένα ρυθµίζεται ώστε να µην ενισχύεται καθόλου το σήµα στην ADC είσοδο 1 η Εργαστηρική Άσκηση - Υλοποίηση FIR Φίλτρων -4-
του συγκεκριµένου καναλιού µέσω του PGA (Programmable Gain Amplifier). Τέλος εγγράφεται, µέσω της τιµής out[15] = 0x0502, ο καταχωρητής ελέγχου 5 (Control Register 5) που καθορίζει τις ρυθµίσεις για τη DAC έξοδο του καναλιού φωνής. Μέσω της συγκεκριµένης τιµής που εγγράφεται, αποφασίζεται να µη γίνει καµία ενίσχυση ούτε στην έξοδο του DAC του συγκεκριµένου καναλιού. out[0] = 0xaa; out[1] = 0; out[2] = 0x1; out[3] = 0x0386; out[4] = 0; out[5] = 0; out[6] = 0x1; out[7] = 0x0306; out[8] = 0; out[9] = 0; out[10] = 0x1; out[11] = 0x0400; out[12] = 0; out[13] = 0; out[14] = 0x1; out[15] = 0x0502; out[16] = 0; Μετά την ανάθεση τιµών σε κάποιες βοηθητικές µεταβλητές, ακολουθούν οι εξής εντολές: CSR=0x100; IER=1; ICR=0xffff; *(unsigned volatile int *)EMIF_GCR = 0x3300; *(unsigned volatile int *)EMIF_CE1 = 0xffffff03; Οι καταχωρητές αυτοί χρησιµοποιούνται για την αρχικοποίηση του ψηφιακού επεξεργαστή σήµατος και των περιφερειακών του. Με χρήση των δύο πρώτων εντολών γίνεται απενεργοποίηση (disabling) όλων των διακοπών (interrupts) εκτός της διακοπής ΝΜΙ. Αυτό επιτυγχάνεται µέσω των τιµών που καταχωρούνται στο Control Status Register (CSR) και στον Interrupt Enable Register (IΕR). Ο Interrupt Clear Register (ICR) επιτρέπει να καθαριστούν όλα τα maskable interrupts. Χρησιµοποιείται αρνητική 1 η Εργαστηρική Άσκηση - Υλοποίηση FIR Φίλτρων -5-
λογική και γι αυτό προκειµένου να καθαριστούν όλα τα maskable interrupts εγγράφεται η τιµή 0xffff. O Global Control Register (GBLCTL) της διεπαφής EMIF αποτελεί τον γενικό καταχωρητή ελέγχου που ρυθµίζει κατάλληλα όλες εκείνες τις παραµέτρους που είναι κοινές για όλα τα Chip Enable (CE) της εξωτερικής µνήµης (πχ ROM, SDRAM, SBSRAM). Τέλος, ρυθµίζεται και το Chip Enable 1 µέσω του καταχωρητή Space Control Register. Ο καταχωρητής αυτός αντιπροσωπεύει τον CE1 χώρο µνήµης (από τους 4 που υποστηρίζει ο EMIF). Εδώ παίρνει την τιµή 0xffffff03 και έτσι καθορίζεται µια ασύγχρονη διεπαφή εύρους 8 bit, ως ο τύπος µνήµης για το CE1. Μόλις ληφθεί ένα δείγµα από τη συσκευή AD535, δηλαδή µόλις ο DRR της McBSP0 λάβει και τα 16 bit δείγµατος, παράγεται το σήµα RINT0. Με παρόµοια διαδικασία µόλις αδειάσει ο DXR και είναι έτοιµος πλέον να γεµίσει µε το επόµενο δείγµα, παράγεται το σήµα XINT0. Προκειµένου αυτά τα σήµατα να γίνουν αντιληπτά από τη CPU θα πρέπει να συνδεθούν µε κάποια από τα διαθέσιµα interrupts της (INT4 INT15). Αυτό επιτυγχάνεται αρχικοποιώντας καταλλήλως τα πεδία των καταχωρητών IMH και IML: *(unsigned volatile int *)IML = 0x310718A4; *(unsigned volatile int *)IMH = 0x08202DA3; Για τη συγκεκριµένη εφαρµογή έχουν χρησιµοποιηθεί τα interrupts ΙΝΤ9 και ΙΝΤ11. Στη συνέχεια θα πρέπει τα interrupts αυτά να ενεργοποιηθούν. Αυτό επιτυγχάνεται µέσω των ακόλουθων εντολών : ICR = 0xffff; IER = 0xA02; CSR = 1; Κάθε φορά που θα γεννιέται το σήµα XINT0 και RINT0 µέσω των ΙΝΤ9 και ΙΝΤ11 καλούνται οι αντίστοιχες ρουτίνες εξυπηρέτησης της CPU. Για το ΙΝΤ9 δηµιουργήθηκε η ρουτίνα mcbsp0_x_isr() και για το ΙΝΤ11 δηµιουργήθηκε η ρουτίνα mcbsp0_r_isr(). Οι ρουτίνες αυτές δηλώνονται όπως όλες οι συναρτήσεις στη C µε τη µόνη διαφορά ότι χρησιµοποιούν τη λέξη κλειδί interrupt στην αρχή των δηλώσεων τους. Ο compiler αναγνωρίζοντας αυτή τη λέξη, δηµιουργεί τον απαραίτητο κώδικα για την αποθήκευση της κατάστασης µηχανής (machine state), κατά την είσοδο και την επαναφορά της κατά την έξοδο από την ρουτίνα αντίστοιχα. Η δήλωση για την αντιστοίχηση των ρουτινών εξυπηρέτησης µε τα ΙΝΤ9 και ΙΝΤ11 γίνεται στα αρχεία.asm και.cmd τα οποία δίνονται. 1 η Εργαστηρική Άσκηση - Υλοποίηση FIR Φίλτρων -6-
Η προτεινόµενη υλοποίηση για τις ρουτίνες εξυπηρέτησης στην περίπτωση µία απλής µεταφοράς ενός δείγµατος από την είσοδο στην έξοδο χωρίς καµία επεξεργασία δίνεται παρακάτω. Πάνω στο format αυτό θα γίνει και η υλοποίηση της παρούσας άσκησης φιλτραρίσµατος: interrupt void mcbsp0_x_isr() { if (start_flag==0) out_sample = out[count++]; else out_sample=buffer&0xfffe; *(unsigned volatile int *)McBSP0_DXR = out_sample; } interrupt void mcbsp0_r_isr() { in_sample = *(unsigned volatile int *)McBSP0_DRR; if (start_flag==1) buffer=in_sample; } /* Εδώ θα τοποθετηθεί ο κώδικας φιλτραρίσµατος*/ Η πρώτη ρουτίνα διαβάζει τη τιµή του καταχωρητή McBSP_DRR και την αποθηκεύει σε µία µεταβλητή, ενώ η δεύτερη γράφει την αποθηκευµένη πλέον τιµή στον καταχωρητή McBSP_DXR. Ο έλεγχος που γίνεται στις ρουτίνες αυτές οφείλεται στην διαδικασία αρχικοποίησης του µετατροπέα A-Ψ. Μετά την ολοκλήρωση των παραπάνω εντολών, γίνεται αρχικοποίηση του McBSP0 µέσω της συνάρτησης msbsp0_init() που καλείται στη συνάρτηση main(). Ακολουθεί ο κώδικας της συγκεκριµένης συνάρτησης που πρόκειται να αναλυθεί: void mcbsp0_init() { *(unsigned volatile int *)McBSP0_SPCR = 0; *(unsigned volatile int *)McBSP0_PCR = 0; *(unsigned volatile int *)McBSP0_RCR = 0x10040; *(unsigned volatile int *)McBSP0_XCR = 0x10040; *(unsigned volatile int *)McBSP0_DXR = 0; *(unsigned volatile int *)McBSP0_SPCR = 0x12001; } 1 η Εργαστηρική Άσκηση - Υλοποίηση FIR Φίλτρων -7-
Με χρήση των δυο πρώτων εντολών εγγράφεται οι τιµή µηδέν τόσο στον Serial Port Control Register (SPCR) όσο και στον Pin Control Register (PCR). Οι δύο αυτοί καταχωρητές περιέχουν τα bits ελέγχου κατάστασης του McBSP0 στη συγκεκριµένη περίπτωση, και ουσιαστικά οι δυο τους ρυθµίζουν τη σειριακή θύρα. Επιπλέον, ο PCR χρησιµοποιείται για να ρυθµίσει τα pins της σειριακής θύρας σαν γενικού σκοπού είσοδοι ή έξοδοι κατά τη διάρκεια του reset στον transmitter ή / και στον receiver. Οι επόµενοι δυο καταχωρητές είναι οι Receive Control Register (RCR) και Transmit Control Register (TCR). Ο πρώτος καταχωρητής ρυθµίζει όλες εκείνες τις παραµέτρους που καθορίζουν τη λειτουργία της λήψης δεδοµένων, ενώ ο δεύτερος καθορίζει τις αντίστοιχες για τη λειτουργία εκποµπής δεδοµένων. Στους δύο αυτούς καταχωρητές εγγράφεται η ίδια τιµή και αυτό γίνεται γιατί επιθυµούµε οι λειτουργίες αποστολής και λήψης δεδοµένων, µέσω του McBSP0, να είναι πανοµοιότυπες και να ακολουθούν την ίδια λογική. Μια από τις βασικές παραµέτρους που προσδιορίζεται µέσω των τιµών που ανατίθενται σε αυτούς είναι πως η λήψη και η αποστολή γίνεται σε frames των 16bits το καθένα. Στη συνέχεια, ο καταχωρητής Data Transmit Register (DXR) αρχικοποιείται µε τη τιµή 0. Στο καταχωρητή DXR εγγράφονται δεδοµένα από τη CPU, προκειµένου αυτά να καταλήξουν στην έξοδο του McBSP0 από όπου µπορεί να τα παραλάβει ο DAC. Στο παραπάνω κώδικα γράφεται η τιµή 0 στον DXR προκειµένου να µην αποσταλεί τιµή στον Ψ-Α. Στην τελευταία εντολή µεταβάλλεται το περιεχόµενο του SPCR λαµβάνοντας την τιµή 0x12001. Με την τιµή αυτή γίνονται οι κατάλληλες ρυθµίσεις στην σειριακή θύρα έτσι ώστε να είναι πλέον έτοιµη τόσο για λήψη όσο και για αποστολή δεδοµένων. Μετά την ολοκλήρωση των παραπάνω αρχικοποιήσεων το πρόγραµµα µπαίνει σε έναν ατέρµονα βρόχο (while( )), κατά τη διάρκεια του οποίου εκτελούνται συνέχεια οι δυο ρουτίνες εξυπηρέτησης διακοπών. Ερώτηµα 1: Υποθέστε ότι επιθυµούµε να επεξεργαστούµε το σήµα εισόδου και ότι η επεξεργασία αυτή θα υλοποιηθεί εντός της ISR συνάρτησης mcbsp0_r_isr ( ), η οποία εξυπηρετεί το σήµα διακοπής RINT0. εδοµένου, ότι έχει ενεργοποιηθεί και η διακοπή XINT0, σε ποια περίπτωση θα υπάρχει σύγκρουση µεταξύ αυτών των δύο και γιατί ; 4. FIR Φίλτρα 4.1 Στοιχεία Θεωρίας Η έξοδος ενός FIR φίλτρου µήκους Ν, δίνεται από την ακόλουθη γραµµική συνέλιξη : 1 η Εργαστηρική Άσκηση - Υλοποίηση FIR Φίλτρων -8-
N [ ] = y n k = 1 0 h[ k] x[ n k] = h[0] x[ n] +... + h[ N 1] x[ n N + 1] (1) Η παραπάνω σχέση µπορεί να γραφεί ισοδύναµα στην ακόλουθη µορφή εσωτερικού γινοµένου y [ n] = h T xn όπου τα διανύσµατα h και x n ορίζονται ως ακολούθως: n [ h[ 0] h[1]... h[ N 1 ] t h = ] [ x[ n] x[ n 1]... x[ n N + 1 ] t (2) x = ] (3) Παρατηρείστε ότι το διάνυσµα x n, τη χρονική στιγµή n περιέχει τα Ν πιο πρόσφατα δείγµατα του σήµατος εισόδου και εποµένως µε κάθε νέο δείγµα του σήµατος θα πρέπει να ενηµερώνεται. Στο Σχήµα 2 φαίνεται η απευθείας υλοποίηση τύπου Ι του παραπάνω φίλτρου. Σχήµα 2: Απευθείας Υλοποίηση Τύπου Ι ενός FIR Φίλτρου. 4.2 Σχεδιασµός και Υλοποίηση FIR Φίλτρων στο περιβάλλον Matlab Ένα φίλτρο χαρακτηρίζεται µοναδικά από την κρουστική του απόκριση ή ισοδύναµα από την απόκριση συχνότητάς του. Για τη σχεδίαση των FIR φίλτρων που επιθυµείτε µπορείτε να χρησιµοποιήσετε µία εκ των συναρτήσεων fir1() ή remez() του υπολογιστικού περιβάλλοντος Matlab. Οι συντελεστές που σας επιστρέφουν στα ορίσµατα εξόδου τους οι παραπάνω συναρτήσεις είναι οι συντελεστές της κρουστικής απόκρισης του επιθυµητού φίλτρου. Οι συντελεστές αυτοί θα χρησιµοποιηθούν παρακάτω στο πρόγραµµά σας για την υλοποίηση των φίλτρων µε τη βοήθεια του CCS. 4.3 FIR Φίλτρα σε DSP Από τη Σχέση (1) είναι προφανές ότι ο υπολογισµός της εξόδου του φίλτρου, απαιτεί Ν πολλαπλασιασµούς και (N-1) προσθέσεις. Ισοδύναµα, η υπολογιστική πολυπλοκότητα αυτού του FIR φίλτρου είναι Ν multiply-accumulates (MACs). O TMS320C6711 επεξεργαστής που θα χρησιµοποιηθεί έχει απόδοση 300M MACs/sec. 1 η Εργαστηρική Άσκηση - Υλοποίηση FIR Φίλτρων -9-
Ερώτηµα 2: Υπολογίστε το πλήθος των MACs που απαιτούνται για τον υπολογισµό της γραµµικής συνέλιξης ενός φίλτρου µήκους 20 και ενός φίλτρου µήκους 100. Θεωρώντας ότι η συχνότητα δειγµατοληψίας που χρησιµοποιεί ο Α-Ψ της συσκευής AD535 είναι τα 8ΚHz, υπολογίστε το µέγιστο µήκος φίλτρου που µπορείτε να χρησιµοποιήσετε ώστε η υλοποίησή του στον TMS320C6711 να λειτουργεί σε πραγµατικό χρόνο. Από τις Σχέσεις (1) και (3) είναι προφανές ότι το παλαιότερο δείγµα εισόδου x [ n ( N 1) ] πολλαπλασιάζεται µε τον συντελεστή h [ N 1] της κρουστικής απόκρισης του φίλτρου και το πιο πρόσφατο δείγµα x [ n] πολλαπλασιάζεται µε τον συντελεστή h [ 0] της κρουστικής απόκρισης. Από πλευράς υλοποίησης, τα αναγκαία Ν δείγµατα του σήµατος εισόδου θα µπορούσαν να αποθηκευθούν σε ένα πίνακα-διάνυσµα στη µνήµη και κάθε φόρα που θα θέλαµε να εισάγουµε ένα νέο δείγµα του σήµατος εισόδου στον πίνακα θα µετατοπίζαµε τα στοιχεία του κατά µία θέση. Ο παραπάνω τρόπος υλοποίησης της γραµµικής συνέλιξης δεν είναι αποδοτικός. Για το λόγο αυτό στην υλοποίηση µας θα χρησιµοποιηθεί ένα σχήµα κυκλικής δεικτοδότησης των στοιχείων ενός διανύσµατος. Επισηµαίνεται, αν και δεν αποτελεί σκοπό αυτής της άσκησης, ότι οι C6000 DSPs διαθέτουν κατάλληλο υλικό που δύναται να προσπελαστεί από εντολές assembly, ώστε να υλοποιηθεί αυτό το κυκλικό σχήµα δεικτοδότησης. Η ιδέα της κυκλικής δεικτοδότησης, φαίνεται στο Σχήµα 3. Οι συντελεστές του φίλτρου και τα δείγµατα του σήµατος εισόδου αποθηκεύονται στα µήκους N διανύσµατα h[] και xcirc[] αντίστοιχα. Ας υποθέσουµε επίσης ότι ο δείκτης newest δείχνει σε εκείνη τη θέση του κυκλικού πίνακα, στην οποία βρίσκεται το πιο πρόσφατο δείγµα εισόδου και oldest τη θέση του κυκλικού πίνακα, στην οποία βρίσκεται το πιο παλαιό δείγµα εισόδου. Όταν, τη χρονική στιγµή n+1 λαµβάνεται ένα νέο δείγµα εισόδου, θα πρέπει να καταχωρείται στη θέση που δείχνει ο δείκτης oldest και οι δείκτες να ενηµερώνονται ως ακολούθως: newest=oldest, και oldest=(oldest 1) modn. Παρατηρήστε ότι, όταν ο δείκτης oldest, αρχικά, έχει την τιµή 0, µετά την ενηµέρωσή του γίνεται Ν-1. Η έξοδος του φίλτρου υπολογίζεται, από τη σχέση : όπου, N 1 m= 0 ( newest + m) mod N y [ n] = h[ m] xcirc[( newest + m)mod N] (4) ακέραιος στο διάστηµα {0,..., Ν-1}. Παρατηρείστε ότι µε το παραπάνω σχήµα δεικτοδότησης ο υπολογισµός της εξόδου του φίλτρου απαιτεί Ν MACs και µια καταχώρηση της τιµής του νέου δείγµατος του σήµατος εισόδου. 1 η Εργαστηρική Άσκηση - Υλοποίηση FIR Φίλτρων -10-
Θέση ιάνυσµα h[ ] ιάνυσµα xcirc[ ] newest h[0] x[n] 1 h[1] x[n-1] 2 N-2 h[n-2] x[n- 2] Oldest h[n-1] x[n -1] Σχήµα 3 : Τα περιεχόµενα των ιανυσµάτων των Συντελεστών της κρουστικής απόκρισης και των δεδοµένων. 4.4. Υλοποίηση FIR Φίλτρων σε DSP- Τροποποίηση του προγράµµατος loopback Στο ήδη υπάρχον πρόγραµµα loopback.c, θα πρέπει να προσθέσετε τον κατάλληλο κώδικα που θα εξασφαλίζει την υλοποίηση ενός FIR φίλτρου. Σε περίπτωση που το θέλετε να υλοποιήσετε το ζητούµενο πρόγραµµα σε διαφορετικό αρχείο, προσθέστε το νέο.c αρχείο στο Project, επιλέγοντας : Project > Add Files to Project. 4.5 Οι Συντελεστές του Φίλτρου Στο ζητούµενο.c αρχείο τοποθετούµε στο τµήµα των καθολικών δηλώσεων τους συντελεστές του προς υλοποίηση FIR φίλτρου. (Άλλος τρόπος είναι η δηµιουργία ενός header αρχείου που θα γίνεται include και θα περιέχει τον αντίστοιχο κώδικα των δηλώσεων). Αυτό επιτυγχάνεται, για παράδειγµα, ως ακολούθως : #define FilterLength 3 float x[filterlength]; float h[filterlength] = {0.5, 0.5, 0.5 } 4.3 Συνάρτηση Υλοποίησης FIR Φίλτρου Ερώτηµα 4: Υλοποιείστε το FIR φίλτρο εντός της ISR συνάρτησης mcbsp0_r_isr (). Επισηµαίνεται ότι ο πίνακας µε τα δείγµατα εισόδου θα πρέπει να αρχικοποιηθεί µε µηδενικά στην αρχή της συνάρτησης main( ). Ερώτηµα 5: Συνδέστε στην είσοδο της κάρτας ένα ακουστικό σήµα και στην έξοδο τα ηχεία. Χρησιµοποιώντας τα φίλτρα που θα σας υποδειχθούν στο εργαστήριο, συγκρίνατε 1 η Εργαστηρική Άσκηση - Υλοποίηση FIR Φίλτρων -11-
τον ήχο του αρχικού και του τελικού σήµατος κι εξηγήστε την επίδραση των δύο FIR φίλτρων. Ερώτηµα 6: Συνδέστε ένα ηµιτονικό σήµα στο jack εισόδου µε πλάτος µικρότερο από ±1 V, χωρίς DC offset. Οδηγήστε στον παλµογράφο την αρχική και την τελική κυµατοµορφή και µετρήστε το gain του φίλτρου για ένα επαρκές σύνολο συχνοτήτων. Επίσης, επιβεβαιώστε τις αποκρίσεις συχνότητας των φίλτρων από τις παραπάνω διαθέσιµες κυµατοµορφές. 1 η Εργαστηρική Άσκηση - Υλοποίηση FIR Φίλτρων -12-