بسمه تعالی
پایان نامه کارشناسی ارشد مخابرات سیستم
پیاده سازی بلادرنگ کدک صحبت استاندارد G.728
بر روی پردازنده TMS320C5402
استاد راهنما :
نگارش :
شهریور 1381
تقدیم به
پدر و مادر عزیز و همسر مهربانم
به پاس محبت های بیدرغشان
از راهنمائی ها و الطاف استاد عزیزم جناب آقای و از یاری و مشاوره جناب آقای و همچنین از مسئولان مرکز تحقیقات مخابرات ایران صمیمانه سپاسگزارم .
K.N.T. University of Technology
Real Time Implementation of G.728
Speech Codec using
TMS320C5402
By: Asghar Pourhosein
Advisor: Dr. M.E. Kalantari
A Thesis submitted to faculty of Electrical Engineering in partial fulfillment
Of the requirements of the degree of M.Sc.
Summer 2002
Abstract
G.728 speech codec is a low delay ITU standard codec which could provide toll quality speech in 16kb/s. It is specially designed for delay sensitive applications like satellite telephony, Internet, and mobile networks.
In this thesis real time implementation of full duplex G.728 encoder and decoder on TMS320C5402 is presented. Using a combinatorial technique for TMS programming, the programming time and complexity have been decreased to 30% comparing with traditional assembly programming. First a fixed point simulation of the codec algorithm has been programmed in C and it is compiled to assembly using CCS (Code Composer Studio) and manually optimized. Then some of the critical functions regarding MIPS, have been programmed in assembly for achieving real time implementation. Finally, implementation results have been presented.
Keywords: Speech Coding & Compression, Real Time Implementation, DSP,
TMS320C5402, DSK Board
چکیده
کدک صحبت استاندارد G.728 ، یک کدک کم تاخیر است که صحبت با کیفیت عالی را در نرخ بیت 16 kbps ارائه می دهد و برای شبکه های تلفن ماهواره ای و اینترنت و موبایل که به تاخیر زیاد حساس هستند ، مناسب است. در این رساله به پیاده سازی بلادرنگ اینکدر و دیکدر G.728 بصورت دوطرفه کامل ( Full Duplex ) بر روی پردازنده TMS320C5402 می پردازیم .
روشی ترکیبی برای برنامه نویسی TMS ارائه می شود که در آن زمان وپیچیدگی برنامه نویسی نسبت به برنامه نویسی دستی به 30% کاهش می یابد . در این روش پس از برنامه نویسی و شبیه سازی ممیزثابت الگوریتم کدک به زبان C ، با استفاده از نرم افزار ( Code Composer Studio ) CCS ، برنامه به زبان اسمبلی ترجمه شده و بهینه سازی دستی در کل کد اسمبلی صورت می گیرد . سپس بعضی از توابع مهم برنامه از نظر MIPS ، بصورت دستی به زبان اسمبلی بازنویسی می شوند تا برنامه بصورت بلادرنگ قابل اجرا گردد . در پایان نتایج این پیاده سازی ارائه می شود .
کلمات کلیدی
کدینگ و فشرده سازی صحبت ، پیاده سازی بلادرنگ ، DSP ، TMS320C5402 ، برد DSK
فهرست
– مقدمه 4
فصل 1 : بررسی و مدل سازی سیگنال صحبت
1-1- معرفی سیگنال صحبت 6
1-2- مدل سازی پیشگویی خطی 10
1-2-1- پنجره کردن سیگنال صحبت 11
1-2-2- پیش تاکید سیگنال صحبت 13
1-2-3- تخمین پارامترهای LPC 14
فصل 2 : روش ها و استانداردهای کدینگ صحبت
2-1- مقدمه 15
2-2- روش های کدینگ 19
2-2-1- کدرهای شکل موج 21
2-2-2- کدرهای صوتی 22 2-2-3- کدرهای مختلط 24
الف- کدرهای مختلط حوزه فرکانس 27
ب- کدرهای مختلط حوزه زمان 29
فصل 3 : کدر کم تاخیر LD-CELP
3-1- مقدمه 34
3-2- بررسی کدرکم تاخیر LD-CELP 36
3-2-1- LPC معکوس مرتبه بالا 39
3-2-2- فیلتر وزنی شنیداری 42
3-2-3- ساختار کتاب کد 42
3-2-3-1- جستجوی کتاب کد 43
3-2-4- شبه دیکدر 45
3-2-5- پست فیلتر 46
فصل 4 : شبیه سازی ممیزثابت الگوریتم به زبان C
4-1- مقدمه 49
4-2- ویژگی های برنامه نویسی ممیزثابت 50
4-3- ساده سازی محاسبات الگوریتم 53
4-3-1- تطبیق دهنده بهره 54
4-3-2- محاسبه لگاریتم معکوس 58
4-4- روندنمای برنامه 59
4-4-1- اینکدر 63
4-4-2- دیکدر 69
فصل 5 : پیاده سازی الگوریتم برروی DSP
5-1- مقدمه 74
5-2- مروری بر پیاده سازی بلادرنگ 75
5-3- چیپ های DSP 76
5-3-1- DSP های ممیزثابت 77
5-3-2- مروری بر DSP های خانواده TMS320 78
5-3-2-1- معرفی سری TMS320C54x 79
5-4- توسعه برنامه بلادرنگ 81
5-5- اجرای برنامه روی برد توسعه گر C5402 DSK 82
5-5-1- بکارگیری ابزارهای توسعه نرم افزار 84
5-5-2- استفاده از نرم افزارCCS 86
5-5-3- نتایج پیاده سازی 94
5-6- نتیجه گیری و پیشنهاد 97
– ضمائم
– ضمیمه (الف) : دیسکت برنامه های شبیه سازی ممیز ثابت به زبان C و
پیاده سازی کدک به زبان اسمبلی – ضمیمه (ب) : مقایسه برنامه نویسی C و اسمبلی 98
– مراجع 103
– مقدمه
امروزه در عصر ارتباطات و گسترش روزافزون استفاده از شبکه های تلفن ،موبایل و اینترنت در جهان ومحدودیت پهنای باند در شبکه های مخابراتی ، کدینگ و فشرده سازی صحبت امری اجتناب ناپذیر است . در چند دهه اخیر روشهای کدینگ مختلفی پدیدآمده اند ولی بهترین و پرکاربردترین آنها کدک های آنالیزباسنتز هستند که توسط Atal & Remedeدر سال 1982 معرفی شدند [2] . اخیرا مناسبترین الگوریتم برای کدینگ صحبت با کیفیت خوب در نرخ بیت های پائین و زیر 16 kbps ، روش پیشگویی خطی باتحریک کد (CELP) می باشد که در سال 1985 توسط Schroeder & Atal معرفی شد [8] و تا کنون چندین استاندارد مهم کدینگ صحبت بر اساس CELP تعریف شده اند .
در سال 1988 CCITT برنامه ای برای استانداردسازی یک کدک 16 kbps با تاخیراندک و کیفیت بالا در برابر خطاهای کانال آغاز نمود و برای آن کاربردهای زیادی همچون شبکه PSTN ،ISDN ،تلفن تصویری و غیره در نظر گرفت . این کدک در سال 1992 توسط Chen et al. تحت عنوان LD-CELP معرفی شد[6] و بصورت استاندارد G.728 در آمد[9] و در سال 1994 مشخصات ممیز ثابت این کدک توسط ITU ارائه شد[10] . با توجه به کیفیت بالای این کدک که در آن صحبت سنتزشده از صحبت اولیه تقریبا غیرقابل تشخیص است و کاربردهای آن در شبکه های تلفن و اینترنت و ماهواره ای در این گزارش به پیاده سازی این کدک می پردازیم .
در فصل اول به معرفی وآنالیز سیگنال صحبت پرداخته می شود و در فصل دوم روش ها و استانداردهای کدینگ بیان می شوند . در فصل سوم کدک LD-CELP را بیشتر بررسی می کنیم و در فصل چهارم شبیه سازی ممیز ثابت الگوریتم به زبان C را بیان می نمائیم. ودر پایان در فصل 5 به نحوه پیاده سازی بلادرنگ کدکG.728 بر روی پردازنده TMS320C5402 می پردازیم.
فصل 1
بررسی و مدل سازی سیگنال صحبت
1-1 -معرفی سیگنال صحبت
صحبت در اثر دمیدن هوا از ریه ها به سمت حنجره و فضای دهان تولید میشود. در طول این مسیر در انتهای حنجره، تارهای صوتی1 قرار دارند. فضای دهان را از بعد از تارهای صوتی ، لوله صوتی2 مینا مند که در یک مرد متوسط حدود cm 17 طول دارد . در تولید برخی اصوات تارهای صوتی کاملاً باز هستند و مانعی بر سر راه عبور هوا ایجاد نمیکنند که این اصوات را اصطلاحاً اصوات بی واک 3 مینامند. در دسته دیگر اصوات ، تارهای صوتی مانع خروج طبیعی هوا از حنجره میگردند که این باعث به ارتعاش درآمدن تارها شده و هوا به طور غیر یکنواخت و تقریباً پالس شکل وارد فضای دهان میشود. این دسته از اصوات را اصطلاحاً باواک4 میگویند.
فرکانس ارتعاش تارهای صوتی در اصوات باواک را فرکانس Pitch و دوره تناوب ارتعاش تارهای صوتی را پریود Pitch مینامند. هنگام انتشار امواج هوا در لوله صوتی، طیف فرکانس این امواج توسط لوله صوتی شکل میگیرد و بسته به شکل لوله ، پدیده تشدید در فرکانس های خاصی رخ میدهد که به این فرکانس های تشدید فرمنت5 میگویند.
از آنجا که شکل لوله صوتی برای تولید اصوات مختلف، متفاوت است پس فرمنت ها برای اصوات گوناگون با هم فرق میکنند. با توجه به اینکه صحبت یک فرآیند متغییر با زمان است پس پارامترهای تعریف شده فوق اعم از فرمنت ها و پریود Pitch در طول زمان تغییر میکنند به علاوه مد صحبت به طور نامنظمی از باواک به بی واک و بالعکس تغییر میکند. لوله صوتی ، همبستگی های زمان-کوتاه ، در حدود 1 ms ، درون سیگنال صحبت را در بر میگیرد. و بخش مهمی از کار کدکننده های صوتی مدل کردن لوله صوتی به صورت یک فیلتر زمان-کوتاه میباشد. همان طور که شکل لوله صوتی نسبتاً آهسته تغییر میکند، تابع انتقال این فیلتر مدل کننده هم نیاز به تجدید6 ، معمولاً در هر 20ms یکبارخواهد داشت.
در شکل (1-1 الف) یک قطعه صحبت باواک که با فرکانس 8KHz نمونه برداری شده است دیده میشود. اصوات باواک دارای تناوب زمان بلند به خاطر پریود Pitch هستند که نوعاً بین 2ms تا 20ms میباشد. در اینجا پریود Pitch در حدود 8ms یا 64 نمونه است. چگالی طیف توان این قطعه از صحبت در شکل (1-1 ب) دیده میشود[3].
اصوات بی واک نتیجه تحریک نویز مانند لوله صوتی هستند و تناوب زمان- بلند اندکی را در بر دارند ، همانگونه که در شکل های (1-1 ج) و (1-1 د) دیده میشود ولی همبستگی زمان کوتاه به خاطر لوله صوتی در آنها هنوز وجود دارد.
بطورکلی سیگنال صحبت دارای افزونگی7 زیادی است که ناشی از عوامل ذیل هستند:
ـ وابستگی های زمان-کوتاه : این وابستگی ها عمدتاً به کندی تغییرات صحبت با زمان و ساختار
( الف) (ب)
(ج) (د)
شکل (1-1) : مقایسه اصوات باواک و بی واک. (الف)و(ب) : باواک ، (ج)و(د) : بی واک
نسبتاً منظم فرمنت ها مربوط میشوند.
ـ وابستگی های زمان- بلند : که عمدتاً از طبیعت نیمه متناوب اصوات با واک و تغییرات آرام پریود Pitch ناشی میشوند.
ـ تابع چگالی احتمال صحبت : علیرغم پیچیدگی آماری صحبت میتوان آن را با توابع چگالی احتمال شناخته شده تقریب زد. شکل لوله صوتی و مد تحریک آن به صورت نسبتاً آرام تغییر میکند و بنابراین صحبت را میتوان به صورت شبه ایستان در دوره های کوتاه زمانی (حدود 20ms) در نظر گرفت و با یک فرآیند تصادفی ارگادیک در یک قطعه زمانی کوچک مدل نمود و طیف مشخصی برای آن در این قطعه زمانی بدست آورد.
علاوه بر افزونگی های فوق عامل مهم دیگری که کاهش نرخ داده سیگنال صحبت را ممکن می سازد، طبیعت غیر حساس گوش انسان نسبت به بسیاری از ویژگیهای این سیگنال میباشد.
1-2- مدل سازی پیشگویی خطی
روش کدینگ پیشگویی خطی (LPC8) مبتنی بر مدل تولید صحبت در کد کننده های صوتی میباشد که در اینجا در شکل (1-2) نشان داده شده است. برای استفاده از مدل لازم است که معلوم شود سیگنال با واک است یا بیواک و اگر با واک است پریود Pitch مجاسبه گردد. تفاوت اصلی بین LPC و سایر کدکننده های صوتی در مدل کردن لوله صوتی است. در تحلیل LPC ، لوله صوتی به صورت یک فیلتر دیجیتال تمام قطب در نظر گرفته میشود.[4,1].
شکل (1-2): مدل تولید صحبت در LPC
با شرکت دادن بهره G در این فیلتر داریم:
که در آن p مرتبه فیلتر است. اگر S(n) خروجی فیلتر مدل صحبت و e(n) تحریک ورودی باشد، معادله فوق را در حوزه زمان به صورت زیر میتوان نوشت:
به عبارت دیگر هر نمونه صحبت به صورت ترکیب خطی از نمونه های قبلی قابل بیان است و این دلیل نام گذاری کدینگ پیشگویی خطی (LPC) میباشد.
1-2-1- پنجره کردن سیگنال صحبت
روش LPC هنگامی دقیق است که به سیگنالهای ایستان9 اعمال شود، یعنی به سیگنالهایی که رفتار آنها در زمان تغییر نمیکند. هر چند که این موضوع در مورد صحبت صادق نیست، اما برای اینکه بتوانیم روش LPC را بکار ببریم، سیگنال صحبت را به قسمت های کوچکی بنام "فریم" تقسیم میکنیم که این فریم ها شبه ایستان هستند. شکل (1-3) مثالی از قسمت بندی سیگنال صحبت را نشان میدهد. این قسمت بندی با ضرب کردن سیگنال صحبت S(n) ، در سیگنال پنجره W(n) انجام میشود.
شکل (1-3) : قسمت بندی سیگنال صحبت
معروف ترین انتخاب برای پنجره ، پنجره همینگ (Hamming) به صورت زیر است:
در اینجا N ، طول پنجره دلخواه به نمونه و عموماً در محدوده 160-320 انتخاب میگردد که 240 یک مقدار نوعی میباشد . در شکل (1-4) چند پنجره معروف نشان داده شده است.
معمولاً پنجره های متوالی برروی هم همپوشانی دارند و فاصله بین آنها را پریود فریم میگویند. مقادیر نوعی برای پریود فریم 10-30ms میباشد. این انتخاب به نرخ بیت و کیفیت صحبت دلخواه ما بستگی خواهد داشت. هر چه پریود فریم کوچکتر باشد، کیفیت بهتری خواهیم داشت.
شکل (1-4): نمایش چند پنجره معروف
1-2-2- پیش تاکید سیگنال صحبت
شکل (1-5) یک توزیع طیفی نمونه سیگنال صحبت را برای اصوات باواک نشان میدهد. با توجه به افت طیف در فرکانس های بالا وضعیف بودن فرکانس های بالا در طیف صحبت ، تحلیل LPC در فرکانس های بالا عملکرد ضعیفی خواهد داشت. برای تقویت مولفه های فرکانس بالا صحبت ، آن را از یک فیلتر بالا گذر با تابع انتقال که فیلتر پیش تاکید نامیده میشود، عبور میدهیم. مقدار نوعی ضریب a معمولاً در نظر گرفته میشود.
اگر S(n) سیگنال ورودی باشد، سیگنال پیش تاکید شده خواهد شد:
شکل (1-5) : پوشش طیفی نمونه اصوات باواک
1-2-3- تخمین پارامترهای LPC
در اینجا لازم است که پارامترهای مدل LPC یعنی ضرایب ai فیلتر و بهره G تعیین گردند. اگر
تخمین S(n) از روی نمونه های قبلی باشد، ضرایب ai را چنان تعیین میکنیم که خطای
روی همه نمونه های موجود مینیمم گردد. این مینیمم سازی ما را به معادلات خطی زیر میرساند:
و یا در فرم ماتریسی
R.a = -r
در معادلات فوق تعریف زیر را داریم:
کهr(i) ، iامین اتوکورلیشن سیگنال میباشد و فرض شده که S(n) به طول N پنجره شده است. این فرمولاسیون به روش اتوکورلیشن معروف است و ماتریس R در آن یک ماتریس Toeplitz میباشد. چنین ماتریسی غیرمنفرد و همیشه معکوس پذیر است و در نتیجه همواره میتوانیم جوابی به صورت a = -R-1r داشته باشیم.
روش دیگری نیز بنام روش کواریانس وجود دارد. در این روش سیگنال صحبت S(n) پنجره نمیشود و به جای اتوکورلیش های r(i) ، کواریانس های r(i,j) برای عنصر (i,j) ماتریس R محاسبه میگردد:
در اینجا تضمین نمیشود که ماتریس R معکوس پذیر باشد و ممکن است که سیستم معادلات فوق جواب نداشته باشد. در این حالت فیلتر LPC ناپایدار میشود. از این رو در اینجا بیش از این به روش کواریانس نمیپردازیم.
راه سوم روش Burg است که امتیاز عدم استفاده از پنجره را در روش کواریانس با امتیاز روش اتوکورلیشن یعنی تضمین پایداری فیلتر ، ترکیب میکند. این روش از ساختار مشبک10 فیلتر تمام قطب استفاده میکند[1] .
جواب دستگاه معادلات فوق را میتوان با یکی از روش های کلاسیک آنالیز عددی مثل حذف گوسی بدست آورد. اما چون R یک ماتریس Toeplitz است میتوان از روشی موثر بنام روش تکرار Durbin سود جست که بصورت زیر ضرائب فیلتر را تولید می کند :
که در آن ، ضریب j ام فیلتردر تکرار i ام و E(i) خطای پیشگویی مرتبه i است و بدین ترتیب ضرایب فیلتر بصورت زیر بدست خواهند آمد:
روش تکرار Durbin پارامترهای را که ضرایب انعکاس نامیده میشوند و E(p) را بدست میدهد که مربع بهره پیشگویی G و مورد نیاز فیلتر سنتز میباشد:
و چون داریم :
میتوانیم به جای E(p) ،r(0) را کد کرده و ارسال داریم و از آنجا به بهره G برسیم و این ترجیح داده میشود زیرا حساسیت r(0) به نویز کوانتیزاسیون کمتر از G است.
ضرایب انعکاس Ki یا PARCOR (برای PARtial CORrelation) نقش مهمی در تحلیل LPC دارند و دارای خواص زیر هستند:
1- ضرایب انعکاس Ki معادل با ضرایب فیلتر ai هستند . به عبارت دیگر میتوان K را به a و برعکس تبدیل کرد :
K به a :
a به K :
2ـ برای یک فیلتر پایدار یعنی یک فیلترLPC که همه قطب های آن داخل دایره واحد باشد داریم:
که این شرط بسیار مهمی است چرا که با اطمینان از اینکه Ki بین -1 و +1 است حتی بعد از کوانیتزاسیون ، پایداری فیلتر تضمین خواهد شد. به علاوه محدوده (-1 , +1) کار کوانیتزاسیون را سادهتر میکند. ولی ai ها دارای چنین ویژگی نیستند که پایداری فیلتر را تضمین نمایند و کوانیتزاسیون ai ها میتواند موجب ناپایداری شود.
فصل2
روش ها و استاندارهای کدینگ صحبت
2-1- مقدمه
کدینگ دیجیتال صحبت موضوع تحقیقات بیش از سه دهه اخیر بوده و روش های زیادی برای کدینگ صحبت پدید آمده است .کیفیت صحبت و نرخ بیت دو عامل اساسی هستند که بطور مستقیم با هم درگیر می باشند و هر چه نرخ بیت پایین تر بیاید ، از کیفیت صحبت کاسته می شود. برای سیستم هایی که به شبکه تلفن متصل می شوند ، صحبت کد شده باید دارای کیفیت خوب باشد تا با استانداردهای ITU11 مطابقت داشته باشد اما برای سیستم های محدود مانند شبکه های تجاری خصوصی و سیستم های نظامی ، ممکن است عامل نرخ بیت مهمتر از کیفیت بالای صحبت باشد . از ویژگیهای سیستم های کدینگ صحبت ، تاخیر کدینگ می باشد که مقدار آن به کیفیت مورد نیاز سیستم ارتباط نزدیک دارد .تاخیر کدینگ شامل تاخیر الگوریتمی (بافر کردن صحبت برای آنالیز)، تاخیر محاسباتی (زمان لازم برای پردازش و ذخیره کردن نمونه های صحبت) و تاخیر مربوط به ارسال و انتقال می باشد . تاخیر اندک در سیستم های مخابراتی باعث کاهش اثراکو در آن سیستم می شود. از ویژگیهای دیگر سیستم ها توانایی آنها برای ارسال داده در باند صوتی است . چرا که مشخصه های آماری و طیف فرکانسی داده باند صوتی کاملا با سیگنال صحبت تفاوت دارد .
2-2- روشهای کدینگ
روشهای کدینگ صحبت را می توان به چند دسته اصلی که در شکل (2-1) نشان داده شده است تقسیم بندی نمود. از این میان سه دسته اصلی که با خط پر نشان داده شده اند موضوع تحقیقاتی بیشتری هستند . این روشها سیگنال صحبت را آنالیز کرده افزونگی های آنرا حذف نموده و بخش های غیر زائد صحبت را به روشی کد می کنند که از نظر شنیداری قابل قبول باشد.
شکل (2-1) : دسته بندی روشهای کدینگ
کدرهای شکل موج12 نوعا نرخ بیت بالایی دارند و صحبت بازسازی شده را با کیفیت خیلی خوب ارائه می دهند. کدرهای صوتی13 در نرخ بیت های خیلی پایین کار می کنند و صحبت را از طریق سنتز بازسازی می کنند . کدرهای مختلط ترکییبی از تکنیک های صوتی و شکل موج را بکار می گیرند و صحبت با کیفیت خوب را در نرخ بیت های میانی ارائه می دهند.
در شکل (2-2) کیفیت صحبت بر حسب نرخ بیت برای سه دسته اصلی کدینگ یعنی کدینگ شکل موج ، کدینگ صوتی و کدینگ مختلط نشان داده شده است . همچنین خلاصه ای از کاربردهای روشهای در حال کار و آنهایی که در حال توسعه می باشند در جدول (2-1) گردآوری شده است [5] .
شکل (2-2) : مقا یسه کیفیت صحبت روشهای کدینگ صحبت
Year of Operation
Type of Coder
Application
Rate (kbps)
1972
PCM
PSTN (1st Generation)
64
1984
ADPCM
PSTN (2nd Generation)
32
1992
LD-CELP
PSTN (3rd Generation)
16
1985
APC
INMARSAT-B
16
1991
RPE-LTP
GSM
13
1990
MPLPC
Skyphone
9.6
1992
VSELP
North American Mobile
8
1993
MBE-CELP
INMARSAT-M
(land mobile)
6.4
1991
CELP
U.S. Gov.Fed.Standard
4.8
1991
Vector Adaptive Predictive Coding VAPC
NASA MSAT-X
(mobile satellite)
4.8
جدول (2-1): استاندارد های کدینگ صحبت
2-2-1- کدرهای شکل موج
کدرهای شکل موج تلاش می کنند که شکل کلی سیگنال صحبت را حفظ نمایند. این کدرها می توانند هر شکل موجی در باند صوتی را قبول کنند و صرفا مختص صحبت نیستند . از آنجا که
در این کدرها کدینگ به صورت نمونه به نمونه انجام می شود ، عملکرد آنها همانند کوانتیزاسیون بوسیله نسبت سیگنال به نویز (SNR) اندازه گیری می شود. کدینگ های شکل موج برای صحبت، به نرخ بیت های بالای 16kbps محدود می شود و بخاطر سادگی و پیاده سازی آسان ، فراگیر شده اند .
اولین استاندارد جهانی کدینگ صحبت استاندارد G.711 64 kbps PCM ، با کمپندینگ u-law برای امریکای شمالی و A-law برای اروپا، یک کدر شکل موج بوده و هنوز هم کاربرد زیادی در سیستم های مخابراتی دیجیتال دارد . از آنجا که کیفیت صحبتPCM 64 kbps عالی می باشد ، معمولا مرجعی برای مقایسه دیگر کدرهای صحبت با نرخ بیت پایین تر قرار می گیرد . کدر بعدی که توسطCCITT استاندارد شده PCM تفاضلی تطبیقی (ADPCM 14) 32 kbps می باشد . کاهش نرخ بیت به نصف در این کدر، از طریق اعمال پیشگویی و کوانتیز اسیون تطبیقی حاصل شده است.
2-2-2- کدرهای صوتی (Vocoders)
بر خلاف کدرهای شکل موج ، کدرهای صوتی خیلی به صحبت وابسته هستند و در اصولشان هم سعی ندارند که شکل موج اصلی صحبت را حفظ نمایند . یک کدرصوتی از یک آنالیزکننده و یک سنتزکننده تشکیل شده است . آنالیزکننده از صحبت اصلی یک دسته پارامتررا که نمایش دهنده مدل تولید صحبت هستند ، استخراج نموده و آنها را ارسال می کند و در گیرنده ، صحبت با استفاده از این پارامترها بازسازی می شود.
در شکل(2-3) مدل تولید صحبت در کدرهای صوتی نشان داده شده است . لوله صوتی بصورت یک فیلتر متغیر با زمان نمایش داده می شود. برای قطعات بی واک صحبت،این فیلتر بایک منبع نویز سفید تحریک می گردد و برای قطعات باواک صحبت بوسیله یک قطار پالس باپریود pitch تحریک می شود.
کدرهای صوتی معمولا در محدوده 2.4kbps کار می کنند و کیفیت قابل قبول آنها از صدای طبیعی فاصله دارد . از معروفترین آنها می توان کدرصوتی استاندارد LPC-10 2.4kbps را نام برد[5].
شکل (2-3) : مدل تولید صحبت درکدرهای صوتی
سیستم های حوزه فرکانس هم، مانند کدرهای صوتی فرمنت درپردازش صحبت بکار می روند . کدرهای صوتی فرمنت صحبت را با تحریک یک دسته از فیلترهای میانگذر که پهنای باند و فرکانس مرکزی آنها با فرمنت های صحبت منطبق هستند ، سنتر می کنند و عملکرد آنها به تعیین مکان دقیق فرمنت ها بستگی دارد.
2-2-3- کدرهای مختلط
کدرهای مختلط که از ویژگی های هر دوروش کدینگ صوتی و کدینگ شکل موج استفاده می کنند به دو دسته حوزه فرکانس و حوزه زمان تقسیم بندی می شوند :
الف- کدرهای مختلط حوزه فرکانس
ایده اصلی در کدینگ حوزه فرکانس ،تقسیم طیف صحبت به باندهای فرکانسی یا مولفه هایی با استفاده از بانک فیلتر و یا یک بلوک تبدیل می باشد .در مرحله دیکدینگ ، این مولفه های فرکانسی برای بازسازی یک کپی از شکل موج ورودی ، از طریق مجموع بانک فیلترها یا تبدیل معکوس ، استفاده می شوند.
– کدینگ زیر باندی و تبدیل تطبیقی
دو روش معروف کدینگ صحبت در حوزه فرکانس ، کدینگ زیر باندی (SBC15) و کدینگ تبدیل تطبیقی (ATC 16)هستند . اصول پایه در هر دو روش تقسیم طیف صحبت ورودی به تعدادی باند فرکانسی است که هر یک جداگانه کد می شوند . درSBC یک بانک فیلتر به صحبت ورودی اعمال می شود تا آنرا به 4تا16 باند فرکانسی تقسیم نماید. ATC یا بعبارت دیگر روش بلوک تبدیل ، تبدیلی به اندازه نوعی 128تا 256 نمونه را بکار می برد تا تفکیک فرکانسی بهتری را فراهم آورد .
در کدینگ زیر باندی بعد از تقسیم طیف صحبت ورودی به تعدادی زیر باند ، هرزیرباند چندتایکی17،کوانتیره ، کد و مالتی پلکس و سپس ارسال می گردد. در گیرنده این زیر باندها دیمالتی پلکس ، دیکد و بوسیله درونیابی18 به فرکانس اولیه خود برمی گردند . سیگنالهای زیر باندی حاصل سپس با هم جمع می شوند تا تقریبی از صحبت اصلی را بوجود آورند . در شکل (2-4) بلوک دیاگرام اینکدر و دیکدر زیر باندی نشان داده شده است .
شکل(2-4) بلوک دیاگرام یک کدر زیر باندی نمونه
کدرهای تبدیل تطبیقی (ATC) یک روش پیچیده تر آنالیز حوزه فرکانس هستند که شامل بلوکی از تبدیل های قطعات پنجره شده صحبت ورودی می باشند . هر قطعه با یک دسته از ضرائب تبدیل نمایش داده می شود که جداگانه کوانتیزه و ارسال می گردند .درگیرنده این ضرائب کوانتیزه و تبدیل معکوس شده تا یک کپی از قطعه اصلی را بازسازی نماید. سپس قطعات مجاور به هم متصل شده تا صحبت سنتز شده را شکل دهند . در شکل (2-5) بلوک دیاگرام یک کدر ATC نشان داده شده است .
شکل (2-5) : بلوک دیاگرام یک کدر تبدیل تطبیقی
کدرهای SBC وATC که در بالا بحث شدند، صحبت با کیفیت بالا در 16kpbs تولید می کنند اما کیفیت صحبت در نرخ بیت حدود 8kbps بدلیل عدم حضور پیشگویی Pitch افت می کند بنابراین محدوده عملیاتی آنها را 16kpbs تا 9.6kbps در نظر می گیرند .
ب) کدرهای مختلط حوزه زمان
کدرهای مختلط حوزه زمان از روش پیشگویی خطی استفاده می کنند . با بکار گیری یک مدل منبع- فیلتر که فرض می کند صحبت نتیجه تحریک یک فیلتر متغیر با زمان بوسیله یک قطار پالس پریودیک برای اصوات باواک و یا یک منبع نویز تصادفی برای اصوات بی واک است ، می توان مشخصات آماری سیگنال صحبت را بسیار دقیق مدل کرد.
روش کدینگ پیشگویی تطبیقی(APC19) که در شکل (2-6) نشان داده شده است ، در اصل توسط schroeder , Atal ابداع شده است واز پیشگویی های زمان کوتاه و زمان بلند هردودرآن استفاده شده است[1]. سیگنال تحریک حاصل بعد از فیلتر معکوس شدن به صورت نمونه به نمونه کوانتیزه می شود. روش APC برای نرخ بیت حدود kbps 16 طراحی شده و در سیستم اینمارست B ازAPC 16kbps به همراه کدینگ کانال Reed-Solomon استفاده شده است[5].
عملکرد APC در نرخ بیت های پایین افت می کند زیرا بیشتر ظرفیت کدینگ آن صرف کدینگ سیگنال مانده می شود . به منظور کاهش ظرفیت مورد نیاز برای کد کردن سیگنال مانده ، کدرهایی با تحریک مانده با عنوان RELP 20 مورد بررسی قرار گرفتند .
شکل (2-6) : بلوک دیاگرام کدر پیشگویی تطبیقی(APC)
همانطور که در شکل (2-7) دیده می شود . کدر RELP در اصل یک APC است به جز اینکه تنها بخشی از (بخش فرکانس پایین) سیگنال مانده در آن ارسال می گردد. ایده RELP در این است که می توان فرض کرد ، اطلاعات سیگنال مانده در نواحی فرکانس پایین (باند پایه) متمرکز شده اند و بنابراین باکد کردن تنها این قسمت می توان نرخ بیت کدینگ را کاهش داد.
شکل (2-7) : بلوک دیاگرام کدر RELP
از اینرو در اینکدر سیگنال باند پایه بوسیله فیلتر پایین گذر و کوانتیزاسیون استخراج می شود . در دیکدر سیگنال باند پایه با استفاده از روش بازسازی فرکانس بالا [5] به سیگنال تمام باند، تبدیل می شود .ویژگی اصلی روش RELP ، توانایی کار در شرایط خیلی بد نویز زمینه می باشد و عملکرد شنیداری خوب آن محدود به 9.6 kbps و بالاتر است .
روشهای کدینگ صحبت که تا کنون بررسی شده اند بر مبنای آنالیز و سنتز هستند . یعنی سیگنال صحبت آنالیز می شود تا پارامترهای سیگنال بدون افزونگی ، از آن استخراج گردد و سپس سیگنال باقیمانده کوانتیزه و ارسال می گردد و در دیکدر عمل عکس صورت می گیرد . این روش کدینگ، استخراج پارامترها را از پروسه کوانتیزاسیون جدا می سازد و بنابراین کنترل بر روی اعوجاج ها به کنترل زیر سیستم های جدا از هم محدود می شود .
برای داشتن کنترل بهتر بر روی تمام پروسه کدینگ، یعنی برای مینیم کردن خطای کلی در سیگنال صحبت سنتز شده ، روشهای آنالیز باسنتز) (AbS 21منظور می شوند . در روش AbS در طرف فرستنده یک دیکدر محلی وجود دارد که در آن صحبت سنتز شده برای آنالیز موجود می باشد .
روش های AbS-LPC مختلفی وجود دارد و اولین روش گزارش شده LPC چند پالسی (MPLPC 22) می باشد که در شکل (2-8) نشان داده شده است . تعیین محل پالسها و دامنه آنها بوسیله یک پروسه AbS انجام می شود . یک نمونه از MPLPCدر سرویس هوایی Skyphone با نرخ بیت 9.6kbps و کدینگ FEC کانولوشنال با نرخ ، بکار گرفته شده است . عیب عمده MPLPC بار محاسباتی نسبتا زیاد آن است. ترکیبی از MPLPCو RELP که برای پیاده سازی ساده تر باشد توسط Kroon گزارش شده که به LPC با تحریک پالس منظم [RPELPC 23] موسوم است .
تحریک بهینه در این کدر ، پالس هایی با فاصله برابر و دامنه های مختلف می باشد که بار محاسباتی آنرا کاهش می دهد. این الگوریتم کارآمد از نظر محاسباتی ، برای سیستم موبایل GSM از میان بقیه الگوریتم های موجود انتخاب شده است [5] .
شکل (2-8) : بلوک دیاگرام MPLPC استفاده شده در Skyphone
با افزایش قدرت پردازشی چیپ های DSP ، سیستم های AbS کاملی که قبلا برای پیاده سازی غیر عملی بودند مورد توجه قرار گرفتند ، همچون LPCبا تحریک کد (CELP 24) که برای نرخ بیت های پایین بسیار مناسب است . در CELP تحریک به صورت یک بردار است که از کتاب کد تحریک انتخاب می شود . هربردار تحریکی که حداقل خطای وزنی را داشته باشد ، بعنوان تحریک بهینه انتخاب می گردد . پروسه AbS درCELP بار محاسباتی زیادی دارد. هر چند که CELP پیچیده است اما قادر به تولید صحبت با کیفیت عالی حتی در نرخ بیت های پایین می باشد . یک گونه از CELP بعد ازبررسی روشهای مختلف کدینگ ، برای سیستم مخابراتی صدا در وزارت دفاع آمریکا با عنوان 4.8 kbps DOD انتخاب شده تا جانشین کدر قدیمیLPC-l0e 2.4kbps شود [5].
هر چند CELP عمدتا برروی نرخ بیت های پایین متمرکز است ، برای نرخ بیت های بالا تر هم مناسب بوده و استانداردLD-CELP CCITT 16kbps نیز نوعی CELP است . بلوک دیاگرام کدر LD-CELP در شکل (2-9) نشان داده شده است .
همانطور که در دیاگرام دیده می شود ، فیلتر طیفی بصورت برگشتی محاسبه می شود و بنابراین لازم نیست که ضرائب فیلتر ارسال شوند . بعلاوه مقیاس کردن یا تنظیم بهره نیز تنها با پیشگویی انجام می شود و نتیجه مستقیم آن این است که نرخ روزآمد شدن تحریک می تواند خیلی بالا باشد (هر 5 نمونه ) و این کدر را قادر می سازد تا تاخیر کدینگ اندک حتی در حدود 2ms داشته باشد . برای یکبار کدینگ در کانالهای نویزی یا بدون نویز ، کیفیت صحبت LD-CELP همانند و یا
بهتر از استاندارد G. 721 یعنی 32kbps ADPCM گزارش شده است[6].
شکل ( 2-9) : بلوک دیاگرام کدر LD-CELP
فصل 3
کدر کم تاخیر LD-CELP
3-1- مقدمه
امروزه با توجه به استفاده روزافزون از شبکه های تلفن و موبایل و نیاز به استفاده موثرتر از ظرفیت شبکه های مخابراتی ، کدرهایی که در نرخ بیت متوسط (16 kbps ) ، صحبتی با کیفیت بالا و حداقل تاخیر ممکن تولید نمایند ، مورد توجه خاصی قرار گرفته اند . تاخیر کلی در یک سیستم مخابراتی را می توان ناشی از عوامل زیر دانست :
تاخیر بافر کردن در اینکدر و دیکدر که بعلت جمع آوری نمونه های مورد نیاز آنالیز LPC است . تاخیر پردازش در اینکدر و دیکدر که در اثر پردازش روی نمونه های بافر شده می باشد . پردازش نمونه های بافر شده باید در فرصت بافر کردن، کامل شود چرا که باید برای پردازش نمونه های بعدی آماده بود . تاخیر ارسال که در سیستم های ماهواره ای بسیار مهم است و قابل کنترل بوسیله کدر صحبت نمی باشد . بنابراین تاخیر کلی سیستم را می توان مجموع عوامل فوق دانست و معمولا حداکثر تاخیر را 4 برابر تاخیر بافر کردن در نظر می گیرند [5،6 ] . در نتیجه با کنترل طول بافر میتوان تآخیر کدر را کاهش داد . بعنوان مثال در کدر LD-CELP طول بافر باندازه 5 نمونه است که با فرض نمونه برداری 8 KHz تاخیر کلی حداکثر 2.5ms می شود ولی در سیستم GSM با طول بافر 20ms تاخیر کلی حداکثر 80ms خواهد بود .
در سال 1988 CCITT برنامه ای را برای استاندارد سازی یک کدر 16kbps آغاز نمود از ویژگی های آن کیفیت بالا و تاخیر اندک بود و برای آن کاربردهای زیادی همچون شبکه PSTN شبکه ISDN ، تلفن تصویری و غیره در نظر گرفته شد. در جدول (3-1) لیستی از شرایط مورد نیاز CCITT برای کدر مورد نظر آورده شده است[5[ .
شرط تاخیر کمتر از 5ms مساله ای بود که هیچ یک از کدرهای موجود قادر به برآوردن آن نبودند . از این رو کدرLD-CELP در سال 1991 بدین منظور معرفی شد و توانست همه شرایط CCITT را برآورده سازد و حتی با 32kbps ADPCM رقابت کند . این کدر در سال 1992 بصورت استاندارد CCITT در آمد و در توصیه نامه (CCITT)ITU-T G.728 ارائه شد [8 ].
جدول (3-1) : شرایط CCITT برای کدر 16 kbps
3-2- بررسی کدر کم تاخیر LD-CELP
در کدرهای معمولی CELP که تطبیقی مستقیم هستند ، پارامترهای پیشگویی بهمراه بردار تحریک به گیرنده ارسال می شوند ولی در LD-CELP فقط سیگنال تحریک ارسال می گردد .ضرائب پیشگویی از طریق انجام آنالیز LPC بر روی نمونه های صحبت قبلی ، روز آمد می شوند. بنابراین کدر LD-CELP در اصل یک نسخه تطبیقی معکوس از کدر CELP معمولی می باشد و اساس CELP که جستجوی کتاب کد به روش آنالیز با سنتز است در آن حفظ شده است .در شکل (3-1) بلوک دیاگرام ساده شده اینکدر و دیکدر LD-CELP نشان داده شده است.
بردار تحریک در اینجا به اندازه 5 نمونه است و پیشگویی زمان بلند رایج در CELP با پیشگویی زمان کوتاه مرتبه بالای 50 ، برروی نمونه های صحبت کوانتیزه که ضرائب آن برای هر 4 بردار تحریک روز آمد می شوند ، تعویض شده است .
بهره تحریک با استفاده از پیشگویی خطی تطبیقی مرتبه 10 بصورت لگاریتمی، برای هر بردار روز آمد می شود .ضرائب این پیشگویی لگاریتمی بهره ، هر 4 بردار یک بار با انجام آنالیز LPC بر روی بهره های لگاریتمی بردارهای تحریک قبلی روز آمد می گردد.
فیلتر مرتبه 10 شنیداری نیز در اینکدر لحاظ شده که هر4 بردار تحریک یک بار با انجام آنالیز LPC روی نمونه های صحبت اصلی در اینکدر روزآمد می شود.
کتاب کد کوانتیزه برداری از کتاب کدهای 3 بیتی بهره و 7 بیتی شکل25 در 16kbps تشکیل شده و تنها اندیس 10 بیتی این کتاب کد به گیرنده ارسال می شود .
Encoder
Decoder
شکل ( 3-1 ) : بلوک دیاگرام ساده شده 16kbps LD-CELP
در شکل ( 3-2 ) بلوک دیاگرام اینکدر LD-CELP ، با جزئیات بیشتری نشان داده شده است. دراین قسمت به بررسی بیشتر آن می پردازیم .
شکل ( 3-2 ) : طرح اینکدر LD-CELP
3-2-1- LPC معکوس مرتبه بالا
از آنجا که پیشگویی زمان بلند( LTP26) pitch، سیستم را خیلی به خطاهای کانال حساس می سازد ، در الگوریتم LTP , LD-CELP حذف شده و بجای آن از LPC معکوس مرتبه بالا استفاده شده است . کاربرد LPC مرتبه 50 دارای امتیازهای زیر است :
– حساسیت خیلی پایین کدر به خطاهای کانال
– اطلاعات جنبی دیگر ارسال نمی شوند .
– با حذف LTP ، الگوریتم کمتر به صحبت وابسته می شود و قادر به دریافت داده باند صوتی می شود .
البته استفاده از LPC مرتبه 50 ، باعث افزایش تعداد محاسبات کورلیشن و پیچیدگی زیاد الگوریتم می شود و برای کاهش پیچیدگی از روش پنجره بازگشتی Branwell استفاده شده است .[5]
هر چند که این روش باعث کاهش پیچیدگی می شود ولی بخاطر عملیات ضرب باعث بروز مسائلی در پیاده سازی ممیز ثابت می شود از اینرو از یک پنجره مختلط جدید استفاده می شود .
فرض کنید که آنالیز LPC برای هرL نمونه صحبت انجام شود و نمونه های مطابق با سیکل تطبیق فعلی باشند و پنجره مختلط به نمونه های قبلی با اندیس کمتر از m اعمال شود ، در زمان m تابع پنجره مختلط بصورت زیر تعریف می شود :
که در آن و و طول بخش غیر بازگشتی پنجره هستند .
در شکل ( 3-3 ) نمایش پنجره مختلط نشان داده شده است[8] .
شکل(3-3): پنجره مختلط
صحبت پنجره شده بصورت زیر محاسبه می شود :
فیلترLPC مرتبه M ام از M+1 ضریب اتوکورلیشن بصورت زیر استفاده می کند :
که در آن ، بخش بازگشتی R چنین است :
فرض کنید که مقادیر در فریم حاضر معلوم هستند و ما می خواهیم، فریم بعدی را محاسبه کنیم که از شروع می شود.صحبت پنجره شده در این حالت:
و بخش بازگشتی را می توان بصورت زیر نوشت:
یا
با قرار دادن , و تابع پنجره در بخش اول داریم :
و سرانجام ضرایب اتوکورلیشن بصورت زیر محاسبه می شوند:
بعد از محاسبه ضرایب اتوکوریشن با N=35 و و L=20 ، از الگوریتم Durbin برای محاسبه پارامترهای LPC استفاده می کنیم [8]. همچنین ضریب تحصیح نویز را برای اصلاح R(0) بکار می بریم که معادل اضافه کردن نویز سفید 24dB زیر سطح متوسط صحبت می باشد. این کار باعث پر شدن چاله های طیفی با نویز سفید وکاهش رنج دینامیک طیفی می شود. قبل از بکارگیری پارامترهای LPC محاسبه شده ، آنها را با ضریب گسترش پهنای باند ، بصورت زیر اصلاح می کنیم:
که در آن و به ترتیب مقدار اولیه و گسترش یافته پارامترهای LPC می باشند[5] .
3-2-2-فیلتر وزنی شنیداری
فیلتر وزنی شنیداری استفاده شده در LD-CELP (بلوک 10 در شکل (3-2)) ،شبیه فیلتر شکل دهنده نویز به فرم کلی زیر است:
که در آن و ضرایب تنظیم هستند که به ترتیب برابر 0.9 و 0.6 قرار می گیرند.ضرایب q فیلتر به همان روش ضرایب فیلتر سنتز ، با M=10 ، L=20 و N=30 و محاسبه می شوند . همچنین ضریب تصحیح نویز نیز در اینجا اعمال می شود.
3-2-3- ساختار کتاب کد
در شکل (3-2) بلوک های 12تا18 تشکیل دهنده بلوک جستجوی کتاب کد )24( هستند . این بلوک ، 1024 بردار تحریک کتاب کد کوانتیزه برداری (VQ) بلوک 19 را بررسی کرده و اندیس
بهترین بردار که بردار صحبت کوانتیزه متناظر آن ، به بردار صحبت ورودی از همه نزدیکتر باشد را مشخص می سازد .جهت ساده شدن جستجو ، کتاب کد 1024 مدخلی 10 بیتی به دو کتاب کد کوچکتر تقسیم می شود: یک کتاب کد شکل 7بیتی که شامل 128 بردارکد مستقل ویک کتاب کد بهره 3 بیتی شامل 8 مقدار اسکالر متقارن نسبت به صفر ( یعنی 1 بیت برای علامت و 2 بیت برای اندازه ) . بردار کد نهایی حاصلضرب بهترین بردار شکل و بهترین سطح بهره خواهد بود .
3-2-3-1- جستجوی کتاب کد
بلوک جستجوی 24 درواقع هر بردار کد را در بهره تحریک کنونی ضرب کرده و از فیلتر های متوالی سنتز F(z) و وزن دهنده شنیداری W(z) عبور می دهد .
فیلتر کردن بردارهای کد VQ را میتوان بدین صورت بیان کرد : فرض کنید که y j , jامین بردارکد در کتاب کد شکل 7 بیتی و gi ,i امین سطح در کتاب کد بهره باشد . اگر h(n) پاسخ ضربه فیلتر متوالی H(z)=F(z)W(z) باشد ، وقتیکه بردارکد مشخص شده با اندیس های jوi به H(z) اعمال شود خروجی فیلتر بصورت زیرخواهد شد :
که در آن
بلوک 24 بدنبال ترکیبی از jوi می گردد که خطای میانگین مربعی (MSE) زیر را مینیمم سازد :
که در آن بردار هدف نرمالیزه بهره می باشد :
چون عبارت های در طول جستجوی کتاب کد ثابت هستند باید :
مینیمم شود که در آن :
توجه کنید که Ej انرژی j امین بردار شکل است و به بردار هدف بستگی ندارد . همچنین بردار شکل yj وماتریس H تنها به فیلترسنتز و فیلتز وزنی بستگی دارد که در دوره 4 بردار صحبت ثابت است ودر نتیجه Ej هم در این دوره ثابت می ماند .
برای کاهش بیشتر محاسبات می توان آرایه های bi =2 gi و Ci= (i=0,1,…,7) را ازقبل محاسبه و ذخیره ساخت .
در نتیجه :
که در آن :
بنابر این برای جستجوی کتاب کد ابتدا باید برای هر بردار شکل y j , بهترین اندیس بهره iکه را مینیمم سازد مشخص کرده و سپس این کار را برای همه y j ها انجام داده تا در نهایت و
مربوطه بدست آید .
3-2-4- شبه دیکدر
تا کنون کدکننده بهترین اندیس کتاب کد تحریک را ارسال داشته ولی هنوز بعضی کارهای آماده سازی برای کدینگ بردارهای بعدی باقی مانده است .ابتدا این اندیس به کتاب کد VQ تحریک اعمال شده تا بهترین بردار تحریک را تولید کند . سپس این بردار در بهره تحریک کنونی ضرب می شود (بلوک 21) . بردار تحریک بدست آمده برابر است با :
بردار تحریک از فیلتر سنتز (22) عبور می کند تا بردار صحبت کوانتیزه فعلی را تولید کند . توجه کنید که بلوک های 19 تا 23 شبه دیکدر( 8 ) را شکل می دهند . ازاین رو بردار صحبت کوانتیزه برابر صحبت دیکد شده شبیه سازی در کانال بدون خطا است .
در شکل (3-2) تطبیق دهنده فیلتر سنتز (23) ، بردار را برای تجدید ضرائب فیلتر سنتز نیاز دارد. همچنین تطبیق دهنده بهره (20 )، بردار تحریک e (n) را جهت تجدید
ضرائب log-gain لازم دارد .
3-2-5-پست فیلتر27
این بلوک جهت افزایش کیفیت شنیداری ، صحبت دیکد شده را فیلتر می کند . جزئیات بیشتر این بلوک در شکل (3-4) نشان داده شده است . پست فیلتر در اصل شامل 3 بخش است : پست فیلتر زمان-بلند 71 ، پست فیلترزمان-کوتاه 72 و واحد مقیاس کننده بهره خروجی 77 . بقیه بلوکهای شکل (3-4) برای محاسبات بلوک 77 هستند.
شکل (3-4) : طرح بلوکی پست فیلتر
پست فیلتر زمان- بلند (71 ) که گاهی پست فیلتر pitch نامیده می شود ، یک فیلتر شانه ای28 است که پیکهای طیفی آن در مضارب فرکانس pitch صحبتی که باید پست فیلتر شود ، واقع شده است . پریود pitch را میتوان از صحبت دیکد شده با استفاده از یک آشکارساز pitch استخراج کرد. اگر p پریود pitch (به نمونه) بدست آمده از آشکارساز pitch باشد ، آنگاه تابع انتقال پست فیلتر زمان-بلند بصورت زیر میتواند بیان شود :
که درآن ضرائب gl ،,b وپریود pitch در تطبیق دهنده پست فیلتر ساخته ودر هر 4بردار (یک فریم) تجدید می شوند .
پست فیلتر زمان-کوتاه (72) شامل یک فیلتر مرتبه10 صفر-قطب بدنبال یک فیلتر تمام-صفر مرتبه 1 است . فیلتر مرتبه 10 صفر-قطب ، مولفه های فرکانسی بین پیک های فرمنت را تضعیف می کند . در حالیکه فیلتر مرتبه اول تمام- صفر می کوشد تا پاسخ فرکانسی فیلتر صفر-قطب مرتبه 10 را هموار سازد .
فرض کنید که ai ,i=1,2,…,10 ضرائب LPC مرتبه 10 وK1 اولین ضریب انعکاس حاصل از آنالیزمعکوس LPC صحبت دیکد شده باشند آنگاه ai وK1 را میتوان باهم از آنالیز PC معکوس مرتبه 50 (بلوک 33 در شکل(3-2) ) بدست آورد . فقط باید تکرار Durbin مرتبه 50 را در مرتبه 10 متوقف کرده وضرائب فوق را ذخیره کرد و
سپس تکرار Durbin را از مرتبه 11 تا 50 ادامه داد .
تابع انتقال پست فیلتر زمان-کوتاه بصورت زیر است :
که در آن ضرائب ai ,bi در هر فریم یک بار و در اولین بردار آن تجدید می شوند . در حالت کلی بعد از اینکه صحبت دیکد شده از پست فیلتر زمان-بلند و زمان-کوتاه می گذرد ، صحبت فیلتر شده همان انرژی اولیه را نداردو بدین منظور بلوکهای 73 تا 77 کار کنترل اتوماتیک بهره وحفظ انرژی صحبت را انجام می دهند .
فصل 4
شبیه سازی ممیزثابت الگوریتم به زبان C
4-1- مقدمه
شبیه سازی یک الگوریتم بر روی کامپیوتر بوسیله یک زبان سطح بالا مانند C،گام نخست جهت پیاده سازی آن الگوریتم برروی DSP بشمار می رود . همانطور که در فصل 5 بیان خواهد شد، با توجه به پیاده سازی کدک G.728 برروی DSP های ممیزثابت ، لازم است که ابتدا آلگوریتم کدک را بصورت ممیزثابت شبیه سازی نماییم. در این فصل ابتدا ویژگی های برنامه نویسی ممیز ثابت را شرح میدهیم . سپس ساده سازی محاسبات برای برنامه نویسی ممیزثابت را بیان نموده و پس از آن بلوک ها ومتغییرهای برنامه را به اختصار شرح می دهیم. در قسمت آخر هم روندنمای برنامه اینکدر و دیکدر را توصیف می کنیم .
4-2- ویژگی های برنامه نویسی ممیز ثابت
4-2-1- نمایش اعداد
واحد پایه در پیاده سازی 16 بیتی ، کلمه 16 بیتی است که برای اعداد صحیح علامت دار بین 32767 تا 32768- تغییر می کند و بصورت مکمل 2 ذخیره می گردد. برای نمایش اعداد اعشاری یک نقطه اعشاری بایدبین دوبیت کلمه در نظر گرفته شود .مثلاً برای نمایش اعداد بین – 1 ,+1 بایستی نقطه اعشاری بین بیت های 14و15 قرار گیرد. این فرمت خاص Q15 نامیده می شود زیرا 15 بیت در سمت راست نقطه اعشاری وجود دارد . Qn فرمت بدین صورت تعریف می شود که n بیت در سمت راست نقطه اعشاری وجود داشته باشد . اعداد صحیح بصورت Q0 نمایش داده می شوند.
برخی داده ها به دقت بیشتری نیاز دارند از اینکه با یک کلمه 16 بیتی نمایش داده شوند . مانند رجیسترهای ضرب و اکومولاتور در چیپ های DSP که می توانند اعداد با دقت از 1 تا را نمایش دهند که به دقت مضاعف معروف است .
برخی داده ها رنج وسیعتری دارند از اینکه بتوان با یک فرمت 16 بیتی ثابت نمایش داده شوند . شاید 16 بیت دقت کافی باشد ولی باید از مقیاس کردن دینامیک استفاده شود. این نوع داده ها را می توان بصورت ممیز شناور و با دقت معمولی نشان داد . یعنی اینکه داده با 2 کلمه نشان داده می شود، اولین کلمه حاوی عددی است که اندازه آن بین 16384و32767 می باشد . این مانتیس مقدار است و می گوئیم که مقدارش در فرمت نرمالیزه نمایش داده می شود اگر مقدار مثبت باشد ، بیت 14 مانتیس 1 است . کلمه دوم حاوی تعداد شیفت به چپ (NLS 29) هایی است که بکار رفته تا عدد را در مقدار نرمالیزه اش قرار دهد .
بنابراین کلمه دوم مشخص کننده Q فرمت مانتیس می باشد. اگر این فرمت برای یک مقدار منفرد بکار رود ممیز شناور اسکالر نامیده می شود . همچنین امکان دارد که یک آرایه از n مقدار را با n+1 کلمه، با استفاده از ممیز شناور بلوکی نمایش داد. با استفاده از این فرمت ، بزرگترین مقدار در آرایه باید به همان صورتی که برای ممیز شناور اسکالر گفته شد ، نمایش داده شود . بقیه مقادیر در آرایه باید از همان NLS استفاده کنند و مانتیس آنها لزوما نباید در فرمت نرمالیزه باشد. گسترش این نمایش بصورت ممیز شناور بلوکی قسمت شده می باشد . در این حالت یک آرایه mn مقداری بوسیله m(n+1) کلمه نمایش داده می شود . این آرایه تقسیم می شود به m زیر آرایه با اندازه n ،که هر زیر آرایه بصورت ممیز شناور بلوکی با n کلمه برای اندازه ها و 1 کلمه برای NLS نمایش داده می شود .
نوع دیگری از نمایش بکار رفته بصورت ممیز شناور با دقت مضاعف است. در این حالت اعداد صحیح با دقت مضاعف بعنوان مانتیس بکار می روند و یک کلمه با دقت معمولی برای NLS استفاده می شود. در مجموع انواع مختلف نمایش ها عبارتند از ممیز ثابت با دقت معمولی، ممیز ثابت با دقت مضاعف برای اکومولاتورها و رجیسترهای ضرب، ممیز شناور اسکالر با دقت معمولی و ممیز شناور بلوکی با دقت معمولی و مضاعف.
4-2-2- عملیات حسابی
از آنجا که ضرب دو کلمه 16 بیتی یک عدد 32 بیتی تولید می کند، رجیسترهای ضرب و اکومولاتور ها باید حداقل 32بیتی باشند . در محاسبات مجموع حاصلضرب ها مانند کانولوشن و فیلتر کردن IIR,FIR ممکن است که آکومولاتور سرریز (overflow) شود که بطور جداگانه مشخص می گردد . در فیلتر کردن IIR مجموع حاصلضربها یا نتیجه عملیات ضرب و انباشت (MAC) بخشی از حافظه فیلتر برای مرحله بعدی است و 16 بیت بالای خروجی در ورودی ضرب کننده استفاده می شود . یک سرریز که موجب می شود تا یک عدد بزرگ مثبت به یک عدد بزرگ منفی تبدیل شود، موجب اختلاف زیادی در خروجی فیلتر می گردد . از اینرو از مد اشباع در فیلترهای IIR استفاده می کنیم . مد اشباع یعنی اینکه اگر کلمه بالایی بزرگتر از 32767 یاکوچکتراز32768- باشد آنگاه مقدار آن برش می خورد (به این دو حد محدود می گردد).
الف- شیفت و رند کردن
حاصلضرب یک مقدار Qn فرمت در یک مقدار Qm فرمت در رجیستر حاصلضرب بصورت (n+m) Q فرمت و با دقت مضاعف ذخیره می شود . اگر لازم باشد که این نتیجه ذخیره گردد یا با دقت دیگری جمع شود ، آنگاه نتیجه باید شیفت داده شود و یا رند گردد تا به دقت مناسب برسد . نکته ای که در عملیات شیفت به راست مکمل 2 وجود دارد اینست که فرض کنید عدد3 را یک بیت به راست می خواهیم شیفت دهیم، نمایش 16 بیتی 3 بصورت 0000000000000011 است که بعد از شیفت، به 0000000000000001 تبدیل می گردد .
حال اگر عدد3 – را بخواهیم یک شیفت به راست دهیم داریم :
-3=111111111111101 >>1 1111111111111110=-2
در این حالت اندازه مقادیربا هم برابر نیستند و در پیاده سازی باید از این نکته آگاه بود .
همچنین ممکن است که در یک الگوریتم تعداد شیفت به راست از اندازه کلمه بیشتر گردد . مثلا یک کلمه 16 بیتی باندازه 18 بیت شیفت داده شود که با انجام 18 بار شیفت یک بیتی حاصل 0 یا 1- می شود البته بسته به علامت اولیه آن عدد. اما در بعضی از کمپایلر ها ممکن است که این کار خطا گرفته شود و این موضوع را باید در نظر داشت .
رند کردن فرایند تبدیل از دقت مضاعف به دقت معمولی در اکومولاتور است. که قبل از ذخیره به صورت 16 بیتی در حافظه ،صورت می گیرد. معمولا با ارزشترین بیت (MSB) در کلمه پایین اکومولاتور چک می شود، اگر این بیت 1 باشد آنگاه یکی به مقدار کلمه بالایی اضافه می شود و این کلمه بعنوان حاصل رند کردن در نظر گرفته می شود . البته در این حالت باید از سرریز نشدن اکومولاتور مطمئن شد .
ب- تقسیم
تقسیم به اندازه جمع و ضرب زیاد استفاده نمی شود . تنها تقسیمی که بکار می رود بصورت ممیز شناور اسکالر می باشد .صورت و مخرج و خارج قسمت به فرمت نرمالیزه نمایش داده می شوند . NLS خارج قسمت با تفریق NLS مخرج از NLS صورت و جمع با 14 محاسبه می شود . چرا که اگر صورت کمی از مخرج بزرگتر باشد و هر دو دارای NLS=0 باشند خارج قسمت باید دارای NLS=14 باشد تا بصورت صحیح نرمالیزه باشد. اگر مانتیس صورت کوچکتر از مانتیس مخرج باشد آنگاه صورت یکی به چپ شیفت داده می شود و به NLS آن یکی اضافه می شود سپس NLS مخرج محاسبه می گردد و این تضمین می کند که مانتیس خارج قسمت بصورت نرمالیزه باشد.
4-3- ساده سازی محاسبات الگوریتم
در این قسمت لازم است که برخی از محاسبات الگوریتم را برای پیاده سازی ممیز ثابت مناسب ساخته و بار محاسباتی آنها را کاهش دهیم .
4-3-1- تطبیق دهنده بهره
در اینجا لازم است که ابتدا عملیات ممیز شناور تطبیق دهنده بهره را به اختصار شرح دهیم . آرایه حالت بهره GSTATE که با علامت نشان داده می شود حاوی 10 بهره لگاریتمی بدون افست می باشد . علامت بهره را برای بردار n نشان می دهد.خروجی پیشگویی بهره برای بردار n بصورت زیر است :
(1)
مطابق با شکل (4-1) قبل از تبدیل به حالت خطی یک افست بهره 32db باید به آن اضافه شده و آزمایش شود که :
(2)
تخمین بهره در حالت خطی بصورت زیر خواهد بود:
(3)
مقدار (n) در ابتدا برای نرمالیزه کردن بردار هدف VQ تحریک بکار می رود . بعد از اینکه جستجوی کتاب کد کامل شد ،(n) برای مقیاس کردن بهترین بردار کد انتخابی بکار می رود . اگر فرض کنیم که اندیس بهره i و اندیس شکل j برای بردار n انتخاب شده باشد بردار تحریک e(n) بصورت زیر خواهد بود :
(4)
که در آن yj ، jامین بردار شکل و gi ،i امین سطح بهره در کتاب کد بهره می باشند .آنگاه بردار تحریک e(n) برای محاسبه (n) بکار می رود. توان e(n) بصورت زیر است :
(5)
قبل از تبدیل P[e(n)] به مقیاس لگاریتمی P[e(n)] را به مقادیر بزرگتر یا مساوی 1 برش می زنیم یعنی :
(6)
این از سرریز شدن در تبدیل لگاریتمی جلوگیری می کند و در نهایت بصورت زیر برای پیشگویی بهره تحریک بعدی حاصل می گردد:
(7)
حالا روشی که از نظر ریاضی معادل روش فوق و مناسب برای پیاده سازی ممیز ثابت می باشد را شرح می دهیم . فرض کنید که, k امین عنصرj امین بردار شکل باشد. از ترکیب معادلات (4و5) داریم :
(8)
با جایگذاری معادله (8) در معادله (7) داریم :
اکنون با استفاده از معادله (3) داریم:
که درآن 20 log |gi| مقدار بهترین بهره انتخابی و 10 log P[yj] مقدار توان بهترین بردار شکل انتخابی بر حسب dB هستند .شکل (4-2) طرح بلوکی این روش را نشان می دهد .از آنجا که فقط 4 مقدار ممکن |gi| و 128 مقدار ممکن P[yj] داریم ، می توان مقادیرآنهارابرحسب dB محاسبه و در جدول های بهره بلوک های 93و94 این شکل ذخیره ساخت.واحدهای تاخیر91و92 بهترین اندیس بهره و شکل حاصل ازجستجوی کتاب کدتحریک برای بردارقبلی راآماده میسازند.واحد یک نمونه تاخیر95 پیشگویی قبلی را نگهداری میکند.خروجی محدود کننده 97 از نظر ریاضی معادل است با خروجی جمع کننده42 در شکل(4-1) و بقیه بلوکها تقریبا مشابه یکدیگرهستند .
شکل(4-1) : تطبیق دهنده بهره
شکل(4-2)
روش معادل نشان داده شده در شکل (4-2)، 2 امتیاز مهم بر روش اولیه دارد :
1- نیاز به محاسبه تابع لگاریتم (بلوک 40 شکل(4-1)) که در DSP ها با محاسبه سری های توانی پیاده سازی می شود و سیکل دستور زیادی را برای محاسبه می گیرد، ندارد .
2- به دلیل حلقه فیدبک طولانی در روش اول (بخاطر تطبیق معکوس ) محاسبات بیشتری در آن انجام می شود و در نتیجه از دقت محاسبات کاسته می شود و بعلاوه در یک پردازنده ممیز ثابت محاسبه تابع لگاریتم همواره با دقت مناسب صورت نمی گیرد .
البته در روش جدید به خاطر محاسبه و ذخیره 4 بردار بهره و 128 بردار شکل به 128+4=132 کلمه بیشتر از حافظهROM احتیاج است که البته مقدار ناچیزی می باشد.
4-3-2- محاسبه لگاریتم معکوس (بلوک 48)
شبه کد ممیزشناور بلوک (48) شکل (4-1) بصورت زیر است :
که در آن GOFF ، افست بهره می باشد. با تبدیل به مبنای 2 داریم :
فرض کنید X=0.1660964Z باشد که در محدوده 0 تا 9.97 تغییر می کندو X=[X]+x که [X] جز صحیح X و x بخش کسری آن است .مقدار براحتی محاسبه می شود و آنچه که می ماند محاسبه بخش کسری X است.
در محاسبه فرض کنید که 0.1660964 در فرمت Q21 نمایش داده شود.این مطابق است با عددی که به صورت10 در 16 بیت بالایی و 20649 در 15 بیت پایینی نمایش داده شود. ما هردو جزه Z را بطور جداگانه ضرب می کنیم تا به دقت خوبی برای X برسیم و آنگاه [X] و x را جدا می کنیم .در محاسبه نمای جز کسری می دانیم که 0<x<1 و بنابراین <21<2 . در نتیجه می توان نمایش ثابت زیر را بکار برد 😡 بصورت Q15 و ،Q14 خواهد بود. برای محاسبه از بسط سری تیلور زیر استفاده می کنیم :
که در آن ضرایب C بصورت زیر هستند [10] :
C4=323 (Q15)
C3=1874 (Q15)
C2=7866 (Q15)
C1=22702 (Q15)
C0=16384 (Q14)
4-4- روند نمای برنامه
با توجه به بلوک دیاگرام طراحی شده برای کدکG.728 (شکل(3-1)) و همچنین ملاحظات و تغییرات لازم برای برنامه نویسی ممیز ثابت، برنامه اینکدر به زبان C استاندارد نوشته شده و همراه با برنامه دیکدر در شبیه سازی مورد استفاده قرار گرفته و آزمایش شده است.این برنامه ها در ضمیمه (الف) بطور کامل موجود می باشد.در این قسمت ابتدا برخی از متغیرها و بلوک های مهم برنامه را در جدول های (4-1)و(4-2) معرفی نموده و سپس روندنمای اینکدر و دیکدر را شرح می دهیم .
نام متغیر
ابعاد (آرایه)
توصیف
A
1 تا 51
ضرایب فیلتر سنتز
ATMP
1 تا 51
آرایه موقت ضرایب فیلتر سنتز
AWP
1 تا 11
ضرائب مخرج فیلتر وزنی
AWZ
1 تا 11
ضرائب صورت فیلتر وزنی
AWZTMP
1 تا 11
آرایه موقت فیلتر وزنی
ET
1 تا 5
بردار تحریک
G2
1 تا 8
2 برابر سطوح بهره در کتاب کد
GAIN
1
بهره تحریک خطی
GB
1 تا 7
نقطه وسط سطوح بهره
GSQ
1 تا 8
مربع سطوح بهره
GP
1 تا 11
ضرائب پیشگویی بهره
GPTMP
1 تا 11
آرایه موقت ضرایب پیشگویی بهره
GTMP
1 تا 4
آرایه موقت بهره
H
1 تا 5
بردار پاسخ ضربه F(z)W(z)
ICHAN
1
بهترین اندیس کتاب کد برای ارسال
IG
1
بهترین اندیس بهره کتاب کد
IS
1
بهترین اندیس شکل کتاب کد
PN
1 تا 5
بردار کورلیشن جستجوی کتاب کد
R
1 تا 11
ضرائب اتوکورلیشن
RTMP
1 تا 11
آرایه موقت ضرائب اتوکورلیشن
S
1 تا 5
بردار صحبت ورودی
ST
1 تا 5
بردار صحبت کوانتیزه
STATELPC
1 تا 50
حافظه فیلتر سنتز
STMP
1 تا 20
بافر پنجره هیبرید فیلتر وزنی
STTMP
1 تا 20
بافر پنجره هیبرید فیلتر سنتز
SW
1 تا 5
بردار صحبت وزن داده شده شنیداری
TARGET
1 تا 5
بردار هدف VQ
Y
1 تا 640
آرایه کتاب کد شکل
Y2
1 تا 128
انرژی بردارهای کانولوشن شده شکل
ZIR
1 تا 5
پاسخ ورودی صفر
جدول (4-1) : متغیرهای برنامه
بلوک
ورودی(ها)
خروجی(ها)
4- فیلتر وزنی شنیداری
S,AWZ,AWP
SW
9و10-BLOCKZIR،پاسخ ورودی صفر فیلتر سنتز وفیلتر وزنی شنیداری
A,STATELPC,AWZ,AWP
ZIR
11-محاسبه بردار هدف
SW,ZIR
TARGET
12-محاسبه پاسخ ضربه
A,AWZ,AWP
H
14و15-کانولوشن بردار شکل ومحاسبه انرژی
H,Y
Y2
16- نرمالیزه کننده بردار هدف
TARGET,GAIN
TARGET
13- کانولوشن معکوس زمانی
H,TARGET
PN
17و18- محاسبه خطاوانتخاب بهترین اندیس کتاب کد
PN,Y,Y2,GB,G2,GSQ
IG,IS,ICHAN
19و21- کتاب کد تحریک و مقیاس بهره
IG,IS,GAIN
ET
9و10- تجدید حافظه فیلتر
ET,A,AWZ,AWP,STATELPC
ST
جدول (4-2): بلوک های برنامه
بلوک
ورودی(ها)
خروجی(ها)
36- پنجره هیبرید فیلتر وزنی شنیداری
STMP
R
37- تکرار Durbin فیلتر وزنی شنیداری
R
AWZTMP
38- محاسبه ضرایب وزن داده فیلتر
AWZTMP
AWZ,AWP
49- پنجره هیبرید فیلتر سنتز
STTMP
RTMP
50- تکرار Durbin فیلتر سنتز
RTMP
ATMP
51- گسترش دهنده پهنای باند
ATMP
A
43- پنجره هیبرید بهره
GTMP
R
44- تکرار Durbin بهره
R
GPTMP
45- گسترش پهنای باند بهره
GPTMP
GP
جدول (4-2): بلوک های برنامه (ادامه)
4-4-1- اینکدر
در شکل (4-3) روند نمای کلی برنامه اینکدر ترسیم شده است، در اینجا مراحل اجرای این روند نما و توصیف کلی بلوکهای استفاده شده در آنرا بیان می کنیم.
در ابتدای برنامه و قبل از وارد شدن به حلقه اصلی برنامه (main-loop )، باید متغیرهای سراسری برنامه مقدار دهی اولیه شوند ، برخی از این متغیر ها مانند بردار پاسخ ضربه H باید در ابتدا دارای مقدار معینی بوده و برخی دیگر مانند ضرایب A , LPC به صفر مقدار دهی اولیه می شود.
همچنین در ابتدای برنامه فلگ های وضعیت خرابی ILLCOND برای فیلتر سنتز ،ILLCONDG برای پیشگویی بهره ، ILLCONDP برای پست فیلتر و ILLCONDW برای فیلتر وزنی به FALSE مقدار دهی اولیه می شوند.این فلگ ها در صورتیکه در محاسبه ضرایب هر یک از فیلتر های مربوطه اشکال پدید آید، دارای مقدار TRUE می شوند و در نتیجه ضرایب این فیلتر ها در سیکل معین شده، تجدید نمی شوند.و تا سیکل بعدی از همان ضرایب قبلی استفاده می شود.
سپس متغیر شمارنده برنامه یعنی ICOUNT به صفر مقدار دهی می شود.این شمارنده دارای مقادیر 1، 2، 3، 4 می باشد و مشخص می کند که در کدام بردار فریم کنونی قرار داریم(هر فریم شامل 4 بردار است). پس از انجام مقدار دهی های اولیه به حلقه اصلی برنامه اینکدر یعنی main-loop می رسیم.
در ابتدا شمارنده ICOUNT چک می شود که اگر در دور قبل دارای مقدار 4 بوده است به مقدار 1 برگردد. سپس یک بردار 5 نمونه ای از صحبت ورودی از بافر ورودی اینکدر خوانده می شود و
به بردار S[1:5] تخصیص داده می شود. در اینجا همه بردار های صحبت ورودی اعم از PCM خطی، u-LAW و یاA-LAW به محدوده [-16384,+16383] تبدیل می شوند. یعنی نمایش Q2 فرمت [-4096,4095.75] .
در مرحله بعد اگر ICOUNT=3 باشدوILLCOND=FALSE باشد بلوک گسترش دهنده پهنای باند 51 اجرا می شود و الا اگر ILLCONDW=FALSE باشد بلوک محاسبه ضرایب فیلتر وزنی 38 اجرا می گردد.سپس بلوک های محاسبه پاسخ ضربه 12وانرژی کتاب کد14و 15 اجرا می شوند.
در مرحله بعدی اگر ICOUNT=2 و همچنین فلگ ILLCONDG=FALSE باشد بلوک گسترش پهنای باند 45 اجرا می شود.در ادامه به شروع پردازش های مربوط به هر بردار می رسیم. ابتدا بلوکهای پیشگویی بهره 46 ، محدود کننده بهره 98- 99 و محاسبه لگاریتم معکوس 48 بطور همزمان و در یک بلوک اجرا می شود .سپس blockzir یعنی بلوکهای فیلترسنتز 9و فیلتروزنی شنیداری 10 برای پاسخ ورودی صفر، اجرا می گردد.
در ادامه به ترتیب بلوکهای فیلتر وزنی شنیداری 4 و محاسبه بردار هدف 11 و نرمالیزه کننده بردار هدف 16 و کانولوشن معکوس زمانی 13 و جستجوی کتاب کد نرمالیزه 17و 18 اجرا می گردند.در این مرحله خروجی اینکدر یعنی اندیس کانال ICHAN بدست می آید و در بافر خروجی اینکدر قرار می گیرد.
پس از تحویل اندیس کانال 10 بیتی ICHAN به کانال مخابراتی نوبت به تطبیق معکوس اینکدر می رسد.
در ابتدا بلوکهای مقیاس بردار تحریک 19و 21 و سپس تجدید حافظه فیلتر های سنتز و شنیداری 9و 10 اجرا می شود.سپس بلوکهای 93،94،96و 97 برای تجدید بهره اجرا می گردند.
در ادامه برنامه، بردار صحبت کوانتیزه ST[] در بافر STTMP[] ذخیره می گردد.STTMP برای محاسبه ضرایب اتوکورلیشن در فیلتر سنتز بکار می رود.سپس بردار سیگنال S[] در بافرSTMP[] ذخیره می گردد تا در محاسبه ضرایب اتوکورلیشن بکار رود .در اینجا پردازش های موبوط به هر بردار پایان می یابد و نوبت به پردازش های مربوط به فریم می رسد.
ابتدا اگر ICOUNT=4 باشد بلوک پنجره هیبرید 49 و تکرار Durbin 50 اجرا می شود.
اگر ICOUNT=2 باشد، بلوک پنجره هیبرید 36 و تکرار Durbin 37 اجرا می گردد.
سرانجام اگر ICOUNT=1 باشد ابتدا آرایه موقت پیشگویی بهره ، GTMP با حافظه پیشگویی بهره GSTATE ، تجدید شده و سپس بلوکهای پنجره هیبرید 43 و تکرار Durbin 44 اجرا می شوند.در اینجا پردازش های مربوط به هر فریم هم پایان می یابدو حلقه اصلی برنامه اینکدر کامل می گرددو برنامه به نقطه شروع این حلقه باز می گردد.
شکل(4-3): روندنمای اینکدر
شکل(4-3): روندنمای اینکدر(ادامه)
شکل(4-3): روندنمای اینکدر(ادامه)
4-4-2- دیکدر
شکل (4-4) روندنمای کلی حاکم بر برنامه دیکدر را نشان می دهد.در این قسمت مراحل اجرای این روندنما را بیان می کنیم.
در ابتدای برنامه، متغیر های سراسری مقدار دهی اولیه می شوند.همچنین فلگ های وضعیت خرابی فیلتر سنتز ILLCOND ، بهره ILLCONDG و پست فیلتر ILLCONDP به FALSE مقدار دهی اولیه می گردند.و سر انجام شمارشگر برنامه ICOUNT به صفر مقدار دهی می شود.
پس از مقدار دهی اولیه برنامه وارد حلقه اصلی دیکدر (main-loop ) می شویم، ابتدا شمارشگر برنامه که نشان می دهد هم اکنون در کدام بردار از فریم کنونی هستیم چک می شود که اگر در دور قبل دارای مقدار 4 بوده به مقدار 1 برگردد.سپس اندیس کانال ICHAN از بافر ورودی دیکدر خوانده می شود.آنگاه اندیس شکل IS و اندیس بهره IG از ICHAN بدست می آید. حال نوبت به تجدید ضرایب فیلتر ها می رسد. اگرICOUNT=3 باشد و همچنین فلگ خرابی ILLCOND برابر FALSE باشد بلوک گسترش پهنای باند 51 اجرا می گردد.در مرحله بعد اگر ICOUNT=2 باشد و فلگ ILLCONDG هم برابر FALSE باشد ، بلوک گسترش باند 45 اجرا می شود.
پس از آن پردازش های مربوط به یک بردار شروع می شود.ابتدا بلوک های 46،98،99و 48 مربوط به پیشگویی بهره انجام می شود .سپس بلوکهای 19و 21 مربوط به بردار تحریک انتخاب شده و بعد از آن بلوک فیلتر سنتز 32 اجرا می شوند .
اگر ICOUNT=1 باشد ضرائب پست فیلتر زمان کوتاه در بلوک 85 تجدید می شود. سپس فیلتر
معکوس LPC مرتبه 10 در بلوک 81 اجرا می شود آنگاه اگر ICOUNT=3 باشد بلوک های استخراج پریودpitch 82 ، محاسبه ضریب پریودpitch 83 و تجدید ضرائب پست فیلتر زمان بلند 84 اجرا می شوند . سپس بلوکهای پست فیلتر زمان بلند 71 و پست فیلتر زمان کوتاه72 و محاسبه مجموع قدر مطلق های 73و74 و همچنین بلوکهای محاسبه ضریب مقیاس 75 و فیلتر پایین گذر 76 و کنترل بهره خروجی پست فیلتر 77 اجرا می گردند.
پس از آن پیشگویی بهره و حافظه آن در بلوک های 93و94و96و97 تجدید می شود . در مرحله بعد بافر صحبت کوانتیزه و سنتز شده ST یعنی STTMP تجدید می گردد . و در اینجا پردازش های مربوط به یک بردار پایان می یابد و پردازش های مربوط به هر فریم آغاز می شود.
ابتدا اگر ICOUNT=4 باشد بلوک پنجره هیبرید فیلتر سنتز 49 و پس از آن بلوک تکرار Durbin 50 از مرتبه 1 تا مرتبه 10 اجرا می شود . سپس ضرائب پیشگویی مرتبه 10 در APF ذخیره می شوند تا پست فیلتر بعداً از آنها استفاده نماید . پس از آن عملیات بلوک 50 از مرتبه 11 تا مرتبه 50 ادامه می یابد .
در پایان اگر ICOUNT=1 باشد بافر بهره GTMP بوسیله حافظه GSTATE در یک مرحله تجدید می شود و بلوک های پنجره هیبرید بهره 43 و تکرار Durbin بهره 44 اجرا می گردند .
در اینجا پردازش های مربوط به هر فریم در دیکدر پایان می یابدو برنامه به حلقه اصلی (main-loop) باز می گردد .
شکل(4-4) : روندنمای دیکدر
شکل(4-4): روندنمای دیکدر(ادامه)
شکل(4-4): روندنمای دیکدر(ادامه)
فصل5
پیاده سازی الگوریتم بر رویDSP
5-1- مقدمه
پس از شبیه سازی الگوریتم کدک G.728 به زبان C ، نوبت به انتخاب DSP و پیاده سازی برنامه برروی آن می رسد . در این فصل ابتدا مروری بر نحوه پیاده سازی بلادرنگ داریم . سپس به معرفی DSP های سری TMS می پردازیم. در قسمت بعدی نحوه برنامه نویسی TMS و تبدیل کد برنامه از زبان C به زبان اسمبلی TMS و بهینه سازی آن را به منظور پیاده سازی بی درنگ شرح می دهیم .
5-2- مروری بر پیاده سازی بلادرنگ
یک پروسه بلادرنگ ، فرآیندی است که باید در زمان مشخص انجام پذیرد . این حد زمانی ممکن است از مرتبه 200us تا حدود20 ms برسد . در کدینگ صحبت با فرض نرخ نمونه برداری 8 khz، برای کدری که بصورت نمونه به نمونه کارمی کند ، پردازش بلادرنگ باید در زمان 0.125 ms انجام شود . اما در کدرهای جدید مانند کدک CELP ، فرآیند کدینگ ، بصورت بلوکی و با طول بلوک اصلی در حدود 20-30 ms ( فریم اصلی ) و طول بلوک فرعی 4-8 ms ( فریم فرعی ) صورت می گیرد که باعث افزایش محدودیت زمانی مجاز می شود .
به موازات پیشرفت در الگوریتم های کدینگ صحبت ، تکنولوژی پردازنده های DSP هم در چند سال اخیر پیشرفت زیادی داشته و با استفاده از DSP های قدرتمند ممیز ثابت30 و ممیز شناور31 ، امکان پیاده سازی بلادرنگ الگوریتم های صحبت بسیار پیچیده همچون CELP فراهم شده است DSP های ممیز ثابت ارزانتر هستند ولی از نظر برنامه نویسی مشکل تر می باشند . هرچند که از نظر قیمت ،استفاده از یک DSP ممیز ثابت بهتر به نظر می رسد اما طراحی یک نسخه ممیز ثابت از یک الگوریتم کدینگ صحبت که ممیز شناور است کاری دشوار و گاهی غیر ممکن می باشد زیرا باید اثرات مقیاس کردن ، نرمالیزه کردن و سرریز شدن را در نظر گرفت.
دو عامل مهم در انتخاب DSP جهت پیاده سازی الگوریتم کدینگ صحبت عبارتند از سیکل زمانی دستور العمل DSP (سرعت محاسبه )و مناسب بودن دستورالعملهای آن برای پردازش بلوک های اصلی آن الگوریتم . بعنوان مثال در الگوریتم کدینگ CELP بیشتر زمان پردازش DSP با دستوراتی به شکل MAC (ضرب و انباشت ) گرفته می شود. برای چنین الگوریتمی DSP هایی که این کار را در یک سیکل دستوالعمل انجام دهند مناسب خواهند بود.
5-3-چیپ های DSP
DSP های برنامه پذیر با توجه به دقت و عملیات حسابی به دو گروه ممیز ثابت و ممیزشناور دسته بندی می شوند . DSP های ممیز ثابت سریعتر و ارزانتر هستند ولی از نظر برنامه نویسی مشکل تربوده و دقت پایین تری را فراهم می سازند . امتیاز های پیاده سازی ممیز شناور بر پیاده سازی ممیز ثابت زیاد است . دقت در اعداد ممیز شناور بخاطر نرمالیزه شدن اتوماتیک مانتیس بوسیله پردازنده در طول برنامه ثابت می ماند . در حالیکه دقت داده های ممیز ثابت، بسته به اندازه ذخیره سازی آن داده پس از عملیات روی آن، تغییر می کند . بخاطر نرمالیزه شدن اتوماتیک مانتیس در DSP های ممیز شناور ، رند کردن و بریدن اعداد ، خطای کلی کمتری نسبت به ممیز ثابت بوجود می آورد . همچنین دقت ثابت بهمراه توانایی نمایش اعداد خیلی بزرگ یا خیلی کوچک ، باعث می شود مشکلاتی که در پیاده سازی فیلترها از نظر فاصله مکان صفرها و قطب ها وجود دارد ، برطرف گردد.
همانطور که در شکل(5-1) دیده می شود ، رنج دینامیکی وسیع در DSP های ممیز شناور اجازه می دهد که اعداد خیلی کوچک و خیلی بزرگ با دقت بالا نمایش داده شوند [5] . این بخصوص در محاسبات میانی FFT ها و فیلتر های بازگشتی مرتبه بالا لازم می شود . همچنین رنج دینامیکی وسیع موجب حذف نیاز مقیاس کردن میانی در DSP های ممیز ثابت ، جهت جلوگیری
از سرریز شدن داده، می گردد. از این رو استفاده از DSP های ممیزشناور ، باعث کاهش اندازه و پیچیدگی برنامه می شود بعلاوه اغلب الگوریتم های DSP ابتدا بر روی کامپیوتر های شخصی و با استفاده از امکانات ممیز شناور شبیه سازی می شوند و در صورت استفاده از DSP های ممیز شناور نیاز به شبیه سازی مجدد ممیز ثابت این الگوریتم ها بر طرف می گردد .
شکل ( 5-1 ) . رنج دینامیک در DSP های ممیز ثابت و ممیز شناور
5-3-1-DSP های ممیزثابت
در DSP های ممیز ثابت باید توجه خاصی به سرریز شدن و مقیاس کردن داده ها نمود . از طریق چک کردن اعداد و مقیاس کردن مناسب آنها می توان به دقت یکنواختی در تمام پیاده سازی دست یافت ، کاهش دقت اغلب در هنگام ضرب دو عدد رخ می دهد چرا که تعداد بیت لازم برای نمایش حاصلضرب برابر مجموع بیت های آن دو عدد می باشد . این بیت های اضافی باعث از دست رفتن اطلاعات می شود و بایستی حاصلضرب را با دقت مضاعف ذخیره نمود . در برخی از DSP ها سرریز شدن (overflow) بسادگی با قرار دادن نتیجه برابربا بزرگترین عدد مثبت یا منقی قابل نمایش در DSP ، کنترل می شود . ولی معمولا برای اینکه کنترل بهتری روی الگوریتم وکاهش خطای آن داشته باشیم بایستی قبل از جمع کردن، حاصلضرب را به اندازه مناسب به سمت راست شیفت دهیم تا از سرریز شدن آکومولاتور جلوگیری شود .
5-3-3- مروری بر DSP های خانواده TMS320
شرکت TI بعنوان پیشرو در بازار DSP ، اولین چیپ DSP را در سال1982 معرفی نمود. خانواده TMS320 در حال حاضر به سه گروه اصلی C2000,C5000,C6000 تقسیم بندی می شوند[16] .
گروه TMS320C6000 از نظر عملکرد و سرعت و راحتی استفاده برای برنامه نویسی سطح بالا بهینه شده اند.این گروه به نسل های ممیز ثابت C64X,C62X و ممیز شناورC67X تقسیم می شوند.
گروه TMS320C5000 از نظر عملکرد و مخصوصا توان مصرفی بهینه شده اند و برای کاربردهای موبایل و اینترنت که مشکل باتری دارند بسیار مناسب هستند.این گروه شامل دو نسل ممیز ثابت C55X,C54X می باشد.
گروه TMS320C 2000 برای کاربردهای کنترل دیجیتال در نظر گرفته شده و شامل دو نسل C28X,C24X می باشند.
در شکل زیر نمودار DSP های خانواده TMS320 نشان داده شده است.
شکل(5-2) : DSP های خانواده TMS320
5-3-3-1-معرفی سری TMS320C54X
DSP های سری C54X دارای سرعت و قابلیت عملیاتی بالایی هستند واز یک معماری باس پیشرفته ، CPU با سخت افزار مناسب کاربردهای خاص ، حافظه و ادوات جانبی on-chip و دستورالعمل های ویژه استفاده می کنند.
ویزگی های C54x:
– معماری پیشرفته چند باسه با یک باس برنامه ، 3 باس داده و4 باس آدرس
– واحد محاسبه و منطق (ALU) 40 بیتی و دو آکومولاتور 40 بیتی جداگانه
– ضرب کننده موازی برای عملیات ضرب/ انباشت (MAC) تک سیکلی بدون pipeline
– فضای حافظه آدرس پذیر 16 بیتی( , 64 kword Data , 64 kword Program ( 64 kword I/O
در جدول (5-1) مشخصات حافظه DSP های C54x ( به kword ) نشان داده شده است[12].
جدول (5-1)
کاربردهای زیررا می توان برای سری C54X در نظر گرفت:
– کدینک و دیکدینگ صحبت
– حذف اکو – حذف نویز
– مدولاسیون و دمدولاسیون
– فشره سازی تصویر و صدا
– رمز نگاری صحبت
– تشخیص صحبت و باز سازی صحبت
5-4- توسعه برنامه بلادرنگ
پیاده سازی یک نرم افزار بصورت بلادرنگ بر روی سخت افزار از اهمیت بالایی در سیستم های مخابراتی برخوردار است.در پیاده سازی بلا درنگ هزینه تجهیزات همانند پارامترهای کیفی سیستم اهمیت زیادی داشته و بایستی سعی شود که یک الگوریتم به روش بهینه پیاده سازی گردد.
در عمل پیاده سازی بلادرنگ یک الگوریتم بر روی چیپ DSP شامل مراحل زیر می شود : الف) بهبود تئوری الگوریتم. ب) آزمایش الگوریتم بوسیله شبیه سازی کامپیوتری با استفاده از یک زبان سطح بالا مانند C . ج) تبدیل کد سطح بالا به کد اسمبلی DSP مربوطه . د) آزمایش کد بلادرنگ با استفاده از ابزارهای توسعه گر موجود( مانند شبیه سازها) و ه) طراحی سخت افزار مناسب.
در قسمت (ج) برای تبدیل کد سطح بالا به کد DSP سه روش وجود دارد . روش اول، استفاده از کراس کمپایلر DSP است که زبان سطح بالای C را به اسمبلی DSP ترجمه می کند.روش دوم، برنامه نویسی دستی و مستقیم الگوریتم با استفاده از مجموعه دستورالعمل های DSP می باشد و روش سوم که عبارتست از استفاده از کراس کمپایلر و همچنین برنامه نویسی دستی در قسمتهایی که از نظر زمان اجرا محدودیت وجود دارد. از آنجا که برنامه نویسی دستی کاری مشکل و وقت گیر می باشد و مخصوصاً وقتی که اندازه برنامه بزرگ باشد آزمایش و اشکال زدایی آن وقت زیادی صرف می کند، معمولاً ازروش سوم در برنامه های بزرگ بیشتر استفاده می شود.
در قسمت (د) نتایج شبیه سازی کامپیوتری با خروجی های معادل DSP مقایسه می شوند . این کار معمولاً برای داده های آزمایش محدودی انجام می شود زیرا که پردازش مقدار زیادی داده در
شبیه ساز DSP کار وقت گیر و دشواری می باشد.پس از مقایسه و درستی خروجی DSP و بررسی اجرای نرم افزار بصورت بلادرنگ آنگاه می توان از درستی پیاده سازی بلادرنگ الگوریتم اطمینان حاصل کرد.
5-5- اجرای برنامه روی برد توسعه گر C5402 DSK
پس از آشنایی با پردازنده های TI ، حال نوبت به معرفی برد توسعه گر C5402 DSK و برنامه نویسی آن می رسد . DSK امکان آزمایش و توسعه برنامه ها را بر روی پردازنده C5402 فراهم می سازد و می تواند مرجع خوبی برای طراحی سخت افزاری سیستم باشد[15] .
برد DSK شامل اجزای زیر است :
– 100 MHz VC5402 DSP
– 64 kword حافظه خارجی SRAM
– رابط صوتی میکروفن/ بلندگو
– رابط تلفن
– رابط داده ناهمزمان RS-232
– رابط JTAG برای امولیشن ورابط Host
در شکل (5-3) بلوک دیاگرام و ارتباط های DSK نشان داده شده است .
شکل(5-3) : طرح بلوکی C5402 DSK
5-5-1- بکارگیری ابزارهای توسعه نرم افزار
شکل (5-4) دیاگرام توسعه نرم افزاری C54x را نشان می دهد .بخش سایه زده مسیری را مشخص می کند که بیشتر استفاده می شود و بقیه بخش ها انتخابی هستند[13,14] .
شکل (5-4) : دیاگرام توسعه نرم افزاری TMS320C54x
در این قسمت برخی از ابزارهای نشان داده شده در شکل فوق را بررسی می کنیم :
– C/C++ Compiler ، کد C/C++ را به کد زبان اسمبلی ترجمه می کند .
– Assembler ، فایل های اسمبلی را به زبان ماشین بصورت یک فایل COFF Object تبدیل می نماید .
– Linker ، Object فایل های تولید شده توسط اسمبلر را بصورت یک ماژول COFF Object قابل اجرا تبدیل می نماید .
– مبدل Hex ، DSP های C54x می توانند فایل COFF را بعنوان ورودی قبول کنند ولی اغلب برنامه ریز های EPROM قادر به این کارنیستند ، ازاین رو باید فایل COFF به یکی از فرمت های TI-tagged , Intel , Motorola ,Tektronix تبدیل شود تا در برنامه ریز EPROM مربوطه ریخته شود .
5-5-2- استفاده از نرم افزارCCS (Code Composer Studio)
نرم افزار CCS محصول شرکتTI است و در قالب یک محیط ویژوال مانند Visual C++ ، امکان برنامه نویسی C ، اسمبلی و تمامی ابزارهای توسعه نرم افزاری شرح داده شده در قسمت قبل را فراهم می آورد. این نرم افزار که بهمراه برد DSK می باشد ، از طریق پورت موازی کامپیوتر به برد DSK متصل شده و کار کنترل و مونیتورکردن آن را انجام می دهد .
همه رجیسترها و فضای حافظه و پورت های بردDSK ، توسط این نرم افزار کنترل و برنامه ریزی می شوند وپس از تولید کد قابل اجرا بر روی TMS ، نرم افزار قادر است پردازنده C5402 را برنامه ریزی کند. همچنین امکانات اشکال زدایی مانند اجرای برنامه بصورت های مختلف و مشاهده متغیرها توسط CCS فراهم شده است .
بمنظور استفاده از CCS و اجرای برنامه برروی DSK ابتدا برنامه شبیه سازی ممیز ثابت کدر G.728 را در قالب یک پروژه بنام CODEC به محیط CCS منتقل کردیم.آنگاه پروژه را بدون استفاده از optimizer ، کمپایل و لینک نموده وپس از رفع اشکالات برنامه و ساختن فایل codec.out ، آن را بر روی DSK اجرا کردیم . هدف ما در این مرحله اطمینان از صحت اجرای برنامه و اندازه گیری MIPS مورد نیاز آن بود . از اینرو بخشی از یک فایل صحبت PCM 16 بیتی ( در حدود 2 ثانیه، 16 kword ) را در بخشی از فضای حافظه بنام _input ذخیره نموده و سپس اینکدر و دیکدر را در یک حلقه قرار دادیم . اینکدر نمونه های ورودی را می خواند و بصورت کدشده به دیکدر می داد و دیکدر هم آنها را بازسازی کرده و در بخشی از حافظه بنام _output ذخیره می ساخت .
با استفاده از امکانProfiler در نرم افزار CCS می توان از عملکرد هر یک از توابع موجود در برنامه ،MIPS ومقدار حافظه مورد نیاز آنها آگاه شد . شکل (5-7) خروجی Profiler را برای 65 دور اجرا (325 نمونه) نشان می دهد.در ستون اول نام توابع برنامه را می توان دید که البته بدلیل محدودیت نمایش همه توابع دیده نمی شوند. ستون دوم اندازه کد هر تابع به word و ستون سوم تعداد اجرای آنرا تا کنون نشان می دهد. در ستون4 کل سیکل دستورالعمل وستون5 ماکزیمم سیکل دستورالعمل لازم برای اجرای هر تابع را نشان می دهد.در ستون 6و7 هم به ترتیب مینیمم و میانگین سیکل دستور هر تابع دیده می شود.
برای اجرای برنامه اینکدر و دیکدر بصورت دوطرفه کامل لازم است که عملیات پردازش هر دور برنامه در زمان 5 نمونه یعنی 0.625 ms به پایان برسد و این در واقع برابر تاخیر الگوریتمی کدک کم تاخیر G.728 می باشد. با توجه به قدرت پردازنده C5402 که برابر 100 MIPS است لازم است هر دور اجرای برنامه از 62500 سیکل دستورالعمل بیشتر نباشد. برای محاسبه تعداد سیکل دستورالعمل هر دور برنامه ، در نقطه ای که برنامه اینکدر و دیکدر به پایان می رسد یک Break Point قرار می دهیم و با استفاده از دستور RUN برنامه را تا این نقطه اجرا می کنیم. خروجی CLOCK پردازنده در این حالت تعداد سیکل دستورالعمل یک دور برنامه را نشان می دهد.
در این حالت چون از optimizer استفاده نشده ، مشاهده می شود که MIPS کلی برنامه چندین برابر قدرت C5402 (100 MIPS) است وحتی در حالت ماکزیمم به 478991 برای هر دور اجرا می رسد در صورتی که با توجه به قدرت C5402 ، نباید از 62500 در هر دور فراتر رود .
شکل (5-7): خروجی Profiler نرم افزار CCS
– استفاده از Optimizer
بهینه ساز باعث بهبود در سرعت اجرای برنامه وحجم کد تولید شده در کمپایلر می شود . این کار با ساده سازی حلقه ها ، مرتب کردن عبارت ها و قراردادن متغیرها در رجیسترها ممکن می شود.
کمپایلر C54x قادر به انجام بهینه سازی های مختلفی است و بهینه سازی سطح بالا در optimizer و بهینه سازی سطح پایین در code generator انجام می شود . شکل(5-8) جایگاه optimizer را بهتر نشان می دهد .
شکل(5-8): روند کمپایل یک فایل
ساده ترین راه استفاده از optimizer این است که در خط فرمان در دستورcl500 از انتخاب -on استفاده شود که n (0,1,2 & 3) ، نشان دهنده سطح بهینه سازی بصورت زیر است :
-o0 :- ساده سازی روندنما
– قرار دادن متغیرها در رجیسترها
– حذف کدهای استفاده نشده
– ساده سازی جمله ها و عبارت ها
-o1 : همه بهینه سازی های -o0 بعلاوه :
– حذف تخصیص های استفاده نشده
– حذف عبارت های مشترک محلی
-o2 : همه بهینه سازی های -o1 بعلاوه :
– بهینه سازی حلقه ها
– حذف تخصیص های سراسری استفاده نشده
– حذف عبارت های فرعی مشترک سراسری
-o3 : همه بهینه سازی های -o2 بعلاوه :
– حذف توابعی که صدا نشده
– ساده سازی توابع با مقدار برگشتی استفاده نشده
– inline کردن صدازدن توابع کوچک
– شناسایی مشخصات متغیر ها در سطح فایل
در این مرحله از پیاده سازی، پروژه CODEC را با استفاده از optimizer و با حداکثر قدرت بهینه سازی -o3 وبهینه سازی در سطح فایل اجرا کردیم . نتایج بدست آمده در شکل (5-9) نشان می دهد که optimizer کاهش چشمگیری در MIPS و حجم کد برنامه بوجود آورده ولی هنوز هم MIPS برنامه بیش از دو برابر قدرت C5402 است و حتی در حالت ماکزیمم به 233892 در هر دور اجرا می رسد.
شکل (5-9):خروجی Profiler در حالت استفاده از Optimizer
– برنامه نویسی اسمبلی بصورت دستی
همانطور که در قسمت قبل دیدیم، کمپایلر C54x حتی با استفاده از optimizer هم نتوانست اجرای برنامه را به 100 MIPS برساند. این بدین دلیل است که در خانواده C54x ،optimizer به حد کافی قوی نیست چراکه ما همین برنامه را با استفاده از optimizer پردازنده C55x کمپایل کردیم و به حدود 40 MIPS برای اجرای آن برروی C55x نیاز بود.
به هرحال باید اجرای این برنامه را به 100 MIPS برسانیم تا بتوان بصورت بلادرنگ آنرا پیاده سازی کرد. در این مرحله تنها راهی که باقی مانده اینست که بر روی توابع برنامه و MIIPS آنها و نتایج بدست آمده از مرحله قبل بررسی کرده تا توابع و قسمت هایی که به نظر میرسد Optimizer نتوانسته خوب بهینه سازد را بصورت دستی برنامه نویسی کنیم . واضح است که در این مرحله باید به زبان اسمبلی C54x تسلط کافی داشت تا بتوان کد اسمبلی تولید شده توسط کمپایلر C54x را بهینه کرد .
در ابتدا ملاحظه می شود که در محاسبات کورلیشن در بعضی از حلقه ها از دستور ضرب/انباشت MAC استفاده نشده و حلقه چند دستوری بوجود آمده است که می توان آنها را با استفاده از این دستور به حلقه تک سیکلی تبدیل کرد . همچنین در بعضی از حلقه های محاسبه انرژی نیز می توان از دستور تک سیکلی مجذور SQURA استفاده نمود.با انجام این اصلاحات MIPS برنامه کاهش یافت ولی هنوز فاصله زیادی با مقدار مورد نیاز ما دارد.
در این مرحله مهمترین توابع برنامه از نظر MIPS – همانطور که در شکل(5-9) دیده می شود -همچون LevinsonDurbin50() ،HybWin49() ، Block17_18() وBlock14_15() را بصورت دستی بازنویسی کردیم . در اینجا بعنوان نمونه به Block14_15() که کوچکتر است می پردازیم :
همانطور که در کد C این تابع درضمیمه (ب) دیده می شود ،تابع از 3 حلقه تو در تو تشکیل شده است. حلقه بیرونی NCWD=128 بار ، حلقه میانی IDIM=5 بار و حلقه داخلی از 1تا 5 بار اجرا می گردند. سیکل دستورالعمل این تابع بیش از 32000 است(شکل(5-9)). در ادامه کد اسمبلی تولید شده توسط کمپایلربا حد اکثر بهینه سازی و کد بازنویسی شده بصورت دستی در این ضمیمه آورده شده است . در بازنویسی این بلوک به این نکته توجه شده که دستورالعمل های حلقه داخلی به حد اقل برسد چرا که این حلقه در ضریب 128*5=640 ضرب می شود .
نتایج این بهینه سازی و برنامه نویسی در شکل(5-10) به ترتیب صعودی بیشترین MIPS نشان داده شده است. با مقایسه نتایج این شکل و شکل (5-9) می توان گفت که MIPS بعضی از توابع همچون LevinsonDurbin() به کمتراز یک سوم وبعضی دیگر همچون Block14_15() به کمتر از نصف رسیده است و نتیجه کلی اینکه هر دور اجرای برنامه که شامل اینکدر و دیکدر بصورت دوطرفه کامل (Full Duplex) می باشد ، کمتر از 62500 شده است و می توان آنرا بصورت بلادرنگ اجرا نمود .
شکل(5-10) : نتایج برنامه نویسی دستی
5-5-3- نتایج پیاده سازی
در این قسمت به نتایج پیاده سازی بلادرنگ کدک G.728 می پردازیم . معمولا برای ارزیابی یک کدک صحبت از معیار های Subjective وObjective استفاده می شود. معروفترین معیار Subjective ، معیار MOS32 است که دارای 5 سطح از 1 (بد)تا 5 (عالی) می باشد . این معیار به شرایط آزمایش ، زبان وشنوندگان وابستگی دارد . معروفترین معیار Objective ، معیار SNR است که اعوجاج بین ورودی و خروجی سیستم را در نظر می گیرد و بصورت نسبت توان ورودی به توان خطای بین ورودی و خروجی تعریف می شود .
معمولا در صحبت به دلیل تفاوت انرژی قسمت های باواک و بی واک از معیار SNRseg بصورت زیر استفاده می شود :
که در آن N تعداد نمونه های صحبت در یک سگمنت که معمولا 128 تا 256 نمونه است وM تعداد این سگمنت ها می باشد[7 ].
در شکل (5-11) صحبت ورودی و صحبت سنتز شده خروجی کدک حاصل از شبیه سازی ممیزثابت ودر شکل(5-12) مقایسه ورودی وخروجی در پیاده سازی بر روی C5402 نشان داده شده است.فایل صحبت جمله " بر سرآنم که گر ز دست بر آید…" با گوینده مرد می باشد.همچنین در جدول(5-2) مقادیر SNR محاسبه شده برای سگمنت های256تایی وکل فایل آورده شده است .
شکل (5-11) : مقایسه صحبت ورودی(بالا) و صحبت سنتز شده (پایین) در شبیه سازی
شکل (5-12) : مقایسه صحبت ورودی(بالا) و صحبت سنتز شده (پایین) در DSP
GLOBAL
SEG256
17.57
17.31
SNR (dB)
جدول (5-2)
در مرجع [7] مقدار SNR برای این کدک از نظر تئوری 22dB محاسبه شده است هرچند که در پیاده سازی ها مثلا مرجع [17] ، SNR کلی کدک برابر 18dB بدست آمده است .
در اینجا نتایج پیاده سازی برروی پردازنده TMS320C5402 از نظر مقدار حافظه برنامه و حافظه دیتا و MIPS مورد نیاز برنامه در جدول های (5-3)و (5-4) ارائه می شوند :
Data Memory
Program Memory
3632 word
8582 word
جدول (5-3)
Average
Maximum
54.6
61.13
Encoder
32.8
38.17
Decoder
87.4
99.3
Full Duplex
جدول (5-4)
برای مقایسه به نتایج پیاده سازی شرکت DCS بر روی C54X که به حافظه برنامه 9 kword و حافظه دیتا 2.1 kword و پردازش 37 MIPS نیاز دارد[19] ،اشاره می کنیم که البته اختلاف MIPS آن با پیاده سازی ما ناشی از برنامه نویسی اسمبلی بصورت کاملا دستی می باشد .
5-6- نتیجه گیری و پیشنهاد
در این گزارش به پیاده سازی بلادرنگ کدک صحبت کم تاخیر G.728 بر روی پردازنده TMS320C5402 پرداختیم. در این راه پس از بررسی روش های کدینگ صحبت ومطالعه الگوریتم کدینگ LD-CELP ، این الگوریتم را به زبان C و بصورت ممیزثابت شبیه سازی نمودیم .سپس برد توسعه گر C5402 DSK و نرم افزار ( Code Composer Studio ) CCS و امکانات آنرا معرفی و نحوه اجرای برنامه بر روی برد را بیان کردیم .با استفاده از نرم افزار CCS برنامه کدک به زبان C را به کد اسمبلی ترجمه و بر روی TMS اجرا نموده و دیدیم که کمپایلر C54X با حداکثر قدرت بهینه سازی هم نمی تواند برنامه را بصورت بلادرنگ اجرا نماید . از اینرو توابع مهم برنامه از نظر MIPS را بصورت دستی به زبان اسمبلی بازنویسی کردیم. در نتیجه MIPS بعضی از توابع به نصف و بعضی به یک سوم کاهش یافت و برنامه بصورت بلادرنگ قابل اجرا گردید.
بعنوان اولین پیشنهاد می توان با اعمال تغییراتی در ساختار کتاب کد 16 kb/s LD-CELP آنرا به یک کدک با نرخ بیت متغیر تبدیل نمود که جزئیات آن در Annex H توصیه نامه G.728 آورده شده است[18] . چنین کدکی با نرخ بیت متغیر برای شبکه های موبایل و اینترنت مناسب است.
پیشنهاد دیگری که در اینجا مطرح می شود ترکیب این کدک با حذف کننده اکو استاندارد G.165 است . چرا که در سیستم های انتقال صحبت بلوک های فشرده سازی و حذف اکو در کنار هم قرار می گیرند و اگر هردو در یک بلوک پیاده سازی شوند می توان از نظر MIPS و حافظه به نتایج بهتری دست یافت.
ضمائم
– ضمیمه (ب) : مقایسه برنامه نویسی C و اسمبلی
/******************************************************
BLOCK 14,15 :SHAPE CODEVECTOR CONVOLUTION &
ENERGY CALCULATION
inputs: H,Y
output: Y2
/******************************************************/
void BLOCK14_15()
{
int I,J,K,K1=1;
long AA0;
for(J=1;J<=NCWD;J++)
{
for(K=1;K<=IDIM;K++)
{
K1++;//K1=(J-1)*IDIM+K+1;
AA0=0;
for(I=1;I<=K;I++)
AA0+=H[I]*Y[K1-I];
AA0>>=14;
TEMP[K]=AA0;
}
AA0=0;
for(K=1;K<=IDIM;K++)
AA0+=(TEMP[K]*TEMP[K]);
AA0>>=15;
Y2[J]=AA0;
}
}
/******************************************************/
کد اسمبلی تولید شده توسط کمپایلر
/******************************************************/
.sect ".text"
.global _BLOCK14_15
.sym _BLOCK14_15,_BLOCK14_15, 32, 2, 0
.func 1757
;———————————————————————-
; 1757 | void BLOCK14_15()
;———————————————————————-
;***************************************************************
;* FUNCTION DEF: _BLOCK14_15 *
;***************************************************************
_BLOCK14_15:
.line 2
.sym _I,0, 4, 1, 16
.sym _J,1, 4, 1, 16
.sym _K,2, 4, 1, 16
.sym _K1,3, 4, 1, 16
.sym _AA0,4, 5, 1, 32
PSHM AR1
FRAME #-6
NOP
.line 3
;———————————————————————-
; 1759 | int I,J,K,K1=1;
; 1760 | long AA0;
;———————————————————————-
ST #1,*SP(3) ; |1759|
.line 6
;———————————————————————-
; 1762 | for(J=1;J<=NCWD;J++)
;———————————————————————-
SSBX SXM
LD #128,A
ST #1,*SP(1) ; |1762|
SUB *SP(1),A ; |1762|
BC L182,ALT ; |1762|
; branch occurs ; |1762|
L175:
.line 8
;———————————————————————-
; 1764 | for(K=1;K<=IDIM;K++)
;———————————————————————-
LD #5,A
ST #1,*SP(2) ; |1764|
SUB *SP(2),A ; |1764|
BC L179,ALT ; |1764|
; branch occurs ; |1764|
L176:
.line 10
;———————————————————————-
; 1766 | K1++;//K1=(J-1)*IDIM+K+1;
;———————————————————————-
ADDM #1,*SP(3) ; |1766|
.line 11
;———————————————————————-
; 1767 | AA0=0;
;———————————————————————-
LD #0,A
DST A,*SP(4) ; |1767|
.line 12
;———————————————————————-
; 1768 | for(I=1;I<=K;I++)
;———————————————————————-
ST #1,*SP(0) ; |1768|
LD *SP(2),A ; |1768|
SUB *SP(0),A ; |1768|
BC L178,ALT ; |1768|
; branch occurs ; |1768|
L177:
.line 13
;———————————————————————-
; 1769 | AA0+=H[I]*Y[K1-I];
;———————————————————————-
LD *SP(3),A
SUB *SP(0),A ; |1769|
STLM A,AR1
NOP
NOP
LD *AR1(_Y),T
MVDK *SP(0),*(AR1)
MPY *AR1(_H),A ; |1769|
DADD *SP(4),A,A ; |1769|
ADDM #1,*SP(0) ; |1769|
DST A,*SP(4) ; |1769|
LD *SP(2),A ; |1769|
SUB *SP(0),A ; |1769|
BC L177,AGEQ ; |1769|
; branch occurs ; |1769|
L178:
.line 15
;———————————————————————-
; 1771 | AA0>>=14;
;———————————————————————-
DLD *SP(4),A ; |1771|
SFTA A,#-14,A ; |1771|
DST A,*SP(4) ; |1771|
.line 16
;———————————————————————-
; 1772 | TEMP[K]=AA0;
;———————————————————————-
MVDK *SP(2),*(AR1)
LD *SP(5),A
STL A,*AR1(_TEMP)
.line 17
ADDM #1,*SP(2) ; |1773|
LD #5,A
SUB *SP(2),A ; |1773|
BC L176,AGEQ ; |1773|
; branch occurs ; |1773|
L179:
.line 18
;———————————————————————-
; 1774 | AA0=0;
;———————————————————————-
LD #0,A
DST A,*SP(4) ; |1774|
.line 19
;———————————————————————-
; 1775 | for(K=1;K<=IDIM;K++)
;———————————————————————-
ST #1,*SP(2) ; |1775|
LD #5,A
SUB *SP(2),A ; |1775|
BC L181,ALT ; |1775|
; branch occurs ; |1775|
L180:
.line 20
;———————————————————————-
; 1776 | AA0+=(TEMP[K]*TEMP[K]);
;———————————————————————-
MVDK *SP(2),*(AR1)
LD *AR1(_TEMP),T
MPY *AR1(_TEMP),A ; |1776|
DADD *SP(4),A,A ; |1776|
ADDM #1,*SP(2) ; |1776|
DST A,*SP(4) ; |1776|
LD #5,A
SUB *SP(2),A ; |1776|
BC L180,AGEQ ; |1776|
; branch occurs ; |1776|
L181:
.line 21
;———————————————————————-
; 1777 | AA0>>=15;
;———————————————————————-
DLD *SP(4),A ; |1777|
SFTA A,#-15,A ; |1777|
DST A,*SP(4) ; |1777|
.line 22
;———————————————————————-
; 1778 | Y2[J]=AA0;
;———————————————————————-
MVDK *SP(1),*(AR1)
LD *SP(5),A
STL A,*AR1(_Y2)
.line 24
ADDM #1,*SP(1) ; |1780|
LD #128,A
SUB *SP(1),A ; |1780|
BC L175,AGEQ ; |1780|
; branch occurs ; |1780|
L182:
.line 26
FRAME #6
POPM AR1
RET
; return occurs
.endfunc 1782,000000400h,7
/******************************************************/
کد اسمبلی تولید شده با برنامه نویسی دستی
/******************************************************/
.text
.global _BLOCK14_15
_BLOCK14_15:
PSHM AR0
PSHM AR1
PSHM AR2
PSHM AR3
PSHM AR4
PSHM AR5
PSHM AR6
frame #-2
ssbx sxm
STM #_Y2+1,AR4
STM #0,BK
STM #127,AR1
stm _Y,ar2
L1:
STM #_TEMP+1,AR0
stm #-1,ar6
stm #4,brc
rptb L2
mar *ar2+
mar *ar6+
ldm ar2,a
stlm a,ar5
ldm ar6,a
stl a,*sp(0)
STM #_H+1,AR3
LD #0,A
RPT *sp(0)
MAC *AR5-, *AR3+, A, A
SFTA A,#-14,A
L2: STL A,*AR0+
STM #_TEMP+1,AR3
LD #0,b
rpt #4
squra *ar3+,b
SFTA B,#-15,B
STL B,*AR4+
BANZ L1,*AR1-
frame #2
POPM AR6
POPM AR5
POPM AR4
POPM AR3
POPM AR2
POPM AR1
POPM AR0
RET
مراجع
1- Panos E. Papamichalis, "Practical Approaches to Speech Coding ", Prentice-Hall Inc. ,1987.
2-B.S. Atal & R.Remde "A new model of LPC excited for producing natural-sounding speech at low bit rates", Proc.ICASSP pp.614-617 1982.
3-Jason P. Woodard , "Digital Speech Coding" , Mini-Thesis , Department of Electronics & Computer Science, University of Southampton, Jun 1994.
4-J.Makhoul "Linear Prediction: A Tutorial Review " Proc. IEEE,vol 63,
No.4,pp.561-580 Apr 1975.
5- Kondoz A.M," Digital Speech , Coding of low bit rate communication Systems", Chichester Wiley 2000
6- Chen,Cox & Lin,"A Low-Delay CELP Coder for the CCITT 16 kb/s Speech Coding Standard",IEEE Jour. On Selected Area in Comm.,vol.10,no.5 ,June 92.
7- L.Hanzo,A.Somerville & Jason P. Woodard, "Voice Compression and Communication",IEEE series on Digital & Mobile,2001
8- Schroeder & Atal ,"Code-Excited linear Prediction (CELP):High quality speech at very low bit rates",IEEE,ICASSP,pp.937-940,1985.
9- ITU,"Coding of Speech at 16 kbps using Low-Delay Code Excited Linear Prediction ", ITU (CCITT) Recommendation G.728, 1992.
10- ITU," G.728 Annex G , 16 kbps Fixed Point specification ", 11/94.
11- TI, "TMS320C54x Assembly language tools user guide ", www.ti.com
June 2001.
12- TI, " TMS320C54x DSP reference set, volume 1: CPU", spru131, www.ti.com.
13- TI, " TMS320C54x DSP reference set, volume 2: Mnemonic instruction set",
spru172, www.ti.com .
14- TI, "Code Composer user guide",spru 328, www.ti.com.
15- TI, "C5402 DSK user guide" ,www.ti.com.
16- TI," DSP product tree" , http://dspvillage.ti.com/docs/allproducttree.jhtml.
17- TCTS Lab," The LD-CELP at 16kb/s (ITU-T G.728)",Coding research group homepage ,http://tcts.fpms.ac.be/coding.htm.
18- ITU,"G.728 Annex H:variable bit rate LD-CELP operation mainly for DCME at rates less than 16 kb/s",5/99.
19- DCS G.728 C54x Vocoder, algorithm,http://wwwd.connect.ti.com/dsp/tpcat/tpcodec.nsf/SoftwareForExternal/
EAB728D36C3C916E862569F200542A92.
1 Vocal Cords
2 Vocal Tracts
3 Unvoiced
4 Voiced
5 Formant
6 Update
7 Redundancy
8 Linear Predictive Coding
9 Stationary
10 Lattice
11 International Telecommunication Union (CCITT)
12 Waveform Coders
13 Vocoders
14 Adaptive Prediction PCM
1 Sub-Band Coding
2 Adaptive Transform Coding
1- Decimation
2- Interpolation
19 Adaptive Prediction Coding
20 Regular Excited Linear Prediction
1 Analysis by Synthesis
2 Multi Pulse LPC
3 Regular Pulse Excited LPC
24 Code Excited Linear Prediction
25 Shape
26 Long Term Prediction
27 Postfilter
28 Comb
29 Number of Left Shift
30 Fixed Point
31 Floating Point
32 Mean Opinion Score
—————
————————————————————
—————
————————————————————