डेटा फ़ॉर्मैट

Android, अंदरूनी तौर पर कई तरह के ऑडियो डेटा फ़ॉर्मैट का इस्तेमाल करता है. साथ ही, इनमें से कुछ फ़ॉर्मैट को सार्वजनिक एपीआई, फ़ाइल फ़ॉर्मैट, और हार्डवेयर एब्स्ट्रैक्शन लेयर (एचएएल) में दिखाता है.

प्रॉपर्टी

ऑडियो डेटा फ़ॉर्मैट को उनकी प्रॉपर्टी के हिसाब से बांटा जाता है:

कंप्रेस करना
बिना कंप्रेस किए, बिना डेटा को खोए कंप्रेस किया गया या डेटा को खोकर कंप्रेस किया गया. PCM, बिना कंप्रेस किए हुए ऑडियो का सबसे सामान्य फ़ॉर्मैट है. FLAC, ऑडियो को कम किए बिना कंप्रेस करने वाला फ़ॉर्मैट है, जबकि MP3 और AAC, ऑडियो को कम करके कंप्रेस करने वाले फ़ॉर्मैट हैं.
बिट डेप्थ
हर ऑडियो सैंपल के लिए, काम के बिट की संख्या.
कंटेनर का साइज़
सैंपल को सेव या ट्रांसमिट करने के लिए इस्तेमाल किए जाने वाले बिट की संख्या. आम तौर पर, यह बिट डेप्थ के बराबर होता है. हालांकि, कभी-कभी अलाइनमेंट के लिए अतिरिक्त पैडिंग बिट भी असाइन किए जाते हैं. उदाहरण के लिए, 24-बिट का सैंपल, 32-बिट के शब्द में हो सकता है.
अलाइनमेंट
अगर कंटेनर का साइज़ बिट डेप्थ के बराबर है, तो इसे पैक किया गया कहा जाता है. ऐसा न होने पर, डेटा को अनपैक किया जाता है. आम तौर पर, सैंपल के अहम बिट, कंटेनर के सबसे बाएं (सबसे अहम) या सबसे दाएं (सबसे कम अहम) बिट के साथ अलाइन होते हैं. आम तौर पर, पैक किया गया और अनपैक किया गया शब्दों का इस्तेमाल सिर्फ़ तब किया जाता है, जब बिट की गहराई दो की घात न हो.
हस्ताक्षर किया गया है या नहीं
सैंपल पर हस्ताक्षर किए गए हैं या नहीं.
प्रतिनिधित्व
फ़िक्स्ड पॉइंट या फ़्लोटिंग पॉइंट; नीचे देखें.

फ़िक्स्ड पॉइंट का प्रतिनिधित्व

फ़िक्स्ड पॉइंट, बिना कंप्रेस किए गए PCM ऑडियो डेटा के लिए सबसे आम तौर पर इस्तेमाल किया जाता है. खास तौर पर, हार्डवेयर इंटरफ़ेस पर.

फ़िक्स्ड-पॉइंट नंबर में, रेडिक्स पॉइंट से पहले और बाद में अंकों की संख्या एक जैसी (एक जैसी) होती है. हमारे सभी डेटा को बेस 2 में दिखाया जाता है. इसलिए, हम बिट को अंक के तौर पर इस्तेमाल करते हैं. साथ ही, रैडिक्स पॉइंट के लिए बाइनरी पॉइंट या सिर्फ़ पॉइंट का इस्तेमाल करते हैं. बिंदु की बाईं ओर मौजूद बिट, पूर्णांक वाला हिस्सा होते हैं और बिंदु की दाईं ओर मौजूद बिट, दशमलव वाला हिस्सा होते हैं.

हम इंटिजर पीसीएम के बारे में बात करते हैं, क्योंकि फ़िक्स्ड-पॉइंट वैल्यू को आम तौर पर इंटिजर वैल्यू के तौर पर स्टोर और मैनिप्युलेट किया जाता है. फ़िक्स्ड-पॉइंट के तौर पर व्याख्या करना ज़रूरी नहीं है.

हम साइन वाले सभी फ़िक्स्ड-पॉइंट वैल्यू के लिए, दो के पूरक का इस्तेमाल करते हैं. इसलिए, जहां सभी वैल्यू एक एलएसबी की यूनिट में होती हैं, वहां यह नियम लागू होता है:

|largest negative value| = |largest positive value| + 1

Q और U नोटेशन

इंटीजर में फ़िक्स्ड-पॉइंट के तौर पर दिखाने के लिए, कई तरह के नोटेशन उपलब्ध हैं. हम Q नोटेशन का इस्तेमाल करते हैं: Qm.n का मतलब है m पूर्णांक बिट और n फ़्रैक्शनल बिट. "Q" को एक बिट माना जाता है, हालांकि इसकी वैल्यू को दो के पूरक के तौर पर दिखाया जाता है. बिट की कुल संख्या m + n + 1 है.

Um.n, बिना साइन वाली संख्याओं के लिए है: m पूर्णांक बिट और n फ़्रैक्शनल बिट, और "U" को शून्य बिट माना जाता है. बिट की कुल संख्या m + n है.

पूर्णांक वाले हिस्से का इस्तेमाल, फ़ाइनल नतीजे में किया जा सकता है या यह कुछ समय के लिए हो सकता है. बाद वाले मामले में, पूर्णांक वाले हिस्से को बनाने वाले बिट को गार्ड बिट कहा जाता है. गार्ड बिट, इंटरमीडिएट कैलकुलेशन को तब तक ओवरफ़्लो करने की अनुमति देते हैं, जब तक कि फ़ाइनल वैल्यू रेंज में हो या उसे रेंज में रखने के लिए क्लैंप किया जा सकता हो. ध्यान दें कि फ़िक्स्ड-पॉइंट गार्ड बिट बाईं ओर होते हैं, जबकि फ़्लोटिंग-पॉइंट यूनिट के गार्ड डिजिट का इस्तेमाल, राउंड-ऑफ़ गड़बड़ी को कम करने के लिए किया जाता है और ये दाईं ओर होते हैं.

फ़्लोटिंग पॉइंट का इस्तेमाल करके वैल्यू दिखाना

फ़्लोटिंग पॉइंट, फ़िक्स्ड पॉइंट का एक विकल्प है. इसमें पॉइंट की जगह अलग-अलग हो सकती है. फ़्लोटिंग-पॉइंट के मुख्य फ़ायदे ये हैं:

  • ज़्यादा हेडरूम और डाइनैमिक रेंज; फ़्लोटिंग-पॉइंट अंकगणित, बीच के हिसाब के दौरान नाममात्र रेंज से ज़्यादा की अनुमति देता है और आखिर में ही वैल्यू को क्लैंप करता है
  • इनफ़ाइनिटी और NaN जैसी खास वैल्यू के लिए सपोर्ट
  • कई मामलों में इस्तेमाल करना आसान है

पहले, फ़्लोटिंग-पॉइंट अंकगणित, पूर्णांक या फ़िक्स्ड-पॉइंट अंकगणित की तुलना में धीमा था. हालांकि, अब फ़्लोटिंग-पॉइंट तेज़ी से काम करता है. हालांकि, इसके लिए ज़रूरी है कि कंट्रोल फ़्लो के फ़ैसले, गिनती की वैल्यू पर आधारित न हों.

Android के लिए ऑडियो फ़ॉर्मैट

Android के लिए ऑडियो के मुख्य फ़ॉर्मैट, नीचे दी गई टेबल में दिए गए हैं:

नोटेशन
प्रॉपर्टी 0.15 Q0.7 1 Q0.23 0.31 फ़्लोट
कंटेनर
बिट
16 8 24 या 32 2 32 32
अहम बिट
इसमें साइन भी शामिल है
16 8 24 24 या 32 2 25 3
हेडरूम
(dB में)
0 0 0 0 126 4
डाइनैमिक रेंज
, dB में
90 42 138 138 से 186 900 5

ऊपर दिए गए सभी फ़िक्स्ड-पॉइंट फ़ॉर्मैट की नाममात्र रेंज, -1.0 से +1.0 माइनस एक एलएसबी होती है. दो के पूरक के तौर पर दिखाए जाने की वजह से, सकारात्मक वैल्यू की तुलना में एक ज़्यादा नेगेटिव वैल्यू होती है.

फ़ुटनोट:

  1. ऊपर दिए गए सभी फ़ॉर्मैट, हस्ताक्षर वाली सैंपल वैल्यू दिखाते हैं. आम तौर पर, 8-बिट फ़ॉर्मैट को "बिना साइन वाला" कहा जाता है. हालांकि, यह असल में साइन वाली वैल्यू होती है, जिसमें 0.10000000 का बायस होता है.
  2. Q0.23 को 24 बिट (तीन 8-बिट बाइट, लिटल-इंडियन) में पैक किया जा सकता है या 32 बिट में अनपैक किया जा सकता है. अनपैक किए जाने पर, अहम बिट को एलएसबी की ओर दाईं ओर और एमएसबी की ओर साइन एक्सटेंशन पैडिंग के साथ या एमएसबी की ओर बाईं ओर और एलएसबी की ओर शून्य फ़िल के साथ (Q0.31) जस्टिफ़ाइड किया जाता है. Q0.31, सैद्धांतिक तौर पर 32 सिग्निफ़िकेंट बिट तक की अनुमति देता है. हालांकि, Q0.31 को स्वीकार करने वाले हार्डवेयर इंटरफ़ेस, शायद ही सभी बिट का इस्तेमाल करते हों.
  3. सिंगल-प्रिसिशन फ़्लोटिंग पॉइंट में 23 साफ़ तौर पर दिखने वाले बिट के साथ-साथ एक छिपा हुआ बिट और साइन बिट होता है. इससे कुल 25 सार्थक बिट बनते हैं. डेनॉर्मल नंबर में, सार्थक बिट कम होते हैं.
  4. सिंगल-प्रिसिशन फ़्लोटिंग पॉइंट में, ±1.7e+38 तक की वैल्यू दिखाई जा सकती हैं. इससे पता चलता है कि इसमें ज़्यादा हेडरूम है.
  5. दिखाई गई डाइनैमिक रेंज, सामान्य से ज़्यादा वैल्यू ±1.0 तक के डेनॉर्मल के लिए है. ध्यान दें कि आर्किटेक्चर के हिसाब से फ़्लोटिंग पॉइंट लागू करने के कुछ तरीके, जैसे कि NEON, डीनॉर्मल के साथ काम नहीं करते.

कन्वर्ज़न

इस सेक्शन में, अलग-अलग तरह के डेटा के बीच डेटा कन्वर्ज़न के बारे में बताया गया है.

फ़्लोटिंग पॉइंट कन्वर्ज़न

किसी वैल्यू को Qm.n फ़ॉर्मैट से फ़्लोटिंग पॉइंट में बदलने के लिए:

  1. वैल्यू को फ़्लोटिंग पॉइंट में बदलें, जैसे कि वह पूर्णांक हो (पॉइंट को अनदेखा करके).
  2. 2-n से गुणा करें.

उदाहरण के लिए, Q4.27 वाली इंटरनल वैल्यू को फ़्लोटिंग पॉइंट में बदलने के लिए, इस फ़ंक्शन का इस्तेमाल करें:

float = integer * (2 ^ -27)

फ़्लोटिंग पॉइंट से फ़िक्स्ड पॉइंट में बदलने के लिए, इन नियमों का पालन करें:

  • सिंगल-प्रिसिशन फ़्लोटिंग पॉइंट की नोमिनल रेंज ±1.0 होती है, लेकिन इंटरमीडिएट वैल्यू की पूरी रेंज ±1.7e+38 होती है. बाहरी दिखाए जाने के लिए, फ़्लोटिंग पॉइंट और फ़िक्स्ड पॉइंट के बीच कन्वर्ज़न में सिर्फ़ नाममात्र रेंज को ध्यान में रखा जाएगा. साथ ही, उस रेंज से ज़्यादा की वैल्यू को क्लैंप किया जाएगा. खास तौर पर, जब +1.0 को फ़िक्स्ड-पॉइंट फ़ॉर्मैट में बदला जाता है, तो इसे +1.0 माइनस एक एलएसबी पर क्लैंप किया जाता है.
  • डेनॉर्मल (सबनॉर्मल) और +/- 0.0, दोनों को दिखाने की अनुमति है. हालांकि, प्रोसेसिंग के दौरान इन्हें चुपचाप 0.0 में बदला जा सकता है.
  • अनंत वैल्यू वाले डेटा को ऑपरेशन के ज़रिए पास किया जाएगा या उसे चुपचाप +/- 1.0 तक सीमित कर दिया जाएगा. आम तौर पर, बाद वाला फ़ॉर्मैट, फ़िक्स्ड-पॉइंट फ़ॉर्मैट में बदलने के लिए होता है.
  • NaN का व्यवहार तय नहीं है: NaN, एक जैसा NaN के तौर पर प्रॉगेट हो सकता है या डिफ़ॉल्ट NaN में बदल सकता है. साथ ही, इसे चुपचाप +/- 1.0 तक सीमित किया जा सकता है या चुपचाप 0.0 में बदला जा सकता है या गड़बड़ी का नतीजा हो सकता है.

फ़िक्स्ड पॉइंट कन्वर्ज़न

अलग-अलग Qm.n फ़ॉर्मैट के बीच कन्वर्ज़न, इन नियमों के हिसाब से होते हैं:

  • m को बढ़ाने पर, बाईं ओर मौजूद पूर्णांक वाले हिस्से को साइन एक्सटेंड करें.
  • जब m कम किया जाता है, तो पूर्णांक वाले हिस्से को क्लैंप करें.
  • n को बढ़ाने पर, दाईं ओर मौजूद दशमलव वाले हिस्से में शून्य जोड़ दिए जाते हैं.
  • n को कम करने पर, दाईं ओर मौजूद अतिरिक्त फ़्रैक्शनल बिट को डाइटर करें, राउंड करें या ट्रिंप करें.

उदाहरण के लिए, Q4.27 वैल्यू को Q0.15 में बदलने के लिए (बिना डिटोर या राउंडिंग के), Q4.27 वैल्यू को 12 बिट दाईं ओर शिफ़्ट करें और 16-बिट साइन वाली रेंज से ज़्यादा के किसी भी नतीजे को क्लैंप करें. इससे, सवाल के जवाब के पॉइंट को अलाइन किया जाता है.

Q7.24 को Q7.23 में बदलने के लिए, साइन के साथ 2 से भाग दें या Q7.24 की पूर्णांक वैल्यू में साइन बिट जोड़ें. इसके बाद, साइन के साथ दाईं ओर एक शिफ़्ट करें. ध्यान दें कि साइन के साथ राइट शिफ़्ट करने की सुविधा, साइन के साथ दो से भाग देने की सुविधा के बराबर नहीं है.

लॉसलेस और लॉस वाले कन्वर्ज़न

अगर किसी कन्वर्ज़न को बदला जा सकता है, तो वह बिना किसी डेटा के बदलाव के होता है: A से B से C में बदलने पर, A = C बनता है. ऐसा न होने पर, कन्वर्ज़न लोस-लेस होता है.

बिना डेटा हानि वाले कन्वर्ज़न, राउंड-ट्रिप फ़ॉर्मैट कन्वर्ज़न की अनुमति देते हैं.

25 या उससे कम सार्थक बिट वाले फ़िक्स्ड पॉइंट से फ़्लोटिंग पॉइंट में किए गए कन्वर्ज़न में डेटा का कोई नुकसान नहीं होता. फ़्लोटिंग पॉइंट से किसी भी सामान्य फ़िक्स्ड पॉइंट में बदलने पर, डेटा में बदलाव होता है.