Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

5b69a5b5a9f64115f5a746bdae33980d.png

μ=255

 

Εχω υλοποιήσει το παραπάνω με τις κλασικές πράξεις Log() .Sign() στο .NET αλλα θέλω να καταλάβω πως γίνεται με binary. Ο παραπάνω τυπος είναι για μ-law / a-law συμπίεση ήχου σε 8bit με λογαριθμική κλιμακα. 

 

Η διαδεδομένη λύση είναι αυτή  που δίνει με πολυ μικρές αποκλίσεις οτι παίρνεις και με το τυπο. Απλα δε μπορώ να καταλάβω πως πάμε απο το τυπο σε αυτό 100%. Πχ νομιζω πως καταλαβαίνω το exponent που ειναι το log το πανω μαλλον αλλα με τη μαντισσα μπερδευομαι λιγο.

   public static class MuLawEncoder
    {
        private const int cBias = 0x84;
        private const int cClip = 32635;


        private static readonly byte[] MuLawCompressTable = new byte[256] 
        {
             0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,
             4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
             5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
             5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
             6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
             6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
             6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
             6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
             7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
             7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
             7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
             7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
             7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
             7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
             7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
             7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7
        };


        /// <summary>
        /// Encodes a single 16 bit sample to mu-law
        /// </summary>
        /// <param name="sample">16 bit PCM sample</param>
        /// <returns>mu-law encoded byte</returns>
        public static byte LinearToMuLawSample(short sample)
        {
            int sign = (sample >> 8) & 0x80;
            if (sign != 0)
                sample = (short)-sample;
            if (sample > cClip)
                sample = cClip;

            sample = (short)(sample + cBias);


            int exponent = (int)MuLawCompressTable[(sample >> 7) & 0xFF];
            int mantissa = (sample >> (exponent + 3)) & 0x0F;
            int compressedByte = ~(sign | (exponent << 4) | mantissa);


            return (byte)compressedByte;
        }
    }
Δημοσ.

Δεν είμαι σίγουρος για το πώς εξηγείται ότι ο τύπος είναι η υλοποίηση logarithmic quantization (δεν τα πάω ιδιαίτερα καλά με τα μαθηματικά) αλλά αν σκεφτείς πώς δουλεύει το μ-law ο κώδικας είναι απλός.

 

Η ερώτησή σου είναι "γιατί το Α και το Β είναι ισοδύναμα" ή "πώς δουλεύει το Β"?

Δημοσ.

Τελικά το έψαξα και ο κώδικας ο παραπάνω είναι προσέγγιση του  logarithmic quantization.

 

Το exponent είναι για τη θέση του MSB στο 15bit (το 1 ειναι για το πρόσημο) που στην ουσία ειναι ο λογάριθμος. Για να αποθηκευσεις τις 8 τιμές αυτες θες 3 bit. 

 

Τελος τα υπολοιπα 4 bit είναι σαν υποδιαιρέσεις.Και για τις χαμηλες τιμες έχεις πχ 16 διαστήματα ανα 2 μετα ανα 4 ,8,16 κτλ.

Που αν κανεις και τις πράξεις πέφτει κοντά στο τύπο.

 

Τέλος το bias που έχει ειναι για υπολογιστικούς λογους 

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...