برای پیادهسازی الگوریتمهای پردازش سیگنال بر روی FPGA، نیازی به داشتن دانش نسبت به ماهیت الگوریتمهای پردازشی ندارید.
در واقع، شما در کار پیادهسازی الگوریتمهای پردازش سیگنال بر روی FPGA، الگوریتمها را بهصورت مجموعهای از محاسبات ریاضی در نظر میگیرید.
هر کدام از این محاسبات را پیادهسازی میکنید و با کنار هم قرار دادن آنها، مدار مربوط به کل الگوریتم ساخته میشود.
اما گاهی لازم است یک دید شهودی نسبت به بلوکهای پرکاربرد الگوریتمهای پردازشی داشته باشید.
More...
بهطور کلی، یک الگوریتم پردازش سیگنال، مجموعهای از محاسبات ریاضی است که این محاسبات، از سه نوع بلوک تشکیل شدهاند:
بلوک فیلتر یک بلوک بسیار مهم است که تقریباً در تمامی الگوریتمهای پردازش سیگنال با آن سروکار دارید.
بنابراین، برای پیادهسازی الگوریتمهای پردازش سیگنال بر روی FPGA، آشنایی با این بلوک و انواع ساختارهای فیلترهای دیجیتال ضروری به نظر میرسد.
بهکمک این مقاله، یک دیدگاه سیستمی، نسبت به این بلوک بهدست خواهید آورد.
فیلتر
فیلتر، سیستمی است که روی مولفههای فرکانسی سیگنال ورودیاش عملیات انجام میدهد.
همانطور که میدانید، هر سیگنال در حوزه زمان، دارای تعدادی مولفه فرکانسی در حوزه فرکانس است.
وقتی شما یک سیگنال را به ورودی فیلتر اعمال میکنید، این سیستم، برخی از مولفههای فرکانسی سیگنال را حذف، و برخی را از خود عبور میدهد.
برای مثال، شکل موج پالسی زیر را که در حقیقت از جمع چند سیگنال سینوسی تشکیل شده است در نظر بگیرید:
اگر از این شکل موج تبدیل فوریه بگیریم، متوجه میشویم که از مجموع چند سیگنال سینوسی با فرکانسهای مختلف تشکیل شده است (شکل زیر):
مولفههای فرکانسی این سیگنال را بر روی محور فرکانس در تصویر بالا مشاهده میکنید.
اگر این سیگنال را به ورودی فیلتری اعمال کنیم که فقط اولین مولفه را از خود عبور میدهد، در خروجی فیلتر شکل موج تصویر زیر را خواهیم داشت:
به این ترتیب، سیگنال پالس مربعی را از یک فیلتر پایینگذر (low pass filter) عبور میدهیم.
فیلتر پایینگذر، فقط مولفههای فرکانسی را که از فرکانس قطعش کمتر است عبور میدهد.
در شکل زیر چهار نوع فیلتر را مشاهده میکنید:
به فیلتری که فرکانسهای بیشتر از فرکانس قطعش را عبور دهد، فیلتر بالاگذر (high pass filter) میگوییم.
نوع دیگری از فیلتر به نام فیلتر میانگذر (band pass filter) نیز وجود دارد که فرکانسهای بین دو مقدار فرکانسی مشخص را از خود عبور میدهد.
همچنین، فیلتر میاننگذر، فرکانسهای بین دو مقدار فرکانسی مشخص را از خود عبور نمیدهد.
بنابراین، هدف فیلترها ایجاد تغییرات در طیف فرکانسی سیگنال ورودیشان است.
اکنون با این مقدمه از فیلترها، بهسراغ معرفی فیلترهای دیجیتال میروم.
انواع ساختارهای فیلترهای دیجیتال
همانطور که گفتم، فیلترهای دیجیتال، یکی از پرکاربردترین بلوکهای هر سیستم پردازش سیگنال هستند.
توجه داشته باشید که به دلیل پیچیدگی فیلترهای دیجیتال، اگر بر پیادهسازی آنها مسلط شوید، میتوانید از مهارت بهدست آمده، در پیادهسازی سایر بلوکها نیز استفاده کنید.
بهطور کلی، فیلترهای دیجیتال به دو گروه تقسیم میشوند:
اگر بخواهیم یک مقایسه اولیه بین این دو نوع فیلتر داشته باشیم، باید بگوییم که ساختار فیلترهای FIR سادهتر از فیلترهای IIR است. بنابراین، پیادهسازی آنها سادهتر از فیلترهای IIR خواهد بود.
در ارتباط با ویژگی فاز این فیلترها، باید گفت که فیلترهای FIR دارای فاز خطی و فیلترهای IIR دارای فاز غیر خطی هستند. اما خطی یا غیرخطی بودن فاز فیلتر چه تاثیری در پیادهسازی آن دارد؟
اگر فاز فیلتری خطی باشد، ما میتوانیم در پیادهسازی، بهگونهای عمل کنیم که حجم منابع مصرفی کاهش یابد.
از نظر سیستمی نیز میتوان مسئله فاز فیلتر را بررسی کرد؛ فیلتر علاوه بر اینکه فرکانسهای سیگنال را دستخوش تغییر میکند، بر فاز سیگنال ورودی نیز تاثیر میگذارد و باعث ایجاد اختلاف فازی بین سیگنال خروجی و ورودی میشود.
مقدار اختلاف فازی که ایجاد میشود، با توجه به فرکانس سیگنال ورودی متفاوت است.
اگر مانند شکل زیر، میزان اختلاف فاز سیگنال ورودی و خروجی نسبت به فرکانس، بهصورت خطی تغییر کند، فاز فیلتر ما خطی است؛ در غیراینصورت، فاز فیلتر غیرخطی خواهد بود.
اختلاف دیگر فیلترهای FIR و IIR این است که فیلترهای FIR، نسبت به فیلتر IIR مشابهشان، دارای مرتبه بزرگتری هستند.
اما مرتبه یک فیلتر به چه معناست؟
از منظر پیادهسازی، هر چه مرتبه یک فیلتر بزرگتر باشد، میزان سختافزاری که نیاز دارد بیشتر است.
بنابراین، اگر دو فیلتر معادل داشته باشیم که یکی از آنها را بهروش FIR و دیگری را بهروش IIR پیادهسازی کنیم، فیلتر FIR، سختافزار بیشتری از FPGA را مصرف میکند و فیلتر حجیمتری خواهد بود.
هر کدام از این فیلترها ساختارهای گوناگونی دارند که اکنون برخی از آنها را برای شما تشریح خواهم کرد.
ساختارهای محبوب فیلتر FIR برای پیادهسازی
فیلتر FIR، دو ساختار محبوب دارد:
در ادامه، این دو ساختار را بررسی میکنم.
ساختار Direct Form در فیلتر FIR
در شکل زیر، ساختار Direct Form یک فیلتر FIR را مشاهده میکنید:
به چنین نمایشی از یک رابطه ریاضی، نمایش signal flow graph میگویند.
اکنون نکاتی را در ارتباط با بلوکهایی که در signal flow graph شکل بالا بهکار رفته است بیان خواهم کرد.
همزمان با بررسی بخشهای مختلف مدار، معادلهای سختافزاری که برای هر بخش در پیادهسازی بهکار میرود را نیز به شما معرفی خواهم کرد.
همانطور که مشاهده میکنید، در سمت چپ تصویر یک سیگنال گسسته بهنام X[n]، به فیلتر اعمال شده است.
احتمالاً این سیگنال گسسته، سیگنالی است که بهکمک یک ADC یا مبدل آنالوگ به دیجیتال، از یک سیگنال آنالوگ نمونهبرداری شده است.
دقت داشته باشید که وقتی ما یک سیگنال گسسته داریم، مقادیر آن را بهصورت پیوسته در زمان نداریم؛ بلکه مقادیر سیگنال در stepهای زمانی مشخصی موجود است.
برای مثال، مقدار سیگنال در stepهای زمانی 0، 1 و 2 برابر است با X[1] ،X[0] و [2]X.
معادل stepهای زمانی در پیادهسازی، همان کلاک در FPGA است.
معادل stepهای زمانی در پیادهسازی، همان کلاک در FPGA است.
همانطور که مشاهده میکنید، تعدادی بلوک Z-1 در شکل بالا وجود دارد؛ این بلوک، یک بلوک ایجاد کننده تاخیر یا delay است. در واقع، خروجی این بلوک، نسبت به ورودی آن یک step زمانی تاخیر دارد.
برای مثال، فرض کنید ابتدا X[0] به این مدار وارد شود؛ سپس در step زمانی بعدی X[1] به آن وارد شود و این روند به همین ترتیب ادامه داشته باشد.
در این صورت، اگر در ورودی یک بلوک Z-1 سیگنال X[1] را داشته باشیم، خروجی آن X[0] خواهد بود.
اما سوالی که مطرح میشود این است که تحقق مداری بلوک Z-1 چیست؟
معادل بلوک Z-1 در دیجیتال، برابر با یک رجیستر است.
اما چرا؟
دلیل آن این است که همواره خروجی یک رجیستر نسبت به ورودی آن به اندازه یک کلاک تاخیر دارد. در شکل زیر یک رجیستر را مشاهده میکنید:
فرض کنید این رجیستر، حساس به لبه بالارونده سیگنال کلاک باشد.
وقتی لبه بالارونده سیگنال کلاک به آن اعمال میشود، محتوای ورودی آن (D) به خروجی (Q) منتقل شده و در آنجا ذخیره میشود.
فرض کنید اکنون ورودی جدیدی به رجیستر اعمال شود؛ این در حالی است که در خروجی رجیستر، ورودی قبلی را داریم. بنابراین، خروجی رجیستر از ورودی آن به اندازه یک کلاک عقبتر است و تاخیر دارد.
این موضوع دقیقاً کارکرد بلوک Z-1 در signal flow graph را اجرا میکند؛ بنابراین، تحقق مداری بلوک Z-1، یک رجیستر است.
تحقق مداری بلوک ایجاد کننده تاخیر Z-1، یک رجیستر است.
سوال دیگری که مطرح میشود این است که فرمول ریاضی این فیلتر چیست؟ در واقع، خروجی این فیلتر از چه رابطهای نسبت به ورودی بهدست میآید؟
بر اساس signal flow graph، میتوانیم رابطه Y[n] را بهصورت زیر بنویسیم:
Y[n] = b3 X[n-3] + b2 X[n-2] + b1 X[n-1] + b0 X[n]
توجه داشته باشید که به مقادیر b0 تا b3، ضرایب فیلتر میگویند.
وقتی یک طراح سیستم، یک فیلتر را طراحی میکند و کار پیادهسازی فیلتر را به شما میسپارد، تنها اطلاعاتی که از فیلتر در اختیار شما قرار میدهد ضرایب آن (Filter Coefficients) است.
شما بهعنوان پیادهساز فیلتر، تنها اطلاعاتی که برای پیادهسازی نیاز دارید ضرایب فیلتر است؛ زیرا تمامی مشخصات فیلتر در ضرایب آن نهفته است.
ضرایب فیلتر، مشخصکننده ویژگیهای فیلتر هستند؛ برای مثال، اینکه فیلتر چه فرکانسهایی را از خود عبور میدهد، از جمله مواردی است که ضرایب فیلتر آن را مشخص میکند.
در واقع، تمامی مشخصات فیلتر در ضرایب آن نهفته است.
در فیلتر، مفهوم دیگری نیز به نام مرتبه یا درجه فیلتر (Filter Order) وجود دارد؛ مرتبه فیلتر، از روی signal flow graph فیلتر قابل تشخیص است.
برای مثال، درجه فیلتر زیر برابر با سه است:
زیرا این فیلتر سه بلوک Z-1 دارد.
بنابراین، تعداد بلوکهای تاخیر Z-1 نشاندهنده درجه فیلتر هستند.
از طرف دیگر، اگر ضرایب فیلتر را از صفر شمارهگذاریم کنیم، اندیس آخرین ضریب، برابر با درجه فیلتر خواهد بود.
در این مثال، ضرایب فیلتر b2 ،b1 ،b0 و b3 هستند؛ بنابراین، فیلتر ما درجه سه است.
ساختار Transposed Structure در فیلتر FIR
فیلتر FIR، علاوه بر ساختار Direct Form، ساختار محبوب دیگری بهنام Transposed Structure نیز دارد.
شکل زیر، signal flow graph این ساختار را نشان میدهد:
در این ساختار، برخلاف ساختار قبل، ورودی X[n] وارد بلوکهای تاخیر Z-1 نشده است؛ بلکه مستقیماً به بلوکهای ضربکننده وارد شده و در ضرایب فیلتر ضرب شده است.
سپس خروجی ضربکنندهها، وارد بلوکهای تاخیر شدهاند.
اکنون، رابطه بین ورودی و خروجی فیلتر را بهدست میآورم؛ فرض کنید که ما در step زمانی nاُم هستیم، سیگنال S1[n] برابر با رابطه زیر خواهد بود:
S1[n]= b3 X[n-1]
اگر به همین ترتیب رابطه ریاضی سیگنالهای signal flow graph را بنویسیم، سیگنالهای S2[n] و S3[n] برابر هستند با:
S2[n]= S1[n-1] + b2 X[n-1]
S3[n] = S2[n-1] + b1 X[n-1]
و در نهایت، رابطه بین ورودی و خروجی فیلتر بهصورت زیر خواهد بود:
Y[n] = b0 X[n] + S3[n]
بر اساس رابطه بین ورودی و خروجی فیلتر FIR با ساختار Transposed Structure، مشاهده میکنیم که برای بهدست آوردن یک sample از خروجی در یک کلاک، تنها نیاز به انجام یک عملیات ضرب و یک عملیات جمع داریم.
این در حالی است که در ساختار Direct Form، طبق رابطهای که قبلاً بهدست آوردیم، مقدار محاسبهای که باید در یک کلاک، برای بهدست آمدن یک sample از Y[n] انجام شود متشکل از چهار عملیات ضرب و سه عملیات جمع است:
Y[n] = b3 X[n-3] + b2 X[n-2] + b1 X[n-1] + b0 X[n]
به این ترتیب، به دلیل اینکه در ساختار Direct Form، در یک step زمانی باید محاسبات بیشتری انجام شود، به یک سیگنال کلاک با دوره تناوب طولانیتر نیاز داریم؛ و دوره تناوب طولانیتر، معادل با فرکانس کمتر است.
بنابراین، سرعت فیلتر FIRای که بهصورت Direct Form پیادهسازی میشود، از معادل Transposed Structure خود کمتر است.
اگر یک فیلتر FIR را یک بار به کمک ساختار Direct Form و بار دیگر به کمک ساختار Transposed Structure در FPGA پیادهسازی کنیم، فیلتر پیادهسازی شده با ساختار Transposed Structure، دارای سرعت بیشتری است.
توجه داشته باشید که اگر ضرایب دو فیلتر یکسان باشند، از لحاظ سیستمی هیچ تفاوتی با یکدیگر ندارند.
بنابراین، شما بهعنوان پیادهساز بر روی FPGA، میتوانید از هر یک ساختارهای Direct Form و Transposed Structure استفاده کنید، بدون اینکه بر پاسخ سیستمی فیلتر تاثیری گذاشته باشید.
اکنون به سراغ نوع دیگری از فیلترهای دیجیتال، یعنی فیلتر IIR میرویم.
ساختارهای محبوب فیلتر IIR برای پیادهسازی
در این بخش چهار ساختار زیر از فیلتر IIR را به شما معرفی خواهم کرد:
ساختار Direct Form I فیلتر IIR
شکل زیر، signal flow graph ساختار Direct Form I از یک فیلتر IIR را نشان میدهد:
همانطور که مشاهده میکنید، در فیلتر IIR، دو بخش بهنامهای feedforward و feedback وجود دارد.
همچنین، در این نمودار، دو خط تاخیر (dealy line) داریم.
برای آشنایی با خط تاخیر و نحوه پیادهسازی آن، این مقاله را مطالعه کنید...
همانطور که مشاهده میکنید، نیمه سمت چپ مدار بالا همانند یک فیلتر FIR است که اصطلاحاً به آن، بخش feedforward فیلتر میگویند.
همچنین در قسمت شماره 1 نمودار، خروجی بخش FIR وارد بخش دیگری میشود که بخش اصلی فیلتر IIR را تشکیل میدهد.
در نیمه سمت راست فیلتر IIR، ما یک بخش فیدبک داریم؛ زیرا در این بخش، از سیگنال خروجی Y[n] یک نمونه گرفته شده است.
سپس، این نمونه وارد چند بلوک تاخیر Z-1 شده است. خروجی این بلوکهای تاخیر، در ضرایبی ضرب شده و با یکدیگر جمع میشوند.
نهایتا مجموع این حاصلجمع، و حاصلجمعی که از بخش FIR به دست آوردیم (قسمت شماره 1 نمودار بالا)، به خروجی فیلتر منتقل شده است.
وجود بخش feedback باعث میشود که پیادهسازی فیلترهای IIR چالشبرانگیزتر از فیلترهای FIR باشد.
وجود بخش feedback در فیلترهای IIR، باعث چالشبرانگیز شدن پیادهسازی این فیلترها میشود.
نکتهای که درباره بخش فیدبک وجود دارد این است که بهطور کلی، فیدبک میتواند موجب افزایش مقادیر شود. این مسئله ممکن است منجر به ایجاد سرریز شود.
اما در این ساختار خاص از فیلتر IIR، ما نیازی به کنترل سرریز نداریم؛ زیرا اگر در شبیهسازی این فیلتر، به ورودی آن سیگنال پله اعمال کنیم، مشاهده میکنیم که خروجی فیلتر اصلاً قسمت صحیح ندارد.
طبق ویژگی خاص اعداد مکمل ۲، اگر شما n عدد m بیتی را با هم جمع کنید و بدانید که نتیجهی نهایی مجموع این اعداد، در محدوده تعداد m بیت میگنجد، میتوانید مطمئن باشید که حتی اگر سرریزهای داخلی نیز رخ دهد، نتیجه نهایی مجموع اعداد، معتبر خواهد بود.
برای آشنایی با خاصیتهای منحصربهفرد اعداد مکمل ۲، این مقاله را مطالعه کنید...
در این مثال نیز ما بهکمک شبیهسازی این فیلتر میدانیم که سیگنال Y[n]، قسمت صحیح ندارد. بنابراین، در محدوده تعداد بیت تعیین شده میگنجد. پس، این فیلتر نیاز به کنترل سرریز ندارد.
اکنون بهسراغ بررسی ساختار بعدی از فیلتر IIR میروم.
ساختار Direct Form II فیلتر IIR
شکل زیر، نمودار signal flow graph ساختار Direct Form II یک فیلتر IIR را نشان میدهد:
در این ساختار، یک خط تاخیر مشاهده میکنید.
مشکل این ساختار این است که در ورودی خط تاخیر (قسمت شماره 1 در شکل بالا)، احتمال سرریز وجود دارد؛ زیرا حاصل جمعکنندههای فیدبک مستقیماً وارد Y[n] نشده است، بلکه ابتدا در ضریب b0 ضرب شدهاند.
بنابراین، نمیتوانیم مانند ساختار قبل با مشاهده عرض بیت قسمت صحیح Y[n]، از عدم وقوع سرریز اطمینان حاصل کنیم.
و اما ساختار Transposed Direct Form I فیلتر IIR به چه صورت است؟
ساختار Transposed Direct Form I فیلتر IIR
در شکل زیر، ساختار Transposed Direct Form I از یک فیلتر IIR را مشاهده میکنید:
در این ساختار نیز در ورودی خط تاخیر احتمال سرریز داریم؛ اما چرا؟
زیرا در این ساختار نیز خروجی بخش فیدبک مستقیماً به Y[n] اعمال نشده است؛ بلکه ابتدا در ضریب b0 ضرب شده است و سپس حاصلضرب به Y[n] وارد شده است.
بنابراین، در این ساختار نیز نمیتوانیم با مشاهده عرض بیت قسمت صحیح Y[n]، از عدم وقوع سرریز اطمینان حاصل کنیم.
و اما چهارمین ساختار محبوب فیلتر IIR به چه صورت است؟
ساختار Transposed Direct Form II فیلتر IIR
چهارمین ساختار محبوب فیلتر IIR، ساختار Transposed Direct Form II است:
این ساختار نیاز به کنترل سرریز ندارد؛ زیرا همانند ساختار Direct Form I، حاصلجمع سیگنالهای بخش فیدبک، مستقیماً به خروجی اعمال شدهاند.
بنابراین، برای این ساختار نیز میتوانید پاسخ پله فیلتر را شبیهسازی کنید؛ سپس، بر مبنای عرض بیت قسمت صحیح پاسخ پله، تعداد بیت موردنیاز برای حاصلجمع بخش فیدبک را بدست آورید.
در ساختارهای Direct Form I و Transposed Direct Form II فیلتر IIR، نیازی به کنترل سرریز ندارید.
اکنون که با ساختارهای محبوب فیلترهای دیجیتال آشنا شدید، میتوانید بهسراغ مرحله پیادهسازی بروید.
پیادهسازی فیلترهای دیجیتال
فرض کنید فیلتری که قصد پیادهسازی آن را دارید قبلاً توسط یک فرد طراح سیستم، طراحی شده و ضرایب آن در اختیار شما قرار گرفته است.
برای عملیات پیادهسازی، هفت گام پیادهسازی که در مقاله "۷ گام پیادهسازی الگوریتمهای پردازش سیگنال در FPGA" تشریح کردم را در پیش بگیرید.
بر اساس این روش، ابتدا باید مدل floating-point این فیلتر را در محیط سیمولینک متلب ایجاد کنید.
برای این کار میتوانید از بخش FDATool در نرمافزار MATLAB نیز استفاده کنید.
ابزار FDATool، یک ابزار فوقالعاده برای طراحی و تحلیل انواع فیلترهای دیجیتال است.
شما میتوانید بلوک فیلترتان را در ابزار FDATool بسازید و به محیط سیمولینک متلب وارد کنید.
سپس، با انجام مراحل کوانتیزاسیون، مدل fixed-point فیلترتان را بسازید.
اکنون باید مدل fixed-point فیلتر را شبیهسازی کرده و ورودیها و خروجیهای آن را ذخیره کنید.
پس از آن، بر اساس مدل fixed-point، یک ماجول VHDL بنویسید.
وقتی ماجول VHDL را در نرمافزار ISim شبیهسازی میکنید، باید همان ورودیهایی که در متلب به مدل fixed-point اعمال کرده بودید را به این ماجول نیز اعمال کنید.
به این ترتیب، میتوانید خروجیهای مدل fixed-point فیلتر در متلب و ماجول VHDL را مقایسه کنید.
اگر این خروجیها بر یکدیگر منطبق بودند، شما کار پیادهسازی را با موفقیت به پایان رساندهاید.
امیدوارم از خواندن این مقاله هم لذت برده باشید و بتوانید از نکات یاد گرفته شده، در انجام پروژههایتان استفاده کنید.
اگر امکانش هست مقاله را در فرمت pdf ارائه فرمایید.
با سپاس
بعضی از مقالات سایت در حال حاضر به صورت PDF قابل دانلود هستند. سعی میکنیم بقیه مقالات را هم به زودی به صورت PDF آماده کنیم.
موفق باشید.
سلام
مطلب آموزنده ای بود ممنون ازتون
برای مقایسه سرعت Direct Form و Transposed Structure در FIR، نوشتین که Direct Form نیاز به 4 عمل ضرب و 3 عمل جمع داره، سوالم اینکه اگه عملیات های ضرب موازی در نظر گرفته بشن، میشه گفت 1 عمل ضرب و 3 عمل جمع نیازه
برای مقایسه سرعت دو ساختار کدوم یکی از این دو صحیح تره؟
سلام،
بله درسته. در واقع آنچه باید مورد بررسی قرار بگیرد، مقدار محاسبات بین رجیسترها است. بیشترین مقدار محاسبات از یک رجیستر تا رجیستر بعدی تعیین کننده مقدار زمان مورد نیاز برای ساخت یک نمونه خروجی است. این در واقع همان مفهوم مسیر بحرانی است که روی سیگنال فلوگراف نیز قابل مشاهده است.
موفق باشید.
با سلام. خیلی ممنونم از پست عالی تان خداقوت، واقعا مفید بود