Discrete Fourier Transforms
Περίληψη Υπολογισµός πολυωνύµων Πολλαπλασιασµός Πολυωνύµων Εφαρµογές
Υπολογισµός Πολυωνύµου Σχεδιάστε ένα αλγόριθµο για τον υπολογισµό του πολυωνύµου p(x) για όλες τις τιµές του x. BruteForce1(A[0 n],x) sum= 0; for i= n to 0 p=1; for j=1 to i p= p*x; sum= sum + A[i]*p; return sum; BruteForce(A[0 n],x) sum= Α[0]; p=1; for i= 1 to n p=p*x; sum= sum + A[i]*p; return sum;
Υπολογισµός Πολυωνύµου: Horner s Rule Απλά αναδιοργανώστε τους όρους του πολυονύµου.
Υπολογισµός Πολυωνύµου: Horner s Rule Horner(A[0 n],x) p= A[n]; for i= n-1 to 0 p= x*p + A[i]; return p; Παράδειγµα: Για x=3 Υπολογίστε το πολυώνυµο A[n] -1 3 1-5 p
Πολλαπλασιασµός Πολυωνύµων Υποθέστε ότι θέλετε να πολλαπλασιάσετε πιο κάτω πολυώνυµα βαθµού. ( ) = x 3 + x + 3x + 4 A x B( x) = 5x 3 + 6x + 7x + 8 Υπολογίστε C( x) = A( x) * B( x) = 3 8 4 0 4 1 18 15 16 14 1 10 8 7 6 5
Πολλαπλασιασµός Πολυωνύµων Υποθέστε ότι θέλετε να πολλαπλασιάσετε δύο πολυώνυµα βαθµού (n-1). Σχεδιάστε ένα αλγόριθµο που να λύνει αποδοτικά το πιο πάνω. Συγκεκριµένα, δεδοµένων των Υπολογίστε
Λύση Brute-Force
Πιθανή Εναλλακτική Λύση Να υπολογιστούν τα πολυώνυµα A(x) και B(x) για κάποιες τιµές το x, π.χ., x 1,,x n. Να υπολογιστεί το γινόµενο C(x)=A(x)*B(x) για όλες τις τιµές x 1,,x n. Από τις τιµές αυτές να βρούµε το ζητούµενο πολυώνυµο!
Συντελεστές Πολυωνύµων και Τιµές Πολυωνύµων Υποθέστε το πολυώνυµο Δεδοµένου ότι το πολυώνυµο παίρνει τις ακόλουθες τιµές για x=-1, A(-1)=1 για x=0, A(0)=0 για x=1, A(1)=1 Με τις πιο πάνω τιµές το πολυώνυµο ορίζεται επακριβώς!
Υπολογισµός της τιµής ενός πολυωνύµου Υποθέστε ότι θέλετε να υπολογίσετε τη τιµή ενός πολυωνύµου σε όλες τις ρίζες της εξίσωσης Im Επαλήθευση: Re
Ιδιότητες της ρίζας ω n Ορισµός: ω n = e j π n Απλοποίηση: ω n = ω n ω n = e j π n = e j π n = ω n Για n ζυγό ισχυεί: ω n n = ω = 1
Υπολογισµός της τιµής ενός πολυωνύµου Θέλουµε να υπολογίσουµε τη τιµή ενός πολυωνύµου A(x) στις n τιµές ω i = e j π i n,i = 0,...,n 1 Χρησιµοποιώντας divide-and-conquer για τον υπολογισµό της τιµής ενός πολυωνύµου (υποθέστε ότι n άρτιο). Οπόταν
Παράδειγµα Υποθέστε πώς Αυτό µπορεί να «σπάσει» σε Οπόταν
Υπολογισµός της τιµής ενός πολυωνύµου Εξ αιτίας της χρήσης του divide-and-conquer, µπορέσαµε να σπάσουµε ένα πολυώνυµο σε δύο «µισά»
Παράδειγµα (συνέχεια) Θέλουµε να υπολογίσουµε τις τιµές του A(x) στις ρίζες της εξίσωσης Για τον υπολογισµό χρειαζόµαστε µόνο τα τετράγωνα! Από αυτά µόνο τα µισά είναι µοναδικά, τα άλλα µισά επαναλαµβάνονται!
Παράδειγµα (συνέχεια) Δηλαδή θα πρέπει να υπολογίσουµε τα µόνο στις τιµές ω 4 k = e j π k 4,k = 0,...,3 Και στη συνέχεια να υπολογίσουµε τις τιµές για όλες τις ρίζες ( ) = A ( 0 even ω ) 4 + ω 4 8 A ( 0 odd ω ) 4 ( ) = A ( 1 even ω ) 4 + ω 5 8 A ( 1 odd ω ) 4 A ω 8 4 A ω 8 5 ( ) = A ( even ω ) 4 + ω 8 A ( odd ω ) 4 ( ) = A ( 3 even ω ) 4 + ω 3 8 A ( 3 odd ω ) 4 A ω 8 A ω 8 3 ( ) = A ( even ω ) 4 + ω 6 8 A ( odd ω ) 4 ( ) = A ( 3 even ω ) 4 + ω 7 8 A ( 3 odd ω ) 4 A ω 8 6 A ω 8 7
Απόδοση Αλγορίθµου Σπάσαµε ένα πρόβληµα υπολογισµού ενός πολυωνύµου βαθµού n-1 για n διαφορετικές τιµές σε πρόβληµα υπολογισµού δύο πολυωνύµων βαθµού n/-1 τα οποία θα πρέπει να υπολογιστούν σε µόνο n/ διαφορετικές τιµές. Ο χρόνος «επανασύνδεσης» είναι σταθερός για κάθε x, (δεν εξαρτάτε από το n) οπόταν για n λύσεις, ο επιπρόσθετος χρόνος είναι O(n) (f(n) = O(n) ). Οπόταν
Πιθανή Εναλλακτική Λύση Να υπολογιστούν τα πολυώνυµα A(x) και B(x) για κάποιες τιµές το x, π.χ., x 1,,x n. Να υπολογιστεί το γινόµενο C(x)=A(x)*B(x) για όλες τις τιµές x 1,,x n. Από τις τιµές αυτές να βρούµε το ζητούµενο πολυώνυµο!
Διακριτός Μετασχηµατισµός Fourier (Discrete Fourier Transform (DFT)) Υποθέστε πως έχετε n δείγµατα από κάποιο σήµα (π.χ. φωνής). Δηλαδή έχετε τα δείγµατα y 0, y 1,,y n-1. Υποθέστε πως θέλετε να υπολογίσετε τη σειρά Χρησιµοποιώντας brute-force χρειάζεστε O(n ) πολλαπλασιασµούς ενώ µε τη µέθοδο που έχουµε δει µόνο O(n log n)
Υπολογισµός ενός πολυωνύµου από τις n τιµές Μέχρι τώρα έχουµε βρει τις τιµές που παίρνει το C(x) για όλες τις λύσεις τις εξίσωσης i x i = ω n = e j π i n,i = 0,...,n 1 Οπόταν µπορούµε να γράψουµε n εξισώσεις µε n -1 αγνώστους Ορίζουµε ένα νέο πολυώνυµο
Υπολογισµός ενός πολυωνύµου από τις n τιµές Στην συνέχεια υπολογίζουµε το D(y) για όλες τις τιµές i y i = ω n Για µια περίπτωση ( ) = c k ω n i D ω n = e j π i n,i = 0,...,n 1 n 1 n n n 1 mk k =0 ω mi = c n k ω mk mi n ω n m=0 k =0 m=0 n n 1 m=0 = c k ω mk mi m ω n = c k e j k =0 n k =0 n 1 m=0 π mk n e j π mi n
Υπολογισµός ενός πολυωνύµου από τις n τιµές Παρατήρηση Εξ ορισµού, y i =x i =ω ι n είναι οι ρίζες της εξίσωσης xn -1=0, οπόταν για όλες τις ρίζες x i 1, i=1,,n-1 πρέπει να ισχύει ότι n 1 m ω n m=0 n 1 π i = e j n m = 0, i = 1,...,n 1 m=0 Οπόταν, στον υπολογισµό του D(x), οι περισσότεροι όροι απλοποιούνται! ( ) = c k e j i D ω n n k =0 n 1 m=0 π (k +i)m n
Υπολογισµός ενός πολυωνύµου από τις n τιµές i D ω n ( ) = nc n c n = 1 D ω n n k =0 n 1 m=0 ( ) = c k e j ( ) = nc n 3 c n 3 = 1 3 D ω n i D ω n π (k +i)m n ( ) n D ω n n D ω n, i = 1,...,n ( 3 ) ( ) = nc n i c n i = 1 ( i ) n D ω n Δηλαδή, οι ζητούµενοι συντελεστές µπορούν να υπολογιστούν εάν υπολογίσουµε το πολυώνυµο D(x) στις ρίζες της εξίσωσης x n -1=0 για το οποίο µόλις βρήκαµε αλγόριθµο ο οποίος το υπολογίζει σε χρόνο
Πιθανή Εναλλακτική Λύση Να υπολογιστούν τα πολυώνυµα A(x) και B(x) για κάποιες τιµές το x, π.χ., ω 0 n,,ω n 1 n. Να υπολογιστεί το γινόµενο C(x)=A(x)*B(x) για όλες τις τιµές Από τις τιµές αυτές να βρούµε το ζητούµενο πολυώνυµο! ω 0 n,,ω n 1 n. Συνολικά:
Συνέλιξη (convolution) x[n] 4 1 h[n] 3 1-1 0 1 3 4 5 n -1 0 1 3 4 5 n x[k] 4 1 h[n-k] 1-1 0 1 3 4 5 3 k n- n-1 n
Συνέλιξη (convolution) x[n] 4 h[n] 3 1 1-1 0 1 3 4 5 n -1 0 1 3 4 5 n Υποθέστε ότι δύο σήµατα έχουν από 10,000 σηµεία (samples). Υποθέστε επίσης πως ένας πολλαπλασιασµός χρειάζεται 1µsec. Χρησιµοποιώντας brute force χρειαζόµαστε χρόνο της τάξης των 100 sec Χρησιµοποιώντας DFT χρειαζόµαστε χρόνο της τάξης 0.04 sec!!