ParhsG Δημοσ. 20 Ιουλίου 2014 Δημοσ. 20 Ιουλίου 2014 μ=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; } }
defacer Δημοσ. 20 Ιουλίου 2014 Δημοσ. 20 Ιουλίου 2014 Δεν είμαι σίγουρος για το πώς εξηγείται ότι ο τύπος είναι η υλοποίηση logarithmic quantization (δεν τα πάω ιδιαίτερα καλά με τα μαθηματικά) αλλά αν σκεφτείς πώς δουλεύει το μ-law ο κώδικας είναι απλός. Η ερώτησή σου είναι "γιατί το Α και το Β είναι ισοδύναμα" ή "πώς δουλεύει το Β"?
ParhsG Δημοσ. 21 Ιουλίου 2014 Μέλος Δημοσ. 21 Ιουλίου 2014 Τελικά το έψαξα και ο κώδικας ο παραπάνω είναι προσέγγιση του logarithmic quantization. Το exponent είναι για τη θέση του MSB στο 15bit (το 1 ειναι για το πρόσημο) που στην ουσία ειναι ο λογάριθμος. Για να αποθηκευσεις τις 8 τιμές αυτες θες 3 bit. Τελος τα υπολοιπα 4 bit είναι σαν υποδιαιρέσεις.Και για τις χαμηλες τιμες έχεις πχ 16 διαστήματα ανα 2 μετα ανα 4 ,8,16 κτλ. Που αν κανεις και τις πράξεις πέφτει κοντά στο τύπο. Τέλος το bias που έχει ειναι για υπολογιστικούς λογους
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα