\title{Συστήματα Πολυμέσων και Εικονική Πραγματικότητα\\
\title{Συστήματα Πολυμέσων και Εικονική Πραγματικότητα\\
Εργασία 2018-2019}
Εργασία 2018-2019}
@ -59,21 +59,6 @@
Tα frame τα οποία είναι στατικά χαρακτηρίζονται ως 'OLS' ενώ τα frames με διακυμάνσεις ως 'ESH'. Τα μεταβατικά παράθυρα μεταξύ αυτών των κύριων κατηγοριών είναι τα 'LSS' και 'LPS'. Ο τρόπος με τον οποίον γίνεται η κατηγοριοποίηση περιγράφεται αναλυτικά στο πρότυπο του AAC. Γενικά, με τα βήματα που ακολουθούνται εξάγεται αρχικά ένα συμπέρασμα για κάθε κανάλι ξεχωριστά και έπειτα με μια συνδυαστική λογική που επίσης περιγράφεται στο πρότυπο, γίνεται ο συνδυασμός των αποφάσεων για να προκύψει ο τελικός τύπος του παραθύρου.
Tα frame τα οποία είναι στατικά χαρακτηρίζονται ως 'OLS' ενώ τα frames με διακυμάνσεις ως 'ESH'. Τα μεταβατικά παράθυρα μεταξύ αυτών των κύριων κατηγοριών είναι τα 'LSS' και 'LPS'. Ο τρόπος με τον οποίον γίνεται η κατηγοριοποίηση περιγράφεται αναλυτικά στο πρότυπο του AAC. Γενικά, με τα βήματα που ακολουθούνται εξάγεται αρχικά ένα συμπέρασμα για κάθε κανάλι ξεχωριστά και έπειτα με μια συνδυαστική λογική που επίσης περιγράφεται στο πρότυπο, γίνεται ο συνδυασμός των αποφάσεων για να προκύψει ο τελικός τύπος του παραθύρου.
% εξετάζεται το αμέσως επόμενο frame, δηλαδή το frame $i+1$. Τα βήματα που ακολουθούνται είναι τα εξής:
%\begin{enumerate}
%\item Τα δείγματά του, περνούν από το υψιπερατό φίλτρο
%$ H(z)=\frac{0.7548-0.7548z^{-1}}{1-0.5095z^{-1}}$, με την βοήθεια της συνάρτησης filter.
%\item Για κάθε μία από τις 8 υποπεριοχές του (subframes), υπολογίζεται η ενέργειά τους $s_{l}^{2}$, $(l =0,..,7)$ , δηλαδή το άθροισμα των τετραγώνων των δειγμάτων τους, και αποθηκεύεται στη μεταβλητή energyEstimations.
%\item Υπολογίζονται τα attack values, $ds_{l}^{2}=\frac{s_{l}^{2}}{(1/l)\cdot\Sigma_{k=0}^{l-1} s_{k}^{2}}$ και αποθηκεύονται στη μεταβλητή energyRatios.
%\item Το frame $i+1$ θα είναι ``ESH'' εάν ισχύουν ταυτόχρονα:
%\begin{itemize}
%\item$s_{l}^{2} > 10^{-3}$
%\item$ds_{l}^{2} > 10$
%\end{itemize}
%\end{enumerate}
% Ανάλογα με την ισχύ ή όχι των παραπάνω συνθηκών και δεδομένου του τύπου του προηγούμενου frame, είναι δυνατή η απόφαση του τύπου του frame i, με τη λογική που παρουσιάζεται στο πρότυπο και την εκφώνηση της εργασίας. Για αυτό τον λόγο, στη συνέχεια, συγκρίνονται οι τύποι του επόμενου και του προηγούμενου frame και λαμβάνεται η απόφαση για τον τύπου του κάθε καναλιού. Για την απόφαση του τύπου ολόκληρου του frame, είναι απαραίτητος ο συνδυασμός των αποφάσεων των τύπων των δύο καναλιών σύμφωνα και πάλι με δοθείσα λογική.
Η συνάρτηση αυτή αφορά την βαθμίδα filterbank και έχει ως ορίσματα ένα frame ήχου 2048x2, τον τύπο του καθώς και τον τύπο παραθύρου που θα χρησιμοποιηθεί. Η δε έξοδός του, είναι η αναπαράσταση του ίδιου του frame στο πεδίο της συχνότητας, σε όρους MDCT. Στην περίπτωση που το frame είναι τύπου ``ESH'', η συνάρτηση θα επιστρέψει 8 υποπίνακες 128x2 με τους συντελεστές του MDCT, έναν για κάθε subframe ενώ σε άλλη περίπτωση, θα επιστρέψει έναν πίνακα 1024x2.
Η συνάρτηση αυτή αφορά την βαθμίδα filterbank και έχει ως ορίσματα ένα frame ήχου 2048x2, τον τύπο του καθώς και τον τύπο παραθύρου που θα χρησιμοποιηθεί. Η δε έξοδός του, είναι η αναπαράσταση του ίδιου του frame στο πεδίο της συχνότητας, σε όρους MDCT. Στην περίπτωση που το frame είναι τύπου ``ESH'', η συνάρτηση θα επιστρέψει 8 υποπίνακες 128x2 με τους συντελεστές του MDCT, έναν για κάθε subframe ενώ σε άλλη περίπτωση, θα επιστρέψει έναν πίνακα 1024x2.
@ -106,7 +91,7 @@ Tα frame τα οποία είναι στατικά χαρακτηρίζοντα
Στην συνάρτηση αυτή, επιδεικνύεται η λειτουργία του κωδικοποιητή και του αποκωδικοποιητή και επιστρέφεται ο σηματοθορυβικός λόγος μεταξύ του αποκωδικοποιημένου και του αρχικού αρχείου ήχου. Δέχεται ως ορίσματα το path του αρχείου που επιθυμούμε να κωδικοποιήσουμε και το όνομα που θα του δοθεί μετά την αποκωδικοποίηση. Για την εύρεση του σηματοθορυβικού λόγου χρησιμοποιείται η συνάρτηση του MATLAB snr.
Στην συνάρτηση αυτή, επιδεικνύεται η λειτουργία του κωδικοποιητή και του αποκωδικοποιητή και επιστρέφεται ο σηματοθορυβικός λόγος μεταξύ του αποκωδικοποιημένου και του αρχικού αρχείου ήχου. Δέχεται ως ορίσματα το path του αρχείου που επιθυμούμε να κωδικοποιήσουμε και το όνομα που θα του δοθεί μετά την αποκωδικοποίηση. Για την εύρεση του σηματοθορυβικού λόγου χρησιμοποιείται η συνάρτηση του MATLAB snr.
Παρακάτω φαίνεται η λειτουργία των παραπάνω συναρτήσεων στο 2ο frame του δείγματος ήχου ``LicorDeCalandraca.wav'' που δίνεται. Ο λόγος του SNR είναι 301.6522 dB χρησιμοποιώντας παράθυρα τύπου ``KBD''.
Παρακάτω φαίνεται η λειτουργία των παραπάνω συναρτήσεων στο 2ο frame του δείγματος ήχου ``LicorDeCalandraca.wav'' που δίνεται. Ο λόγος του SNR είναι 301.5978 dB χρησιμοποιώντας παράθυρα τύπου ``KBD'', ενώ για παράθυρα ``SIN'' είναι ίσος με 307.8881.
\begin{figure}[H]
\begin{figure}[H]
\centering
\centering
@ -141,28 +126,27 @@ Tα frame τα οποία είναι στατικά χαρακτηρίζοντα
Η συνάρτηση TNS υλοποιεί τη βαθμίδα Temporal Noise Shaping για ένα κανάλι. Δέχεται ως εισόδους τους κβαντισμένους συντελεστές MDCT των 2 καναλιών ενός frame και τον τύπο του ενώ επιστρέφει σαν έξοδο το frame στο πεδίο συχνότητας, σε όρους MDCT συντελεστών έπειτα από την εφαρμογή του TNS καθώς και τους κβαντισμένους συντελεστές του TNS.
Η συνάρτηση TNS υλοποιεί τη βαθμίδα Temporal Noise Shaping για ένα κανάλι. Δέχεται ως εισόδους τους κβαντισμένους συντελεστές MDCT ενός καναλιού ενός frame και τον τύπο του frame ενώ επιστρέφει σαν έξοδο το frame στο πεδίο συχνότητας, σε όρους MDCT συντελεστών έπειτα από την εφαρμογή του TNS καθώς και τους κβαντισμένους συντελεστές του TNS.
Σαν πρώτο βήμα, αρχικοποιούμε τον πίνακα των μπαντών του ψυχοακουστικού μοντέλου όπως δίνεται στο πρότυπο. Στη συνέχεια, κατατάσσουμε του συντελεστές MDCT στις μπάντες
Σαν πρώτο βήμα, αρχικοποιούμε τον πίνακα των μπαντών του ψυχοακουστικού μοντέλου όπως δίνεται στο πρότυπο. Στη συνέχεια, κατατάσσουμε τους συντελεστές MDCT στις μπάντες και βρίσκουμε την ενέργεια κάθε μπάντας. Έπειτα, υπολογίζουμε τους συντελεστές κανονικοποίησης, τους εξομαλύνουμε όπως υποδεικνύεται και κανονικοποιούμε τους συντελεστές MDCT ανάλογα με την ενέργεια της μπάντας στην οποία ανήκουν. Με την βοήθεια της συνάρτησης lpc του MATLAB, βρίσκουμε τους συντελεστές γραμμικής πρόβλεψης για κάθε frame (ή subframe αν ο τύπος πρόκειται ``ESH'') και τους κβαντίζουμε με τη βοήθεια της συνάρτησης quantiz σύμφωνα με ομοιόμορφο κβαντιστή βήματος 0.1. Εφαρμόζουμε το FIR φίλτρο $H_{TNS}(z)=1- a_{1}z^{-1}- a_{2}z^{2}- a_{3}z^{-3}- a_{4}z^{-4}$ στους αρχικούς συντελεστές MDCT όπου $a_{i}$ οι κβαντισμένοι συντελεστές γραμμικής πρόβλεψης.
και βρίσκουμε την ενέργεια κάθε μπάντας. Έπειτα, υπολογίζουμε τους συντελεστές κανονικοποίησης, τους εξομαλύνουμε όπως υποδεικνύεται και κανονικοποιούμε τους συντελεστές MDCT ανάλογα με την ενέργεια της μπάντας στην οποία ανήκουν. Με την βοήθεια της συνάρτησης lpc του MATLAB, βρίσκουμε τους συντελεστές γραμμικής πρόβλεψης για κάθε frame (ή subframe αν ο τύπος του είναι "ESH") και τους κβαντίζουμε με τη βοήθεια της συνάρτησης quantiz για ομοιόμορφο κβαντιστή βήματος 0.1. Εφαρμόζουμε το FIR φίλτρο $H_{TNS}(z)=1- a_{1}z^{-1}- a_{2}z^{2}- a_{3}z^{-3}- a_{4}z^{-4}$ στους αρχικούς συντελεστές MDCT όπου $a_{i}$ οι κβαντισμένοι συντελεστές γραμμικής πρόβλεψης.
Αποτελεί την αντίστροφη συνάρτηση της TNS. Δέχεται ως όρισμα το frame στο πεδίο του χρόνου σε όρους συντελεστών MDCT μετά το TNS, τον τύπο του και τους συντελεστές TNS, ενώ ως έξοδο επιστρέφει τους συντελεστές MDCT πριν το TNS. Για την εύρεση τους χρησιμοποιεί το αντίστροφο φίλτρο $H_{TNS}(z)=\frac{1}{1- a_{1}z^{-1}- a_{2}z^{2}- a_{3}z^{-3}- a_{4}z^{-4}}$
Αποτελεί την αντίστροφη συνάρτηση της TNS. Δέχεται ως όρισμα το frame στο πεδίο της συχνότητας σε όρους συντελεστών MDCT οι οποίοι έχουν υποστεί TNS, τον τύπο του frame και τους συντελεστές TNS, ενώ ως έξοδο επιστρέφει τους συντελεστές MDCT έχοντας αναστρέψει τη διαδικασία TNS. Για την εύρεση τους χρησιμοποιεί το αντίστροφο φίλτρο $H_{TNS}(z)=\frac{1}{1- a_{1}z^{-1}- a_{2}z^{2}- a_{3}z^{-3}- a_{4}z^{-4}}$
Υλοποιεί έναν κωδικοποιητή ο οποίος ουσιαστικά εκτελεί την συνάρτηση TNS. Δέχεται ως όρισμα το path του δείγματος ήχου που επιθυμούμε να κωδικοποίησουμε και επιστρέφει ένα struct μεγέθους K x 1, όπου Κ το πλήθος των frames που έχουν κωδικοποιηθεί και παριέχει για το κάθε ένα τον τύπο του, τον τύπο παραθύρου που χρησιμοποιήθηκε κατά την κωδικοποίηση, τους συντελεστές MDCT και τους κβαντισμένους συντελεστές TNS για κάθε κανάλι.
Υλοποιεί έναν κωδικοποιητή ο οποίος συμπεριλαμβάνει τη χρήση της συνάρτησης TNS. Δέχεται ως όρισμα το path του δείγματος ήχου που επιθυμούμε να κωδικοποίησουμε και επιστρέφει ένα struct μεγέθους k x 1, όπου k το πλήθος των frames που έχουν κωδικοποιηθεί και περιέχει για το κάθε ένα τον τύπο του, τον τύπο παραθύρου που χρησιμοποιήθηκε κατά την κωδικοποίηση, τους συντελεστές MDCT και τους κβαντισμένους συντελεστές TNS για κάθε κανάλι.
Όπως και στον παραπάνω κωδικοποιητή, αρχικά διαβάζεται το αρχείο, χωρίζεται σε frames και με την βοήθεια της συνάρτησης SSC, καθορίζεται ο τύπος τους με την ίδια αντιμετώπιση για τα οριακά frames. Στη συνέχεια, τροφοδοτούνται τα frames ως είσοδοι στην συνάρτηση filterbank και στην συνάρτηση TNS και αποθηκεύονται τα αποτελέσματα στο struct.
Όπως και στον προηγούμενο κωδικοποιητή, αρχικά διαβάζεται το αρχείο, χωρίζεται σε frames και με την βοήθεια της συνάρτησης SSC, καθορίζεται ο τύπος τους με την ίδια αντιμετώπιση για τα οριακά frames. Στη συνέχεια, τροφοδοτούνται τα frames ως είσοδοι στην συνάρτηση filterbank και στην συνάρτηση TNS και αποθηκεύονται τα αποτελέσματα στο struct.
\subsection{\texttt{function x = iAACoder2(AACSeq2, fNameOut)}}
\subsection{\texttt{function x = iAACoder2(AACSeq2, fNameOut)}}
Υλοποιεί την αντίστροφη του κωδικοποιητή AACoder1, δηλαδή έναν αποκωδικοποιητή. Δέχεται ως εισόδους το K x 1 struct του κωδικοποιημένου αρχείου καθώς και το όνομα που πρόκειται να πάρει μετά την αποκωδικοποίησή του. Ως έξοδο, επιστρέφει τα αποκωδικοποιημένα δείγματα του αρχείου και τα αποθηκεύει σε μορφή WAV. Για να το επιτύχει αυτό, χρησιμοποιεί τηις συναρτήσεις iTNS και iFilterbank.
Υλοποιεί την αντιστροφή του κωδικοποιητή AACoder1, δηλαδή τον αποκωδικοποιητή. Δέχεται ως είσοδο τον πίνακα k x 1 structs του κωδικοποιημένου αρχείου καθώς και το όνομα που πρόκειται να πάρει το αρχείο ήχου που θα προκύψει μετά την αποκωδικοποίησή. Ως έξοδο, επιστρέφει τα αποκωδικοποιημένα δείγματα του αρχείου τα οποία αποθηκεύει επίσης σε μορφή WAV. Για να το επιτύχει αυτό, χρησιμοποιεί τηις συναρτήσεις iTNS και iFilterbank.
H συνάρτηση αυτή επιδεικνύει την κωδικοποίηση του 2ου επιπέδου. Δέχεται ως ορίσματα το path του αρχείου ήχου που πρίκειται να κωδικοποιηθεί και το όνομα που πρόκειται να πάρει μετά την αποκωδικοποίησή του ενώ επιστρέφει τον συνολικό σηματοθορυβικό λόγο σε dB. Χρησιμοποιεί τις συναρτήσεις AACoder2 και iAACoder2 για την κωδικοποίηση και αποκωδικοποίηση του αρχείου ενώ για την εύρεση του σηματοθορυβικού λόγου χρησιμοποιεί την συνάρτηση snr του MATLAB.
Η συνάρτηση αυτή επιδεικνύει την κωδικοποίηση του 2ου επιπέδου. Δέχεται ως ορίσματα το path του αρχείου ήχου που πρόκειται να κωδικοποιηθεί και το όνομα που πρόκειται να πάρει μετά την αποκωδικοποίησή του ενώ επιστρέφει τον συνολικό σηματοθορυβικό λόγο σε dB. Χρησιμοποιεί τις συναρτήσεις AACoder2 και iAACoder2 για την κωδικοποίηση και αποκωδικοποίηση του αρχείου ενώ για την εύρεση του σηματοθορυβικού λόγου χρησιμοποιεί την συνάρτηση snr του MATLAB.
Παρακάτω βλέπουμε τα αποτελέσματα του κωδικοποιητή και αποκωδικοποιητή.
Παρακάτω βλέπουμε τα αποτελέσματα του κωδικοποιητή και αποκωδικοποιητή.
@ -173,7 +157,7 @@ H συνάρτηση αυτή επιδεικνύει την κωδικοποίη
\label{ref:2}
\label{ref:2}
\end{figure}
\end{figure}
Να σημειωθεί ότι ο σηματοθορυβικός λόγος ισούται με 301.5897 dB που σημαίνει ότι δεν έχει αλλάξει σχεδόν καθόλου, γεγονός που είναι λόγικο αφού μέχρι στιγμής έχουμε κβαντίσει μόνο τους συντελεστές γραμμικής πρόβλεψης και όχι το σήμα άρα δεν έχουμε χάσει πληροφορία. Οι μικρή απόκλιση ανάμεσα στους δύο σηματοθορυβικούς λόγος έγκειται στις μικροαποκλίσεις των πράξεων λόγω των στρογγυλοποιήσεων που εκτελεί το MATLAB. Στο \ref{ref:2} είναι φανερή η ταύτιση του αρχικού σήματος με το σήμα εξόδου του αποκωδικοποιητή, ένδειξη ότι υλοποιήθηκε σωστά. Το ένα σήμα σχεδιάστηκε με πιο έντονη γραμμή και πάλι προς σκοπό οπτικοποίησης των αποτελεσμάτων.
Να σημειωθεί ότι ο σηματοθορυβικός λόγος ισούται με 301.5897 dB, χρησιμοποιώντας παράθυρα τύπου ``KBD'', ενώ για παράθυρα ``SIN'' είναι ίσος με 307.8563, που σημαίνει ότι δεν έχει αλλάξει σχεδόν καθόλου, γεγονός που είναι λογικό αφού μέχρι στιγμής έχουμε κβαντίσει μόνο τους συντελεστές γραμμικής πρόβλεψης και όχι το σήμα, άρα δεν έχουμε χάσει πληροφορία. Οι μικρή απόκλιση ανάμεσα στους δύο σηματοθορυβικούς λόγος έγκειται στις μικροαποκλίσεις των πράξεων λόγω των στρογγυλοποιήσεων που εκτελεί το MATLAB. Στο \ref{ref:2} είναι φανερή η ταύτιση του αρχικού σήματος με το σήμα εξόδου του αποκωδικοποιητή, ένδειξη ότι υλοποιήθηκε σωστά. Το ένα σήμα σχεδιάστηκε με πιο έντονη γραμμή και πάλι προς σκοπό οπτικοποίησης των αποτελεσμάτων.
\section{3ο Επίπεδο}
\section{3ο Επίπεδο}
@ -182,12 +166,9 @@ H συνάρτηση αυτή επιδεικνύει την κωδικοποίη
Υλοποιεί την βαθμίδα του ψυχοακουστικού μοντέλου για ένα κανάλι. Δέχεται ως είσοδο το frame στο πεδίο του χρόνου, τον τύπο του και τα 2 προηγούμενα του frames στο ίδιο κανάλι. Σαν έξοδο επιστρέφει τον λόγο σήματος προς μάσκα (Signal to Mask Ratio - SMR).
Υλοποιεί την βαθμίδα του ψυχοακουστικού μοντέλου για ένα κανάλι. Δέχεται ως είσοδο το frame στο πεδίο του χρόνου, τον τύπο του και τα 2 προηγούμενα frames στο ίδιο κανάλι. Σαν έξοδο επιστρέφει τον λόγο σήματος προς μάσκα (Signal to Mask Ratio - SMR).
Ακολουθώντας την διαδικασία που περιγράφεται στο πρότυπο, βρίσκουμε το κατώφλι ακουστότητας που φαίνεται στο \ref{ref:9} ενώ στο \ref{ref:10} φαίνεται το SMR.
% Πρώτα αρχικοποιήσαμε τους πίνακες TNS από το πρότυπο και στη συνέχεια υπολογίσαμε όλα τα πιθανά αποτελέσματα της spreading function και το παράθυρο Hann, τόσο για long όσο και για short frames. Στη συνέχεια, πολλαπλασιάστηκε το κατάλληλο παράθυρο στο frame i, i-1, i-2 και υπολογίστηκε ο FFT , το πλάτος και η φάση για κάθε ένα από αυτά τα frames. Έπειτα, γίνεται πρόβλεψη για το πλάτος και την φάση του frame, όπως υποδεικνύεται στην εκφώνηση και υπολογίζεται η προβλεψιμότητα του. Υπολογίζοντας την ενέργεια και τη βεβαρυμένη προβλεψιμότητα για κάθε μπάντα μπορούμε να τις συνδυάσουμε με την spreading function και να κανονικοποιήσουμε το αποτέλεσμα ώστε να εξάγουμε από αυτό τον δείκτη τονικότητας. Βρίσκουμε το SNR, το μετατρέπουμε σε λόγο ενέργειας, όπως υποδεικνύεται, και υπολογίζουμε το κατώφλι ενέργειας. Τέλος, υπολογίζουμε το επίπεδο θορύβου σε κάθε μπάντα και το SMR.
Ακολουθώντας την διαδικασία που περιγράφεται στο πρότυπο, βρίσκουμε το κατώφλι ακουστότητας που φαίνεται στο \ref{ref:6} ενώ στο \ref{ref:10} φαίνεται το SMR.
\begin{figure}[H]
\begin{figure}[H]
\centering
\centering
@ -196,8 +177,6 @@ H συνάρτηση αυτή επιδεικνύει την κωδικοποίη
Υπολογίζει εσωτερικά το κατώφλι ακουστότητας T(b) και υλοποιεί τη βαθμίδα του κβαντιστή για κάθε κανάλι. Δέχεται ως εισόδους το frame στο πεδίο της συχνότητας σε όρους συντελεστών MDCT, τον τύπο του και το υπολογισμένο SMR. Σαν έξοδο επιστρέφει τον πίνακα s που περιέχει τα σύμβολα κβάντισης των συντελεστών ΜDCT του frame, τον πίνακα sfc με τις τιμές των Scalefactor για κάθε Scalefactor band και το G που είναι το global gain του frame.
Υπολογίζει εσωτερικά το κατώφλι ακουστότητας T(b) και υλοποιεί τη βαθμίδα του κβαντιστή για κάθε κανάλι. Δέχεται ως εισόδους το frame στο πεδίο της συχνότητας σε όρους συντελεστών MDCT, τον τύπο του και το υπολογισμένο SMR. Σαν έξοδο επιστρέφει τον πίνακα S που περιέχει τα σύμβολα κβάντισης των συντελεστών ΜDCT του frame, τον πίνακα sfc με τις τιμές των Scalefactor για κάθε Scalefactor band και το G που είναι το global gain του frame.
% Βρίσκουμε αρχικά το κατώφλι ακουστότητας και έπειτα ακολουθώντας τα βήματα που υποδεικνύονται, αρχικά υπολογίζεται μια τιμή του συντελεστή Scalefactor Gain και υπολογίζεται το σφάλμα. Στη συνέχεια αυξάνεται σταδιακά ο συντελεστής και υπολογίζεται και πάλι το σφάλμα μέχρι να φτάσουμε το κατώφλι ακουστότητας.
Η συνάρτηση παίρνει ως είσοδο τους συντελεστές MDCT που φαίνονται στο \ref{ref:3}
Η συνάρτηση παίρνει ως είσοδο τους συντελεστές MDCT που φαίνονται στο \ref{ref:3}
Υλοποιεί την αντίστροφη συνάρτηση της AACquantizer. Δέχεται ως ορίσματα τα σύμβολα κβάντισης των συντελεστών MDCT, τον πίνακα με τα scalefactors κάθε μπάντας και το global gain. Σαν έξοδο, με τους συντελεστές και το scalefactor προσπαθεί να επανακατασκαευάσει το frame στο πεδίο της συχνότητας σε όρους συντελεστών MDCT, το οποίο και επιστρέφει.
Υλοποιεί την αντίστροφη συνάρτηση της AACquantizer. Δέχεται ως ορίσματα τα σύμβολα κβάντισης των συντελεστών MDCT, τον πίνακα με τα scalefactors κάθε μπάντας και το global gain. Σαν έξοδο, χρησιμοποιώντας τους συντελεστές και τα scalefactor προσπαθεί να επανακατασκαευάσει το frame στο πεδίο της συχνότητας σε όρους συντελεστών MDCT, το οποίο και επιστρέφει.
Υλοποιεί τη βαθμίδα κωδικοποίσης Huffman. Δέχεται ως εισόδους
κβαντισμένους συντελεστές, τους Huffman look-up tables και τον δείκτη Codebook, όπως αυτός παρουσιάζεται στο πρότυπο.
Σαν έξοδο, επιστρέφει ένα string από '1' και '0' αντίστοιχο με την κωδικοποίηση Huffman, και το huffCodebook, τον αριθμό των Huffman codebook που χρησιμοποιήθηκαν.
Για την υλοποίησή της ακολουθήθηκαν οι οδηγίες από το πρότυπο ενώ για να χρησιμοποιηθούν οι look-up tables κλήθηκε η συνάρτηση loadLUT.m.
Υλοποιεί την αντίστροφη συνάρτηση της encodeHuff, δηλαδή αποτελεί έναν αποκωδικοποιητή Huffman. Δέχεται ως είσοδο το string με '1' και '0' που αντιστοιχεί στην κωδικοποίηση Huffman, τους δείκτες codebook που χρησιμοποιήθηκαν και τους Huffman look-up tables. Σαν έξοδο, επιστρέφει τους αποκωδικοποιημένους κβαντισμένους συντελεστές.
Η διαδικασία είναι και πάλι αυτή που παρουσιάζεται στο πρότυπο ενώ λόγο του zero padding που είναι απαραίτητο, το μήκος της εξόδου, δηλαδή των κβαντισμένων συντελεστών, ίσως είναι μεγαλύτερο από αυτό που θα έπρεπε. Σε αυτήν την περίπτωση οι τιμές που είναι εκτός του εύρους του αναμενόμενου μήκους, θα πρέπει να αγνοηθούν ενώ αναμένεται να είναι και μηδενικοί
Υλοποιεί έναν κωδικοποιητή ο οποίος δέχεται σαν είσοδο το path του αρχείου το οποίο πρόκειται να κωδικοποιηθεί και το path του .mat αρχείου που πρόκειται να εγγραφεί μετά την κωδικοποίηση. Ως έξοδο, επιστρέφει ένα struct με διάσταση k x 1, όπου k, ο αριθμός των frames του αρχείου, το οποίο περιέχει για κάθε frame, όπως και πριν τον τύπο του και το παράθυρο που χρησιμοποιήθηκε,ενώ για κάθε κανάλι επιστρέφει τους κβαντισμένους συντελεστές TNS, τα κατώφλια ακουστότητας λόγω του ψυχοακουστικού μοντέλου, τα κβαντισμένα global gains, τους κωδικοποιημένους με Huffman κβαντισμένους συντελεστές MDCT και scalefactors και το Huffman codebook.
Υλοποιεί έναν κωδικοποιητή ο οποίος δέχεται σαν είσοδο το path του αρχείου το οποίο πρόκειται να κωδικοποιηθεί και το path του MAT αρχείου που πρόκειται να εγγραφεί μετά την κωδικοποίηση. Ως έξοδο, επιστρέφει ένα struct με διάσταση k x 1, όπου k, ο αριθμός των frames του αρχείου, το οποίο περιέχει για κάθε frame, όπως και πριν τον τύπο του και το παράθυρο που χρησιμοποιήθηκε,ενώ για κάθε κανάλι επιστρέφει τους κβαντισμένους συντελεστές TNS, τα κατώφλια ακουστότητας του ψυχοακουστικού μοντέλου, τα global gains, τους κωδικοποιημένους με Huffman κβαντισμένους συντελεστές MDCT και scalefactors και τον αύξων αριθμό του Huffman codebook που χρησιμοποιήθηκε.
Φορτώνει αρχικά τους πίνακες TNS, διαβάζει το αρχείο προς κωδικοποίηση και αφού το χωρίσει σε frames χρησιμοποεί στη συνέχεια τις συναρτήσεις SSC, filterbank, TNS, psycho, AACquantizer και encodeHuff για να το κωδικοποίησει. Τα αποτελέσματα φαίνονται παρακάτω:
Φορτώνει αρχικά τους πίνακες TNS, διαβάζει το αρχείο προς κωδικοποίηση και αφού το χωρίσει σε frames χρησιμοποιεί διαδοχικά τις συναρτήσεις SSC, filterbank, TNS, psycho, AACquantizer και encodeHuff για να το κωδικοποίησει. Τα αποτελέσματα φαίνονται παρακάτω.
\subsection{\texttt{function x = iAACoder3(AACSeq3, fNameOut)}}
\subsection{\texttt{function x = iAACoder3(AACSeq3, fNameOut)}}
Υλοποιεί τον αντίστοιχο αποκωδικοποιητή. Δέχεται ως εισόδους, το struct που προκύπτει από τον κωδικοποιητή AACoder3 και το όνομα μαζί με το path που πρόκειται να πάρει το αποκωδικοποιημένο αρχείο ενώ ως έξοδο επιστρέφει έναν πίνακα με το αποκωδικοποιημένο σήμα. Για την υλοποίηση του χρησιμοποιούνται οι συναρτήσεις decodeHuff, iAACquantizer, iTNS και iFilterbank.
Υλοποιεί τον αντίστοιχο αποκωδικοποιητή. Δέχεται ως εισόδους, το struct που προκύπτει από τον κωδικοποιητή AACoder3 και το όνομα μαζί με το path που πρόκειται να πάρει το αποκωδικοποιημένο αρχείο ενώ ως έξοδο επιστρέφει έναν πίνακα με το αποκωδικοποιημένο σήμα. Στην υλοποίηση του χρησιμοποιούνται οι συναρτήσεις decodeHuff, iAACquantizer, iTNS και iFilterbank.
Ουσιαστικά η συνάρτηση αυτή παρουσιάζει την λειτουργία των συναρτήσεων του επιπέδου 3. Δέχεται ως εισόδους το path του αρχείου που πρόκειται να κωδικοποιηθεί και το όνομα του αρχείου που πρόκειται να επιστραφεί μετά την αποκωδικοποίηση. Σαν έξοδο, επιστρέφει τον σηματοθορυβικό λόγο του σήματος μετά την κωδικοποίηση και αποκωδικοποίησή του, το bitrate και το ποσοστό συμπίεσης.
Η συνάρτηση αυτή παρουσιάζει την λειτουργία των συναρτήσεων του επιπέδου 3. Δέχεται ως εισόδους το path του αρχείου που πρόκειται να κωδικοποιηθεί και το όνομα του αρχείου που πρόκειται να επιστραφεί μετά την αποκωδικοποίηση. Σαν έξοδο, επιστρέφει τον σηματοθορυβικό λόγο του σήματος μετά την κωδικοποίηση και αποκωδικοποίησή του, το bitrate του κωδικοποιημένου αρχείου και το ποσοστό συμπίεσης.
Αφού εκτελέστηκε η συνάρτηση, επέστρεψε τα εξής αποτελέσματα:
Αφού εκτελέστηκε η συνάρτηση, επέστρεψε τα εξής αποτελέσματα:
\begin{table}[]
\begin{table}[H]
\centering
\centering
\begin{tabular}{ll}
\begin{tabular}{ll}
\textbf{SNR}& 5.1821 dB \\
\textbf{SNR (KBD)}& 5.1821 dB \\
\textbf{bitrate}& 3.1937e+05 \\
\textbf{SNR (SIN)}& 6.4480 dB \\
\textbf{bitrate}& 31.937e+05 \\
\textbf{compression}& 4.8094
\textbf{compression}& 4.8094
\end{tabular}
\end{tabular}
\end{table}
\end{table}
Πιο συγκεκριμένα, είδαμε τα αποτελέσματα του κωδικοποιητή και αποκωδικοποιητή για το 2ο frame του δείγματος ήχου:
Πιο συγκεκριμένα, βλέπουμε τα αποτελέσματα του κωδικοποιητή και αποκωδικοποιητή για το 2ο frame του δείγματος ήχου:
\begin{figure}[H]
\begin{figure}[H]
\centering
\centering
@ -305,7 +266,3 @@ H συνάρτηση αυτή επιδεικνύει την κωδικοποίη
Όπως βλέπουμε το αποκωδικοποιημένο και το αρχικό σήμα δεν ταυτίζονται. Αυτό είναι απολύτως λογικό αφού το σήμα πλέον έχει αλλοιωθεί και δεν ήταν δυνατό να επανακατασκευαστεί πλήρως. Για τον λόγο αυτό είναι και ο σηματοθορυβικός λόγος πολύ μικρός πλέον σε σχέση με τους προηγούμενους.
Όπως βλέπουμε το αποκωδικοποιημένο και το αρχικό σήμα δεν ταυτίζονται. Αυτό είναι απολύτως λογικό αφού το σήμα πλέον έχει αλλοιωθεί και δεν ήταν δυνατό να επανακατασκευαστεί πλήρως. Για τον λόγο αυτό είναι και ο σηματοθορυβικός λόγος πολύ μικρός πλέον σε σχέση με τους προηγούμενους.