MMS-HW2-SpringSemester2014.pdf

‫بسمه تعالی‬
‫های‏چندرسانهای‏(‪ )44-243‬‏‬
‫‏‬
‫‏‬
‫سیستم‬
‫تمرین‏‪:3‬‏پردازش‏سیگنال‏صوتی ‏‬
‫دانشکده‏مهندسی‏کامپیوتر‬
‫دانشگاه‏صنعتی‏شریف‬
‫‪ 41‬اسفند‬
‫دکتر مهدی امیری‬
‫مقدمه ‏‬
‫در این تمرین‪ ،‬شما برخی از مفاهیم پردازش صوت که در درس با آنها آشنایی پیدا نمودید را مورد آزمایش قرار‬
‫داده و به بررسی علل آنها میپردازید‪.‬‬
‫آنچه که بایستی تحویل داده شود شامل پاسخ سواالت مطرح شده در صورت تمرینها (در قالب یك گزارش با‬
‫فرمت‪ ،PDF‬نمودارها و شكلهاي خروجی ‪ m‬فایلها و خود ‪ m‬فایلها میباشد‪ .‬لطفا تمامی فایلها را به صورت یك فایل‬
‫فشرده‪ ،‬که نام آن در قالب ‪ MM_HW2_LastName_StudentID‬باشد که در آن به جاي ‪ LastName‬نام‬
‫خانوادگی شما و به جاي‪ StudentID‬شماره دانشجویی شما قرار میگیرد‪ ،‬به آدرس ایمیل درس به نشانی‬
‫‪ [email protected]‬بفرستید‪ .‬لطفا عنوان ‪ email‬خود را همانند قالب فوق قرار دهید‪ .‬مهلت‬
‫تحویل خروجی ها ساعت ‪ 95:32‬تاریخ ‪ 1525/1/13‬می باشد و به ازاي هر روز تأخیر در ارسال‪ 13 ،‬درصد از‬
‫نمره تمرین کسر می گردد‪.‬‬
‫بخش تشریحی و تحلیلی‬
‫‪ .1‬تحقیق کنید چرا در خطوط تلفن از کوانتیزاسیون یکنواخت ‪ 8‬یا ‪ 11‬بیتی استفاده نمی شود؟‬
‫‪ .2‬توضیح دهید که چگونه با استفاده از کد گذاری پیشگویانه (‪ )DPCM‬می توانیم متوسط نرخ بیتی را در مقایسه‬
‫با کدگذاری مستقیم (‪ )PCM‬کاهش دهیم؟‬
‫‪ .3‬مفهوم ‪ ADPCM‬را توضیح دهید و دو نوع مختلف آن (‪ forward-adaption‬و ‪ )backward-adaption‬را‬
‫تشریح نمایید‪.‬‬
‫‪ .4‬به وسیله نرم افزار ‪ Audacity‬صدای خود را که در حال گفتن کلمه ی ‪ stamp‬هستید ضبط کرده و‬
‫‪ spectrogram‬آن را رسم نمایید‪ .‬جایگاه تک تک حرفها را در شکل مشخص کنید و دلیل خود را در مورد‬
‫انتخاب جایگاه حرف ‪ a‬توضیح دهید‪.‬‬
‫‪ .5‬فرض کنید با استفاده از روش کدینگ ‪ DPCM‬می خواهیم یک سیگنال را نمونه برداری و کوانتایز نماییم‪ .‬در‬
‫این روش به جای کوانتیزه کردن ) (‬
‫)‬
‫(‬
‫) (‬
‫) (‬
‫(نمونهای از سیگنال) به صورت مستقیم‪ ،‬اختالف آنها را به صورت‬
‫کوانتایز می نمایند‪ .‬اگر واریانس اختالف ) (‬
‫صد برابر کمتر از واریانس‬
‫سیگنال ) ( باشد به سواالت زیر پاسخ دهید‪:‬‬
‫الف) اگر ) ( را با ‪ 11‬بیت بر نمونه کوانتایز کنیم‪ SNR ،‬چقدر میشود؟‬
‫ب ) برای آنکه ‪ SNR‬بیشتر یا مساوی ‪ 07‬دسی بل باشد‪ ،‬نرخ بیت بر نمونه را محاسبه نمایید؟‬
‫‪ .1‬با توجه به مبحث آنتروپی به سواالت زیر پاسخ دهید‪:‬‬
‫جدول ‪1‬‬
‫)‪Symbol P(Symbol‬‬
‫‪A‬‬
‫‪0.06‬‬
‫‪B‬‬
‫‪0.06‬‬
‫‪C‬‬
‫‪0.06‬‬
‫‪D‬‬
‫‪0.06‬‬
‫‪E‬‬
‫‪0.08‬‬
‫‪F‬‬
‫‪0.15‬‬
‫‪G‬‬
‫‪0.23‬‬
‫‪H‬‬
‫‪0.30‬‬
‫الف) با داشتن جدول شماره ‪ ،1‬یک کتاب کدی مبتنی بر روش هافمن طراحی کنید‪ .‬همچنین متوسط نرخ بیتی را‬
‫محاسبه کرده و میزان کارایی این روش را محاسبه کنید‪.‬‬
‫ب) کلمه ‪ aa‬را به دو روش هافمن و ‪ Arithmetic coding‬رمزگذاری کنید و رمزشده آن را به صورت باینری‬
‫نمایش دهید‪.‬‬
‫** برای روش هافمن از کتاب کدی ساخته شده در قسمت الف و برای روش ‪ Arithmetic coding‬از‬
‫احتماالت جدول شماره ‪ 1‬استفاده نمایید‪ .‬ضمناً در روش ‪ Arithmetic coding‬تقسیم بندی بازهی‬
‫[‪ ]7،1‬را به ترتیب حروف الفبا انجام دهید‪.‬‬
‫ج) از چه روشهایی زمان اتمام رمزگشایی در ‪ Arithmetic coding‬را مشخص مینمایند؟‬
‫د) دو روش هافمن و ‪ Arithmetic coding‬در مبحث فشرده سازی و کدینگ سیگنال را از منظر آنتروپی‪،‬‬
‫انعطافپذیری و نیازمندی های الزم جهت رمزگذاری و رمزگشایی مقایسه نمایید و بیان کنید که کدام روش بهتر‬
‫است‪.‬‬
‫کار با متلب‬
‫الف) فیلتر کردن سیگنال صوت ونمونه برداری افزایشی و کاهشی از صوت‬
‫در این بخش تمرین بایستی طبق مراحل زیر و به صورت گام به گام‪ ،‬جلو رفته و خواسته هر قسمت را انجام دهید‪.‬‬
‫فایل ورودی این قسمت از تمرین ‪ Speech.wav‬میباشد که با نرخ ‪ 32777‬نمونه در ثانیه ضبط شده است و‬
‫ضمیمه تمرین میباشد‪ .‬در تمام این بخش میتوانید با استفاده از تابع )(‪ wavread‬فایل صوتی را بخوانید و با‬
‫استفاده از تابع )(‪ wavplay‬آن را پخش کنید‪.‬‬
‫ابتدا فایل صوتی تمرین را بخوانید و ‪ waveform‬آن را در یک متغیر متلب به نام ‪ s32‬بارگذاری کنید‪ .‬سپس‬
‫بخش های زیر را به ترتیب انجام دهید‪ .‬فراموش نکنید که خروجی های ذکرشده در مقدمه تمرین را برای تمامی‬
‫قسمت های این بخش بایستی ارسال نمایید‪.‬‬
‫‪ .1‬سیگنال ‪ s32‬را به عنوان تابعی از زمان رسم نمایید‪ .‬محور اندازه در بازه ]‪ [-1.3, 1.3‬و محور زمان با مقیاس‬
‫ثانیه مدرج شده باشد‪ .‬سپس طیف فرکانسی این سیگنال را به صورت تخمینی و نرماالیز شده در بازه فرکانسی‬
‫]‪ [0, Fs‬با مقیاس ‪ Hz‬و محور اندازه در بازه ]‪ [0, 0.008‬رسم نمایید‪.‬‬
‫‪ .2‬حال سیگنال ‪ s32‬را با فاکتور ‪ 4‬نمونهبرداری کاهشی کنید و آن را در ‪ s8‬قرار دهید و قسمت ‪ 1‬را برای آن تکرار‬
‫کنید‪ .‬به صدای سیگنال ‪ s8‬و ‪ s32‬گوش کنید و این دو را با هم مقایسه نمایید‪.‬‬
‫ راهنمایی‪s8 = s32(1:4:length(s32)) :‬‬‫‪ .3‬یک فیلتر ‪ FIR‬خطی برای استفاده قبل از نمونهبرداری کاهشی میتواند مناسب باشد! (چرا؟) در این قسمت از‬
‫تابع ‪ fir1‬متلب برای طراحی این فیلتر به صورت زیر استفاده میکنیم‪ .‬با این تابع در راهنمای متلب آشنا شوید‪.‬‬
‫)‪fir1(64,1/4‬‬
‫‪ .4‬سیگنال ‪ s32f‬را با فیلتر کردن سیگنال ‪ s32‬و استفاده از فیلتر قسمت ‪ 3‬بسازید‪.‬‬
‫ راهنمایی‪ :‬میتوانید از دستور ‪ filter‬در متلب استفاده نمایید‪.‬‬‫‪ .5‬سیگنال ‪ s32f‬را به کمک قسمت ‪ 2‬نمونهبرداری کاهشی با فاکتور ‪ 4‬نمایید و آن را در ‪ s8f‬قرار دهید و قسمت‬
‫‪ 1‬را برای آن تکرار کنید‪.‬‬
‫‪ .1‬سیگنال ‪ s8‬و ‪ s8f‬را در متلب پخش کنید و تفاوت این دو را با ذکر علت مشخص کنید‪.‬‬
‫‪ .0‬سیگنال ‪ s8f‬را با فاکتور ‪ 4‬نمونهبرداری افزایشی کرده و آن را ‪ s8f32‬بنامید و قسمت ‪ 1‬را برای آن تکرار کنید‪.‬‬
‫سپس آن را پخش نموده و آن را با سیگنال اصلی ابتدایی مقایسه نمایید‪ .‬انتظار میرود این دو مشابه باشند‪ .‬این‬
‫انتظار برآورده شده است؟‬
‫ راهنمایی‪s8f32(4*(1:length(x8f))) = s8f(1:length(s8f)) :‬‬‫‪ .8‬برای باالتر بردن کیفیت سیگنال ‪ s8f32‬میتوانیم از فیلتر پایینگذر طراحیشده در قسمت ‪ 3‬استفاده نماییم‪.‬‬
‫سیگنال ‪ s8f32‬را فیلتر نموده و آن را ‪ s8f32f‬نامیده و قسمت ‪ 1‬را برای آن تکرار نمایید‪ .‬سپس آن را پخش‬
‫نموده و بهبود کیفیت آن را احساس کنید‪.‬‬
‫‪ .9‬در این قسمت میخواهیم با پیادهسازی ‪ CIC Moving Average Filter‬یک فیلتر پایینگذر ساده طراحی‬
‫کنیم‪ .‬این کار در متلب بدین صورت انجام میشود‪:‬‬
‫‪Acic = [-1, 1] , Bcic = [1 0 0 0 0 0 0 0 -1]/8‬‬
‫سپس پاسخ فرکانسی این فیلتر و فیلتر طراحیشده در قسمت ‪ 3‬را با دستور )(‪ freqz‬رسم نمایید‪.‬‬
‫‪ .17‬سیگنال ‪ s8f32cic‬را با اعمال فیلتر ‪ CIC‬بر سیگنال ‪ s8f32‬ایجاد کنید‪ .‬حال ‪ s8f32‬را در ‪ 4‬ضرب کنید تا‬
‫اندازه سیگنال به حالت اولیه برگردد و قسمت ‪ 1‬را برای آن تکرار نمایید‪ .‬حال آن را پخش نموده و بهبود کیفیت را‬
‫احساس کنید‪.‬‬
‫‪ .11‬حال میتوانیم با فیلتر مجدد این سیگنال با فیلتر ‪ CIC‬میرایی یاند قطع آن را بهبود دهیم‪ .‬سیگنال ‪s8f32cic‬‬
‫را یک بار دیگر با فیلتر ‪ CIC‬فیلتر نموده و آن را ‪ s8f32cic2‬بنامید و قسمت ‪ 1‬را برای آن تکرار کنید‪ .‬حال آن را‬
‫پخش نمایید‪.‬‬
‫هدف از انجام این قسمت از تمرین استفاده از نمونهبرداری کاهشی و کاهش حجم فایل مورد نظر و سپس استفاده از‬
‫نمونه برداری افزایشی و بازسازی سیگنال اصلی به کمک فیلترها بود‪ .‬اما در هنگام نمونهبرداری افزایشی پدیدهای به‬
‫نام انعکاس طیفی‪ 1‬رخ میدهد‪ .‬میتوانید در مورد این پدیده و علت آن جستجو کنید‪.‬‬
‫‪1‬‬
‫‪. Spectral Replication‬‬
‫ب) ‪LPC - Linear Predictive Coding‬‬
‫در این قسمت می خواهیم فرکانس ‪ Formant‬صدادار را با استفاده از روش ‪Linear predictive coding‬‬
‫تخمین بزنیم‪.‬‬
‫‪ .1‬ابتدا فایل ‪ mtlb.mat‬را بخوانید‪ ،‬بعد نمودار هیستوگرام آن را رسم کنید‪( .‬محتوی سیگنال صوت‪ ،‬صدای‬
‫خانمی که کلمه متلب را می خواند‪).‬‬
‫;‪Load mtlb‬‬
‫‪% Fs is the sampling frequency‬‬
‫‪% x is input signal‬‬
‫;‪Window=100; noverlap=90; F=128‬‬
‫;)‪[y,f,t,p] = spectrogram(x,window,noverlap,F,fs‬‬
‫;)'‪surf(t,f,10*log10(abs(p)),'EdgeColor','none‬‬
‫‪ .2‬جهت تحلیل سیگنال از مقدار ‪ 7.1‬تا ‪ 7.25‬ثانیه بخوانید‪ .‬به نظرتان این قسمت از سیگنال بیان کننده چه‬
‫صدایی است؟ دلیل خود را بیان کنید‪.‬‬
‫‪ .3‬جهت بدست آوردن چهار ‪ Formant‬اولیه که فرکانس آنها بیشتر از ‪ 90 Hz‬با پهنای باند کمتر از ‪400Hz‬‬
‫است ‪ ،‬مراحل زیر را گام به گام بر روی سیگنال حاصل از قسمت ‪ 2‬اجرا نمایید‪.‬‬
‫‪ .3.1‬پنجره بندی بخش گفتار‪ :‬مشخص کنید که از چه تابعی برا ی پنجره بندی سیگنال استفاده میکنید و در‬
‫مورد دلیل انتخاب خود توضیح دهید‪.‬‬
‫‪ .3.2‬فیلتر زیر را بر روی سیگنال اعمال کنید‪.‬‬
‫;]‪HFilter= [1 0.63‬‬
‫; )‪Y= filter( 1 , HFilter , x‬‬
‫‪ .3.3‬ضرایب ‪ LPC‬را بدست آورید (مرتبهی پیشگو کننده ی خطی را ‪ 9‬در نظر بگیرید)‪.‬‬
‫‪ .3.4‬ریشه چند جمله ای حاصل از ظرایب ‪ LPC‬را بدست آورید‪.‬‬
‫‪ .3.5‬زاویه متناسب با هر ریشه را بر حسب ‪ HZ‬محاسبه کنید‪.‬‬
‫‪ .3.1‬پهنای باند سیگنال را با استفاده از دستور زیر مشخص کنید‪.‬‬
‫‪BandWith= -1/2 * (Fs/(2*pi))*log(x)); % x is vector of roots‬‬
‫‪ .3.0‬چهار ‪ Formant‬اولیه که فرکانس آنها بیشتر از ‪ 90 Hz‬با پهنای باند کمتر از ‪ 400Hz‬است را بدست‬
‫آورید‪.‬‬
‫ج) کوانتایزر غیرخطی‬
‫همانطور که میدانید برای اعمال کوانتیزاسیون غیرخطی از دو روش استفاده میشود‪ .‬ابتدا فرمول زیر که مربوط به‬
‫روش ‪ µ-law‬میباشد را به صورت یک تابع در متلب پیادهسازی نمایید‪( .‬مقدار ‪ µ=255‬و بازه ]‪)x=[-1,1‬‬
‫‪ .1‬فایل ضمیمه همراه تمرین با نام ‪ speech.wav‬که با ‪ 11‬بیت کوانتایز شده است را در متلب بارگذاری نموده و‬
‫تابع نوشته شده باال را بر روی آن اعمال نمایید‪.‬‬
‫ راهنمایی ‪ :1‬برای بارگذاری فایل صوتی در متلب از دستور ‪ wavread‬با پارامتر ‪ native‬استفاده کنید‪.‬‬‫جزئیات این دستور را در راهنمای متلب دنبال کنید‪.‬‬
‫ راهنمایی ‪ : 2‬برای بردن محدوده ورودی به بازه ]‪ [-1,1‬و اعمال تابع نوشتهشدهتان میتوانید مقادیر ورودی‬‫را به ‪ 32018‬تقسیم کنید و سپس تابعتان را اعمال نمایید‪ .‬همچنین مقادیر خروجی را در ‪ 120‬ضرب کنید‬
‫تا خروجی در محدوده ‪ 8‬بیت قرار گیرد‪.‬‬
‫‪ .2‬پس از انجام این کار به فایل اصلی و سیگنال خروجی گوش دهید‪ .‬آیا تفاوتی حس میکنید؟ دلیل آن چیست؟‬
‫‪ .3‬نمودار این دو سیگنال (اصلی و کوانتایز شده) را در حوزه زمان رسم نمایید‪ .‬در مورد تفاوت این دو نیز مختصر‬
‫توضیح دهید‪.‬‬
‫‪ .4‬حال در این قسمت بایستی عکس تابع نوشته شده خود را نیز پیادهسازی نموده و آن را به فایل کوانتایزشده‬
‫خود اعمال کنید‪ .‬انتظار این است که پس از انجام این کار همان فایل اصلی به دست آید‪ .‬آیا این انتظار تحقق‬
‫مییابد؟ دلیل آن را تشریح نمایید‪.‬‬
‫‪ .5‬نمودار سیگنال اصلی و سیگنال بازیابیشده پس از دیکوانتایز را در حوزه زمان رسم نمایید‪ .‬در مورد تفاوت این‬
‫دو نیز مختصر توضیح دهید‪.‬‬
‫‪ .1‬نمودار خطای عمل کونتایز نسبت به فایل اصلی و همچنین نمودار خطای عمل دیکوانتایز نسبت به فایل اصلی‬
‫را در حوزه زمان رسم کنید‪.‬‬
‫د) کد کردن پیشگویانه‬
‫همانطور که می دانید در یک شکل موج صوت معمولی مثالً صحبت و یا حتی آهنگهای مالیم نمونههای متوالی‬
‫زیادی دارای مقادیر مشابهی هستند‪ .‬یک راه برای فشردهسازی بیشتر استفاده از این تشابهها و استفاده از کد کردن‬
‫به روش پیشگویی خطی است‪.‬‬
‫در این روش در قسمت کدکننده‪ 2‬در ابتدا نمونه فعلی از روی ترکیب خطی نمونههای قبلی ساختهشده تخمین زده‬
‫شده و سپس مقدار خطای بین نمونه اصلی و نمونه پیشبینیشده کوانتایز شده و کد میشود‪.‬‬
‫در قسمت کدگشا‪ 3‬نیز ابتدا همان مقدار پیشبینی شده از روی نمونههای قبلی کدگشاییشده ساخته میشود‪ .‬سپس‬
‫مقدار خطایی که در سمت کدکننده کوانتایز شده است به آن اضافه میگردد‪.‬‬
‫در این قسمت می خواهیم سناریوی ذکر شده فوق را در متلب پیاده نموده و همان فایل قسمت ج را این بار با این‬
‫روش مورد آزمایش قرار دهیم‪ inputFile ( .‬همان فایل ‪ speech.wav‬میباشد‪).‬‬
‫‪ .1‬ابتدا یک تابع بنویسید که یک فایل صوتی و تعداد بیتهای خروجی را به عنوان ورودی دریافت کرده و دو بردار‬
‫تفاضل نمونهها و بردار خطا را باز میگرداند‪.‬‬
‫)‪function [differ, err] = dpcm(inputFile, n‬‬
‫تابع شما باید سه کار زیر را به ترتیب انجام دهد‪:‬‬
‫ تفاوت هر دو نمونه متوالی از سیگنال ورودی را با کمک تابع ‪ diff‬متلب محاسبه نماید‪.‬‬‫ این تفاوتها را در محدوده ]‪ [-2n-1, 2n-1 -1‬کوانتایز خطی نمایید و خروجی آن را در برداری به نام‬‫‪( differ‬یکی از خروجیهای این تابع) ذخیره نمایید‪.‬‬
‫ یک بردار با نام ‪ err‬ایجاد کنید که تفاوت هر درایه ‪ differ‬را با مقدار آن پیش از کوانتایز کردن نگه دارد‪.‬‬‫‪ .2‬تابع ‪ idpcm‬که عکس تابع فوق است را نیز پیادهسازی نمایید‪ .‬این تایع‪ ،‬اولین نمونه سیگنال اصلی را به همراه‬
‫بردار ‪ differ‬گرفته و سیگنال اولیه را بازسازی مینماید‪.‬‬
‫ راهنمایی‪ :‬به منظور سادگی کار‪ ،‬فرض کنید که نمونه فعلی فقط از روی یک نمونه قبلی ساخته می شود‪.‬‬‫‪ .3‬با قرار دادن مقدار ‪ 4‬برای ‪ n‬تفاوت سیگنال بازسازیشده و سیگنال اولیه را محاسبه نمایید و با بردار ‪err‬‬
‫مقایسه نمایید‪.‬‬
‫‪ .4‬به سیگنال اصلی و بازسازی شده گوش دهید‪ .‬چه تفاوتی بین آنها وجود دارد؟‬
‫‪ .5‬مقدار ‪ n‬را به ‪ 8‬و ‪ 2‬تغییر داده و دوباره به سیگنالها گوش دهید‪ .‬آیا تغییر مقدار ‪ n‬روی کیفیت سیگنال‬
‫بازسازیشده تأثیر قابل توجهی دارد؟ علت چیست؟‬
‫«موفق باشید»‬
‫موضوع تمرین بعدی‪ :‬پردازش تصویر‬
‫‪2‬‬
‫‪. Encoder‬‬
‫‪. Decoder‬‬
‫‪3‬‬