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

[Lab2] 4.3 Wiener filter #82

Open odychlapanis opened 4 years ago

odychlapanis commented 4 years ago

Γεια σας, Έχω μπερδευτεί στην εφαρμογή του φίλτρου Wiener. Αρχικά πρέπει να βρούμε το φάσμα του θορύβου και στη συνέχεια του μη-θορυβώδους σήματος σε ένα παράθυρο. Όπως ρώτησα και στο προηγούμενο issue δεν έχω καταλάβει πώς θα διαλέξω πόσα σημεία θα έχουν αυτά τα δύο. Ας πούμε ότι επιλέγω 512 σημεία. Μετά το παράθυρο θα το επιλέξω αναγκαστικά 512 δείγματα ή κάποιο πολλαπλάσιό του; Μπορώ για 512 σημεία να πάρω παράθυρα 400 δειγμάτων ή όχι; Και μετά, αν βρω και το φάσμα του παραθυρωμένου σήματος, πώς θα εφαρμόσω το φίλτρο; Δηλαδή αν βρω την Η για κάποιο παράθυρο μέτα θα την πολλαπλασιάσω με το θορυβώδες σήμα ? Ή θα πάρω απλώς την Η ? Ευχαριστώ πολύ για άλλη μία φορά.

cgaroufis commented 4 years ago

Καλησπέρα,

Θα επιχειρήσω να απαντήσω και στα δύο issues σχετικά με την 4.3:

Για κάθε παράθυρο του σήματος, τα φάσματα ισχύος θα έχουν υποχρεωτικά το ίδιο μήκος. Αυτό σημαίνει ότι αν πάρεις n_fft = 512 σημεία για το φάσμα ισχύος του θορύβου, θα πρέπει να πάρεις τον ίδιο αριθμό σημείων για όλα τα φάσματα ισχύος των πλαισίων ανάλυσης του σήματός σου. Ο αριθμός σημείων DFT (έστω Ν) δεν είναι απαραίτητο να είναι ίσος με τον αριθμό δειγμάτων του παραθύρου σου (εστω L) - απλώς αν Ν < L, ο DFT υπολογίζεται από τα πρώτα Ν δείγματα του παραθύρου σου και έχεις απώλεια πληροφορίας (αν Ν > L το σήμα γίνεται zero-padded).

Έχοντας βρει, για κάθε παράθυρο, την H(ω), μπορείς να πάρεις το αποθορυβοποιημένο σήμα με οποιονδήποτε από τους εξής δύο τρόπους:

  1. Υπολογισμός DFT για το παράθυρό σου (έστω X(ω)), πολλαπλασιασμός μεταξύ των X(ω), H(ω) για να πάρεις το φάσμα του φιλτραρισμένου σήματος, αντίστροφος DFT στο φάσμα αυτό.
  2. Αντίστροφος DFT στην H(ω) για να βρεις την κρουστική απόκριση του Wiener φιλτρου για το παράθυρο αυτό, και εφαρμογή της h[n] στο παραθυρωμένο σήμα με χρήση της lfilter().

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