Gömülü uygulamalar için sabit nokta trigonometrisi


9

Sin () cos () ve tan () işlevleri gerektiren gömülü bir uygulamada dönme (ve diğer) dönüşümleri yapmam gerekiyor. Arama tablolarını kullanabileceğinizi biliyorum ve kendi araştırmamı yaparken bulabildiğim tek çözüm, ama orada iyi bir sabit nokta trig kütüphanesi var mı?

Ben uygulama için bir korteks M3 kullanmayı düşünüyorum, bu yüzden uygulamaları zippy tutmak için mümkün olduğunca kayan noktadan uzak kalmak istiyorum.


İki düşünce: Geleneksel bir ilkel rotasyon uygulaması CORDIC algoritmasıdır. Ayrıca satıcınızın artık düşündüğünüz M3 ile rekabet eden bir Cortex M4 sunup sunmadığını da görebilirsiniz.
Chris Stratton

4
Neden arama tablolarını kullanmak istemiyorsunuz? Günah ve cos için çok iyi çalışıyor. Sin ve cos'u algoritmik olarak yapmak daha uzun sürecektir. Tek avantaj, daha az kullanılan program bellek alanı olabilir, ancak uygulamanızda bu gerçekten önemli mi?
Olin Lathrop

@OlinLathrop, ben başkalarının ne bulduklarını bilmek istiyorum: belki de hızlı bir şekilde küçük bir hata ile sorunu çözmek için etkili bir yol bulamıyorum bellek alanı tasarruf ederken var? Bildiğim kadarıyla (ve yanlış olabilir), standart kütüphanelerle algoritmik olarak çözmenin en büyük sorunu, tüm matematiğin kayan noktada yapılması ve bir FPU olmadan, her şeyin sayısal olarak yapılması gerektiğidir, bu da korkunç derecede verimsizdir. .. Arama tablolarındaki en büyük sorun şudur: ne kadar doğru olmam gerekir? Bu doğruluk gereksinimi değişirse, yine de yeterli program belleğim olacak mı?
Bob

Ne kadar doğru ihtiyacınız var? Çoğu gömülü sin / cos ihtiyacı için mütevazı bir boyut arama tablosu oldukça yeterlidir. 1025 tablo girişi ile 4096 açı çözünürlüğü elde edersiniz. Bu noktada, doğrusal birlikte çalışma tablo girişleri arasında iyi bir doğruluk sağlar. Sinüs arama ile ilgili birçok yanlış efsane var gibi görünüyor. Daha fazla bilgi için electronics.stackexchange.com/a/16516/4512 adresindeki yanıtımı inceleyin.
Olin Lathrop

Söylediklerini duyuyorum ve sinüs fonksiyonu için arama tablosunun fikrini anlıyorum, ancak kod sınırlıysam (projeler her zaman kod alanını doldurur), bunu ele almanın daha kompakt bir yolu var mı? Bu yüzden sordum: katkıda bulunan çok sayıda yetenekli insan var ve daha iyi bir şey bulup bulmadıklarını bilmek istiyorum.
Bob

Yanıtlar:


6

Gömülü uygulamalarda trigonometri yapmak için iyi bir yaklaşım, ihtiyacınız olan işlevlere polinom yaklaşımlarını kullanmaktır . Kod kompakttır, veriler birkaç katsayıdan oluşur ve gerekli olan tek işlem çarpma ve toplama / çıkarmadır. Birçok gömülü sistem iyi performans sağlayan donanım çarpanlarına sahiptir.


1
Herkes bu sürüm C kayan nokta talimatları kullanmayan gömülü uygulamalar için optimize edilmiş bir sürümü yayımladı? Polinom yaklaşımının her iki tarafındaki yüksek hata, hatayı azaltmak için farklı segmentler için farklı polinomlar kullanmak için hileler kullanmaya ya da başka bir hile ...
Bob

1
Generic C, tamsayı olmayan sabit nokta veri türlerini ve işlemlerini doğrudan desteklemediğinden, bu veri türü için optimizasyonlar platforma özgüdür. Örneğin, çoğu DSP doğrudan donanımlarında sabit noktalı kesirli veri türünü destekler. C'den buna özel kütüphaneler aracılığıyla erişirsiniz.
Dave Tweed


Genel C, _Fract veri türü aracılığıyla destek kazanıyor, ancak mikrodenetleyici uygulamalarının çoğunun satıcıya özgü kitaplıkları var. Tüm sabit nokta ihtiyaçlarım için libmathq15 kullanıyorum . Şu ana kadar bu işi yaptı.
slightlynybbled

_Fractbir bok IMHO parçasıdır; C komitesi tarafından "standartlaştırılmış" olmasından nefret ediyorum. Sizi her şey için Q15 veya Q31 kullanmaya zorlar, bu birçok durumda mantıklı değildir ve sizi bu durumlar için yardım almadan mahsur bırakır.
Jason S

3

Bunun için sabit nokta Cortex kütüphanelerini kullanmaya karşı mısınız?

q31_t arm_sin_q31 (q31_t x) Q31
verileri için trigonometrik sinüs işlevine hızlı yaklaşım.

dan:

CMSIS-DSP: 60'ın üzerinde DSP Kütüphanesi Koleksiyonu Çeşitli veri türleri için fonksiyonlar: düzeltme noktası (kesirli q7, q15, q31) ve tek hassas kayan nokta (32 bit). Kitaplık Cortex-M0, Cortex-M3 ve Cortex-M4 için kullanılabilir.

İkinci dereceden enterpolasyonlu bir arama tablosu kullanır, ancak oldukça hızlıdır. Daha hızlı ancak daha fazla hata için doğrusal enterpolasyona uyarlayabilirsiniz.

Ayrıca Cortex M4'te bile FPU bulunmadığını unutmayın. Eğer yaparlarsa "M4F" diye gördüm.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.