Krzysztof
Guest
Fri Aug 18, 2006 3:10 pm
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...
BartekK
Guest
Fri Aug 18, 2006 4:13 pm
Krzysztof napisał(a):
Quote:
z jaką prędkością da się wyliczać
wartość sinusa na procesorach serii ARM?
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 ?
--
| Bartlomiej Kuzniewski
| sibi@drut.org GG:23319 tel +48 696455098
http://drut.org/
|
http://www.allegro.pl/show_user_auctions.php?uid=338173
Krzysztof
Guest
Sat Aug 19, 2006 2:09 pm
Quote:
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...
Pzdr.
K.
Jarosław Grolik
Guest
Sat Aug 19, 2006 5:40 pm
Witam
Użytkownik "Krzysztof" <krzysztof.gedroyc_NOSPAM_@wp.pl> napisał w
wiadomości news:ec766v$sq1$1@nemesis.news.tpi.pl...
Quote:
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).
A może dało by się użyć jakiegoś DDS-a zamiast programowo generować sinusa ?
Pozdrawiam
Jarek Grolik
Grzegorz Kurczyk
Guest
Sat Aug 19, 2006 7:08 pm
Użytkownik Krzysztof napisał:
Quote:
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).
A ilu bitowy jest ten przetwornik D/A ?
Pozdrawiam
Grzegorz
Krzysztof
Guest
Sat Aug 19, 2006 7:41 pm
Quote:
A ilu bitowy jest ten przetwornik D/A ?
Przetowrnik jest 16-bitowy.
Dla informacji dodam, że potrzebuję naraz generowac dwa przebiegi o
podobnych częstotliwościach (330-350Hz)...
K.
JR
Guest
Sat Aug 19, 2006 8:55 pm
Użytkownik "Krzysztof" :
Quote:
Przetowrnik jest 16-bitowy.
Dla informacji dodam, że potrzebuję naraz generowac dwa przebiegi o
podobnych częstotliwościach (330-350Hz)...
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
--
pzdr.
JR
JR
Guest
Sat Aug 19, 2006 9:12 pm
Użytkownik "Krzysztof" :
Quote:
Przetowrnik jest 16-bitowy.
Dla informacji dodam, że potrzebuję naraz generowac dwa przebiegi o
podobnych częstotliwościach (330-350Hz)...
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
--
pzdr.
JR
J.F.
Guest
Sun Aug 20, 2006 6:41 am
On Sat, 19 Aug 2006 21:41:01 +0200, Krzysztof wrote:
Quote:
A ilu bitowy jest ten przetwornik D/A ?
Przetowrnik jest 16-bitowy.
Dla informacji dodam, że potrzebuję naraz generowac dwa przebiegi o
podobnych częstotliwościach (330-350Hz)...
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.
Piotr Wyderski
Guest
Sun Aug 20, 2006 10:25 am
Krzysztof wrote:
Quote:
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?
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ć.
Quote:
na mikrokontrolerach serii AVR przy standardowych
bibliotekach da się wyliczać max. niecałe 3000
razy/sek wartość sinusa...
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
PAndy
Guest
Mon Aug 21, 2006 8:09 am
"J.F." <jfox_xnospamx@poczta.onet.pl> wrote in message
news:dsvfe2hufd8r6b2frhj76cm0c76q2q9o2u@4ax.com...
Quote:
On Sat, 19 Aug 2006 21:41:01 +0200, Krzysztof wrote:
A ilu bitowy jest ten przetwornik D/A ?
Przetowrnik jest 16-bitowy.
Dla informacji dodam, że potrzebuję naraz generowac dwa przebiegi
o
podobnych częstotliwościach (330-350Hz)...
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.
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