Może ktoś to robił, ewentualnie może ktoś to wie: z jaką prędkością da się wyliczać wartość sinusa na procesorach serii ARM?
Krzysiek
PS. Może ktoś tego będzie szukał: na mikrokontrolerach serii AVR przy standardowych bibliotekach da się wyliczać max. niecałe 3000 razy/sek wartość sinusa...
co prawda nie odpowiem na twoje pytanie - ale czy trzeba wyliczac? a nie mozna zrobic "tabelki" z gotowymi wynikami, np znormalizowanymi, gdzie max sinusa to pelny zakres (dla danego typu zmiennej), a potem sobie tylko odnajdywac w tabelce wartosc dla danego kata ?
Testowałem tą metodę (na mikrokontrolerach AVR, tabela o rozmiarze kilkuset bajtów), ale do mojego zastosowania jest zbyt mało dokładna. Potrzebuję miec wartości sinusa dla niemal dowolnych kątów, bo później wyliczone wartości trafiają na przetowrnik D/A. Potrzebuję generowac częstotliwości (sinusoida) z zakresu 330-350Hz, przy niskim poziomie zniekształceń (pierwsza harmoniczna najwyżej -40 dB). Ale gdyby tabela wartości była dużych rozmiarów (kilkadziesiąt kB) może dałoby to zamierzony efekt...
Użytkownik "Krzysztof" <krzysztof.gedroyc_NOSPAM snipped-for-privacy@wp.pl napisał w wiadomości news:ec766v$sq1$ snipped-for-privacy@nemesis.news.tpi.pl...
A może dało by się użyć jakiegoś DDS-a zamiast programowo generować sinusa ?
możesz spróbować zastosować na wyjściu C/A ostry filtr dolnoprzepustowy analogowy fgr = 370..400Hz, taki jaki ongiś stosowało się w torze CD-Audio w czasach przed C/A 1-bit i wielokrotnym oversamplingiem ( żyratory i takie inne Butherwothy/Czebyszewy); zerknij na jakieś gotowce i przeskaluj na niższe częstotliwości; powinieneś dostać bardzo czyste przebiegi nawet przy mało dokładnym wyznaczeniu sinusa;
a od strony programowej szukaj algorytmu pod: "DTMF Generation" a szczególnie "Artificial Sine Wave Generation Using SX Microcontroller" pod mikrokontrolery Scenixa; mała ilość kodu i świetna szybkość algorytmu
możesz spróbować zastosować na wyjściu C/A ostry filtr dolnoprzepustowy analogowy fgr = 370..400Hz, taki jaki ongiś stosowało się w torze CD-Audio w czasach przed C/A 1-bit z wielokrotnym oversamplingiem ( żyratory i takie inne Butherwothy/Czebyszewy); zerknij na jakieś gotowce i przeskaluj na niższe częstotliwości; powinieneś dostać bardzo czyste przebiegi nawet przy mało dokładnym wyznaczeniu sinusa;
a od strony programowej szukaj algorytmu pod: "DTMF Generation" a szczególnie "Artificial Sine Wave Generation Using SX Microcontroller" pod mikrokontrolery Scenixa; mała ilość kodu i świetna szybkość algorytmu
Po pierwsze - kolejne probki mozna wyliczyc w ogole bez sinusa, po drugie - mozesz to sobie stablicowac i interpolacje liniowa miedzy wezlami wprowadzic, po trzecie - dla tej dokladnosci to i wielomian obliczeniowy moze byc krotszy.
Na ARMie nie robiłem, ale na FPGA tak -- tam częstotliwość ograniczała wydajność bloku RAM, co na Cyclone dawało ~250 MHz. Algorytm był prosty i generował dokładność 17,3 bitu. Zgaduję, że na ARMie da się osiągnąć co najmniej kilka milionów sampli na sekundę. Pomysł jest następujący: stablicuj sobie wartości sinusa w zakresie podzielonym na 256 i pobieraj je indeksując starszym bajtem akumulatora fazy. Dodaj do tego wynik interpolacji liniowej, obliczony z iloczynu różnicy dwóch kolejnych próbek i młodszego bajtu akumulatora fazy. I to wszystko.
Na FPGA oszczędzałem RAM, więc trzymałem tylko 256 18-bitowych wartości z pierwszej ćwiartki kątów i na podstawie dwóch najstarszych bitów akumulatora fazy dokonywałem korekcji kąta i znaku. Akumurator miał więc efektywnie 18 bitów. Ze wzgledu na sekwencyjną naturę procesorów na ARMie może się to nie opłacać.
Jeśli ktoś potrzebuje więcej, to są metody niestandardowe... Sądzę, że kilkaset tysięcy próbek na sekundę bym z niego wycisnął.
z DSP - jeszcze czasem po prostu wystarczy zasymulowac bezstratny obwod LC A pzoa tym CORDIC i masa innych roziwazan. pamietac nalezy o symetrii sinusa wiec wystarczy liczyc wartosc dla jednej cwiartki a pozsotale uzyskuje sie przez proste zanegowanie
ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here.
All logos and trade names are the property of their respective owners.