madwolf Milan Vukov Leuven, Belgium
Član broj: 8409 Poruke: 51 92.244.136.*
|
U ideji koju je predstavio <korak> ne koristis deljenje. Na primer, kad delis sa 4 to ti je ekv. sa siftovanjem u desno dva puta. Evo da malo preformulisem njegov kod:
p = 0;
q = 1;
r = n;
while ( q <= n ) q <<= 2;
while ( q != 1 )
{
q >>= 2;
h = p-q;
p >>= 1;
if ( r >= h )
{
p += q;
r -= h;
}
}
Nisam probao da li ovo zaista radi, ali evo ti ideje :) Ovde cak nemas ni mnozenje...
Evo sad malo detaljnije, kako bi ja na primer to uradio... Ideja. Ti dobijas 12b broj sa A/D konvertora: 0-0FFF hex (sve na dalje pisem u hex). Ukoliko trazis koren iz 16b broja, taj koren ce ti biti 8b. Slicno, ukoliko trazis koren iz 32b broja, ti dobijas 16b koren. Da bi racun bio tacniji, hajde da tvoju "sumu kvadrata" predstavimo kao 32b broj. Dakle, jedan sempl 0-0FFF, njegov kvadrat je u opsegu 0 - 00FFE001; "suma kvadrata" je dakle 0 - 01FFC002. Gornjih 16b (0-01FF) mozes da iskoristis kao indeks u 16b look-up (LUT) tabelu od 512 semplova korenova. Ukoliko ti nije to dosta, siftujes "sumu kvadrata" za jedan u levo (0-03FF8004) i dobijes indeks za LUT od 1024 semplova, itd. LUT naravno ide u flash memoriju... Sto se tice tacnosti, to vec moras da bacis na papir, ili na primer da simuliras u MATLAB-u. Ako se ipak to pokaze kao nedovoljno tacno (odnosno da bi LUT za potrebnu tacnost bila velika) onda se bacis na racun. Mislim da je ovo najbrze... Sa druge strane, ako ti brzina izracunavanja nije mnogo bitna onda radi proracun, stekas memoriju :) - nisi naveo koji su ti vremenski okviri.
Pozdrav,
Milan.
|