Trygonometria punktu stałego dla osadzonych aplikacji

9

Potrzebuję wykonać transformacje rotacyjne (i inne) we wbudowanej aplikacji, wymagające funkcji sin () cos () i tan (). Wiem, że możesz korzystać z tabel przeglądowych i to jedyne rozwiązanie, jakie mogłem znaleźć, prowadząc własne badania, ale czy jest tam dobra biblioteka ze stałymi punktami wyzwalania?

Zastanawiam się nad zastosowaniem kory M3 do aplikacji, więc chcę jak najdalej trzymać się punktu zmiennoprzecinkowego, aby aplikacje były niepoprawne.

Kok
źródło
Dwie myśli: Tradycyjną prymitywną implementacją rotacji jest algorytm CORDIC. Możesz także sprawdzić, czy twój sprzedawca oferuje teraz Cortex M4 konkurencyjny wobec rozważanego M3.
Chris Stratton
4
Dlaczego nie chcesz używać tabel odnośników? To działa bardzo dobrze w przypadku grzechu i cos. Algorytmiczne popełnianie grzechu i cos potrwa dłużej. Jedyną zaletą może być mniejsze zużycie pamięci programu, ale czy to naprawdę ma znaczenie w Twojej aplikacji?
Olin Lathrop
@OlinLathrop, chcę wiedzieć, co znaleźli inni: być może jakiś skuteczny sposób szybkiego rozwiązania problemu z małym błędem, podczas gdy istnieje oszczędność miejsca w pamięci, którego nie znalazłem? Z tego, co wiem (i mogłem się mylić), największym problemem w rozwiązywaniu algorytmicznym za pomocą bibliotek standardowych jest to, że cała matematyka jest wykonywana w liczbach zmiennoprzecinkowych, a bez FPU wszystko musi być wykonane liczbowo, co jest strasznie nieefektywne. .. Największy problem z tabelami przeglądowymi polega na tym, jak dokładny muszę być? A jeśli zmieni się to wymaganie dokładności, czy nadal będę mieć wystarczającą ilość pamięci programu?
Bob
Jak dokładny potrzebujesz? Tabele wyszukiwania o skromnym rozmiarze są wystarczające dla większości osadzonych potrzeb sin / cos. Dzięki 1025 wpisom w tabeli otrzymujesz rozdzielczość 4096 kątów. W tym momencie interpolacja liniowa zapewnia dobrą dokładność między wpisami tabeli. Wydaje się, że istnieje wiele niepoprawnych mitów na temat wyszukiwania sinusoidy. Zobacz moją odpowiedź na elektronice.stackexchange.com/a/16516/4512, aby uzyskać więcej informacji.
Olin Lathrop
Słyszę, co mówisz, i rozumiem ideę tabeli przeglądowej dla funkcji sinusoidalnej, ale jeśli mam ograniczony kod (projekty zawsze wypełniają przestrzeń kodu), czy istnieje bardziej zwarty sposób radzenia sobie z tym? Właśnie dlatego zapytałem: wielu utalentowanych ludzi wnosi swój wkład i chciałbym wiedzieć, czy znaleźli coś lepszego.
Bob

Odpowiedzi:

6

Dobrym podejściem do wykonywania trygonometrii w aplikacjach osadzonych jest stosowanie aproksymacji wielomianowych do potrzebnych funkcji. Kod jest zwarty, dane składają się z kilku współczynników, a jedynymi wymaganymi operacjami są mnożenie i dodawanie / odejmowanie. Wiele systemów wbudowanych ma multiplikatory sprzętowe, co zapewnia dobrą wydajność.

Dave Tweed
źródło
1
Czy ktoś wypuścił wersję tego w C zoptymalizowaną dla aplikacji osadzonych nieużywających instrukcji zmiennoprzecinkowych? Wysoki błąd po obu stronach aproksymacji wielomianu pozwala na użycie sztuczek do użycia różnych wielomianów dla różnych segmentów w celu zmniejszenia błędu lub innej sztuczki ...
Bob
1
Ogólny C nie obsługuje bezpośrednio typów danych i operacji na liczbach całkowitych niecałkowitych, dlatego optymalizacje dla tego typu danych są zazwyczaj dość specyficzne dla platformy. Na przykład większość procesorów DSP obsługuje stały typ ułamkowego typu danych bezpośrednio w ich sprzęcie. Z poziomu C uzyskuje się do tego dostęp za pośrednictwem bibliotek zastrzeżonych.
Dave Tweed
Ogólne C zyskuje wsparcie poprzez typ danych _Fract, ale większość implementacji mikrokontrolerów ma biblioteki specyficzne dla dostawcy. Używam libmathq15 do wszystkich moich potrzeb w punkcie stałym. Jak dotąd wykonał tę pracę.
nieznaczniebbled
_Fractto bzdura IMHO; Nienawidzę faktu, że została ona „znormalizowana” przez komisję C. Zmusza cię do użycia Q15 lub Q31 do wszystkiego, co nie ma sensu w wielu sytuacjach i pozostawia cię bez pomocy w tych sytuacjach.
Jason S
3

Czy jesteś przeciwny używaniu do tego celu bibliotek Cortex ze stałym punktem?

q31_t arm_sin_q31 (q31_t x)
Szybkie przybliżenie do funkcji trygonometrycznej sinus dla danych Q31.

od:

CMSIS-DSP: Biblioteka DSP z ponad 60 funkcjami dla różnych typów danych: punkt stały (ułamek q7, q15, q31) i zmiennoprzecinkowy pojedynczej precyzji (32-bit). Biblioteka jest dostępna dla Cortex-M0, Cortex-M3 i Cortex-M4.

Używa tabeli odnośników z interpolacją kwadratową, ale jest dość szybka. Możesz dostosować go do interpolacji liniowej, aby uzyskać większą prędkość, ale więcej błędów.

Zauważ też, że nawet Cortex M4 niekoniecznie ma FPU. Widziałem je nazywane „M4F”, jeśli tak.

endolit
źródło