metody numeryczne - logarytm/dB liczone na '51

moze ktos ma z was jakis szybki patent na liczenie 10*log(A/B) dla '51 w bascomie/asm z liczb byte / single ?

moge operowac na single (i wartosci po przecinku) lub na byte, przy czym wiadomo ze wielkosc A jest rzedu np 100 razy mniejsza niz B, np mam A=50 i B=80, to wiadomo ze A=50mV a B=8V bo w takim zakresie bedzie urzadzenie zawsze pracowac.

mam dorobic wyswietlanie dB z pomiaru 2 napiec mierzonych 8-bitowo, mam dosc duzo flashu wolnego (uzywam 51rd2) oraz czasu procesora, ale ramu mam malo (prawie cale 1kB wykorzystane). Czyli moze w flashu zrobic tablice wartosci A, B => dB ? Ale to by bylo zbyt duzo kombinacji, bo 64kB ;), wiec moze zrobic normowanie wartosci A i B do wspolnego mianownika - tzn pomnozyc obie przez taka stala, by np A miala wartosc np 255, a dla B zrobic tabelke "odpowiednie B - wartosc w dB" ?

Reply to
BartekK
Loading thread data ...

najpierw dzielisz A/B, później liczysz logarytm i mnożysz przez 10 i robisz to tak:

-robisz dzielenie, może być 16bit przez 8bit to wtedy będziesz miał wartości po przecinku

-robisz aproksymację wielomianową logarytmu na przedziale (0;2) uznając zero za zero a b'11111111' za prawie 2 (czyli MSB oznacza 1 a reszta to po przecinku 1/2,1/4,1/8 itd.) i musisz pamiętać o wykładniku

-mnozysz przez 10, zrobiwszy najpierw mnożenie albo podzielić przez

1/10 wtedy wystarczy dzielenie

Tylko że chcesz to zrobić na jednym bajcie i tu jest problem bo to jest dla mnie za proste, po prostu :-) Ja zrobiłem lN(x) na IEEE 754 32 bit dla PICa.

PS Najważniejsze przy obliczaniu log jest wzór log(x)=log(2)*log2(x) i aproksymuje się tylko ten log2(x) na przedziale. Powodzenia

Reply to
szlovak

Dnia Tue, 26 Jul 2005 10:32:52 +0000 (UTC), "szlovak" snipped-for-privacy@o2.pl wyklepał(a):

Się nie znam , ale może przyda Ci się wzór na obliczenie wartości przybliżonej wyrażenia? Albo rozwinięcie w szereg potęgowy? Po szczegóły zajrzyj do pierwszego z brzego podręcznika do analizy matematycznej

Reply to
scx

Użytkownik BartekK napisał:

A może zastanów się ile wartości wyjściowych chcesz otrzymać. Dla każdej z nich umieść w tabeli wartość ilorazu. Przez wyszukiwanie w tabeli ilorazu otrzymasz wynik.

Albert

Reply to
Albert Bartoszko

Wartość rzeczywista stosunku napięć w decybelach:

10*log(A/B) = 10*log(A) - 10*log(B)

Stosunek napięć w decybelach liczony wg. wartości odczytanych z przetwornika A/C (k1 i k2 to wzmocnienia wzmacniaczy sterujących wejściami przetwornika A/C):

10*log((k1*A) / (k2*B)) = 10*log(k1/k2) + 10*log(A) - 10*log(B)

Wobec tego:

10*log(A/B) = 10*log((k1*A) / (k2*B)) - 10*log(k1/k2) = 10*log(k1*A) - 10*log(k2*B) - 10*log(k1/k2)

k1*A i k2*B to są wartości odczytane bezpośrednio z przetwornika A/C, k1/k2 jest stałą. Robisz więc 256 elementową lookup tabelkę odwzorowującą przedział (0, 255> na (-inf; 10*log(max(k1*Amax, k2*Bmax))> i całe liczenie logarytmu sprowadza się do dwóch zerknięć do lookup tabelki i trzech odejmowań.

Pozostaje kwestia doboru k1 i k2 - najlepiej byłoby gdyby k1*Amax = k2*Bmax = Uref

Jest tylko pewien problem z nasycaniem się tego algorytmu, więc trzebaby liczyć to na liczbach dwubajtowych i dodać warunek nasycenia.

Można też skorzystać z wzoru 10*log((k1*A)*k2 / (k2*B)*k2) - nie ma nasycenia, tylko jedno odwołanie to tabelki, ale niestety dwa mnożenia i jedno dzielenie, a z tym na standartowej '51 jest tragicznie.

Regards, /J.D.

Reply to
Jan Dubiec
[...]

W kwestii formalnej (wKF):

Dla napięć, prądów, ciśnień akustycznych - 20 * log10. Dla mocy 10 * log10.

[...]
Reply to
RoMan Mandziejewicz

^^^^^^^^^^^^^^^^^^^^^^^^

To ja też w kwestii formalnej :-) Dla *mocy* liczonych z napięć i prądów

20*..., a pozostałych przypadkach 10*...
Reply to
Zbych

Oczywiście masz rację. Z dokładnością do tego co napisał Zbych. :-)

Regards, /J.D.

Reply to
Jan Dubiec

On 26 Jul 2005 21:52:58 +0200, Jan Dubiec snipped-for-privacy@SPAMTRAP.slackware.pl> wrote: [.....]

W zasadzie to z tego możnaby zrezygnować i po prostu zrzutować te trzy

8-bitowe liczby na 16-bitowe, odjąć od siebie i otrzymać 10-bitowy wynik. :-) [.....]

Tutaj oczywiście miało być k1 ---------------------------^

Regards, /J.D.

Reply to
Jan Dubiec
Reply to
Piotr Wyderski
Reply to
Piotr Wyderski

Zrobiłem kiedyś logarytm na 80c537 w asemblerze. Już nie pamiętam dokładnie dałem chyba 5 wyrazów a błąd był na poziomie 10^-5. Rozwinięcie z książki "Matematyka dla pracowników naukowych i inżynierów" Korn & Korn.

Reply to
Mariusz Dybiec
Reply to
Piotr Wyderski

Piotrze, z armaty strzelasz :-)

Liczby sa 8 bit, co daje "zakres dynamiki" 48 dB. Stablicowac wartosc logarytmu dla tych 256 probek, faktycznie znalezc dla obu wartosci i po prostu odjac. W tablicy mozna wpisac od razu wartosc w dB np razy 4, da 256 bajtow i dokladnosc cwierc dB - ktora sie zaokragli po obliczeniach, zeby nie wyswietlac tak dokladnie :-)

A logarytm dokladnie sie liczy w miare prosto - tylko trzeba zaczac od doprowadzenia liczby do postaci mantysa-cecha. Cecha w zapisie binarnym ma zakres 1..2, czy jak kto woli

0.5-1, wiec szeregi sie szybko zbiegaja.

J.

Reply to
J.F.

Jan Dubiec napisał(a):

prawde mówiąc nie wiem o co chodzi z tym nasycaniem, przekroczenie 1 bajtu? Poza tym przecież 51 ma mnożenie i dzielenie, jest to ułatwienie a nie utrudnienie

Reply to
szlovak

Tak.

Zależy jak na to patrzeć. Na zwykłej '51 dwa mnożenia i dzielenie będą AFAIR 4 razy wolniejsze niż 3 odejmowania.

Regards, /J.D.

Reply to
Jan Dubiec

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.