metody numeryczne - logarytm/dB liczone na '51

Jul 26, 2005 15 Replies

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" ?


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

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

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

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.

[...]

W kwestii formalnej (wKF):

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

[...]

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

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

20*..., a pozostałych przypadkach 10*...

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

Regards, /J.D.

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.

A jak dok³adnie potrzebujesz? Bo tak na szybko, to przychodz± mi nastêpujce pomys³y:

  1. Interpolacja funkcjami odcinkami liniowymi -- tylko trzeba przesymulowaæ i wyznaczyæ warto¶æ b³êdu, albo wyznaczyæ analitycznie.
  2. Interpolacja albo aproksymacja jak±¶ bardziej wyrafinowan± technik± -- trzeba dobraæ w³a¶ciw± do potrzeb.
  3. CORDIC w trybie rotacji hiperbolicznej i "po¶rednie" obliczenie logarytmu naturalnego z to¿samo¶ci

ln x = 2*arc tgh((x-1)/(x+1))

i zmiana podstawy.

Moim zdaniem bez sensu. Ja bym zacz±³ od (1), bo to mo¿na ³atwo zrobiæ, a jak zadzia³a, to dalej nie trzeba kombinowaæ. :-)

Pozdrawiam Piotr Wyderski

Te wzory czêsto s± wolnozbie¿ne -- o ile matematykom w niczym nie przeszkadza sumowanie do nieskoñczono¶ci, to procesorowi ju¿ tak. :-)

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

Nie znam, ale s±dz±c po tytule _to_ rozwiniêcie pewnie by³o lepsze.

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

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

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.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required