ntua-cvsp-lab / DSP_LabSupport

Here the students of the 2019-2020 DSP course can submit questions regarding the course to the teaching assistants.
7 stars 3 forks source link

[Lab 2] Σωστή εφαρμογή lfilter() και convolve() και γραφικές τους #65

Open KonstantinosRiz opened 4 years ago

KonstantinosRiz commented 4 years ago

Καλησπέρα, Με μπερδεύει λίγο η χρήση των δύο αυτών συναρτήσεων και συγκεκριμένα η χρήση τους για να κάνω plots σωστά: Η convolve() κάνει συνέλιξη των σημάτων που της δίνω και μου επιστρέφει έναν πίνακα που ξεκινάει από το 0 (ως πίνακας). Άρα, για να είναι σωστή η γραφική μου πρέπει να φτιάξω χειροκίνητα τον άξονα των x; Στην 2.5 για παράδειγμα που ζητείται φίλτρο με τιμές στο [-1, 1]. Άρα η συνέλιξη μου θα πρέπει να αρχίσει από το -1 και να τελειώσει στο len(output_signal) - 2; Κι αν ναι, πρέπει εγώ να φροντίσω να συμβεί αυτό όταν θα κάνω την γραφική μου; Επίσης, η μεταβλητή της συνάρτησης mode σίγουρα παίζει και αυτή κάποιο ρόλο - θέλουμε την default; Επειδή με την χρήση του mode = 'same' πχ η γραφική μου φάνηκε πιο κοντά σε αυτό που θα περίμενα σε σχέση με το σήμα μου (μπορεί να κάνω και λάθος βέβαια). Ομοίως για την lfilter() όσον αφορά τις γραφικές πρέπει να προσέξω να ορίσω εγώ κατάλληλο άξονα x; Τέλος, αν έχω την κρουστική απόκρισή μου h έχει σημασία ποια από τις δύο συναρτήσεις θα χρησιμοποιήσω; Υπάρχει κάποια ποιο αποδοτική / κάνουν κάτι διαφορετικό;

cgaroufis commented 4 years ago

Καλησπέρα,

Αναφορικά με το αποτέλεσμα της εντολής convolve(), σωστά παρατηρείς οτι το διαισθητικά ορθό αποτέλεσμα δίνεται με χρήση του ορίσματος 'same', καθώς κόβει δείγματα συμμετρικά στα άκρα της συνέλιξης, ώστε να συμπίπτουν οι άξονες των 2 σημάτων. Συστήνεται η χρήση της κατά τις συνελίξεις.

Η έξοδος της scipy.signal.lfilter() εχει το ίδιο μήκος με την είσοδο, οπότε και είναι "συγχρονισμένη" με την είσοδο της συνάρτησης. Ουσιαστικά την ίδια λειτουργία έχουν οι δύο συναρτήσεις - μπορείς να τσεκάρεις εδώ μία αναλυτική (perfromance-wise) σύγκρισή τους, καθώς και άλλων συναρτήσεων των numpy/scipy που επιτελούν την ίδια λειτουργία.

Καλή συνέχεια, Χρήστος

KonstantinosRiz commented 4 years ago

Κατάλαβα. Τελικά, όμως, σχετικά με τους άξονες αν το αποτέλεσμα της συνέλιξης μου θα έπρεπε να ξεκινάει από ένα αρνητικό δείγμα (πχ -50), ενώ στην πραγματικότητα ο πίνακας μου ξεκινάει από 0, αυτό δεν θα μου δώσει λάθος γραφική αν απλά κάνω plt.plot(myOutputSignal), αφού θα το ξεκινάω με το 0; Άρα, τον άξονα x πρέπει να θυμάμαι να τον φροντίσω κάθε φορά εγώ για το συγκεκριμένο σήμα να είναι ορθό κάνοντας κάτι του στυλ x = np.linspace(-50, len(myOutputSignal) -1 -50, 1); Στην περίπτωση μας που το φίλτρο ξεκινάει από το -1 υποθέτω δεν έχει πολλή μεγάλη σημασία, αλλά στην παραπάνω περίπτωση δεν θα έβγαινε αρκετά λάθος αποτέλεσμα; Τέλος, επειδή η convolve() μου έβγαζε πολύ μεγάλες τιμές και μου έκανε εντύπωση βρήκα με λίγο ψάξιμο ως πρακτική να πολλαπλασιάζω το output σήμα με dx = x[1] - x[0]. Είναι σωστό αυτό; Και αν ναι γιατί χρειάζεται; Συγγνώμη για το μεγάλο κείμενο.

cgaroufis commented 4 years ago
  1. Για την περίπτωση που δε χρησιμοποιείς το όρισμα 'same' κατά τη χρήση της εντολής convolve(), αν θες να είσαι τυπικά σωστός πρέπει να ορίζεις ξεχωριστά linspaces/άξονες για τα δύο σήματα οπως περιγράφεις (για την περίπτωση της απόστασης 1 δείγματος δεν παίζει πρακτικά ρόλο πάντως).
  2. Σε ποιο σημείο εννοείς ότι η convolve() σου έβγαζε μεγάλες τιμές; Πάντως, στην περίπτωσή σου δε χρειάζεται κάτι τέτοιο - αν θες να είναι στην ίδια κλίμακα τα αποτελέσματά σου, αρκεί να πολλαπλασιάσεις το "μεγαλύτερο" αποτέλεσμα με μία σταθερά κατά το πλοτάρισμα (αν έπεσες σε αυτό το post στο stackexchange, απ' ότι κατάλαβα ο/η OP ήθελε να υλοποιήσει τη συνέλιξη μεταξύ δύο συναρτήσεων συνεχούς χρόνου, οπότε η κανονικοποίηση αυτή ήταν απαραίτητη)

Χρήστος

KonstantinosRiz commented 4 years ago

Έχετε δίκιο, αυτό είχα δει πράγματι, μάλλον θα είναι η ιδέα μου ότι οι τιμές είναι μεγαλύτερες επειδή αθροίζονται πολλές από αυτές σε κάθε παράθυρο. Ευχαριστώ πολύ!