ตรีโกณมิติจุดคงที่สำหรับ aplications แบบฝัง


9

ฉันต้องทำการแปลงแบบหมุน (และอื่น ๆ ) ในแอปพลิเคชันแบบฝังที่ต้องการฟังก์ชัน sin () cos () และ tan () ฉันรู้ว่าคุณสามารถใช้ตารางการค้นหาและนั่นเป็นทางออกเดียวที่ฉันสามารถหาการวิจัยของฉันเอง แต่มีห้องสมุดตรีโกณมิติที่มีจุดคงที่หรือไม่?

ฉันกำลังคิดว่าจะใช้ Cortex M3 สำหรับแอปพลิเคชันดังนั้นฉันจึงต้องการอยู่ห่างจากจุดที่เป็นไปได้มากที่สุดเพื่อให้แอปพลิเคชันมีกำลังใจ


ความคิดสองประการ: การใช้การหมุนแบบดั้งเดิมดั้งเดิมคืออัลกอริทึมแบบ CORDIC คุณอาจเห็นว่าผู้ขายของคุณเสนอ Cortex M4 ที่แข่งขันกับ M3 ที่คุณกำลังพิจารณาอยู่หรือไม่
Chris Stratton

4
ทำไมคุณไม่ต้องการใช้ตารางการค้นหา? มันใช้งานได้ดีกับบาปและคอส การทำบาปและเพราะอัลกอริทึมจะใช้เวลานานกว่า ข้อได้เปรียบเพียงอย่างเดียวอาจจะใช้พื้นที่หน่วยความจำของโปรแกรมน้อยกว่า แต่นั่นสำคัญสำหรับแอปพลิเคชันของคุณหรือไม่
Olin Lathrop

@OlinLathrop ฉันต้องการที่จะรู้ว่าสิ่งที่คนอื่นได้พบ: บางทีวิธีที่มีประสิทธิภาพในการแก้ปัญหาได้อย่างรวดเร็วโดยมีข้อผิดพลาดเล็กน้อยในขณะที่ประหยัดพื้นที่หน่วยความจำอยู่ที่ฉันไม่ได้พบ? จากสิ่งที่ฉันรู้ (และฉันผิด) ปัญหาที่ใหญ่ที่สุดสำหรับการแก้อัลกอริธึมกับไลบรารีมาตรฐานคือคณิตศาสตร์ทั้งหมดทำในจุดลอยตัวและไม่มี FPU ที่ทุกคนต้องทำตัวเลขซึ่งไม่มีประสิทธิภาพอย่างน่ากลัว .. ปัญหาที่ใหญ่ที่สุดของตารางการค้นหาคือ: ฉันต้องแม่นยำขนาดไหน และหากความแม่นยำนั้นเปลี่ยนไปฉันจะยังมีหน่วยความจำโปรแกรมเพียงพอหรือไม่
Bob

คุณต้องการความแม่นยำเพียงใด? ตารางการค้นหาขนาดที่พอเหมาะนั้นค่อนข้างเพียงพอสำหรับความต้องการ sin / cos แบบฝังส่วนใหญ่ ด้วยรายการตาราง 1025 คุณจะได้รับความละเอียดมุม 4096 ณ จุดนั้นการแทรกสอดเชิงเส้นทำให้คุณมีความแม่นยำที่ดีระหว่างรายการตาราง ดูเหมือนจะมีตำนานที่ไม่ถูกต้องมากมายเกี่ยวกับการค้นหาไซน์ ดูคำตอบของฉันได้ที่electronics.stackexchange.com/a/16516/4512สำหรับรายละเอียดเพิ่มเติม
Olin Lathrop

ฉันได้ยินสิ่งที่คุณพูดและเข้าใจความคิดของตารางค้นหาสำหรับฟังก์ชันไซน์ แต่ถ้าฉันรหัส จำกัด (โครงการเติมพื้นที่โค้ดเสมอ) มีวิธีจัดการที่กระชับกว่านี้หรือไม่? นั่นเป็นเหตุผลที่ฉันถามว่า: มีคนที่มีความสามารถมากมายที่มีส่วนร่วมและฉันต้องการที่จะรู้ว่าพวกเขาได้พบสิ่งที่ดีกว่า
บ๊อบ

คำตอบ:


6

วิธีที่ดีสำหรับการทำตรีโกณมิติในแอพพลิเคชั่นแบบฝังคือการใช้การประมาณแบบพหุนามกับฟังก์ชันที่คุณต้องการ รหัสมีขนาดกะทัดรัดข้อมูลประกอบด้วยค่าสัมประสิทธิ์ไม่กี่และการดำเนินการที่จำเป็นเท่านั้นที่จะคูณและเพิ่ม / ลบ ระบบฝังตัวหลายตัวมีตัวคูณฮาร์ดแวร์ให้ประสิทธิภาพที่ดี


1
มีใครเปิดตัวรุ่นนี้ใน C ปรับให้เหมาะสมสำหรับการใช้งานที่ฝังตัวไม่ได้ใช้คำแนะนำจุดลอยตัว? ข้อผิดพลาดสูงที่ทั้งสองด้านของการประมาณค่าพหุนามให้ยืมตัวเองโดยใช้ลูกเล่นที่ใช้ชื่อพหุนามที่แตกต่างกันสำหรับส่วนต่าง ๆ เพื่อลดข้อผิดพลาดหรือเคล็ดลับอื่น ๆ ...
Bob

1
Generic C ไม่สนับสนุนประเภทและการดำเนินงานของข้อมูลคงที่ที่ไม่ใช่จำนวนเต็มโดยตรงดังนั้นการปรับให้เหมาะสมสำหรับประเภทข้อมูลนี้จึงค่อนข้างเฉพาะแพลตฟอร์ม ตัวอย่างเช่น DSP ส่วนใหญ่สนับสนุนชนิดข้อมูลแบบจุดคงที่โดยตรงในฮาร์ดแวร์ของพวกเขา จาก C คุณเข้าถึงสิ่งนี้ผ่านห้องสมุดที่เป็นกรรมสิทธิ์
Dave Tweed


Generic C ได้รับการสนับสนุนผ่านประเภทข้อมูล _Fract แต่การใช้ไมโครคอนโทรลเลอร์ส่วนใหญ่มีห้องสมุดเฉพาะของผู้ขาย ฉันใช้libmathq15สำหรับความต้องการคงที่ทั้งหมดของฉัน ทำผลงานได้แล้ว
เล็กน้อย

_Fractเป็นชิ้นส่วนของอึ IMHO; ฉันเกลียดความจริงที่ว่ามันเป็น "มาตรฐาน" โดยคณะกรรมการซี มันบังคับให้คุณใช้ Q15 หรือ Q31 สำหรับทุกสิ่งซึ่งไม่สมเหตุสมผลในหลาย ๆ สถานการณ์และทำให้คุณติดค้างโดยไม่ต้องช่วยในสถานการณ์เหล่านั้น
Jason S

3

คุณไม่เห็นด้วยกับการใช้ห้องสมุด Cortex แบบตายตัวสำหรับเรื่องนี้หรือไม่?

q31_t arm_sin_q31 (q31_t x) การ
ประมาณที่รวดเร็วสำหรับฟังก์ชันตรีโกณมิติไซน์สำหรับข้อมูล Q31

จาก:

CMSIS-DSP: DSP Library Collection ที่มีฟังก์ชั่นมากกว่า 60 ฟังก์ชั่นสำหรับชนิดข้อมูลต่าง ๆ : fix-point (เศษส่วน q7, q15, q31) และ floating-point ที่มีความแม่นยำเดียว (32 บิต) ห้องสมุดพร้อมใช้งานสำหรับ Cortex-M0, Cortex-M3และ Cortex-M4

ใช้ตารางการค้นหาพร้อมการแก้ไขกำลังสอง แต่มันค่อนข้างเร็ว คุณสามารถปรับให้เข้ากับการแก้ไขเชิงเส้นเพื่อความเร็วที่เร็วขึ้น แต่มีข้อผิดพลาดมากขึ้น

โปรดทราบว่าแม้แต่ Cortex M4 ก็ไม่จำเป็นต้องมี FPU ฉันเคยเห็นพวกเขาเรียกว่า "M4F" ถ้าพวกเขาทำ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.