در این آموزش قصد داریم همراه با هم یک سیگنال صوتی را آنالیز کنیم. حتما میدانید که امواج صوتی که ما انسانها (و به طور کلی در طبیعت) تولید میکنیم، امواج آنالوگ یا پیوسته هستند. پس برای پردازش این امواج با کامپیوترهای دیجیتال، به مدلهایی نیاز داریم که در زمان گسسته (دیجیتال) باشند. هدف اصلی این مطلب آموزشی نیز همین است؛ اینکه بفهمیم این پردازش چگونه انجام میشود. برای رسیدن به این هدف، با هم بر روی یک مثال کار میکنیم که در آن با دو سیگنال سر و کار داریم، یکی صدای ضبط شدهی خودمان و دیگری سیگنالی معوج از همین سیگنال. ضمن این پروسه متوجه خواهیم شد که چگونه میتوان شباهتها و تفاوتهای بین دو سیگنال صوتی را تشخیص داد و آنالیز کرد.
برای اینکه بتوانید با آموزش همراه شوید، لازم است که دانشی مقدماتی در مورد اینکه الگوهای امواج چگونه هستند و چگونه با تغییر پارامترهای مختلف، در طول زمان تغییر میکنند داشته باشید. در این جلسه که قسمت اول آموزش ماست به سراغ این میرویم که ویژگیهای مختلف امواج صوتی چه چیزهایی هستند و چگونه میتوانیم این امواج را با کمک متلب پردازش کنیم و در جلسهی بعدی که قسمت دوم همین آموزش خواهد بود، آنالیز دقیقتری از امواج صوتی ضبط شده را با کمک آردوینو انجام خواهیم داد.
نرمافزارهای مورد نیاز
مرحلهی اول: دربارهی سیگنالهای صوتی
وقتی قرار است با سیگنالهای صوتی (voice signals) کار کنیم، مهمترین چیزی که باید درک صحیحی از آن داشته باشیم این است که اصلا مفهوم «سیگنال» چیست؟ تا به حال به این فکر کردهاید که سیگنال واقعا به چه معناست؟
برای پاسخ دادن به این سوال، بیایید سری به کتاب معروف و معتبر Signal Processing for Communications، نوشتهی Paolo Prandoni و Vetterli بزنیم.
« اگر بخواهیم به صورت تخصصی اما با حفظ کلیات صحبت کنیم؛ {یک} سیگنال توصیفی قراردادی است از پدیدهای که در طول زمان یا مکان در حال تحول است. بنابراین منظور ما از پردازش سیگنال هر عمل دستی یا مکانیکی است که به وسیلهی آن اطلاعات نهفته در آن پدیدهی رخ دهنده را اصلاح، آنالیز و یا دستکاری میکنیم. یک مثال ساده را در نظر بگیرید، دمای محیط. در ابتدا ما یک مدل مشخص را برای توصیف این متغیر قرارداد میکنیم؛ به عنوان مثال درجهی سلسیوس و سپس میتوانیم تحولات و تغییرات این متغیر در طول زمان را با روشهای مختلف رصد و ثبت و ضبط کنیم. مجموعه دادههای حاصل شده از این کار یک سیگنال دما نام دارد.»
بسیار خب، حالا که این تعریف عمومی از سیگنال را دانستیم، میخواهیم ویژگیهای خاص سیگنالهای صوتی را بیشتر بررسی کنیم. پس قبل از آنکه برای پروژهی عملی آماده شویم و صدای خودمان را ضبط کنیم، با برخی پارامترهای نرمافزار Audacity آشنا میشویم.
تعداد کانالها
- حالت Mono: در این حالت شما صدا را با یک کانال ضبط میکنید. اما منظور از ضبط کردن با یک کانال چیست؟ منظور این است که تنها یک سیگنال صوتی وجود خواهد داشت. باز هم بیشتر توضیح میدهیم، تمام پروسهی ضبط صدا در یک سطح انجام میشود. یعنی اگر دو یا تعداد بیشتری هم اسپیکر داشته باشید، تفاوتی در صدای شنیده شده از آنها وجود نخواهد داشت. این حالت متداولترین روش ضبطی است که برای پردازش سیگنالهای صوتی استفاده میشود چرا که صدا با یک میکروفون ضبط میشود و این به آن معناست که سیگنال بدست آمده پهنای باند کمتری خواهد داشت پس در کاربردهای فراوانی قابل استفاده خواهد بود. (مثلا در تلفن و رادیو و …)
همچنین برای کاربرانی که هنوز خیلی با اصطلاحات تخصصی و جزئیات تجهیزات صوتی آشنا نیستند، استفاده از حالت Mono بهترین پیشنهاد است.
یک سیگنال صوتی واحد در اسپیکرهای مختلف هم سطح یکسانی دارد. (حالت Mono)
- حالت Stereo: حالتی که در آن شما با دو یا تعداد بیشتری کانال سیگنال صوتی را ضبط میکنید. در این حالت، از آنجایی که اطلاعات و دادههای سیگنال از دو یا چند سورس مختلف ضبط میشوند، شما اطلاعات جهت و مکان سیگنال صوتی را نیز در اختیار خواهید داشت. اگر بخواهید از این حالت استفاده کنید مستلزم آن است که حداقل دو میکروفون را در موقعیتهای مناسب قرار دهید. با این کار منابع ثبت اطلاعات شما دارای موقعیتهای (location) متفاوت خواهند بود. از این روش معمولا در تنظیم صدای فیلمها یا موسیقیها استفاده میکنند تا بتوانند به صدا پرسپکتیو (بعد) بدهند.
نرخ نمونه برداری (sampling rate یا Project rate)
تعداد نمونههایی که در یک ثانیه از یک سیگنال زمان-پیوسته برمیداریم و با کنار هم قرار دادن این نمونهها یک سیگنال زمان-گسسته (با مقادیر عددی) بدست میآوریم. واحد نرخ نمونهبرداری S/s یا نمونه (sample) بر ثانیه است.
در بخش توضیحات ابتدایی هم توضیح دادیم که چون سیگنالهای صوتی سیگنالهایی پیوسته در زمان هستند، و از طرفی ما تنها در صورتی میتوانیم سیگنالها را با کامپیوتر پردازش کنیم که به صورت گسسته در زمان باشند، پس ناگزیریم که ابتدا سیگنالهای آنالوگمان را با روش نمونهبرداری به سیگنالهای دیجیتال و قابل پردازش تبدیل کنیم. این تبدیل با استفاده از قضیهی نمونهبرداری و به روش زیر انجام میشود.
فرض کنید ما یک سیگنال آنالوگ مانند تصویر زیر در اختیار داریم. حالا فرض کنید که میخواهید این سیگنال را برای دوستتان توصیف کنید. احتمالا کار بسیار مشکلی خواهد بود و زمانی ساده میشود که شما بتوانید سیگنال را با گزارش کردن دنبالهای از مقادیر عددی توصیف کنید، این مقادیر عددی نمونههایی هستند که شما با قاعده و نظمی به خصوص از سیگنال پیوسته انتخاب میکنید.
هر کدام از نمونهها با مقدار دامنهی آنها مشخص میشوند. نرخ نمونهبرداری هم بر اساس نظر کاربر و با لحاظ ویژگیهای هر پروژه تعیین میشود. در تصویر زیر نحوهی تبدیل یک سیگنال پیوسته به سیگنال گسستهاش را میبینید که براساس همین قضیه و نظریهی نمونهبرداری انجام شده است.
در مورد سیگنالهای صوتی، نرخ نمونهبرداری باید با در نظر گرفتن محدودهی شنوایی انسان تعیین شود. این محدوده بازهی فرکانسی بین 20Hz تا 20/000Hz را در بر میگیرد. بنابراین برای آنکه همهی اطلاعات مفید و لازم یک سیگنال را داشته باشیم و چیزی را در حین این تبدیل از دست ندهیم، باید نرخ نمونهبرداری را مطابق با نظریهی نایکوئیست-شانون تنظیم کنیم. یعنی به این صورت که:
مطابق این فرمول، فرکانس نمونه برداری باید از دو برابر ماکسیمم فرکانس موجود در طیف سیگنال بزرگتر باشد و گفتیم که ماکسیسمم فرکانس در طیف سیگنال صوتی قابل شنوایی برای انسان، ۲۰/۰۰۰Hz است. بنابراین فرکانس نمونهبرداری ما باید حداقل ۴۰/۰۰۰Hz باشد.
فرکانسی که ما انتخاب میکنیم ۴۸/۰۰۰kHz است. البته این عدد را از خودمان انتخاب نمیکنیم. بلکه یک مقدار استاندارد در کار کردن با سیگنالهای صوتی است و با آزمایشهای متعدد به این نتیجه رسیدهاند که با انتخاب این نرخ نمونهبرداری از سیگنال، تمام اطلاعات مفید و مورد نیاز سیگنال آنالوگ در زمان تبدیل آن به سیگنال دیجیتال حفظ شده و دادهی مهم و تعیینکنندهای از دست نخواهد رفت.
اما در راستای همین مسئلهی تعیین نرخ نمونهبرداری، آشنایی به دو حالت دیگری که ممکن است پیش بیایند نیز مهم است.
- Oversampling یا بیش نمونهبرداری: پروسهی نمونه برداری از یک سیگنال آنالوگ با فرکانسی بیشتر از فرکانس نایکوئیست. از نظر تئوری، هر سیگنال باند محدودی که با نرخ نایکوئیست یا مقداری بیشتر از آن نمونهبرداری شده باشد، اطلاعات آن کاملا قابل بازیابی است. بنابراین در حالت مشکلی پیش نخواهد آمد. نرخ نایکوئیست هم که گفتیم، براساس فرمول بالا بزرگتر یا مساوی دو برابر ماکسیمم فرکانس موجود در سیگنال است.
- Undersampling یا کم نمونهبرداری: روشی است که در آن از سیگنالی که توسط فیلتر میانگذر فیلتر شده است، با نرخی کمتر از نرخ نایکوئیست نمونهبرداری میشود اما سیگنال همچنان قابل بازیابی است. در این حالت نمونههایی که برداشته میشوند، با نمونههای برداشته شده از قسمت فرکانس پایین سیگنال اولیه قابل تمایز دادن نیست. به این حالت (Aliasing) هم گفته میشود.
بیایید به عنوان نمونه یک سیگنال سینوسی را با هم بررسی کنیم.
در نمودار بالا، یک موج سینوسی داریم با فرکانس ۲Hz که در بازهی زمانی [۱,۱-] قرار دارد. ۴ دورهی تناوب از این موج در نمودار نشان داده شده است پس میتوان نتیجه گرفت که هر دورهی تناوب آن برابر با ۰.۵ ثانیه یا Hz½ است.
حالا میخواهیم به این سیگنال نمونههای بیشتری اضافه کنیم تا ببینیم چه اتفاقی میافتد.
اگر معیاری داشته باشیم به نام تعداد نقاط، این معیار نشان دهندهی این خواهد بود که در هر دورهی تناوب از تابع، ما چند نمونه را برای بازیابی تابع استفاده کردهایم. (بازیابی تابع به این شکل صورت میگیرد که این نقاط داده شده به کمک روش درونیابی به هم وصل میشوند) همانطور که در تصویر زیر میبینیم، حداقل تعداد نقاطی که لازم داریم تا بتوانیم تابع را بدون اعوجاج بازیابی کنیم ۲۰ نقطه است (آخرین نمودار را ببینید و با قبلیها مقایسه کنید) بنابراین ما همواره در مورد بازیابی سیگنالهای آنالوگی که شکل موج آنها مانند موج سینوسی تغییرات نرم و پیوسته داشته باشند، همین قانون تعداد نقاط را داریم. هرچه تعداد نقاط نمونهبرداری شدهی بیشتری در اختیار داشته باشیم، شکل موجی که میتوانیم از سیگنال بازیابی کنیم به واقعیت نزدیکتر خواهد بود.
در این قسمت میخواهیم با کمک نرمافزار متلب تعدادی شکل موج سینوسی رسم کنیم و ببینم تغییر فرکانس نمونهبرداری بر آنها چه تاثیری دارد. در قسمتهای بعدی از مطالب مربوط به سیگنالهای صوتی، با کمک متلب آنالیز فوریه را نیز بر آنها اعمال خواهیم کرد. دلیل اینکه برای این پردازشها از نرمافزار متلب استفاده میکنیم نیز این است که متلب به خاطر داشتن اینترفیس سریال، به خوبی با بوردهای آردوینو ارتباط برقرار میکند. در قسمتهای بعدی جزئیات بیشتری از این ارتباط را استفاده میکنیم به این ترتیب که با بورد آردوینو یک سیگنال صوتی را ضبط میکنیم و سپس آن را با نرمافزار متلب پردازش میکنیم.
در اینجا بد نیست برای آن خوانندگانی که تا به حال به طور جدی با متلب کار نکردهاند، برخی از قسمتهای مهم آن از جمله طریقهی رسم نمودار یا اصطلاحا پلات کردن یک تابع را به طور خلاصه توضیح دهیم.
برای ایجاد یک تابع، در محیط نرمافزار متلب ابتدا به قسمت [HOME] → [New] بروید. سپس گزینهی Script یا Function را بزنید.
به عنوان مثال برای آنکه بتوانیم یک شکل موج سینوسی را ترسیم کنیم، باید یک Script ایجاد کنیم. پس از ایجاد، کد زیر را کپی و در آن جا paste کنید.
f = 1
points = 5;
t = 0:1/points:1;
wave = sin(2*pi*f*t);
subplot(4,1,1)
plot(t,wave)
title(‘5 points plot’)
points1 = 10;
t = 0:1/points1:1;
wave1 = sin(2*pi*f*t);
subplot(4,1,2)
plot(t,wave1)
title(’10 points plot’)
points2 = 15;
t = 0:1/points2:1;
wave2 = sin(2*pi*f*t);
subplot(4,1,3)
plot(t,wave2)
title(’15 points plot’)
points3 = 20;
t = 0:1/points3:1;
wave3 = sin(2*pi*f*t);
subplot(4,1,4)
plot(t,wave3)
title(’20 points plot’)
برای دیدن نتیجه تنها کافی است گزینهی Run را بزنید.
خب حالا برای اینکه بتوانیم مثلا تاثیر کاری مانند نمونه برداری را بر سیگنال رسم شده ببینیم، باید یک پلات دیگر را هم روی آن بیندازیم. میخواهیم گستردهی زمانی سیگنال جدید همین ۰.۵ ثانیه باشد اما فرکانس آن را به ۶۰ تغییر دهیم. تعداد نقاط را هم ۲۰ برابر عدد فرکانس میگیریم. فرض کنید میخواهیم با فرکانس ۵۰ هرتز نمونهبرداری کنیم. به این ترتیب هر کدام از نقاط را در T=۱/۵۰ باید قرار دهیم. در تصویر زیر میبینید که نقاط کوچک قرمز رنگ، نقاط نمونهبرداری شده از تابع هستند.
در تصویر فوق، اگر فرض کنیم بخواهیم از روی نقاط قرمز رنگ که نمونههای برداشته شده هستند، تابع را بازیابی کنیم، چه میشود؟ چه حدسی در مورد شکل موج آن میتوانیم داشته باشیم؟ تقریبا هیچ چیز! به علت تعداد کم آنها، حتی اگر با دقیقترین روشهای درونیابی هم آنها را به هم متصل کنیم، نموداری مانند شکل موج قرمز رنگ تصویر زیر به دست خواهیم آورد. میبینیم که چیزی که حاصل شده است هیچ شباهتی به فرم سینوسی شکل موج اولیهی ما ندارد و بنابراین نمیتواند اطلاعات آن را به درستی بازیابی کند.
همانطور که در دو تصویر بالایی میتوانید ببینید، زمانی که فرکانس نمونهبرداری را دقیقا دو برابر فرکانس سیگنال انتخاب میکنیم، تنها نقاطی که به درستی بازیابی میشوند نقاط ماکسیمم و مینیمم تابع هستند. قضیهی نمونهبرداری میگوید که داشتن همین دو نقطه از یک تابع (یعنی نقطهی ماکسیمم و مینیمم در یک دورهی تناوب) برای بازیابی آن کفایت میکند.
مرحله ی دوم: کار کردن با سیگنالهای صوتی
بسیار خب، درباره ی سیگنالها و مفاهیم و ویژگیهای آنها به قدر نیاز صحبت کردیم. حالا وقت آن رسیده است که با یک سیگنال واقعی کار کنیم. کار ضبط کردن صدا را با استفاده از نرمافزار Audacity و با تنظیمات زیر انجام میدهیم.
- نرخ نمونهبرداری: ۴۸۰۰۰Hz
- تعداد بیتها: ۱۶
گسترهی زمانی سیگنال باید حداقل حدود ۱۰ ثانیه باشد اما از آنجایی که قصد داریم پردازشهای زیادی را در طول پروژه بر روی آن اعمال کنیم، توصیه نمیکنیم که بازهی زمانی را از ۲۰ ثانیه هم بیشتر بگیرید.
استفاده از نرمافزار Audacity کار بسیار راحتی است و مانند اغلب نرمافزارهای ضبط صدا همین که ظاهر آن را ببینید به طور شهودی خواهید توانست کارکرد بخشهای مختلف آن را متوجه شوید. مثلا در تصویری که در ادامه میبینید، یک دکمهی قرمز رنگ وجود دارد که دایرهای در وسط آن است. این لوگوی مشترک تمام نرمافزارهای ضبط صدا برای آغاز ضبط است. یا مثلا اگر میخواهید فرآیند ضبط کردن را در جایی متوقف کنید، کافیست مربع زرد رنگ را بزنید. بنابراین این نرمافزار به همین راحتی و از طریق ضبط کنندههای سیستم شما (مثلا میکروفن یا …) سیگنالهای صوتی را ضبط میکند و نتایج آن را در نموداری مانند آنچه که در تصوی زیر میبینیم، نشان میدهد.
در این قسمت سعی کردیم که مقدمهی مختصری دربارهی پردازش سیگنالهای دیجیتال داشته باشیم. از متلب کمک گرفتیم و شکل موجهای مختلفی از سیگنالها را دیدیم. همچنین با کمک نرمافزار Audacity یک سیگنال صوتی نیز از خودمان ضبط کردیم. در قسمت بعدی تماما به قسمت «پردازش» خواهیم پرداخت. الگوریتمهای مختلف پردازش سیگنال را در حوزهی زمان و فرکانس بررسی میکنیم و همچنان نرمافزار متلب اصلیترین نرمافزار مورد استفادهی ما برای رسم توابع، پردازش سیگنالهای صوتی که ضبط میکنیم و آنالیز نتایج خواهد بود.
- منبع: ترجمه از سایت deviceplus.com
- منبع: عکس شاخص از سایت lynda.com
امیدواریم آموزش آشنایی با پردازش سیگنال دیجیتال با متلب براتون مفید واقع شده باشه. برای آنکه در بهبود کیفیت مطالب ارائه شده به ما کمک کنید، در قسمت کامنتها ما را مطلع کنید که از نظر شما این آموزش چطور بود؟ مهمترین نکتهای که از آن آموختید و بهترین ایدهای که در ذهن شما ایجاد کرد چه چیزی است؟
اگر این نوشته برایتان مفید بود لطفا کامنت بنویسید.