এফপিজিএতে স্থির বিন্দু atan2 গণনার পদ্ধতি


12

atan2(x,y)অবিচ্ছিন্ন ইনপুট / ডেটা আউটপুট স্ট্রিম সহ আমি একটি এফপিজিএতে কম্পিউটিংয়ের প্রয়োজন । আমি এটি অনিবন্ধিত, পাইপলাইনযুক্ত কর্ডিক কার্নেলগুলি ব্যবহার করে বাস্তবায়ন করতে সক্ষম হয়েছি, তবে আমার যথাযথতাটি পেতে, আমাকে 32 পুনরাবৃত্তি করতে হয়েছিল। এটি এই এক কার্যে বেশ বড় পরিমাণে LUTs উত্সর্গ করেছে। আমি আংশিকভাবে অনিবন্ধিত কর্ডিক কার্নেলগুলি ব্যবহার করতে প্রবাহটি পরিবর্তনের চেষ্টা করেছি, তবে তারপরেও অবিচ্ছিন্ন ইনপুট / আউটপুট প্রবাহ বজায় রেখে বারবার লুপগুলি কার্যকর করতে আমার বহুগুণিত ঘড়ির ফ্রিকোয়েন্সি দরকার। এটির সাথে আমি সময় নির্ধারণ করতে পারিনি।

তাই এখন আমি কম্পিউটিংয়ের বিকল্প পদ্ধতির জন্য পৌঁছে যাচ্ছি atan2(x,y)

আমি ব্লক-র‍্যাম লকিং টেবিলগুলি ইন্টারপোলেশন সহ ব্যবহার করার বিষয়ে ভেবেছিলাম, তবে যেহেতু 2 টি ভেরিয়েবল রয়েছে তার জন্য আমার অনুসন্ধানের টেবিলগুলির 2 টি মাত্রা প্রয়োজন, এবং এটি ব্লক-র্যাম ব্যবহারের ক্ষেত্রে খুব সংস্থানযুক্ত resource

আমি তখন চতুষ্কোণ সামঞ্জস্যের সাথে atan2(x,y)সম্পর্কিত যে বিষয়টি ব্যবহার করে তা নিয়ে ভাবলাম atan(x/y)। এটির সাথে সমস্যাটি হ'ল x/yসত্যিকারের বিভাজন হওয়া প্রয়োজন যেহেতু yধ্রুবক নয় এবং এফপিজিএগুলিতে বিভাগগুলি খুব সংস্থানীয় সংস্থানীয়।

atan2(x,y)কোনও এফপিজিএতে প্রয়োগের আরও কোনও নতুন উপায় আছে যার ফলস্বরূপ LUT ব্যবহার কম হবে, তবে এখনও সঠিক নির্ভুলতা সরবরাহ করা যায়?


2
আপনার প্রক্রিয়াকরণের ঘড়ির হার এবং আপনার ইনপুট ডেটার হার কী?
জিম ক্লে

আপনার প্রয়োজনীয় নির্ভুলতাটি কী? আমি ধরে নিচ্ছি আপনিও নির্দিষ্ট পয়েন্ট গণনা ব্যবহার করছেন। আপনি কি বিট গভীরতা ব্যবহার করছেন? চতুষ্কোণ সামঞ্জস্য সহ একটি বহুবর্ষের আনুমানিক (বা LUT) বাস্তবায়ন করার একটি সাধারণ পদ্ধতি atan2। যদিও আপনি বিভাজন ছাড়াই পেতে পারেন তা নিশ্চিত নয়।
জেসন আর

ইনপুট ক্লকটি 150MHz, ইনপুট ডেটার হার 150 এমএসএএমপি / সেকেন্ড। মূলত আমি প্রতিটি ক্লক চক্রটিতে একটি নতুন ইনপুট পাই। বিলম্বিত হওয়া ভাল, তবে আমার অবশ্যই 150 এমএসএমপি / সেকেন্ডে আউটপুট তৈরি করতে হবে।
ব্যবহারকারী 2913869

আমার অনুকরণগুলি দেখায় আমি প্রায় 1 * 10 ^ -9 এর সাথে বেঁচে থাকতে পারি। নিখুঁত ন্যূনতম নির্ধারিত পয়েন্ট বিটগুলি নিশ্চিত নয়, তবে আমি Q10.32 নির্দিষ্ট পয়েন্ট ফর্ম্যাটটির সাথে অনুকরণ করছি
ইউজার 2913869

এই নিবন্ধটি একটি নির্দিষ্ট পয়েন্ট বাস্তবায়ন ব্যাখ্যা করে atan2। আপনার এখনও একটি বিভাগ প্রয়োজন হবে।
ম্যাট এল।

উত্তর:


20

বিভাগ থেকে মুক্তি পাওয়ার জন্য আপনি লগারিদম ব্যবহার করতে পারেন। জন্য (x,y) প্রথম পাদ মধ্যে:

z=log2(y)log2(x)atan2(y,x)=atan(y/x)=atan(2z)

ATAN (2 ^ য)

চিত্র 1. আতনের প্লট ( 2 জেড )atan(2z)

আপনি আনুমানিক করতে হবে atan(2z) সীমার মধ্যে 30<z<30 1E -9 আপনার প্রয়োজনীয় সঠিকতা জন্য। আপনি প্রতিসম আতন ( 2 - z ) = π এর সুবিধা নিতে পারেন πatan(2z)=π2atan(2z)বা বিকল্পভাবে নিশ্চিত করুন যে(x,y)একটি পরিচিত অক্ট্যান্টে রয়েছে। আনুমানিকlog2(a):

b=floor(log2(a))c=a2blog2(a)=b+log2(c)

b সবচেয়ে উল্লেখযোগ্য নন-শূন্য বিটের অবস্থান সন্ধান করে গণনা করা যেতে পারে। c একটি বিট শিফট দ্বারা গণনা করা যেতে পারে। আপনি আনুমানিক করতে হবেlog2(c) সীমার মধ্যে1c<2

log2 (গ)

চিত্র 2. লগ 2 এর প্লট ( সি )log2(c)

আপনার সঠিকতা প্রয়োজনীয়তা, রৈখিক ক্ষেপক এবং অভিন্ন স্যাম্পলিং জন্য 214+1=16385 নমুনা log2(c) এবং 30×212+1=122881 নমুনা atan(2z) জন্য 0<z<30 চলা উচিত নয়। পরের টেবিলটি বেশ বড়। এটির সাথে, বিরতিজনিত কারণে ত্রুটি z উপর নির্ভর করে :

অ্যাটান (2 ^ z) এর ত্রুটি x

চিত্র 3. atan(2z) পড়তা বৃহত্তম বিভিন্ন ব্যাপ্তির জন্য পরম ত্রুটি z একক ব্যবধান প্রতি নমুনার বিভিন্ন সংখ্যা (8192 32) জন্য (অনুভূমিক অক্ষ) z0z<1 (বাদ দেওয়া) এর জন্য বৃহত্তম পরম ত্রুটি floor(log2(z))=0 চেয়ে কিছুটা কম ।

atan(2z) টেবিল একাধিক subtables বিভক্ত যে মিলা হতে পারে 0z<1 এবং বিভিন্ন floor(log2(z)) সঙ্গে z1 , যা ক্যালকুলেট করা সহজ। চিত্রের দ্বারা নির্দেশিত হিসাবে টেবিলের দৈর্ঘ্যগুলি চয়ন করা যেতে পারে 3.. অভ্যন্তরীণ-সাবটেবল সূচকটি একটি সাধারণ বিট স্ট্রিং ম্যানিপুলেশন দ্বারা গণনা করা যায়। আপনার সঠিকতা প্রয়োজনীয়তা জন্য atan(2z) subtables আপনি পরিসর প্রসারিত 29217 নমুনা মোট থাকবে z জন্য 0z<32 সরলতার জন্য।

পরবর্তী রেফারেন্সের জন্য, এখানে আঁকড়ে পাইথন স্ক্রিপ্টটি আমি আনুমানিক ত্রুটিগুলি গণনা করতে ব্যবহার করি:

from numpy import *
from math import *
N = 10
M = 20
x = array(range(N + 1))/double(N) + 1
y = empty(N + 1, double)
for i in range(N + 1):
    y[i] = log(x[i], 2)

maxErr = 0
for i in range(N):
    for j in range(M):
        a = y[i] + (y[i + 1] - y[i])*j/M
        if N*M < 1000: 
            print str((i*M + j)/double(N*M) + 1) + ' ' + str(a)
        b = log((i*M + j)/double(N*M) + 1, 2)
        err = abs(a - b)
        if err > maxErr:
            maxErr = err

print maxErr

y2 = empty(N + 1, double)
for i in range(1, N):
    y2[i] = -1.0/16.0*y[i-1] + 9.0/8.0*y[i] - 1.0/16.0*y[i+1]


y2[0] = -1.0/16.0*log(-1.0/N + 1, 2) + 9.0/8.0*y[0] - 1.0/16.0*y[1]
y2[N] = -1.0/16.0*y[N-1] + 9.0/8.0*y[N] - 1.0/16.0*log((N+1.0)/N + 1, 2)

maxErr = 0
for i in range(N):
    for j in range(M):
        a = y2[i] + (y2[i + 1] - y2[i])*j/M
        b = log((i*M + j)/double(N*M) + 1, 2)
        if N*M < 1000: 
            print a
        err = abs(a - b)
        if err > maxErr:
            maxErr = err

print maxErr

y2[0] = 15.0/16.0*y[0] + 1.0/8.0*y[1] - 1.0/16.0*y[2]
y2[N] = -1.0/16.0*y[N - 2] + 1.0/8.0*y[N - 1] + 15.0/16.0*y[N]

maxErr = 0
for i in range(N):
    for j in range(M):
        a = y2[i] + (y2[i + 1] - y2[i])*j/M
        b = log((i*M + j)/double(N*M) + 1, 2)
        if N*M < 1000: 
            print str(a) + ' ' + str(b)
        err = abs(a - b)
        if err > maxErr:
            maxErr = err

print maxErr

P = 32
NN = 13
M = 8
for k in range(NN):
    N = 2**k
    x = array(range(N*P + 1))/double(N)
    y = empty((N*P + 1, NN), double)
    maxErr = zeros(P)
    for i in range(N*P + 1):
        y[i] = atan(2**x[i])

    for i in range(N*P):
        for j in range(M):
            a = y[i] + (y[i + 1] - y[i])*j/M
            b = atan(2**((i*M + j)/double(N*M)))
            err = abs(a - b)
            if (i*M + j > 0 and err > maxErr[int(i/N)]):
                maxErr[int(i/N)] = err

    print N
    for i in range(P):
        print str(i) + " " + str(maxErr[i])    

একটি ফাংশন approximating থেকে স্থানীয় সর্বাধিক ত্রুটি f(x) সুসংগত প্রক্ষেপক দ্বারা ( এক্স ) নমুনা থেকে ( এক্স ) , স্যাম্পলিং ব্যবধান সঙ্গে অভিন্ন স্যাম্পলিং কর্তৃক গৃহীত Δ এক্স দ্বারা বিশ্লেষণী আনুমানিক করা যেতে পারে:f^(x)f(x)Δx

f^(x)f(x)(Δx)2limΔx0f(x)+f(x+Δx)2f(x+Δx2)(Δx)2=(Δx)2f(x)8,

"(এক্স)(এক্স)এক্স

একটি কষা^(2z- র)-একটি কষা(2z- র)(Δz- র)22z- র(1-4z- র)Ln(2)28(4z- র+ +1)2,লগ2^(একটি)-লগ2(একটি)-(Δএকটি)28একটি2Ln(2)

কারণ ফাংশনগুলি অবতল এবং নমুনাগুলি ফাংশনের সাথে মেলে তাই ত্রুটিটি সর্বদা একদিকে থাকে। স্থানীয় সর্বাধিক পরম ত্রুটিটি অর্ধনমিত হতে পারে যদি ত্রুটির চিহ্নটি প্রতিটি নমুনা বিরতিতে একবার পিছনে পিছনে পিছনে করা যায়। রৈখিক সংক্ষিপ্তসার দ্বারা, প্রতিটি টেবিলে প্রিফিল্টার করে অনুকূল ফলাফলের কাছাকাছি হওয়া সম্ভব:

y[k]={b0x[k]+b1x[k+1]+b2x[k+2]if k=0,c1x[k1]+c0x[k]+c1x[k+1]if 0<k<N,b2x[k2]+b1x[k1]+b0x[k]if k=N,

xy0kNc0=98,c1=116,b0=1516,b1=18,b2=1160,1এন

(Δx)NlimΔx0(c1f(xΔx)+c0f(x)+c1f(x+Δx))(1a)+(c1f(x)+c0f(x+Δx)+c1f(x+2Δx))af(x+aΔx)(Δx)N={(c0+2c11)f(x)if N=0,|c1=1c020if N=1,1+aa2c02(Δx)2f(x)if N=2,|c0=98

0a<1f(x)f(x)=exb0,b1,b2

(Δx)NlimΔx0(b0f(x)+b1f(x+Δx)+b2f(x+2Δx))(1a)+(c1f(x)+c0f(x+Δx)+c1f(x+2Δx))af(x+aΔx)(Δx)N={(b0+b1+b21+a(1b0b1b2))f(x)if N=0,|b2=1b0b1(a1)(2b0+b12)Δxf(x)if N=1,|b1=22b0(12a2+(2316b0)a+b01)(Δx)2f(x)if N=2,|b0=1516

0a<1

প্রিফিল্টার এবং শেষ কন্ডিশনার সহ এবং ছাড়াই আনুমানিক ত্রুটি

log2(a)

এই নিবন্ধটি সম্ভবত খুব অনুরূপ একটি অ্যালগোরিদম উপস্থাপন করেছে: আর। গুতেরেজ, ভি। টরেস এবং জে ভলস, " লগারিদমিক ট্রান্সফর্মেশন এবং লুট-ভিত্তিক কৌশলগুলির উপর ভিত্তি করে আতান (ওয়াই / এক্স) এর এফপিজিএ-বাস্তবায়ন, " সিস্টেমস আর্কিটেকচার জার্নাল , খণ্ড । ৫ 56, ২০১০. অ্যাবস্ট্রাক্ট বলছে যে তাদের বাস্তবায়ন পূর্বের কর্ডিক-ভিত্তিক অ্যালগরিদমগুলিকে গতিতে এবং LUT- ভিত্তিক অ্যালগোরিদমকে পদচিহ্ন আকারে পরাজিত করে।


3
ম্যাথু গ্যামব্রেল এবং আমি 1985 ইয়ামাহা ওয়াইএম 3812 সাউন্ড চিপ (মাইক্রোস্কোপি দ্বারা) ইঞ্জিনিয়ার করেছি এবং এতে একই রকম লগ / এক্সপ্রেড রিড ওলি মেমরি (আরওএম) সারণী পেয়েছি। ইয়ামাহা প্রতিটি টেবিলের প্রতিটি দ্বিতীয় এন্ট্রি পূর্ববর্তী এন্ট্রি থেকে পৃথক করে প্রতিস্থাপনের জন্য একটি অতিরিক্ত কৌশল ব্যবহার করেছিল। মসৃণ ফাংশনের জন্য, পার্থক্যটি ফাংশনের চেয়ে প্রতিনিধিত্ব করতে কম বিট এবং চিপ অঞ্চল নেয়। তাদের ইতিমধ্যে চিপটিতে একটি সংযোজন রয়েছে যা তারা পূর্বের এন্ট্রিটিতে পার্থক্য যুক্ত করতে সক্ষম হয়েছিল।
অলি নিমিত্তালো

3
আপনাকে অনেক ধন্যবাদ! আমি গাণিতিক বৈশিষ্ট্যের এই ধরণের শোষণ পছন্দ করি। আমি অবশ্যই এর কয়েকটি ম্যাটল্যাব সিম বিকাশ করব এবং যদি সমস্ত ভাল দেখা যায় তবে এইচডিএল-এ সরে যান। সমস্ত কাজ শেষ হয়ে গেলে আমি আমার LUTs সঞ্চয়গুলি পুনরায় জানাব।
ব্যবহারকারী 2913869

আমি আপনার বিবরণটিকে গাইড হিসাবে ব্যবহার করেছি এবং আমি LUs দ্বারা প্রায় %০% হ্রাস পেয়ে খুশি happy আমার ব্রামগুলি হ্রাস করার প্রয়োজন ছিল, তাই আমি বুঝতে পেরেছিলাম যে অ-ইউনিফর্ম স্যাম্পলিংয়ের মাধ্যমে আমি আমার এটিএন টেবিলে একটি ধারাবাহিক সর্বোচ্চ ত্রুটি পেতে পারি: আমার একাধিক লুট ব্রাম ছিল (ঠিক একই সংখ্যার ঠিকানা বিট), আরও কাছাকাছি শূন্য, দ্রুত নমুনা। আমি আমার টেবিলের ব্যাপ্তিগুলিকে 2 এর শক্তি হিসাবে বেছে নিয়েছি তাই আমি সহজেই সনাক্ত করতে পারি যে আমিও কোন পরিসরে ছিলাম এবং বিট ম্যানিপুলেশনের মাধ্যমে স্বয়ংক্রিয় টেবিল সূচীকরণ করতে পারি। আমি এটান প্রতিসাম্য প্রয়োগ করেছি তাই আমি কেবল অর্ধেক তরঙ্গরূপ সংরক্ষণ করেছি stored
ব্যবহারকারী 2913869

এছাড়াও, আপনার কিছু সম্পাদনা আমি মিস করেছি, তবে আমি 2 ^ z কে 2 ^ into এ বিভক্ত করে বাস্তবায়ন করতে সক্ষম হয়েছি যদি} = 2 ^ i * 2 ^ {0.f}, যেখানে আমি পূর্ণসংখ্যার অংশ এবং চ ভগ্নাংশ অংশ। 2 ^ আমি সহজ, সামান্য বিট ম্যানিপুলেশন এবং 2 ^ {0.f এর সীমিত পরিসর ছিল, সুতরাং এটি নিজেকে ফাঁকে ফাঁকে ভালভাবে ধার দিয়েছিল। আমি নেতিবাচক কেসটিও পরিচালনা করেছি: 2 ^ {- যদি} = 2 ^ {- i} * 1 / (2 ^ {0.f}। সুতরাং 1/2 ^ {0.f} এর জন্য আরও একটি টেবিল My আমার পরবর্তী পদক্ষেপ লগ 2 (y) এলইউটি তে 2 টি রেঞ্জিং / অ-ইউনিফর্ম স্যাম্পলিংয়ের শক্তি প্রয়োগ করা হতে পারে, কারণ মনে হয় এটি সেই ধরণের জিনিসটির জন্য উপযুক্ত প্রার্থী তরঙ্গরূপ হবে। চিয়ার্স!
ব্যবহারকারী 2913869

1
হ্যাঁ, আমি পুরোপুরি এই পদক্ষেপটি মিস করেছি। আমি এখন এটি চেষ্টা করতে যাচ্ছি। আমাকে আরও LUTs এবং আরও বেশি ব্র্যাম সংরক্ষণ করতে হবে
user2913869
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.