آشنایی با ریاضیات ممیز ثابت

در این مقاله ابتدا به بررسی تفاوت‌های پردازنده‌های ممیز ثابت و شناور می‌پردازیم، سپس با انجام محاسبات ریاضی در پردازنده ممیز ثابت توضیح می‌دهیم.

Fixed-point در مقابل Floating-point

  • در پردازنده DSP Floating-point ضرب و جمع اعشاری در یک کلاک انجام می‌پذیرد ولی در پردازنده Fixed-point برای ضرب یا جمع اعشاری تعداد زیادی کلاک لازم است.
  • پردازنده‌های ممیز شناور 32 بیتی و پردازنده‌های‎‏ ممیز ثابت‎ ‎‏16 بیتی می‌باشند.
  • در پردازنده‌های ممیز شناور زمان نوشتن برنامه سریع‌تر می‌باشد زیرا برنامه نویس نگران سرریز و خطای گردن کردن نیست. در مقابل نوشتن برنامه برای پردازنده ممیز ثابت سخت‌تر است و برنامه نویس باید برنامه بیش‌تری بنویسد تا از سریز جلوگیری کند.
  • پردازنده‌های ممیز شناور گران‌تر هستند و توان بیش‌تری مصرف می‌کنند اما پردازنده‌های ممیز ثابت ارزان قیمت می‌باشند، توان مصرفی کمتری دارند و برای کارهای قابل حمل مناسب‌ترند.
  • مزیت اصلی که پردازنده ممیز شناور نسبت به ممیز ثابت دارد این است که نرخ سیگنال به نویز (گرد کردن اعداد) در پردازنده ممیز شناور ‏ بسیار بالاتر از ممیز ثابت ‏است.

پردازنده ممیز ثابت

برای این که محاسبات اعشاری در DSP ممیز ثابت با سرعت بالا انجام شود، ابتدا اعداد اعشاری را بین 1- و 1+ نرمالیزه می‌کنند. سپس این اعداد را در \(2^{15} = 32768\) ضرب می‌کنند. در انتها اعداد را گرد می‌کنند تا بخش اعشاری حذف شود. به این فرمت نمایش Q0.15 و یا به طور خلاصه Q15 می‌گویند. یک بیت برای علامت و 15 بیت برای قسمت صحیح می‌باشد که در مجموع 16 بیت می‌شود.

فرمت Q3.12

در فرمت Q15، 15 بیت اعشاری و صفر بیت صحیح می­باشد. می­توان ترکیبی از بیت­های اعشاری و صحیح نیز داشت. برای مثال 3 بیت صحیح و 12 بیت اعشاری برای نمایش اعداد بین $\frac{- ‎32768‎}{2^{12}}$ تا $\frac{+ 32768‎}{2^{12}}$ یا 8- تا 7.9997 داشت.

\[sin(x) = c1*x + c2*x^2 + c3*x^3 + c4*x^4 + c5*x^5\] \[c1 = 3.140625x\] \[c2 = 0.02026367\] \[c3 = − 5.3251\] \[c4 = 0.5446778\] \[c5 = 1.800293\]

‌همان که مشاهده می‌کنید ضرایب بین 5- تا 3 می‌باشند. به جای نرمالیزه کردن و نمایش اعداد به فرمت Q15 می‌توان از فرمت Q3.12 برای دقت به‌تر استفاده کرد. کافی است تا ضرایب را در \(2^{12}\) ضرب کنیم و نتیجه نهایی را گرد کنیم تا اعداد به فرمت Q3.12‎‏ ‏نشان داده شوند.

ضرب دو عدد با فرمت Q15

وقتی دو عدد 15 بیتی علامت‌دار را در هم ضرب می‌کنیم حاصل یک عدد 30 بیتی می‌باشد. که باعث سرریز شدن رجیسترهای 16 بیتی می‌شود. برای رفع این مشکل در پردازنده‌های 16 بیتی DSP رجیستر اصلی یعنی آکوملاتور 40 بیتی می‌باشد تا در انجام محاسبات میانی سرریز اتفاق نیافتد. برای ذخیره نهایی در متغییر 16 بیتی باید 15 بیت کم ارزش را دور بریزیم. این کار در محاسبات اعشاری معادل گرد کردن است. به این نکته توجه داشته باشید که داده‌های اولیه بین 1- و 1+ می‌باشند. با ضرب این دو عدد باز هم نتیجه نهایی بین 1- و 1+ می‌باشد.

image

با یک مثال موضوع را به‌تر توضیح می‌دهیم: دو عدد اعشاری x1 و x2 و معادل ممیز ثابت‌شان را در نظر بگیرید:

\[x_{1} = 0.25\ \ \rightarrow \ \ \ x_{1,fix} = 0.25 \times 2^{15} = 8,192\]
\[x_{2} = 0.75\ \ \rightarrow \ \ \ x_{2,fix} = 0.75‎ \times 2^{15} = 24,576\]

ضرب اعشاری به صورت زیر

\[x_{1} \times x_{2} = 0.1875\]

و ضرب ممیز ثابت نیز به صورت زیر

\[{Q30 = Q15 \times Q15:\ \ \ \ \ \ \ \ \ \ \ \ \ x}_{1,fix} \times x_{2,fix} = 201,326,592\]

می‌باشد که با شیفت 15 واحد به راست یا به طور معادل تقسیم بر \(2^{15}\) حاصل نهایی با فرمت Q15 به دست می‌آید.

\[‎‎Q30 \gg 15 = Q15:\ \ \ \ \ \ \ \ \ \ \ \ \ \ \frac{‎201,326,592‎}{2^{15}} = 6144\]

برای تبدیل حاصل Q15 به فرمت اعشاری اولیه کافی است آن را بر \(2^{15}\) تقسیم کنیم:

\[‎‎\frac{‎6144‎}{2^{15}} = 0.1875\]

نکته دیگری که در مورد فرمت Q15 وجود دارد این است که این فرمت را باید در بازه [32767 ,32767-] و یا به طور معادل [0.9999xx, 0.9999xx-] به کار ببریم.

مثال DSP با زبان C

در پردازنده‌های DSP سری 5000 شرکت TI، فرمت short، شانزده بیتی و long، سی‌و‌دو بیتی می‌باشد. برای ضرب دو عدد short ابتدا باید این دو عدد را به فرمت long تبدیل کرد. سپس در هم ضرب نمود. 15 بیت کم ارزش حاصل ضرب را دور ریخت تا نتیجه نهایی به دست بیاید. به عمل تبدیل فرمت Casting می‌گویند. برنامه C که این کار را انجام می‌دهد در ادامه آمده است:

;short x1,x2,y
;y = (short)(((int)x1 * (int)x2) >> 15)

ضرب دو عدد با فرمت مختلف

وقتی دو عدد با فرمت مختلف را در هم ضرب می‌کنیم حاصل نهایی به صورت زیر می‌باشد:

\[Q_{\text{x.y}} \times Q_{\text{w.z}} = Q_{x + y.w + z}\]

مثال:

\[Q_{3.12} \times Q_{3.12} = Q_{6.24}\]
\[Q_{3.12} \times Q_{15} = Q_{3.27}\]

حاصل ضرب 30 بیتی می‌باشد که با 15 واحد شیفت به چپ حاصل 15 بیتی می‌شود.

\[Q_{6.24} \gg 15 = Q_{6.9}\]
\[Q_{3.27} \gg 15 = Q_{3.12}\]

تگ ها:

دسته بندی ها:

به روز شده در: