%
% !TEX TS-program = xelatex
% !TEX encoding   = UTF-8 Unicode
% !TEX spellcheck = el-GR
%
% Information Systems Security assignment report
%
% Requires compilation with XeLaTeX
%
% authors:
%   Χρήστος Χουτουρίδης ΑΕΜ 8997
%   cchoutou@ece.auth.gr


% Options:
%
% 1) mainlang=<language>
%    Default:  english
%    Set the default language of the document which affects hyphenations,
%    localization (section, dates, etc...)
%
%    example: \documentclass[mainlang=greek]{AUThReport}
%
% 2) <language>
%    Add hyphenation and typesetting support for other languages
%    Currently supports: english, greek, german, frenc
%
%    example: \documentclass[english, greek]{AUThReport}
%
% 3) short: Requests a shorter title for the document
%    Default: no short
%
%    example: \documentclass[short]{AUThReport}
%
\documentclass[a4paper, 11pt, mainlang=greek, english]{AUThReport/AUThReport}

\CurrentDate{\today}

% Greek report document setup suggestions
%---------------------------------
% Document configuration
\AuthorName{Χρήστος Χουτουρίδης}
\AuthorAEM{8997}
\AuthorMail{cchoutou@ece.auth.gr}

%\CoAuthorName{CoAuthor Name}
%\CoAuthorAEM{AEM}
%\CoAuthorMail{CoAuthor Mail}

% \WorkGroup{Ομάδα Χ}

\DocTitle{Εργασία Εξαμήνου}
\DocSubTitle{Απλοποιημένη κωδικοποίηση-αποκωδικοποίηση AAC}

\Department{Τμήμα ΗΜΜΥ. Τομέας Ηλεκτρονικής}
\ClassName{Συστήματα Πολυμέσων και Εικονική Πραγματικότητα}

\InstructorName{Αναστάσιος Ντελόπουλος}
\InstructorMail{antelopo@ece.auth.gr}

%\CoInstructorName{}
%\CoInstructorMail{}


% Local package requirements
%---------------------------------
%\usepackage{tabularx}
%\usepackage{array}
%\usepackage{commath}

\usepackage{amsmath, amssymb, amsfonts}
\usepackage{graphicx}
\usepackage{caption}
\usepackage{subcaption}
\usepackage{float}

\captionsetup[figure]{name=Εικόνα}

% Requires: -shell-escape compile argument
\usepackage{minted}
\usepackage{xcolor} %

\setminted[python]{
    fontsize=\small,
    breaklines,
    autogobble,
    baselinestretch=1.1,
    tabsize=2,
    numbersep=8pt,
    startinline,
    gobble=0
}

\setminted[bash]{
    fontsize=\small,
    breaklines,
    autogobble,
    baselinestretch=1.1,
    tabsize=2,
    numbersep=8pt,
    startinline,
    gobble=0
}

\newcommand{\repo}{https://git.hoo2.net/hoo2/Multimedia_AAC_Project}


\begin{document}

% Request a title page or header
\InsertTitle

\section{Εισαγωγή}

Η παρούσα εργασία αφορά την υλοποίηση ενός απλοποιημένου κωδικοποιητή και αποκωδικοποιητή ήχου κατά το πρότυπο \textbf{Advanced Audio Coding} (AAC).
Το AAC αποτελεί μία μέθοδο κωδικοποίησης μετασχηματισμού (transform coding) η οποία συνδυάζει ανάλυση στο πεδίο της συχνότητας, ψυχοακουστικό μοντέλο και κωδικοποίηση εντροπίας, με στόχο την αποδοτική συμπίεση ηχητικών σημάτων υψηλής ποιότητας.
Η βασική αρχή λειτουργίας του βασίζεται στη μείωση της πλεονάζουσας πληροφορίας μέσω του μετασχηματισμού \textbf{MDCT} και στην εκμετάλλευση των ιδιοτήτων της ανθρώπινης ακοής ώστε να επιτρέπεται ελεγχόμενη απώλεια πληροφορίας που δεν είναι αντιληπτή.

Στο πλαίσιο της εργασίας υλοποιούμε μία \textit{απλοποιημένη εκδοχή} του προτύπου, όπως αυτή περιγράφεται στην εκφώνηση, παραλείποντας ορισμένες βαθμίδες όπως το Mid/Side stereo και το Bit Reservoir, διατηρώντας όμως τον βασικό κορμό της αλυσίδας κωδικοποίησης.
Συγκεκριμένα, αναπτύσσουμε διαδοχικά τις βαθμίδες Sequence Segmentation Control, Filterbank (MDCT/IMDCT), Temporal Noise Shaping, Psychoacoustic Model, Quantization και Huffman coding, καθώς και τις αντίστροφες διαδικασίες αποκωδικοποίησης.

Στην παρούσα αναφορά περιγράφουμε τη θεωρητική βάση κάθε βαθμίδας, τον τρόπο υλοποίησής της και τα αποτελέσματα που προκύπτουν από την πειραματική αξιολόγηση του συστήματος.

\subsection{Παραδοτέα}
Τα παραδοτέα της εργασίας αποτελούνται από:
\begin{itemize}
    \item Την παρούσα αναφορά.
    \item Τον κεντρικό κατάλογο \texttt{source} που περιέχει τους ζητούμενους από την εκφώνηση καταλόγους \texttt{level\_<i>}, $i=1,2,3$ με τον κώδικα της εφαρμογής.
    Ο καθένας περιέχει ένα αντίστοιχο script \texttt{level\_<i>.py} που καλεί την demonstration συνάρτηση του αντίστοιχου level.
    Επίσης ο κατάλογος \texttt{source} περιέχει και τον κατάλογο \texttt{core}, όπου έγινε η κεντρική ανάπτυξη του κώδικά και των tests.
    \item Το \href{\repo}{σύνδεσμο} με το αποθετήριο που περιέχει όλο το project με τον κώδικα της εφαρμογής και της παρούσας αναφοράς.
\end{itemize}

\section{Υλοποίηση}

Η υλοποίηση οργανώνεται \textbf{αρθρωτά}, με σαφή διαχωρισμό των επιμέρους λειτουργικών βαθμίδων, ώστε κάθε στάδιο της κωδικοποίησης και της αποκωδικοποίησης να μπορεί να ελεγχθεί και να επαληθευτεί ανεξάρτητα.
Η δομή αυτή μας επιτρέπει να αναπτύξουμε σταδιακά τρία επίπεδα ολοκλήρωσης, από την πλήρως αναστρέψιμη μετασχηματιστική κωδικοποίηση έως την πλήρη απωλεστική κωδικοποίηση με ψυχοακουστικό έλεγχο και κωδικοποίηση εντροπίας.

Οι επιμέρους βαθμίδες του κωδικοποιητή και του αποκωδικοποιητή υλοποιήθηκαν ως \textbf{ανεξάρτητα modules}, τα οποία επαναχρησιμοποιούνται σε κάθε κατάλογο \texttt{level\_<i>}.
Αν και η δομή του παραδοτέου δίνει την εντύπωση ότι οι κατάλογοι των επιπέδων περιέχουν αντίγραφα των ίδιων αρχείων, στην πράξη αυτό δεν ισχύει.
Η αρχική μας προσέγγιση ήταν η ύπαρξη ενός κεντρικού καταλόγου με κοινή υλοποίηση για όλα τα επίπεδα, ωστόσο οι περιορισμοί της εκφώνησης δεν επέτρεπαν τέτοια οργάνωση.
Αντί της χρήσης υπο-αποθετηρίων, επιλέξαμε τη λύση των hard links, ώστε τα αρχεία του κοινού πυρήνα να εμφανίζονται σε κάθε κατάλογο επιπέδου χωρίς να υπάρχει πραγματικός διπλασιασμός του κώδικα.
Με τον τρόπο αυτό διατηρούμε \textbf{ένα ενιαίο σημείο που συντηρείται ο κώδικας} και αποφεύγουμε αποκλίσεις μεταξύ των επιπέδων.

Κάθε module αναπτύχθηκε ανεξάρτητα, με εκτεταμένη χρήση αυτοματοποιημένων δοκιμών.
Η ανάπτυξη ακολούθησε προσέγγιση \textbf{Test-Driven Development}, όπου τα tests σχεδιάστηκαν με βάση το δημόσιο interface κάθε module και περιγράφουν τη λειτουργική του συμπεριφορά.
Τα tests έχουν λειτουργικό και συμβατικό χαρακτήρα (functional and contract-based) και ελέγχουν σχήματα δεδομένων, αριθμητική σταθερότητα, οριακές περιπτώσεις και ιδιότητες αναστρεψιμότητας.
Η πρακτική αυτή μας επέτρεψε να εκτελούμε εύκολα \textbf{regression tests} μετά από κάθε τροποποίηση, διασφαλίζοντας ότι δεν εισάγονται ανεπιθύμητες παρενέργειες σε άλλα μέρη του συστήματος.

Δημιουργήσαμε επίσης wrapper module για το δοθέν module κωδικοποίησης Huffman.
Κατά την ενσωμάτωσή του \textbf{εντοπίστηκε σφάλμα τύπου off-by-one} στον μηχανισμό αποκωδικοποίησης escape τιμών του codebook 11.
Το σφάλμα αφορούσε τον χειρισμό του bit διαχωρισμού (delimiter) στη μορφή κωδικοποίησης των escape τιμών.
Συγκεκριμένα, κατά την αποκωδικοποίηση μετρούνταν σωστά τα N διαδοχικά bits τιμής ‘1’, όμως το επόμενο bit ‘0’, που λειτουργεί ως διαχωριστής, δεν παραλειπόταν πριν την ανάγνωση των N+4 bits του payload.
Ως αποτέλεσμα, το bit διαχωρισμού συμπεριλαμβανόταν εσφαλμένα στα bits της escape τιμής, οδηγώντας σε μετατόπιση κατά ένα bit και σε λανθασμένη ανακατασκευή του μεγέθους.
Το σφάλμα αυτό δεν προκαλούσε εξαίρεση εκτέλεσης, αλλά αλλοίωνε τις διαφορές των scalefactors.
Η διόρθωση συνίσταται στη σωστή κατανάλωση του bit διαχωρισμού πριν την ανάγνωση των N+4 bits της escape τιμής.
Η προτεινόμενη αλλαγή κοινοποιήθηκε στους διδάσκοντες και έγινε αποδεκτή.

Συνοπτικά, τα βασικά modules του συστήματος είναι τα ακόλουθα:

\begin{itemize}
    \item \textbf{\texttt{aac\_ssc}}: Υλοποίηση της βαθμίδας Sequence Segmentation Control.
    \item \textbf{\texttt{aac\_filterbank}}: Υλοποίηση MDCT/IMDCT και διαχείριση παραθύρων.
    \item \textbf{\texttt{aac\_tns}}: Υλοποίηση Temporal Noise Shaping.
    \item \textbf{\texttt{aac\_psycho}}: Υλοποίηση ψυχοακουστικού μοντέλου και υπολογισμός SMR.
    \item \textbf{\texttt{aac\_quantizer}}: Υλοποίηση μη ομοιόμορφου κβαντιστή και αντίστροφης κβάντισης.
    \item \textbf{\texttt{aac\_huffman}}: Διαχείριση κωδικοποίησης και αποκωδικοποίησης Huffman.
    \item \textbf{\texttt{aac\_coder} / \texttt{aac\_decoder}}: Σύνθεση της πλήρους ροής κωδικοποίησης και αποκωδικοποίησης.
    \item \textbf{\texttt{aac\_utils}}: Βοηθητικές συναρτήσεις και μετρικές αξιολόγησης.
\end{itemize}

Για την επιτυχή εκτέλεση του κώδικα απαιτείται η εγκατάσταση των εξαρτήσεων.
Για το λόγο αυτό από τον κεντρικό κατάλογο πρέπει να εκτελεστεί:
\begin{minted}{bash}
    pip install -r requirements.txt
\end{minted}

Τα αυτοματοποιημένα tests δεν απαιτούνται από την εκφώνηση και δεν εκτελούνται από τα scripts των επιπέδων.
Παρ' όλα αυτά, ο αναγνώστης μπορεί να τα εκτελέσει από τον κεντρικό κατάλογο του project:
\begin{minted}{bash}
    pytest -v
    # to run a specific module (for example filterbank)
    pytest -v core/tests/test_filterbank.py
\end{minted}


\section{Level 1 -- SSC και MDCT}

\subsection{Απαιτήσεις Level 1}

Στο πρώτο επίπεδο ζητείται η υλοποίηση ενός πλήρως αναστρέψιμου συστήματος κωδικοποίησης--αποκωδικοποίησης βασισμένου στον μετασχηματισμό MDCT.
Το επίπεδο αυτό δεν περιλαμβάνει ψυχοακουστικό μοντέλο, κβάντιση ή κωδικοποίηση εντροπίας.
Στόχος είναι η σωστή υλοποίηση του Sequence Segmentation Control και του Filterbank, έτσι ώστε \textbf{η ανακατασκευή του σήματος να είναι αριθμητικά ταυτόσημη με το αρχικό}, μέχρι αριθμητική ακρίβεια κινητής υποδιαστολής.

Το Level 1 λειτουργεί ως θεμέλιο για τα επόμενα επίπεδα, καθώς οποιοδήποτε σφάλμα στο μετασχηματιστικό στάδιο θα μεταφερόταν και θα ενισχυόταν στα επόμενα στάδια.

\subsection{Modules που χρησιμοποιούνται}

Για το Level 1 χρησιμοποιούνται τα εξής modules:

\begin{itemize}
    \item \textbf{\texttt{aac\_ssc}} για την επιλογή τύπου frame.
    \item \textbf{\texttt{aac\_filterbank}} για MDCT/IMDCT και OLA.
    \item \textbf{\texttt{aac\_coder\_1}} και \textbf{\texttt{aac\_decoder\_1}} για τη σύνθεση της ροής.
    \item \textbf{\texttt{aac\_utils}} για βοηθητικές συναρτήσεις και υπολογισμό SNR.
\end{itemize}

\subsection{Sequence Segmentation Control}

Η βαθμίδα SSC υλοποιεί τον μηχανισμό επιλογής τύπου παραθύρου (OLS, LSS, ESH, LPS) με βάση την ανίχνευση spikes (attack detection).
Η ανίχνευση βασίζεται στον υπολογισμό της ενέργειας σε υπο-τμήματα μήκους 128 δειγμάτων και στον λόγο διαδοχικών ενεργειών.

Η υλοποίηση είναι πλήρως συμμετρική για τα δύο κανάλια και ο τελικός τύπος frame προκύπτει από συγχώνευση των δύο καναλιών σύμφωνα με τον πίνακα μετάβασης.
Επίσης, δόθηκε ιδιαίτερη προσοχή στη αριθμητική σταθερότητα, ώστε να αποφεύγονται διαιρέσεις με μηδενική ενέργεια.

\subsection{Filterbank και MDCT}

Το module \texttt{aac\_filterbank} υλοποιεί τον MDCT και τον αντίστροφό του IMDCT σε διακριτή μορφή.
Χρησιμοποιούνται παράθυρα τύπου SIN και KBD, σύμφωνα με τον τύπο frame.
Η υλοποίηση διαχειρίζεται σωστά τις μεταβάσεις μεταξύ παραθύρων, εφαρμόζοντας overlap-add (OLA) ώστε να επιτυγχάνεται perfect reconstruction σε steady state.

Τόσο η ιδιότητα γραμμικότητας του μετασχηματισμού, όσο και η σχέση ενίσχυσης:
\[
\text{MDCT}(\text{IMDCT}(X)) \approx 2X
\]
ελέγχθηκαν αριθμητικά στο πλαίσιο των tests.

Ενδεικτικά να αναφαίρουμε το παράδειγμα στον έλεγχος της σχέσης ενίσχυσης:
\begin{minted}{python}
    X: MdctCoeffs     = rng.normal(size=K)
    x: TimeSignal     = imdct(X)
    X_hat: MdctCoeffs = mdct(x)
    _assert_allclose(X_hat, 2.0 * X, rtol=tolerance, atol=tolerance)
\end{minted}


\subsection{Φιλοσοφία Ελέγχου Ορθότητας}

Ως γνωστόν, στον προγραμματισμό και στο quality assurance, \textbf{δεν μπορεί να υπάρχει απόλυτη απόδειξη ορθότητας}.
Υπάρχει μόνο μείωση της πιθανότητας σφάλματος μέσω στοχευμένων ελέγχων.

Για το Level 1 ελέγχθηκαν:

\begin{itemize}
    \item Ιδιότητες γραμμικότητας MDCT/IMDCT.
    \item Απουσία NaN/Inf σε τυχαίες εισόδους.
    \item Σωστή διαχείριση μεταβάσεων παραθύρων.
    \item Ορθή συμπεριφορά SSC σε edge cases.
    \item End-to-end ταυτότητα σήματος με υψηλό SNR.
\end{itemize}

Τα tests μπορούν να εκτελεστούν με:

\begin{minted}{bash}
    pytest -v core/tests/test_filterbank.py
    pytest -v core/tests/test_ssc.py
    pytest -v core/tests/test_utils.py
\end{minted}

Η επιτυχής εκτέλεση των παραπάνω tests διασφαλίζει ότι το Level 1 αποτελεί αριθμητικά σταθερό θεμέλιο για τα επόμενα επίπεδα.

\subsection{Demo και Αποτελέσματα}

Η demonstration του Level 1 μπορεί να εκτελεστεί με:

\begin{minted}{bash}
    cd level_1
    python -m level_1 material/LicorDeCalandraca.wav material/LicorDeCalandraca_out_l1.wav
\end{minted}

Η έξοδος που προέκυψε ήταν:

\begin{minted}{text}
    Encoding ...................... done
    Decoding ...................... done
    SNR = 257.437 dB
\end{minted}

Η τιμή SNR άνω των 250 dB \textbf{υποδηλώνει πρακτικά αριθμητική ταυτότητα μεταξύ αρχικού και ανακατασκευασμένου σήματος}.
Η απόκλιση οφείλεται αποκλειστικά σε \textbf{αριθμητική ακρίβεια κινητής υποδιαστολής} και όχι σε δομικό σφάλμα της υλοποίησης.
Το αποτέλεσμα αυτό επιβεβαιώνει ότι η υλοποίηση του Filterbank και του SSC είναι συνεπής και πλήρως αναστρέψιμη.


\section{Level 2 – Temporal Noise Shaping}

\subsection{Απαιτήσεις Level 2}

Στο δεύτερο επίπεδο ζητείται η ενσωμάτωση της βαθμίδας \textbf{Temporal Noise Shaping (TNS)} στη ροή κωδικοποίησης.
Το TNS εφαρμόζεται στο πεδίο των συντελεστών MDCT και βασίζεται σε γραμμική πρόβλεψη.
Στόχος της βαθμίδας είναι η χρονική ανακατανομή του σφάλματος κβάντισης, ώστε το αντιληπτό σφάλμα να κατανέμεται χρονικά με πιο ευνοϊκό τρόπο.

Στο Level 2 η διαδικασία παραμένει πλήρως αναστρέψιμη.
Η κβάντιση των συντελεστών πρόβλεψης γίνεται με συγκεκριμένο βήμα και σε περιορισμένο εύρος τιμών, ώστε να διασφαλίζεται η σταθερότητα του αντίστροφου φίλτρου.

\subsection{Modules που χρησιμοποιούνται}

Για το Level 2 χρησιμοποιούνται:

\begin{itemize}
    \item \textbf{\texttt{aac\_ssc}}.
    \item \textbf{\texttt{aac\_filterbank}}.
    \item \textbf{\texttt{aac\_tns}}.
    \item \textbf{\texttt{aac\_coder\_2}} και \textbf{\texttt{aac\_decoder\_2}}.
    \item \textbf{\texttt{aac\_utils}}.
\end{itemize}

Το νέο στοιχείο σε σχέση με το Level 1 είναι το module \texttt{aac\_tns}, το οποίο εφαρμόζεται μετά τον MDCT και πριν από την αντίστροφη διαδικασία στον αποκωδικοποιητή.

\subsection{Υλοποίηση της βαθμίδας TNS}

Για κάθε frame υπολογίζονται συντελεστές γραμμικής πρόβλεψης τάξης \texttt{PRED\_ORDER} (4).
Στην περίπτωση ESH, η διαδικασία εφαρμόζεται ανεξάρτητα σε κάθε ένα από τα 8 υπο-frames.
Οι συντελεστές πρόβλεψης κβαντίζονται με σταθερό βήμα \texttt{QUANT\_STEP} (0.1) και περιορίζονται στο διάστημα $[-\texttt{QUANT\_MAX}(-0.7), +\texttt{QUANT\_MAX}(+0.7)]$.

Το φίλτρο που ορίζεται από τους συντελεστές $\{a_k\}$ έχει μορφή:

\[
H(z) = 1 - \sum_{k=1}^{p} a_k z^{-k}.
\]

Στον κωδικοποιητή το φίλτρο εφαρμόζεται σε μορφή \textbf{FIR}.
Κάθε νέος συντελεστής MDCT προκύπτει αφαιρώντας γραμμικό συνδυασμό προηγούμενων συντελεστών.
Η επιλογή FIR μορφής εξασφαλίζει αριθμητική σταθερότητα, καθώς δεν υπάρχει ανατροφοδότηση.

Στον αποκωδικοποιητή εφαρμόζεται το αντίστροφο φίλτρο:

\[
H^{-1}(z) = \frac{1}{1 - \sum_{k=1}^{p} a_k z^{-k}},
\]

το οποίο έχει μορφή \textbf{IIR}.
Η αντιστροφή υλοποιείται αναδρομικά, επαναφέροντας τους αρχικούς συντελεστές MDCT.
Η διαδικασία αυτή είναι πλήρως αναστρέψιμη υπό την προϋπόθεση ότι το IIR φίλτρο είναι σταθερό.

Η σταθερότητα απαιτεί όλες οι ρίζες του πολυωνύμου:

\[
z^p - a_1 z^{p-1} - \dots - a_p = 0
\]

να βρίσκονται \textbf{εντός του μοναδιαίου κύκλου}.
Ακόμη και μικρή υπέρβαση της μοναδιαίας ακτίνας θα οδηγούσε σε εκθετική ενίσχυση κατά την αναδρομική εφαρμογή του φίλτρου και σε αριθμητική υπερχείλιση.

\subsection{Φιλοσοφία Ελέγχου Ορθότητας}

Όπως και στο Level 1, δεν υπάρχει απόλυτη μαθηματική απόδειξη ορθότητας.
Για τη βαθμίδα TNS ελέγχθηκαν:

\begin{itemize}
    \item Σωστά σχήματα εξόδου για long και ESH frames.
    \item Κβάντιση πάνω στο επιθυμητό πλέγμα τιμών.
    \item Περιορισμός συντελεστών στο επιτρεπτό εύρος.
    \item Ρητός έλεγχος σταθερότητας μέσω υπολογισμού ριζών.
    \item Ιδιότητα round-trip: $\text{iTNS}(\text{TNS}(X)) \approx X$.
    \item Απουσία NaN/Inf σε τυχαίες και οριακές εισόδους.
\end{itemize}

Ο έλεγχος σταθερότητας υλοποιείται αριθμητικά με την εξής λογική:
\begin{minted}{python}
    poly = np.empty(p + 1)
    poly[0] = 1.0
    poly[1:] = -a_q
    roots = np.roots(poly)
    margin = 1e-12
    assert np.all(np.abs(roots) < (1.0 - margin))
\end{minted}

Η ιδιότητα αντιστρεψιμότητας ελέγχεται μέσω round-trip ελέγχου:
\begin{minted}{python}
    frame_F_tns, coeffs = aac_tns(frame_F_in, frame_type)
    frame_F_hat = aac_i_tns(frame_F_tns, frame_type, coeffs)
    np.testing.assert_allclose(frame_F_hat, frame_F_in)
\end{minted}

Οι παραπάνω έλεγχοι δεν αποδεικνύουν μαθηματικά την ορθότητα, αλλά διασφαλίζουν ότι το ζεύγος FIR/IIR λειτουργεί ως ακριβές αντίστροφο εντός αριθμητικής ακρίβειας και ότι η κβάντιση δεν εισάγει αστάθεια.

Τα ακριβή tests μπορούν να εκτελεστούν με:

\begin{minted}{bash}
    pytest -v core/tests/test_tns.py
\end{minted}

\subsection{Demo και Αποτελέσματα}

Η demonstration του Level 2 εκτελείται με:

\begin{minted}{bash}
    cd level_2
    python -m level_2 material/LicorDeCalandraca.wav material/LicorDeCalandraca_out_l2.wav
\end{minted}

Η έξοδος που προέκυψε ήταν:

\begin{minted}{text}
    Encoding ...................... done
    Decoding ...................... done
    SNR = 257.437 dB
\end{minted}

Η τιμή SNR είναι πρακτικά ταυτόσημη με εκείνη του Level 1.
Το αποτέλεσμα αυτό επιβεβαιώνει ότι η ενσωμάτωση του TNS \textbf{δεν εισάγει απώλεια πληροφορίας στο συγκεκριμένο στάδιο}.
Η υλοποίηση του FIR/IIR ζεύγους και ο έλεγχος σταθερότητας εξασφαλίζουν \textbf{πλήρη αναστρεψιμότητα} της διαδικασίας.



\section{Level 3 – Πλήρης Απωλεστική Κωδικοποίηση}

\subsection{Απαιτήσεις Level 3}

Στο τρίτο επίπεδο ζητείται η υλοποίηση της \textbf{πλήρους απωλεστικής αλυσίδας κωδικοποίησης}.
Προστίθενται το ψυχοακουστικό μοντέλο, ο μη ομοιόμορφος κβαντιστής και η κωδικοποίηση Huffman.
Σε αντίθεση με τα προηγούμενα επίπεδα, το Level 3 \textbf{δεν είναι πλέον πλήρως αναστρέψιμο}.
Η απώλεια πληροφορίας είναι συνειδητή και ελεγχόμενη, με βάση τις αρχές της ψυχοακουστικής απόκρυψης.

Στόχος είναι η μείωση του bitrate διατηρώντας αποδεκτή αντιληπτή ποιότητα.

\subsection{Modules που χρησιμοποιούνται}

Για το Level 3 χρησιμοποιούνται όλα τα modules του συστήματος:

\begin{itemize}
    \item \textbf{\texttt{aac\_ssc}}.
    \item \textbf{\texttt{aac\_filterbank}}.
    \item \textbf{\texttt{aac\_tns}}.
    \item \textbf{\texttt{aac\_psycho}}.
    \item \textbf{\texttt{aac\_quantizer}}.
    \item \textbf{\texttt{aac\_huffman}}.
    \item \textbf{\texttt{aac\_coder\_3}} και \textbf{\texttt{aac\_decoder\_3}}.
    \item \textbf{\texttt{aac\_utils}}.
\end{itemize}

Το Level 3 αποτελεί σύνθεση όλων των προηγούμενων βαθμίδων με προσθήκη κβάντισης και κωδικοποίησης εντροπίας.

\subsection{Ψυχοακουστικό Μοντέλο}

Το module \texttt{aac\_psycho} υπολογίζει το Signal-to-Mask Ratio (SMR) για κάθε Bark band.
Η διαδικασία βασίζεται στους πίνακες B219a και B219b για long και short frames αντίστοιχα.
Υπολογίζεται η ενέργεια ανά band, εφαρμόζεται spreading function και κατώφλι απόλυτης ακουστότητας.
Το SMR καθορίζει το επιτρεπτό σφάλμα κβάντισης σε κάθε band.

Δόθηκε ιδιαίτερη προσοχή:

\begin{itemize}
    \item Στην αποφυγή διαίρεσης με μηδέν μέσω χρήσης μικρού όρου \texttt{EPS}.
    \item Στον έλεγχο ότι όλες οι ενδιάμεσες ποσότητες παραμένουν πεπερασμένες.
\end{itemize}

\subsection{Κβαντιστής και Scalefactors}

Το module \texttt{aac\_quantizer} εφαρμόζει μη ομοιόμορφη κβάντιση των συντελεστών MDCT.
Για κάθε band επιλέγεται scalefactor που ικανοποιεί το αντίστοιχο SMR.
Οι scalefactors κωδικοποιούνται διαφορικά (DPCM).
Η ανακατασκευή γίνεται αθροιστικά και εφαρμόζεται εκθετικός παράγοντας της μορφής:

\[
\hat{X} = \text{sign}(S) |S|^{4/3} \times 2^{\alpha/4}.
\]

Η συγκεκριμένη μορφή καθιστά το σύστημα \textbf{ιδιαίτερα ευαίσθητο σε αριθμητικά σφάλματα}.
Για τον λόγο αυτό χρησιμοποιήθηκαν:

\begin{itemize}
    \item Έλεγχοι πεπερασμένων τιμών (finite checks).
    \item Έλεγχος αποφυγής overflow.
    \item Προστασία με \texttt{EPS} σε παρονομαστές.
\end{itemize}

\subsection{Κωδικοποίηση Huffman}

Οι κβαντισμένοι συντελεστές και τα DPCM scalefactors κωδικοποιούνται με Huffman.
Το bitstream ανακατασκευάζεται πλήρως στον αποκωδικοποιητή.
Ιδιαίτερη προσοχή δόθηκε:

\begin{itemize}
    \item Στη σωστή \textbf{διαχείριση escape τιμών}.
    \item Στην ορθή \textbf{κατανάλωση bitstreams}.
    \item Στην \textbf{αποφυγή out-of-bounds} προσπελάσεων.
\end{itemize}

\subsection{Φιλοσοφία Ελέγχου Ορθότητας}

Το Level 3 \textbf{δεν μπορεί να ελεγχθεί με κριτήριο ταυτότητας}.
Ελέγχθηκε με κριτήρια λειτουργικής ορθότητας και αριθμητικής σταθερότητας.

Συγκεκριμένα ελέγχθηκαν:

\begin{itemize}
    \item Ορθότητα DPCM ανακατασκευής scalefactors.
    \item Συνεπής αντιστοίχιση ESH packing και unpacking.
    \item Απουσία NaN/Inf σε όλη τη ροή.
    \item Απουσία εκθετικής υπερχείλισης.
    \item Έλεγχος μηδενικού lag μεταξύ αρχικού και ανακατασκευασμένου σήματος.
    \item Έλεγχος μη ανταλλαγής καναλιών (L/R swap detection).
    \item Έλεγχος απουσίας clipping.
    \item Έλεγχος διατήρησης συνολικού gain.
\end{itemize}

Ο \textbf{έλεγχος lag} υλοποιείται μέσω εκτίμησης χρονικής μετατόπισης.
Ο έλεγχος καναλιών διασφαλίζει ότι η \textbf{ενέργεια του αριστερού και δεξιού καναλιού δεν έχει ανταλλαγεί}.
Οι έλεγχοι αυτοί διασφαλίζουν ότι η απώλεια ποιότητας οφείλεται αποκλειστικά στην κβάντιση και όχι σε δομικό σφάλμα.

Τα tests μπορούν να εκτελεστούν με:

\begin{minted}{bash}
    pytest -v core/tests/test_psycho.py
    pytest -v core/tests/test_quantizer.py
    pytest -v core/tests/test_huffman.py
    pytest -v core/tests/test_aac_coder_decoder.py
\end{minted}

\subsection{Demo και Αποτελέσματα}

Η demonstration του Level 3 εκτελείται με:

\begin{minted}{bash}
    cd level_3
    python -m level_3 material/LicorDeCalandraca.wav material/LicorDeCalandraca_out_l3.wav material/aac_seq_3.mat
\end{minted}

Η έξοδος που προέκυψε ήταν:

\begin{minted}{text}
    Storing coded sequence to material/aac_seq_3.mat
    Encoding ...................... done
    Decoding ...................... done
    SNR = 9.454 dB
    Bitrate (coded) = 216710.22 bits/s
    Compression ratio = 7.0881
\end{minted}

Παρατηρούμε πως η τιμή SNR είναι σημαντικά χαμηλότερη σε σχέση με τα προηγούμενα επίπεδα, γεγονός αναμενόμενο λόγω απωλεστικής κβάντισης.
Παρά τη μείωση του SNR, ελέγχθηκε ότι:

\begin{itemize}
    \item Δεν υπάρχει χρονική μετατόπιση (lag).
    \item Δεν υπάρχει ανταλλαγή καναλιών.
    \item Δεν εμφανίζεται clipping.
    \item Δεν υπάρχει μη ελεγχόμενη ενίσχυση (gain drift).
\end{itemize}

\begin{figure}[!ht]
    \centering
    \includegraphics[width=0.75\linewidth]{figures/bitrate_per_frame.png}
    \caption{Κατανομή του bitrate ανά frame.
        Παρατηρείται σημαντική διακύμανση που αντανακλά την προσαρμοστική φύση της κωδικοποίησης.}
    \label{fig:bitrate_per_frame}
\end{figure}

\begin{figure}[!ht]
    \centering
    \includegraphics[width=0.75\linewidth]{figures/compression_per_frame.png}
    \caption{Λόγος συμπίεσης ανά frame.
        Η μεταβολή του compression ratio επιβεβαιώνει τη δυναμική κατανομή bit ανάλογα με το περιεχόμενο του σήματος.}
    \label{fig:compression_per_frame}
\end{figure}

Η χαμηλή τιμή SNR δεν αντικατοπτρίζει πλήρως την αντιληπτή ποιότητα, καθώς το ψυχοακουστικό μοντέλο επιτρέπει μεγάλο ενεργειακό σφάλμα σε περιοχές όπου το σφάλμα καλύπτεται από το φαινόμενο απόκρυψης.
Η παρατηρούμενη απώλεια αφορά κυρίως λεπτομέρειες υψηλών συχνοτήτων, χωρίς δομική αλλοίωση του σήματος.
Το αποτέλεσμα επιβεβαιώνει ότι η υλοποίηση είναι αριθμητικά σταθερή και ότι η απώλεια ποιότητας είναι αποτέλεσμα ελεγχόμενης κβάντισης και όχι υλοποιητικού σφάλματος.

Όπως φαίνεται στην Εικόνα~\ref{fig:bitrate_per_frame}, παρατηρείται σημαντική διακύμανση του bitrate μεταξύ διαδοχικών frames, με τιμές που κυμαίνονται περίπου \textbf{μεταξύ 160 kbps και 250 kbps} και σποραδικές κορυφές υψηλότερων τιμών.
Η συμπεριφορά αυτή είναι αναμενόμενη, καθώς το ψυχοακουστικό μοντέλο κατανέμει περισσότερα bits σε χρονικές περιοχές με αυξημένη ενεργειακή ή φασματική πολυπλοκότητα.
Αντίστοιχα, στην Εικόνα~\ref{fig:compression_per_frame} παρατηρούμε ότι ο λόγος συμπίεσης μεταβάλλεται δυναμικά, με \textbf{τυπικές τιμές μεταξύ 6:1 και 9:1}.

Οι χαμηλότερες τιμές λόγου συμπίεσης αντιστοιχούν σε frames όπου απαιτούνται περισσότερα bits για την ικανοποίηση του SMR, ενώ οι υψηλότερες τιμές εμφανίζονται σε περιοχές μικρότερης φασματικής πυκνότητας.
Η δυναμική αυτή συμπεριφορά επιβεβαιώνει ότι \textbf{η κωδικοποίηση δεν είναι σταθερού ρυθμού} (CBR), αλλά προσαρμοστική ως προς το περιεχόμενο του σήματος.
Η συνολική μέση τιμή συμπίεσης περίπου \textbf{7:1} επιτυγχάνεται μέσω της συνδυασμένης λειτουργίας ψυχοακουστικής κβάντισης και κωδικοποίησης εντροπίας, χωρίς να παρατηρούνται δομικά σφάλματα όπως χρονική μετατόπιση, ανταλλαγή καναλιών ή ανεξέλεγκτη ενίσχυση.


\section{Συμπεράσματα}

Στην παρούσα εργασία υλοποιήσαμε μία απλοποιημένη αλλά πλήρως λειτουργική αλυσίδα κωδικοποίησης και αποκωδικοποίησης τύπου AAC, ακολουθώντας σταδιακή προσέγγιση τριών επιπέδων.
Ξεκινήσαμε από μία αυστηρά αναστρέψιμη μετασχηματιστική κωδικοποίηση με MDCT και Sequence Segmentation Control, επεκτείναμε το σύστημα με Temporal Noise Shaping διατηρώντας την αριθμητική αντιστρεψιμότητα και ολοκληρώσαμε με την ενσωμάτωση ψυχοακουστικού μοντέλου, μη ομοιόμορφης κβάντισης και κωδικοποίησης εντροπίας.
Η \textbf{αρθρωτή σχεδίαση} και η \textbf{εκτεταμένη χρήση αυτοματοποιημένων δοκιμών μας επέτρεψαν να ελέγχουμε ανεξάρτητα κάθε βαθμίδα και να περιορίζουμε συστηματικά την πιθανότητα σφαλμάτων}.

Δώσαμε ιδιαίτερη έμφαση στη \textbf{αριθμητική σταθερότητα} του συστήματος.
Εφαρμόσαμε ελέγχους σταθερότητας φίλτρων, προστασίες τύπου \texttt{EPS} σε παρονομαστές, ελέγχους πεπερασμένων τιμών, καθώς και ελέγχους απουσίας χρονικής μετατόπισης, ανταλλαγής καναλιών και clipping.
Η φιλοσοφία αυτή αποδείχθηκε κρίσιμη στο Level 3, όπου μικρά αριθμητικά σφάλματα μπορούν να ενισχυθούν εκθετικά μέσω της απο-κβάντισης.
Η συστηματική προσέγγιση testing και οι round-trip έλεγχοι διασφάλισαν ότι η παρατηρούμενη απώλεια ποιότητας οφείλεται αποκλειστικά στη σχεδιασμένη κβάντιση και όχι σε υλοποιητικά σφάλματα.

Τα αποτελέσματα έδειξαν ότι το σύστημα επιτυγχάνει \textbf{λόγο συμπίεσης περίπου 7:1}, με μέσο \textbf{bitrate περίπου 216 kbps}, διατηρώντας αποδεκτή αντιληπτή ποιότητα.
Η ανάλυση ανά frame κατέδειξε ότι η κατανομή bit είναι δυναμική και εξαρτάται από τη φασματική πολυπλοκότητα του σήματος, γεγονός που επιβεβαιώνει τη σωστή λειτουργία του ψυχοακουστικού μοντέλου.
Η σημαντική πτώση του SNR στο Level 3 είναι αναμενόμενη σε ενεργειακούς όρους και δεν αντανακλά πλήρως την αντιληπτή ποιότητα, καθώς το σφάλμα κατανέμεται σύμφωνα με τα φαινόμενα απόκρυψης.
Συνολικά, η υλοποίηση επιβεβαιώνει ότι ακόμη και ένα απλοποιημένο μοντέλο AAC μπορεί να επιτύχει ουσιαστική συμπίεση, εφόσον η σχεδίαση είναι προσεκτική και αριθμητικά συνεπής.

\end{document}