ডেটা ফর্ম্যাট

Android ইন্টার্নালি বিভিন্ন ধরনের অডিও ডেটা ফর্ম্যাট ব্যবহার করে এবং পাবলিক API, ফাইল ফর্ম্যাট ও হার্ডওয়্যার অ্যাবস্ট্রাকশন লেয়ার (HAL)-এ এগুলির একটি সাবসেট এক্সপোজ করে।

প্রপার্টি

অডিও ডেটা ফর্ম্যাট তাদের প্রপার্টি অনুযায়ী শ্রেণীবদ্ধ করা হয়:

কম্প্রেশন
কমপ্রেস না করা, কোয়ালিটি না কমিয়ে কম্প্রেস করা, বা কোয়ালিটি কমিয়ে কম্প্রেস করা। PCM হল সবচেয়ে সাধারণ আনকম্প্রেসড অডিও ফর্ম্যাট। FLAC হল লসলেস কম্প্রেসড ফর্ম্যাট, যেখানে MP3 এবং AAC হল লসি কম্প্রেসড ফর্ম্যাট।
বিট ডেপথ
প্রতিটি অডিও স্যাম্পেলে উল্লেখযোগ্য বিটের সংখ্যা।
কন্টেনারের সাইজ
কোনও স্যাম্পেল সেভ বা ট্রান্সমিট করার জন্য ব্যবহৃত বিটের সংখ্যা। সাধারণত এটি বিট ডেপথের সমান হয়, কিন্তু কখনও কখনও অ্যালাইনমেন্টের জন্য অতিরিক্ত প্যাডিং বিট বরাদ্দ করা হয়। যেমন, একটি ২৪-বিট স্যাম্পেল ৩২-বিট শব্দের মধ্যে থাকতে পারে।
অ্যালাইনমেন্ট
কন্টেনারের সাইজ বিট ডেপথের সমান হলে, সেই প্রতিনিধিত্বকে প্যাক করা বলা হয়। অন্যথায়, উপস্থাপনাটি আনপ্যাক করা হয়। স্যাম্পেলের গুরুত্বপূর্ণ বিটগুলি সাধারণত কন্টেনারের সবচেয়ে বামদিকের (সবচেয়ে গুরুত্বপূর্ণ) বা সবচেয়ে ডানদিকের (সবচেয়ে কম গুরুত্বপূর্ণ) বিটের সাথে অ্যালাইন করা হয়। প্যাক করা ও আনপ্যাক করা শব্দগুলি সাধারণত তখনই ব্যবহার করা হয় যখন বিট ডেপথ দুইয়ের পাওয়ার হয় না।
সাইন করা
স্যাম্পেল সাইন করা আছে নাকি নেই।
প্রতিনিধিত্ব
ফিক্সড পয়েন্ট বা ফ্লোটিং পয়েন্ট; নিচে দেখুন।

ফিক্সড পয়েন্ট উপস্থাপনা

ফিক্সড পয়েন্ট হল আনকমপ্রেসড PCM অডিও ডেটার সবচেয়ে সাধারণ উপস্থাপনা, বিশেষ করে হার্ডওয়্যার ইন্টারফেসে।

ফিক্সড-পয়েন্ট নম্বরে রেডিক্স পয়েন্টের আগে ও পরে নির্দিষ্ট (ধ্রুবক) সংখ্যক ডিজিট থাকে। আমাদের সবকটি উপস্থাপনাতেই বেস ২, ব্যবহার করা হয়, তাই আমরা অঙ্ক-এর পরিবর্তে বিট, এবং রেডিক্স পয়েন্ট-এর পরিবর্তে বাইনারি পয়েন্ট বা শুধু পয়েন্ট ব্যবহার করি। পয়েন্টের বাঁদিকে থাকা বিটগুলি হল পূর্ণ সংখ্যা, এবং পয়েন্টের ডানদিকে থাকা বিটগুলি হল ভগ্নাংশ।

আমরা পূর্ণসংখ্যা PCM-এর কথা বলছি, কারণ ফিক্সড-পয়েন্ট ভ্যালু সাধারণত পূর্ণসংখ্যা ভ্যালু হিসেবে স্টোর ও ম্যানিপুলেট করা হয়। ফিক্সড-পয়েন্ট হিসেবে ব্যাখ্যা করাটা অন্তর্নিহিত।

আমরা সমস্ত সাইন করা ফিক্সড-পয়েন্ট উপস্থাপনার জন্য টু'স কমপ্লিমেন্ট ব্যবহার করি, তাই নিম্নলিখিতগুলি প্রযোজ্য যেখানে সব মান এক LSB ইউনিটে আছে:

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

Q এবং U নোটেশন

পূর্ণসংখ্যায় ফিক্সড-পয়েন্ট উপস্থাপনার জন্য বিভিন্ন নোটেশন থাকে। আমরা Q নোটেশন ব্যবহার করি: Qm.n বলতে m পূর্ণসংখ্যা বিট ও n ভগ্নাংশ বিট বোঝায়। "Q" একটি বিট হিসেবে গণনা করা হয়, যদিও ভ্যালু টু'জ কমপ্লিমেন্ট হিসেবে প্রকাশ করা হয়। মোট বিটের সংখ্যা হল m + n + ১।

Um.n হল চিহ্নহীন সংখ্যার জন্য: m পূর্ণসংখ্যা বিট এবং n ভগ্নাংশ বিট, এবং "U" শূন্য বিট হিসেবে গণনা করা হয়। মোট বিটের সংখ্যা হল m + n.

পূর্ণ সংখ্যাটি চূড়ান্ত ফলাফলে ব্যবহার করা হতে পারে অথবা এটি সাময়িক হতে পারে। পরের ক্ষেত্রে, যে বিটগুলি পূর্ণসংখ্যা অংশ তৈরি করে সেগুলিকে গার্ড বিট বলা হয়। যতক্ষণ পর্যন্ত চূড়ান্ত মান রেঞ্জের মধ্যে থাকে বা রেঞ্জের মধ্যে থাকার জন্য ক্ল্যাম্প করা যায়, ততক্ষণ পর্যন্ত গার্ড বিটগুলি একটি মধ্যবর্তী গণনাকে ওভারফ্লো করার অনুমতি দেয়। মনে রাখবেন, ফিক্সড-পয়েন্ট গার্ড বিট বাঁদিকে থাকে, অন্যদিকে রাউন্ড-অফ সংক্রান্ত সমস্যা কমাতে ফ্লোটিং-পয়েন্ট ইউনিট গার্ড ডিজিট ব্যবহার করা হয় এবং সেগুলি ডানদিকে থাকে।

ফ্লোটিং পয়েন্ট উপস্থাপনা

ফ্লোটিং পয়েন্ট হল ফিক্সড পয়েন্টের একটি বিকল্প, যেখানে পয়েন্টের লোকেশন আলাদা আলাদা হতে পারে। ফ্লোটিং-পয়েন্টের প্রাথমিক সুবিধার মধ্যে রয়েছে:

  • বেশি হেডরুম ও ডায়নামিক রেঞ্জ; ফ্লোটিং-পয়েন্ট গাণিতিক গণনা, মধ্যবর্তী গণনা চলাকালীন, নমিনাল রেঞ্জ অতিক্রম করাকে সহ্য করে এবং শুধুমাত্র শেষে ভ্যালু ক্ল্যাম্প করে
  • অসীম ও NaN-এর মতো বিশেষ মানের জন্য সহায়তা
  • অনেক ক্ষেত্রে ব্যবহার করা সহজ

ঐতিহাসিকভাবে, ফ্লোটিং-পয়েন্ট অ্যারিথমেটিক, ইন্টিজার বা ফিক্সড-পয়েন্ট অ্যারিথমেটিকের চেয়ে ধীর ছিল, কিন্তু এখন ফ্লোটিং-পয়েন্ট দ্রুত হওয়া সাধারণ ব্যাপার, যদি কন্ট্রোল ফ্লো সংক্রান্ত সিদ্ধান্ত কোনও গণনার মানের উপর ভিত্তি করে না হয়।

অডিওর জন্য Android ফর্ম্যাট

অডিওর জন্য প্রধান Android ফর্ম্যাটগুলি নিচের টেবিলে তালিকাভুক্ত করা আছে:

স্বরলিপি
প্রপার্টি Q0.15 Q0.7 1 Q0.23 Q0.31 ফ্লোট
কন্টেনার
বিটস
16 8 ২৪ বা ৩২ ২ ৩২ ৩২
চিহ্ন সহ
গুরুত্বপূর্ণ বিট
16 8 24 ২৪ বা ৩২ ২ ২৫ ৩
হেডরুম
dB-তে
0 0 0 0 ১২৬ ৪
ডায়নামিক রেঞ্জ
dB-তে
৯০ ৪২ 138 ১৩৮ থেকে ১৮৬ ৯০০ ৫

উপরে উল্লেখ করা সবকটি ফিক্সড-পয়েন্ট ফর্ম্যাটের রেঞ্জ হল -১.০ থেকে +১.০, এর মধ্যে একটি LSB বাদ দেওয়া হয়েছে। টু'স কমপ্লিমেন্ট উপস্থাপনার কারণে পজিটিভ ভ্যালুর চেয়ে একটি নেগেটিভ ভ্যালু বেশি আছে।

ফুটনোট:

  1. উপরের সব ফর্ম্যাট সাইন করা স্যাম্পেল ভ্যালু প্রকাশ করে। ৮-বিট ফর্ম্যাটকে সাধারণত "আনসাইনড" বলা হয়, কিন্তু এটি আসলে 0.10000000-এর বায়াস সহ একটি সাইনড ভ্যালু।
  2. Q0.23-কে ২৪ বিটে (তিনটি ৮-বিট বাইট, লিটল-এন্ডিয়ান) প্যাক করা হতে পারে অথবা ৩২ বিটে আনপ্যাক করা হতে পারে। আনপ্যাক করা হলে, গুরুত্বপূর্ণ বিটগুলি হয় LSB-এর দিকে রাইট-জাস্টিফায়েড হয় এবং MSB-এর দিকে সাইন এক্সটেনশন প্যাডিং থাকে (Q8.23), অথবা MSB-এর দিকে লেফ্ট-জাস্টিফায়েড হয় এবং LSB-এর দিকে জিরো ফিল থাকে (Q0.31)। Q0.31 তাত্ত্বিকভাবে ৩২টি পর্যন্ত সিগনিফিক্যান্ট বিটের অনুমতি দেয়, কিন্তু Q0.31 গ্রহণ করে এমন হার্ডওয়্যার ইন্টারফেস খুব কমই সব বিট ব্যবহার করে।
  3. সিঙ্গেল-প্রিসিশন ফ্লোটিং পয়েন্টে ২৩টি এক্সপ্লিসিট বিট, একটি হিডেন বিট ও একটি সাইন বিট থাকে। এর ফলে মোট ২৫টি সিগনিফিক্যান্ট বিট পাওয়া যায়। ডিনরমাল সংখ্যায় কম গুরুত্বপূর্ণ বিট থাকে।
  4. সিঙ্গেল-প্রিসিশন ফ্লোটিং পয়েন্ট ±১.৭e+৩৮ পর্যন্ত ভ্যালু প্রকাশ করতে পারে, যা অনেক বেশি হেডরুমের বিষয়টি ব্যাখ্যা করে।
  5. ডায়নামিক রেঞ্জটি নমিনাল সর্বাধিক ভ্যালু ±১.০ পর্যন্ত ডিনর্মালের জন্য দেখানো হয়। মনে রাখবেন যে কিছু আর্কিটেকচার-নির্দিষ্ট ফ্লোটিং পয়েন্ট ইমপ্লিমেন্টেশন যেমন NEON ডিনরমালকে সাপোর্ট করে না।

কনভার্সন

এই বিভাগে বিভিন্ন ধরনের উপস্থাপনার মধ্যে ডেটা কনভার্সন নিয়ে আলোচনা করা হয়েছে।

ফ্লোটিং পয়েন্ট কনভার্সন

Qm.n ফর্ম্যাট থেকে ফ্লোটিং পয়েন্টে ভ্যালু কনভার্ট করতে:

  1. মানটিকে ফ্লোটিং পয়েন্টে কনভার্ট করুন, যেন এটি একটি পূর্ণসংখ্যা (পয়েন্ট উপেক্ষা করে)।
  2. 2-n দিয়ে গুণ করুন।

যেমন, Q4.27 ইন্টার্নাল ভ্যালুকে ফ্লোটিং পয়েন্টে কনভার্ট করতে, এগুলি ব্যবহার করুন:

float = integer * (2 ^ -27)

ফ্লোটিং পয়েন্ট থেকে ফিক্সড পয়েন্টে কনভার্সনের ক্ষেত্রে এইসব নিয়ম মেনে চলা হয়:

  • সিঙ্গেল-প্রিসিশন ফ্লোটিং পয়েন্টের নমিনাল রেঞ্জ হল ±1.0, কিন্তু ইন্টারমিডিয়েট ভ্যালুর সম্পূর্ণ রেঞ্জ হল ±1.7e+38। এক্সটার্নাল উপস্থাপনার জন্য ফ্লোটিং পয়েন্ট ও ফিক্সড পয়েন্টের মধ্যে কনভার্সন (যেমন, অডিও ডিভাইসে আউটপুট) শুধুমাত্র নমিনাল রেঞ্জ বিবেচনা করবে, সাথে সেই রেঞ্জের বাইরে থাকা ভ্যালু ক্ল্যাম্প করা হবে। বিশেষ করে, +১.০-কে ফিক্সড-পয়েন্ট ফর্ম্যাটে কনভার্ট করা হলে, এটিকে +১.০ থেকে একটি LSB বিয়োগ করে ক্ল্যাম্প করা হয়।
  • প্রতিনিধিত্বে ডিনরমাল (সাবনরমাল) এবং +/- 0.0 দুটিই অনুমোদিত, তবে প্রসেসিংয়ের সময় নীরবে 0.0-তে কনভার্ট করা হতে পারে।
  • ইনফিনিটি অপারেশন সম্পূর্ণ করবে অথবা +/- ১.০-এর মধ্যে হার্ড-লিমিট করা হবে। সাধারণত, পরেরটি হল ফিক্সড-পয়েন্ট ফর্ম্যাটে কনভার্সনের জন্য।
  • NaN আচরণ অনির্দিষ্ট: একটি NaN একই রকম NaN হিসেবে প্রোপাগেট হতে পারে অথবা ডিফল্ট NaN-এ কনভার্ট হতে পারে, নীরবে +/- ১.০-এ হার্ড লিমিট করা হতে পারে অথবা নীরবে ০.০-এ কনভার্ট হতে পারে অথবা এর ফলে কোনও সমস্যা হতে পারে।

ফিক্সড পয়েন্ট কনভার্সন

বিভিন্ন Qm.n ফর্ম্যাটের মধ্যে কনভার্সন এই নিয়মগুলি অনুসরণ করে:

  • m-এর মান বাড়ানো হলে, বাঁদিকে পূর্ণসংখ্যার অংশটি বাড়ান।
  • m কমে গেলে, পূর্ণসংখ্যা অংশটি ক্ল্যাম্প করুন।
  • n বাড়লে, ডানদিকে ভগ্নাংশ অংশে শূন্য যোগ করুন।
  • n-এর মান কমলে, ডানদিকে অতিরিক্ত ফ্র্যাকশনাল বিট হয় ডিথার, রাউন্ড বা ট্রানকেট করুন।

যেমন, Q4.27 ভ্যালুকে Q0.15-এ (ডিদার বা রাউন্ডিং ছাড়া) কনভার্ট করতে, Q4.27 ভ্যালুকে ১২ বিট দিয়ে ডানদিকে শিফট করুন এবং ১৬-বিট সাইন করা রেঞ্জ অতিক্রম করে এমন যেকোনও ফলাফল ক্ল্যাম্প করুন। এটি Q উপস্থাপনার পয়েন্টকে অ্যালাইন করে।

Q7.24 থেকে Q7.23-এ কনভার্ট করতে, ২ দিয়ে সাইন করা ভাগ করুন, অথবা সমতুল্যভাবে Q7.24 পূর্ণসংখ্যা কোয়ান্টিটিতে সাইন বিট যোগ করুন এবং তারপর ১ দিয়ে সাইন করা ডানদিকে শিফট করুন। মনে রাখবেন, একটি সাধারণ সাইন করা রাইট শিফট কখনই ২ দ্বারা সাইন করা ভাগের সমতুল্য নয়।

লসি ও লসলেস কনভার্সন

কোনও কনভার্সন লসলেস হয় যদি সেটি ইনভার্টিবল হয়: A থেকে B-এ কনভার্সন এবং তারপরে C-এ কনভার্সন করলে A = C পাওয়া যায়। অন্যথায়, কনভার্সন লসি হয়।

লসলেস কনভার্সন রাউন্ড-ট্রিপ ফর্ম্যাট কনভার্সন করার অনুমতি দেয়।

২৫ বা তার কম গুরুত্বপূর্ণ বিট সহ ফিক্সড পয়েন্ট রিপ্রেজেন্টেশন থেকে ফ্লোটিং পয়েন্টে কনভার্সন লসলেস হয়। ফ্লোটিং পয়েন্ট থেকে যেকোনও সাধারণ ফিক্সড পয়েন্টে কনভার্ট করলে ডেটা লস হয়।