ARM - prędkość wyliczania sin(x)

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...

Reply to
Krzysztof
Loading thread data ...

Krzysztof napisał(a):

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 ?

Reply to
BartekK

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...

Pzdr. K.

Reply to
Krzysztof

Witam

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 ?

Pozdrawiam

Jarek Grolik

Reply to
invalid unparseable

Użytkownik Krzysztof napisał:

A ilu bitowy jest ten przetwornik D/A ?

Pozdrawiam Grzegorz

Reply to
Grzegorz Kurczyk

Przetowrnik jest 16-bitowy. Dla informacji dodam, że potrzebuję naraz generowac dwa przebiegi o podobnych częstotliwościach (330-350Hz)...

K.

Reply to
Krzysztof

Użytkownik "Krzysztof" :

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

Reply to
JR

Użytkownik "Krzysztof" :

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

Reply to
JR

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.

J.

Reply to
J.F.

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ął.

Pozdrawiam Piotr Wyderski

Reply to
Piotr Wyderski

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

Reply to
PAndy

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.