Trigonometri titik tetap untuk aplikasi tertanam

9

Saya perlu melakukan rotasi (dan lainnya) transformasi dalam aplikasi tertanam, membutuhkan fungsi sin () cos () dan tan (). Saya tahu Anda dapat menggunakan tabel pencarian, dan itulah satu-satunya solusi yang dapat saya temukan saat melakukan penelitian sendiri, tetapi apakah ada pustaka trigonometri titik tetap yang bagus di luar sana?

Saya sedang berpikir untuk menggunakan korteks M3 untuk aplikasi, jadi saya ingin menjauh dari floating point sebanyak mungkin untuk menjaga aplikasi zippy.

Bob
sumber
Dua pemikiran: Implementasi rotasi primitif tradisional adalah algoritma CORDIC. Anda mungkin juga melihat apakah vendor Anda sekarang menawarkan Cortex M4 yang kompetitif dengan M3 yang Anda pertimbangkan.
Chris Stratton
4
Mengapa Anda tidak ingin menggunakan tabel pencarian? Itu bekerja sangat baik untuk dosa dan cos. Melakukan dosa dan cos secara algoritmik akan memakan waktu lebih lama. Satu-satunya keuntungan mungkin lebih sedikit ruang memori program yang digunakan, tetapi apakah itu benar-benar penting dalam aplikasi Anda?
Olin Lathrop
@ OlinLathrop, saya ingin tahu apa yang orang lain temukan: mungkin beberapa cara efisien untuk menyelesaikan masalah dengan cepat dengan sedikit kesalahan sambil menghemat ruang memori yang belum saya temukan? Dari apa yang saya tahu (dan saya bisa salah), masalah terbesar untuk menyelesaikan algoritme dengan perpustakaan standar adalah bahwa semua matematika dilakukan dalam floating point, dan tanpa FPU bahwa semua harus dilakukan secara numerik, yang sangat tidak efisien. .. Masalah terbesar dengan tabel pencarian adalah: seberapa akurat saya harus? Dan jika akurasi req berubah, apakah saya masih memiliki cukup memori program?
Bob
Seberapa akurat yang Anda butuhkan? Tabel pencarian ukuran sederhana cukup memadai untuk sebagian besar kebutuhan sin / cos tertanam. Dengan 1025 entri tabel, Anda mendapatkan resolusi 4096 sudut. Pada saat itu, interoplasi linier memberi Anda akurasi yang baik antara entri tabel. Tampaknya ada banyak mitos yang salah tentang pencarian sinus. Lihat jawaban saya di electronics.stackexchange.com/a/16516/4512 untuk rincian lebih lanjut.
Olin Lathrop
Saya mendengar apa yang Anda katakan, dan saya memahami ide tabel lookup untuk fungsi sinus, tetapi jika saya terbatas kode (proyek selalu mengisi ruang kode), apakah ada cara yang lebih kompak untuk menangani ini? Itu sebabnya saya bertanya: ada banyak orang berbakat di luar sana yang berkontribusi, dan saya ingin tahu apakah mereka telah menemukan sesuatu yang lebih baik.
Bob

Jawaban:

6

Pendekatan yang baik untuk melakukan trigonometri dalam aplikasi yang disematkan adalah dengan menggunakan pendekatan polinomial ke fungsi yang Anda butuhkan. Kode ini kompak, data terdiri dari beberapa koefisien, dan hanya operasi yang diperlukan adalah bertambah dan tambah / kurangi. Banyak sistem tertanam memiliki pengganda perangkat keras, memberikan kinerja yang baik.

Dave Tweed
sumber
1
Adakah yang sudah merilis versi ini dalam C yang dioptimalkan untuk aplikasi tertanam yang tidak menggunakan instruksi floating point? Kesalahan tinggi di kedua sisi perkiraan polinomial cenderung menggunakan trik untuk menggunakan polinomial yang berbeda untuk segmen yang berbeda untuk mengurangi kesalahan, atau trik lainnya ...
Bob
1
Generic C tidak secara langsung mendukung tipe data dan operasi titik tetap non-integer, sehingga optimisasi untuk tipe data ini cenderung bersifat spesifik platform. Sebagai contoh, sebagian besar DSP mendukung tipe data pecahan titik tetap langsung di perangkat keras mereka. Dari C, Anda mengakses ini melalui perpustakaan eksklusif.
Dave Tweed
Generic C mendapatkan dukungan melalui tipe data _Fract, tetapi sebagian besar implementasi mikrokontroler memiliki pustaka khusus vendor. Saya menggunakan libmathq15 untuk semua kebutuhan fixed-point saya. Telah melakukan pekerjaan sejauh ini.
slightlynybbled
_Fractadalah sepotong omong kosong IMHO; Saya benci fakta bahwa itu "standar" oleh komite C. Ini memaksa Anda untuk menggunakan Q15 atau Q31 untuk semuanya, yang tidak masuk akal dalam banyak situasi, dan membuat Anda terdampar tanpa bantuan untuk situasi itu.
Jason S
3

Apakah Anda menentang menggunakan perpustakaan titik tetap Cortex untuk ini?

q31_t arm_sin_q31 (q31_t x)
Perkiraan cepat untuk fungsi sinus trigonometri untuk data Q31.

dari:

CMSIS-DSP: Pengumpulan Perpustakaan DSP dengan lebih dari 60 Fungsi untuk berbagai tipe data: titik perbaikan (fraksi q7, q15, q31) dan titik mengambang presisi tunggal (32-bit). Perpustakaan tersedia untuk Cortex-M0, Cortex-M3 , dan Cortex-M4.

Ini menggunakan tabel pencarian dengan interpolasi kuadrat, tapi cukup cepat. Anda bisa menyesuaikannya dengan interpolasi linier untuk kecepatan lebih cepat tetapi lebih banyak kesalahan.

Perhatikan juga bahwa bahkan Cortex M4 tidak harus memiliki FPU. Saya pernah melihat mereka disebut "M4F" jika mereka melakukannya.

endolit
sumber