مقدمه
در مقالهی پیشین (فایل MP3 چیست و از کجا آمده است؟)، به چگونگی پیدایش فایل های MP3 ، مزیتها و قابلیتهای آن پرداختیم. در این مقاله قصد داریم که ساز و کار و نحوه دکد و پخش فایل های MP3 را تشریح کنیم. همانطور که در مقالهی قبلی اشاره شد، فایل mp3 بر خلاف فایل های wav جهت کاهش حجم فایل صوتی، دست به فشردهسازی و رمزگذاری صدا میزند و آن را به بخشهای کوچکی که فریم نام دارد میشکند.
برای این که بتوانیم خروجی مناسب صوتی داشته باشیم؛ باید قادر باشیم که فریمهای مجزا را در زمان مناسبی از حالت فشرده خارج کنیم و برای پخش به واحد دیجیتال به آنالوگ بفرستیم و هیچ وقفهای هم نباید وجود داشته باشد تا قعطی و پرش در صوت ایجاد نشود. با توجه به قابلیتهای میکروکنترلرهای قدیمی، این امکان وجود نداشت؛ چرا که به دلیل محدودیتهای حافظه و پردازشگر، سرعت تبدیل فریمها به فایل خام، پایینتر از بیتریت پخش صوت بود و همین امر باعث میشد که این نوع میکروکنترلرها قادر به پخش اینگونه فایل ها نباشند. برای رفع این نقص، شرکتهای تولید کننده چیپ، دست به کار شدند و دکدر سخت افزاری خود را وارد بازار کردند. اغلب استفاده کنندهها برای پخش فایلهای صوتی با فرمت MP3 دست به دامن این گونه چیپها می شدند.
یکی از شرکتهای شناختهشده در خصوص تولید چیپ های دکدر، شرکت VLSI است که به واسته چیپ VS1003 در ایران محبوبیت زیادی پیدا کرد. با استفاده از این چیپ، پخشکننده همراه و غیرهمراه بسیاری طراحی شد. به عنوان نمونه عکس زیر که به کمک همین چیپ و میکروکنترلر AVR ، یک پخشکننده MP3 قابلحمل ساخته شده است.
با این وجود، این گونه طراحی، مشکلات خاص خودش را به همراه داشت. از جمله حجیم شدن مدار، مصرف انرژی بیشتر، بالا رفتن قیمت تمامشده و ….. اما چارهی دیگری وجود نداشت و استفاده از این نوع چیپ ها اجتنابناپذیر بود. تا این که میکروکنترلرهای ARM معرفی شدند که علاوه بر مصرف پایین، سرعت پردازشی به مراتب بالاتر داشتد. میزان حافظه و سرعت پردازش بالای این خانواده از میکروکنترلر، امکان دکد و پخش مستقیم فایل mp3 را ایجاد کرد؛ به نحوی که برای دکد و پخش، نیاز به هیچ المان خارجی نباشد و تمام فرایندها در درون خود میکروکنترلر میسر باشد.
استخراج فریمها
تا اینجا با ساختار کلی فایل MP3 آشنایی پیدا کردیم. برای شروع فرایند دکد و پخش، اولین قدم پیدا کردن فریمها و استخراج آنها از فایل است. همانطور که میدانید یک فایل MP3 از مجموعهای از فریمهای صوتی تشکیل شده است.
همانطور که در عکس بالا مشاهده میکنید، هر فریم داده دارای هدری است که علاوه بر مشخص کردن شروع یک فریم، مجموعهای از اطلاعات در خصوص آن فریم را نیز دارد. برای روشنتر شدن موضوع به عکس زیر دقت کنید:
هر فریم دارای جزئیات فوق است که 32 بیت (4 بایت) اول اطلاعات سینک و هدر را در خود دارد. 16 بیت (2 بایت) بعد، حاوی اطلاعات اعتبار سنجی است که به صورت اختیاری است، یعنی ممکن است وجود نداشته باشد. 136/256 بیت بعدی حاوی اطلاعات مربوط به کانال صوتی است؛ (همانطور که میدانید یک فایل صوتی ممکن است منو یا استریو باشد) و مابقی دادهها مربوط به دادههای صوتی است. برای این که بتوانیم دادههای صوتی را از حالت فشرده و رمز شده خارج کنیم، لازم است اول اطلاعات مربوط به فریم را از هدر استخراج کنیم و بر اساس دادههای به دست آمده، رمزگشایی دادههای صوتی را شروع کنیم.
دیکد Mp3 – رمزگشایی هدر MP3
همانطور که قبلاً اشاره کردیم، هدر حاوی 32 بیت است که هر بیت معنی و مفهوم خاص خود را دارد. اگر بیتها را به تفکیک و رنگ مرتبط با معنی آنها دستهبندی کنیم، نتیجه به شکل زیر خواهد بود:
AAAAAAAA AAABBCCD EEEEFFGH IIJJKLMM
- 11 بیت (A) (از بیت 21 تا 31) : بیتهای شناسایی (همه 1 هستند) که برای تشخیص شروع یک فریم به کار برده میشوند.
- 2 بیت (B) (بیت 20 و 19) : ورژن هدر که حاوی 4 حالت است:
- 00 – MPEG Version 2.5
- 01 – reserved
- 10 – MPEG Version 2
- 11 – MPEG Version 1
- 2 بیت (C) (بیت 18 و 17): توضیح دهنده لایه:
- 00 – reserved
- 01 – Layer III
- 10 – Layer II
- 11 – Layer I
- 1 بیت (D) (بیت 16): بیت اعتبارسنجی
- 0 : قسمت CRC وجود خواهد داشت.
- 1 : قسمت CRC وجود نخواهد داشت.
- 4 بیت (E) (از بیت 12 تا 15) : بیتریت خروجی (مطابق جدول زیر)
- دو بیت (F) (بیت 10 و 11) : سمپلریت مطابق جدول زیر:
- بیت (G) (بیت شماره 9) : Padding bit
- 0 – frame is not padded
- 1 – frame is padded with one extra slot
- بیت (H) (بیت 8) : Private bit. This one is only informative.
- 2 بیت (I) (بیت 6 و 7) : Channel Mode
- 00 – Stereo
- 01 – Joint stereo (Stereo)
- 10 – Dual channel (2 mono channels)
- 11 – Single channel (Mono)
- 2 بیت (J) (بیت 4 و 5) : Mode extension (Only used in Joint stereo)
- بیت (K) (بیت 3) : Copyright
- Audio is not copyrighted
- Audio is copyrighted
- بیت (L) (بیت 2) : Original
- 0 – Copy of original media
- 1 – Original media
- 2 بیت (M) (بیت 0 و 1) : Emphasis
بعد از چهار بایت توصیفکننده هدر، بنا به وضعیت بیت D در این توصیفکننده، ممکن است که یا 2 بایت CRC وجود داشته باشد یا نه. بعدازاین دو بایت اختیاری، طبق فریم که تک کانال باشد یا دو کانال (دو بیت 6, 7)، 17 یا 32 بایت اطلاعات مربوط به کانالها وجود خواهد داشت و بعدازآن دادههای صوتی قرار خواهند داشت. دقت داشته باشید در شرایط خیلی نادر ممکن است که فریم دارای دادههای صوتی نباشد. در عکس زیر یک فریم را درون یک فایل MP3 مشخص کردهایم که 4 بایت قرمزرنگ، هدر و 32 بایت آبیرنگ، اطلاعات کانال میباشد. بقیهی بایتها هم دادههای صوتی هستند. توجه داشته باشید که بایتهای مربوط به خطایابی وجود ندارند.
دکد Mp3 – رمزگشایی دادههای صوتی
برای رمزگشایی دادههای موجود در این قسمت اول لازم است با الگوریتم هافمن آشنایی داشته باشیدِ؛ روش کدگذاری هافمن یک روش فشردهسازی داده است که توسط دیود هافمن پایهگذاری شد. در روش هافمن دادهها 20 الی 90 درصد فشرده میشوند. در الگوریتم هافمن از ساختمان دادهی صف اولویت استفاده میشود. توضیح نحوهی عملکرد الگوریتم هافمن در این مقاله نمیگنجد و علاقهمندان جهت یادگیری میتوانند به وبسایت های مربوطه مراجعه کنند. برای دکدینگ این قسمت همانطور که در عکس مشخص شده است، باید از درخت هافمن استفاده کنید.
توضیح سختافزار
همانطور که در تصویر زیر مشخص شده است، سختافزار مورداستفاده جهت دکد فایل MP3، یک سختافزار بسیار ساده است که جزء اصلی آن را یک میکروکنترلر STM32F103RET تشکیل داده است. تمام اتفاقات درون میکروکنترلر رخ میدهد.
برای تبدیل دادههای دیجیتال از مبدلهای دیجیتال به آنالوگ (DAC) داخلی میکروکنترلر استفاده شده که قادر است نرخ یک مگاسمپل بر ثانیه و دقت 12 بیت را ارائه نماید. کارت حافظه هم با استفاده از رابط SPI به میکروکنترلر وصل شده است. درواقع تلاش شده که تا جای ممکن مدار، ساده و قابلفهم باشد.
نرمافزار
نرمافزار توسط کامپایلر کیل نوشته شده و قادر است فایلهای MP3 تا بیت ریت 320 کیلو و فایلهای Wav را تا بالاترین بیتریت ممکن پخش نماید. برای سرعت عمل بیشتر در دکد فایلهای MP3، بخشی از کد به زبان اسمبلی نوشته شده است. تا حد ممکن سعی شده که از منابع موجود بهترین استفاده برده شود. برای انتقال دادههای صوتی به مبدلهای DAC، از واحد DMA استفاده شده تا CPU کمترین درگیری را در این انتقال داشته باشد.
int main(void){ RCC_Configuration(); GPIO_Configuration(); NVIC_Configuration(); buffer_Init(); /* Uart init RX / TX buffers */ USART1_Init(); while(disk_initialize(0)==STA_NOINIT) /*Init SdCard Disk*/ { SET_LED(); }RESET_LED(); while(f_mount(0,&fs)!=RES_OK) /*Mount Fat File System*/ { SET_LED(); }RESET_LED(); printf("Zeus@sisoog.com\r\n"); MP3_PlayAudioFile("start.mp3"); /*Play Mp3 File*/ play_wave("start.wav"); /*Play Wave File*/ while(1) { } }
مطابق برنامهی فوق، بعد از نصب و پیکربندی کارت حافظه، برنامه ابتدا به دنبال فایل start.mp3 درون کارت حافظه میگردد. در صورت وجود چنین فایلی آن را اجرا کرده و بعد از اتمام، به دنبال فایل start.wav میگردد تا آن را پخش نماید. شما بهراحتی با اضافه کردن توابع و بخشهای موردنظر خود، میتوانید این کد را تبدیل به یک Mp3 Player همراه کنید.
دانلود سورس کد دیکدر MP3
ٰ