Witam,
Przeczytałem zasadę działania DDS i wydaje mi się, że wszystko zrozumiałem. Potem znalazłem opis pewnego projektu
Z góry dziękuję.
Robbo
Witam,
Przeczytałem zasadę działania DDS i wydaje mi się, że wszystko zrozumiałem. Potem znalazłem opis pewnego projektu
Z góry dziękuję.
Robbo
W dniu 2010-03-18 20:02, Robbo pisze:
No to widocznie nie zrozumiałeś. Zakres częstotliwości uzyskuje się wybierając "prędkość odtwarzania" tych próbek. Próbki zawierają tylko wartości chwilowe. Łatwiej może byś zrozumiał gdyby autor miał 360 próbek skatalogowanych, i dla sinusa ustawiał co 1stopień kolejną próbkę z tabeli. A jak szybko stopnie się zmieniają - do tego zależy częstotliwość, jeśli będziesz zmieniał stopnie (numery próbek z tabeli) z częstotliwością (prędkością)
1/360s to cały sinus wymalujesz w czasie 360/360=1s czyli uzyskasz 1Hz. Oczywiście nie ma sensu przechowywać 360próbek, bo w układzie cyfrowym po pierwsze łatwiej się liczy do pełnych potęg dwójki, a w dodatku skoro "góra i dół" sinusa (0-180st i 180-360) są takie same tylko odwrócone co do znaku. I nie ma sensu przechowywać całego kawałka 0-180st, skoro 90-180st jest taki sam jak 0-90 tylko odtwarzany od tyłu. Dzięki temu odcinek 0-90st zapisujesz "niby tylko" na 256próbkach, tylko te próbki odtwarzasz z odpowiednią kolejnością i ze znakiem, a to przekłada się na 1024 próbki na całego sinusa, całkiem ładny przebieg dając.Nie wiem, czy siê rozumiemy, a mi zale¿y, ¿eby dobrze zrozumieæ DDS i wymieniony projekt generatora. Za³ó¿my, ¿e dla 1Hz uk³ad "wypluwa" na wyj¶cie po kolei 256 próbek. Dla czêstotliwo¶ci 2Hz korzysta ju¿ tylko z po³owy próbek -- "wypluwa" co drug± próbkê. Przy 256Hz wypluwa ju¿ tylko jedn± próbkê na okres. Nie rozumiem, jak mo¿e doj¶æ do 65kHz i mieæ na wyj¶ciu sinusoidê. Bêdê wdziêczny za wyja¶nienie. Z góry dziêki.
Robbo
Masz licznik o wielkiej pojemnosci A.
Masz stałą o niewielkiej wartości B
Dodajesz w ciasnej pętli B do A bez przerwy.
Bierzesz najstarsze osiem bitów z A i to jest indeks w tablicy twojego sinusa. Dzieki temu ze A się czasem przepelnia bezustannie przechodzisz przez swoje 256 próbek sinusa.
Sinus na wyjsciu układu bedzie nie lepszy niż 256 próbek sinsua, a jesli B stanie się niebezpiecznie wysokie - może byc gorszy, bedziesz wtedy przeskakiwał próbki z tablicy.
Zerknij sobie tutaj:
W dniu 2010-03-18 20:31, Robbo pisze:
Wszystko źle :) Dla 1Hz układ wypluwa po kolei 256 próbek, w odstępach 1/256sekundy. Dla 2Hz układ wypluwa po kolei 256 próbek, w odstępach 1/512sekundy. Dla 256Hz układ wypluwa po kolei 256 próbek, w odstępach 1/(256*f[HZ]) itd. Dla 65kHz (65000Hz) układ wypluwa po kolei 256 próbek, w odstępach
1/16640000 sekundy czyli z prędkością 16,64 MHz (coś wysoko, Atmega by musiała być taktowana z 32MHz, by "co takt" mogła zmieniać wartość na porcie)Dziêki za odpowied¼.
Je¶li dobrze zrozumia³em... Je¶li B jest relatywnie niewielkie, to trzeba wielu obiegów pêtli, ¿eby najstarsze osiem bitów A zmieni³o swoj± warto¶æ o jeden. W ten sposób przez wiele obiegów pêtli na wyj¶ciu uC utrzymuje siê ta sama stablicowana próbka sinusa. Zatem mamy tu jakgdyby do czynienia z rozci±ganiem.
Je¶li B jest tak dobrane, ¿e ka¿dy obieg pêtli powoduje, ¿e te najstarsze osiem bitów A zwiêksza siê o jeden, to co obieg pêtli mamy na wyj¶ciu uC kolejne stablicowane próbki sinusa.
Je¶li B jest na tyle du¿e, ¿e ka¿dy obieg pêtli powoduje, ¿e te najstarsze osiem bitów A zwiêksza siê o wiêcej ni¿ jeden, to niektóre stablicowane próbki sinusa s± omijane; np. je¶li co obieg pêtli warto¶æ o¶miu najstarszych bitów zwiêksza siê o 2, to ma wyj¶ciu uC mamy co drug± próbkê.
Widzia³em to. Czyta³em w dokumentacji Atmela o znaczeniu mnemonika "lpm", ale nie uda³o mi siê ustaliæ, sk±d czerpie on informacjê, spod jakiego adresu ma pobraæ bajt w sytuacji, gdy nie stoj± po nim ¿adne argumenty.
Robbo
Mniej więcej dobrze.
Z adresu pamieci wskazywanego przez Z.
Poczytaj tutaj:
Nie chce mi sie przez ten kod przebijac - ale DDS dziala inaczej. "wypluwa" probki bardzo czesto - w tym przypadku tak czesto jak sie procesor wyrobi, powiedzmy 1MHz, czy jak kto woli co 1us.
Za kazdym razem oblicza jaka ma byc wartosc probki. Jesli syntezuje 1Hz - to bardzo czesto nowa probka bedzie taka sama jak stara. Trudno zreszta zeby bylo inaczej jesli mamy do dyspozycji tylko 8-bitowy DAC.
Jesli syntezuje 65kHz, to co 1us przeskakuje o wiecej bitow i probek.
A jak oblicza? Dosc prosto.
Mamy np 32 bitowy rejestr, zwany dalej "faza". Traktujemy go tak ze on odpowiada pelnemu "obrotowi" czy jak kto woli okresowi, czyli jedna jednostka odpowiada 360/2^32 stopnia.
Co chwila dodajemy do tego rejestru "skok". Jesli chcemy wygenerowac
1Hz przy cyklu 1MHz/1us, to w ciagu miliona cykli rejestr fazy powinien sie "przekrecic". Skok powinien wiec wynosic 2^32/1000000 = 4294.967296Ulamkowej liczby dodawac nie damy rady, bedziemy wiec dodawac np 4295, uzyskujac czestotliwosc 1.0000076.. Hz. Ta odchylka sie nie przejmujemy, albo dobieramy lepiej parametry.
Teraz skupmy sie na najstarszym bajcie rejestru fazy - on tez podaje faze, tylko z rozdzielczoscia 360/256 stopnia.. Moze wprost wybierac wartosc probki z tablicy sinusa. Albo trojkata.
Poniewaz ten bajt zmienia sie po dodaniu ok 16.7 mln do rejestru fazy, w naszym przykladzie bedzie sie zmienial co ok 3906.2 cykli zegara.
Jesli chcemy generowac 2Hz, dodajemy co cykl 8590, i probka zmienia sie co ~1853 cykle.
A przy 65000Hz, co cykl dodajemy 279 172 874, czyli za kazdym razem przestakujemy ok co 1us przeskakujemy co ok 17 probek w tablicy.
Jak sie dokladnie przyjrzec na cyfrowym oscyloskopie, to szemrana ta sinusoida :-)
Ale w AD twierdza ze wystarczaja im nawet 3 probki na okres :-)
Duzo zalezy czy mozemy sobie pozwolic na filtr dolnoprzepustowy.
J.
No to dobrze wiedzieæ, jak dzia³a DDS. Czyli ca³a kwestia rozbija siê o to, ¿e z akumulatora odczytujemy tylko pewn± liczbê najstarszych bitów. W ten sposób przez kilka kolejnych cykli pracy uk³adu mo¿e pojawiæ siê próbka sinusa spod tego samego adresu w pamiêci. Natomiast, je¶li zwiêkszamy rejestr o odpowiednio du¿± warto¶æ (tak aby co cykl pracy najstarsze brane pod uwagê bity akumulatora zmienia³y swoj± warto¶æ), to dopiero wtedy na wyj¶ciu pojawia siê co która¶ stablicowana próbka. Zmyli³y mnie opisy DDS-ów, które znalaz³em (a by³o ich trzy). Tam wszêdzie by³a mowa o tym, ¿e odczytuje siê ca³y akumulator (a nie np. najstarsze bity). Tylko w jednym z opisów znalaz³em informacjê, ¿e mo¿na sobie akumulator rozszerzyæ o czê¶æ u³amkow± (czyli mniej wiêcej to samo, co mamy odczytuj±c tylko najstarsze bity).
Robbo
U¿ytkownik "Robbo" snipped-for-privacy@yle.com napisa³ w wiadomo¶ci news:hnu6bl$bd2$ snipped-for-privacy@nemesis.news.neostrada.pl...
Je¶li w tych opisach by³y akumulatory rzêdu 32 bity to powinno Ciê zastanowiæ, gdzie upchnêli pamiêæ 4 gigabajtów próbek. P.G.
U¿ytkownik "Piotr Ga³ka" snipped-for-privacy@CUTTHISmicromade.pl
I po co - sinus to funkcja stosunkowo wolnozmienna, dla 8 bit DAC wystarczy probek 500-650, a jak dobrze pomyslec to cwierc z tego.
J.
U¿ytkownik "J.F." <jfox snipped-for-privacy@poczta.onet.pl> napisa³ w wiadomo¶ci news:hnviot$ele$ snipped-for-privacy@news.onet.pl...
Nie zrozumia³e¶, co chcia³em powiedzieæ. P.G.
U¿ytkownik "Piotr Ga³ka" snipped-for-privacy@CUTTHISmicromade.pl
Zrozumialem, i chcialem poprzec dodatkowym argumentem, ale zle napisalem :-)
Powinno byc "i zastanowic sie po co trzymac 4G probek, skoro DAC ma 8-16 bitow".
J.
U¿ytkownik "J.F." <jfox snipped-for-privacy@poczta.onet.pl> napisa³ w wiadomo¶ci news:hnvs04$89n$ snipped-for-privacy@news.onet.pl...
Fakt, nawet tamt± wypowied¼ mo¿na tak zrozumieæ - tylko, ¿e na to nie wpad³em. P.G.
Have something to add? Share your thoughts — no account required.
Ask the community — no account required