Efektywne obliczanie wartości dB w Bascomie/ASM na mikrokontrolerze '51?
metody numeryczne - logarytm/dB liczone na '51
From: BartekK <sibi_at_nospam_drut.org>
Subject: metody numeryczne - logarytm/dB liczone na '51
Date: Tue, 26 Jul 2005 12:03:08 +0200
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" ?
--
| Bartlomiej Kuzniewski
| sibi_at_nospam_drut.org GG:23319 tel +48 696455098
| http://www.allegro.pl/show_user_auctions.php?uid=338173
From: "szlovak" <BEZXadamkx_at_nospam_o2.pl>
Subject: Re: metody numeryczne - logarytm/dB liczone na '51
Date: Tue, 26 Jul 2005 10:32:52 +0000 (UTC)
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
--
Pozdrawiam
Adam
From: scx <szczupx.WYTNIJ_at_nospam_TO.wp.pl>
Subject: Re: metody numeryczne - logarytm/dB liczone na '51
Date: Tue, 26 Jul 2005 14:10:18 +0200
Dnia Tue, 26 Jul 2005 10:32:52 +0000 (UTC), "szlovak"
<BEZXadamkx_at_nospam_o2.pl> wyklepał(a):
-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
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
--
scx
Wszyscy mają sygnaturkę... mam i ja :)
From: "Piotr Wyderski" <wyderskiREMOVE_at_nospam_ii.uni.wroc.pl>
Subject: Re: metody numeryczne - logarytm/dB liczone na '51
Date: Wed, 27 Jul 2005 02:41:01 +0200
scx wrote:
Po szczegóły zajrzyj do pierwszego z brzego podręcznika do analizy
matematycznej
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
From: Mariusz Dybiec <mardyb_at_nospam_poczta.onet.pl>
Subject: Re: metody numeryczne - logarytm/dB liczone na '51
Date: Wed, 27 Jul 2005 09:36:54 +0200
Piotr Wyderski wrote:
scx wrote:
Po szczegóły zajrzyj do pierwszego z brzego podręcznika do analizy
matematycznej
Te wzory często są wolnozbieżne -- o ile matematykom w niczym nie
przeszkadza sumowanie do nieskończoności, to procesorowi już tak. :-)
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.
--
Pozdrawiam
MD
"Ja nie myślę, ja dyskutuję na pcoa" (c) Artur Karaźniewicz
From: "Piotr Wyderski" <wyderskiREMOVE_at_nospam_ii.uni.wroc.pl>
Subject: Re: metody numeryczne - logarytm/dB liczone na '51
Date: Wed, 27 Jul 2005 10:57:12 +0200
Mariusz Dybiec wrote:
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
From: Albert Bartoszko <albertb_at_nospam_nt.kegel.com.pl>
Subject: Re: metody numeryczne - logarytm/dB liczone na '51
Date: Tue, 26 Jul 2005 15:33:32 +0200
Użytkownik BartekK napisał:
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" ?
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
From: Jan Dubiec <jdx_at_nospam_SPAMTRAP.slackware.pl>
Subject: Re: metody numeryczne - logarytm/dB liczone na '51
Date: 26 Jul 2005 21:52:58 +0200
On Tue, 26 Jul 2005 12:03:08 +0200, BartekK <sibi_at_nospam_drut.org> wrote:
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.
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.
--
Jan Dubiec We're all living in Amerika
jdx#slackware.pl Coca Cola
+48 506 790442 Sometimes war
Amerika by Rammstein
Date: Tue, 26 Jul 2005 22:01:27 +0200
From: RoMan Mandziejewicz <roman_at_nospam_pik-net.pl>
Subject: Re: metody numeryczne - logarytm/dB liczone na '51
Hello Jan,
Tuesday, July 26, 2005, 9:52:58 PM, you wrote:
[...]
Wartość rzeczywista stosunku napięć w decybelach:
10*log(A/B) = 10*log(A) - 10*log(B)
W kwestii formalnej (wKF):
Dla napięć, prądów, ciśnień akustycznych - 20 * log10. Dla mocy 10 *
log10.
[...]
--
Best regards,
RoMan mailto:roman_at_nospam_pik-net.pl
From: Zbych <abuse_at_nospam_onet.pl>
Subject: Re: metody numeryczne - logarytm/dB liczone na '51
Date: Tue, 26 Jul 2005 22:10:09 +0200
RoMan Mandziejewicz wrote:
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*...
From: Jan Dubiec <jdx_at_nospam_SPAMTRAP.slackware.pl>
Subject: Re: metody numeryczne - logarytm/dB liczone na '51
Date: 26 Jul 2005 22:49:09 +0200
On Tue, 26 Jul 2005 22:01:27 +0200, RoMan Mandziejewicz <roman_at_nospam_pik-net.pl> wrote:
Hello Jan,
Tuesday, July 26, 2005, 9:52:58 PM, you wrote:
[...]
Wartość rzeczywista stosunku napięć w decybelach:
10*log(A/B) = 10*log(A) - 10*log(B)
W kwestii formalnej (wKF):
Dla napięć, prądów, ciśnień akustycznych - 20 * log10. Dla mocy 10 *
log10.
Oczywiście masz rację. Z dokładnością do tego co napisał Zbych. :-)
Regards,
/J.D.
--
Jan Dubiec We're all living in Amerika
jdx#slackware.pl Coca Cola
+48 506 790442 Sometimes war
Amerika by Rammstein
From: Jan Dubiec <jdx_at_nospam_SPAMTRAP.slackware.pl>
Subject: Re: metody numeryczne - logarytm/dB liczone na '51
Date: 26 Jul 2005 22:58:50 +0200
On 26 Jul 2005 21:52:58 +0200, Jan Dubiec <jdx_at_nospam_SPAMTRAP.slackware.pl> wrote:
[.....]
Jest tylko pewien problem z nasycaniem się tego algorytmu, więc trzebaby
liczyć to na liczbach dwubajtowych i dodać warunek nasycenia.
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. :-)
[.....]
Można też skorzystać z wzoru 10*log((k1*A)*k2 / (k2*B)*k2) - nie ma
Tutaj oczywiście miało być k1 ---------------------------^
Regards,
/J.D.
--
Jan Dubiec We're all living in Amerika
jdx#slackware.pl Coca Cola
+48 506 790442 Sometimes war
Amerika by Rammstein
From: "szlovak" <BEZXadamkx_at_nospam_o2.pl>
Subject: Re: metody numeryczne - logarytm/dB liczone na '51
Date: Wed, 27 Jul 2005 15:17:11 +0000 (UTC)
Jan Dubiec napisał(a):
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.
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
--
Pozdrawiam
Adam
From: Jan Dubiec <jdx_at_nospam_SPAMTRAP.slackware.pl>
Subject: Re: metody numeryczne - logarytm/dB liczone na '51
Date: 27 Jul 2005 19:23:43 +0200
On Wed, 27 Jul 2005 15:17:11 +0000 (UTC), "szlovak" <BEZXadamkx_at_nospam_o2.pl> wrote:
Jan Dubiec napisał(a):
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.
prawde mówiąc nie wiem o co chodzi z tym nasycaniem, przekroczenie 1
bajtu?
Tak.
Poza tym przecież 51 ma mnożenie i dzielenie, jest to
ułatwienie a nie utrudnienie
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.
--
Jan Dubiec We're all living in Amerika
jdx#slackware.pl Coca Cola
+48 506 790442 Sometimes war
Amerika by Rammstein
From: "Piotr Wyderski" <wyderskiREMOVE_at_nospam_ii.uni.wroc.pl>
Subject: Re: metody numeryczne - logarytm/dB liczone na '51
Date: Wed, 27 Jul 2005 02:38:42 +0200
BartekK wrote:
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.
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.
Czyli moze w flashu zrobic tablice wartosci A, B => dB ?
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
From: J.F. <jfox_xnospamx_at_nospam_poczta.onet.pl>
Subject: Re: metody numeryczne - logarytm/dB liczone na '51
Date: Wed, 27 Jul 2005 14:20:01 +0200
On Wed, 27 Jul 2005 02:38:42 +0200, Piotr Wyderski wrote:
BartekK wrote:
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.
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
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.