توانایی ضبط صدا، ذخیره آن و پخش آن بارها و بارها هرگز باعث نمیشود که من از پیشگامان آن، از توماس ادیسون گرفته تا آلن بلوملین ، مهندس برق بریتانیایی که در سال 1931 «ضبط دوگوشی» را اختراع کرد، شگفت زده شوم. اکنون "استریو" را صدا کنید. (هیچوقت نام او را نشنیده اید؟ بلوملین 128 اختراع در زمینه صدا، رادار و تلویزیون جمع آوری کرد که هنوز هم مورد استفاده قرار می گیرند، اما به طرز غم انگیزی، در حین آزمایش رادار هوابرد در یک سانحه هوایی در طول جنگ جهانی دوم کشته شد. از دست دادن او بسیار بزرگ تلقی شد، اخبار مرگ او تا پس از جنگ مخفی نگه داشته شد).
تا کنون در این سری، ما یک آردوینو را به تعدادی پروژه مرتبط با صدا از یک پخش کننده صوتی دیجیتال تا اخیراً یک تحلیلگر طیف صوتی تبدیل کرده ایم. در این ماه، میبینیم که تا چه حد میتوانیم میکروکنترلر محبوب را از ابتدا شروع کنیم و آن را به یک ضبط کننده صوتی دیجیتالی ساده اما کارآمد تبدیل کنیم.
چگونه کار می کند
مهم نیست که چگونه به نظر می رسند، همه دستگاه های ضبط صدا دیجیتال باید عملکردهای اولیه یکسانی را انجام دهند - آنها باید یک سیگنال صوتی آنالوگ را در فواصل زمانی منظم ضبط کنند و در همان زمان، داده های دیجیتال را در ذخیره سازی ذخیره کنند. این ممکن است برای رایانه شخصی یا تلفن هوشمند آسان باشد، اما ما باید برخی از تکنیک های برنامه نویسی پیشرفته را به همراه ضربه زدن به برخی ویژگی های مخفی معرفی کنیم تا بتوانیم این کار را روی Arduino Uno کار کنیم.
برای ضبط، ضبط کننده صوتی دیجیتال ما یک کانال صوتی آنالوگ تک (مونو) با نرخ نمونه 22.05 کیلوهرتز، عمق نمونه 8 بیتی را ضبط می کند و آن را به عنوان یک فایل WAV ویندوز با حجم فایل حداکثر 4 گیگابایت در یک کارت فلش microSD ذخیره می کند. حالا قبل از اینکه با این مشخصات خمیازه بکشید، به یاد داشته باشید، ما این کار را با یک پردازنده 16 مگاهرتز، فقط 2 کیلوبایت رم و 32 کیلوبایت فضای برنامه نویسی انجام می دهیم. اگر فقط یک کامپیوتر ویندوزی می توانست تا این حد کارآمد باشد! برای کمک به درک پروژه (و کد منبع ) تا حد امکان، ضبط کننده ما فقط دو دکمه دارد - ضبط و توقف. صدا را پخش نمی کند و فقط در یک فایل ثابت در پوشه اصلی فلش کارت به نام "REC00000.WAV" ضبط می کند. یک فایل موجود با همین نام رونویسی می شود. برای پخش، فقط فلش کارت را بردارید، آن را در رایانه شخصی، تلفن یا رایانه لوحی خود بارگذاری کنید و فایل را در هر پخش کننده یا ویرایشگر رسانه ای استاندارد WAV پخش کنید.
قضیه نایکیست
همه ما صدای دیجیتال را می شناسیم - همه ما به موسیقی گوش می دهیم و بدون شک همه ما در زمان خود چند سی دی را پاره کرده ایم. اما چگونه یک سیگنال آنالوگ را گرفته و به صدای دیجیتال تبدیل کنیم؟
اینجاست که کار یک مهندس برق دیگر، هری نایکیست، به ما کمک می کند. او متوجه شد که برای گرفتن دیجیتالی سیگنال آنالوگ، باید آن را در فواصل زمانی معین گرفته یا «نمونهگیری» کنیم، نرخی که باید حداقل دو برابر بالاترین فرکانس صوتی باشد که میخواهیم ضبط کنیم. این بدان معناست که اگر به عنوان مثال پهنای باند صوتی 5 کیلوهرتز می خواهیم، حداقل به نرخ نمونه برداری 10 کیلوهرتز نیاز داریم.
روشی که ما آن نمونهها را میگیریم با یک دستگاه مدار به نام مبدل آنالوگ به دیجیتال (ADC) است و تراشه میکروکنترلر ATMEGA328P آردوینو Uno یک دستگاه روی برد دارد. اما بهطور پیشفرض، سرعت نمونهگیری 9.6 کیلوهرتز و عمق نمونه 10 بیتی دارد، بنابراین ما باید کارهایی را انجام دهیم تا آن را به شکلی درآوریم. برای شروع، نرخ نمونه بسیار پایین است (ما فقط پهنای باند صوتی 4.8 کیلوهرتز را دریافت می کنیم که در بهترین حالت کیفیت رادیو AM است) و عمق بیت اندازه اشتباه است. (عمق بیت دقت نمونه است که معمولاً در صدای سی دی 16 بیت است، اما ADC آردوینو فقط 10 بیت برای شروع دارد).
با این حال، ATMEGA328P چند ترفند در آستین خود دارد. یکی از مواردی که ما در پروژه آنالایزر طیف صوتی استفاده کردیم، پیش مقیاس کننده ساعت قابل تنظیم ADC است. درست مانند هر CPU، ADC برای همگام سازی عملکرد خود به یک سیگنال ساعت نیاز دارد و در اینجا، این توسط یک تقسیم کننده قابل برنامه ریزی یا "پیش مقیاس کننده" تنظیم می شود و کلاک اصلی آردوینو 16 مگاهرتزی را بر ضریب پیش فرض 128 تقسیم می کند تا نرخ کلاک ADC 125 کیلوهرتز ایجاد شود.
از آنجایی که ADC از روش نمونهبرداری «تقریبی متوالی» استفاده میکند (ما چند ماه پیش به جزئیات این موضوع را بررسی کردیم)، هر نمونه 13 سیکل ساعت میگیرد که نرخ نمونه 125 کیلوهرتز/13 یا تقریباً 9.6 کیلوهرتز را به ما میدهد. اما اگر ضریب پیش مقیاس را کاهش دهیم، میتوانیم نرخ کلاک ADC را افزایش دهیم – یک ضریب پیش مقیاسکننده 16 بلافاصله سرعت نمونه را به نزدیک به 77 کیلوهرتز یا یک نمونه در هر 13 میکرو ثانیه افزایش میدهد.
اما یک نقطه ضعف وجود دارد - ADC دقت نمونه را با افزایش سرعت کلاک از دست می دهد، با این حال، حتی در این نرخ بالاتر، دقت هنوز نزدیک به 8 بیت است، که تمام چیزی است که ما نیاز داریم. این تکنیک «اورکلاک» بسیار خوب کار میکند، اما یک محدودیت عمده دیگر وجود دارد - تعداد محدود تنظیمات پیش مقیاسکننده، ما را با نرخهای نمونه غیردوستانه صوتی 9.6، 19.2، 38.4 و 76.8 کیلوهرتز مواجه میکند که هیچکدام از آنها استاندارد فرمت WAV نیستند.
برگه داده ATMEGA328P را بخوانید و متوجه خواهید شد که علاوه بر حالت نمونه معمولی "رایگان" که در مورد آن صحبت کردیم، ADC یک حالت "تبدیل واحد" نیز دارد که به موجب آن ADC با تنظیم نمونه گیری فعال می شود. ثبت بیت یا «پرچم»، آن نمونه را می گیرد و هنگامی که نمونه برای پردازش آماده شد، بلافاصله پرچم را بازنشانی می کند.
شاید دلیلی برای جشن به نظر نرسد، اما وقتی آن را با یکی دیگر از استعدادهای پنهان ATMEGA328P به نام «وقفه های تایمر» ترکیب می کنیم، اکنون مکانیزمی برای تنظیم نرخ نمونه بسیار دقیق تر داریم.
تایمر قطع می شود
در معماری رایانه، «وقفه» محرکی است که به پردازنده میگوید فوراً فرآیند فعلی را منحرف یا «وقفه» کند و یک کار خاص مرتبط با آن وقفه را اجرا کند. پس از تکمیل کار جدید، پردازنده به فرآیند اولیه باز می گردد و از جایی که کار را متوقف کرده است، ادامه می دهد.