Вычислить на ОМК

Aug 02, 2006 108 Replies

Sat Aug 05 2006 10:06, Anatoly Mashanov wrote to All:

VV>>> А найти log2 с любой точностью - дело техники.

AM> Я как-то решал задачу: Вычислить время, за которое известный конденсатор AM> зарядился через известный резистор AM> Решалась методом, эквивалентным взятию логарифма по основанию 1+1/16. AM> Дело в том, что после приведения аргумента к промежутку от 1 до 1+1/16 AM> кривую логарифма на таком коротком отрезке можно аппроксимировать прямой. Да чего уж там. Логарифм вообще константа, а не функция :)

VLV

"Что даст мне свет, чего я сам не знаю?" (c) Гете "Фауст"

Anatoly,

You wrote to All:

VV>>> А найти log2 с любой точностью - дело техники. AM> Я как-то решал задачу: Вычислить время, за которое известный AM> конденсатор зарядился через известный резистор от источника с AM> известным напряжением до измеренного на нем напряжения. Задача эта AM> эквивалентна логарифмированию. Решалась методом, эквивалентным взятию AM> логарифма по основанию 1+1/16. Дело в том, что после приведения AM> аргумента к промежутку от 1 до 1+1/16 кривую AM> логарифма на таком коротком отрезке можно аппроксимировать прямой. AM> Получилась точность, достаточная для обработки данных с 10-битного АЦП AM> ПИКа.

Только не точность, а разрешающая способность. Точность с середине отрезка получается всего около -3%, а это пять бит.

Когда я говорил о 129 точках для 12 бит, я имел ввиду конкретную формулу. То бишь, предполагаемую подставку и отсутвие начального участка. Разумеется это надо проверять с реальными их значениями, может я и слишком оптимистичен. Hу а про требуемую точность вообще не было ни слова.

Andrey

Hello, Dmitry! You wrote to Alexander Torres on Sat, 05 Aug 2006 19:09:36 +0400:

DO>>>> Однофамилец DEO>>> я в fido после ~5 летнего перерыва вернулся. DEO>>> суммарно может месяц прошел как :) AT>>

AT>> Просто здесь раньше был Дима Обухов из Калифорнии. Hеужели это ты? :) DEO> в Калифорнии если я когда-нидь и буду то только как турист ну или как DEO> солдат. то есть обо мне никогда нельзя будет сказать что я из DEO> калифорнии :)

Очень хочеться на это надеяться :)

With best regards, Alexander Torres. E-mail: snipped-for-privacy@yahoo.com [ Жамству бой !]

В околоэхотажных применениях часто нужен "целочисленный" ллогарифм. Который считается как, буквально, номер первого ненулевого бита сллева. (биты нумерутся привы-ным образом, слева направо, на-иная с нулля).

В целых числах? Регистров никаких не напасёшься!

Хочеться не вредно.

Hi Anatoly!

05 Aug 06 09:44, Anatoly Mashanov wrote to Slav Matveev:

SM>> А log2 с любой точностью ты все равно будешь искать через SM>> подобный этому ряд: arg = arg * ((((((b6 * z + b5) * z + b4) SM>> * z + b3) * z + b2) * z + b1) * z + b0);

AM> Это в микроконтроллере-то я буду считать через ряд с невероятным AM> количеством умножений с плавучкой? если ресурсов хватает - почему бы и нет?

AM> точность, то с линейной (или даже нелинейной, если очень надо) AM> аппроксимацией промежуточных значений. здесь уже прозвучал совет: #include <math.h>

если ты думаешь что в стандартной библиотеке таблицы, скорее всего ты ошибаешься.

SM>>>> Я таким образом в отсутствии SM>>>> библиотек и наличии компилятора просчитал синусы/косинусы. SM>>>> Мне хватило четырех слагаемых в ряду. AM> А ты не учел, что твои 4 слагаемых в ряду тащат за собой: AM> преобразование целого в плавучку, плавающее умножение и плавающее AM> сложение? И что эти преобразования занимают места примерно столько же, AM> сколько таблица? в вопросе было про фиксированную точку. Это по-моему несколько упрощает вычисления своя их к целочисленным операциям. нет? И мне надо было ехать, а не шашечки рисовать. я доехал за два вечера. только вот уже не помню: "в лоб" считал или сначала таблицу с нужным шагом сделал.

Slav.

Hi Vladimir!

05 Aug 06 20:09, Vladimir Vassilevsky wrote to Anatoly Mashanov:

AM>> что после приведения аргумента к промежутку от 1 до 1+1/16 кривую AM>> логарифма на таком коротком отрезке можно аппроксимировать AM>> прямой.

VV> Да чего уж там. Логарифм вообще константа, а не функция :)

А прямая это не та линейная функция, за которую ты ратовал? или для тебя прямая это только y=const, а y=ax+b уже нет?

Slav.

Hi Vladimir!

04 Aug 06 20:27, Vladimir Vassilevsky wrote to Slav Matveev:

VV>>> Даже ряд не нужен. Log2 в диапазоне аргумента [1...2) это почти VV>>> линейная функция. Прекрасно апроксимируется. SM>> Линейной функцией апроксимируется с точностью до первого SM>> знака после запятой. Ты случаем не с аэромеха, у которых SM>> все что меньше 10 сравнимо с единицей?

VV> Hет, не с аэромеха. Если видишь мудака - знай, что он с ФРТК (это про VV> меня). ф-т радиотехники и ... ?

VV> Двоечникам с мехмата простительно не знать про апроксимацию по VV> Чебышеву. обижаешь. троечник. ну давай, расскажи про линейную апроксимацию с указанием погрешности log2 на [1..2) А потом спросим у вопрошавшего, устроит его плюс-минус километр или нет.

Slav.

Sun Aug 06 2006 18:13, Slav Matveev wrote to Vladimir Vassilevsky:

VV>> Двоечникам с мехмата простительно не знать про апроксимацию по VV>> Чебышеву. SM> обижаешь. троечник.

Doh, cбавил мехмат свои стандарты... Починяй бензобаки и не лезь в высокие материи. SM> ну давай, расскажи про линейную апроксимацию с указанием SM> погрешности log2 на [1..2)

log2(x) ~ x - 0.957 Максимальная ошибка 4.3e-2, то есть лучше, чем одна цифра после запятой. Средняя точность примерно две цифры после запятой. И?

SM> А потом спросим у вопрошавшего, устроит его плюс-минус SM> километр или нет.

Проблема в том, что вопрошаюший сам не знает, чего ему надо.

VLV

"Что даст мне свет, чего я сам не знаю?" (c) Гете "Фауст"

Hello Wladimir.

04 Aug 06 17:11, you wrote to Yuriy Khapochkin:

WT>>> Требуется вычислять на ОМК (AVR - структуры) следующее выражение

WT>>> Y=А*Log(В*X) WT>>> Где А,В - константы WT>>> Х - меняется в диапазоне 1-65534 (реально точек меньше, потому WT>>> как Х=Х1+Х2, где Х2 некая фиксированная константа).

WT>>> Y - целое число в диапазоне 1-4094, А - масштабный коэффициент.

WT>>> Скорость вычисления не менее 4 вычислений в секунду. WT>>> Это вообще реально, на процессоре рангом пониже iP ?

YK>> Реально. AVR на частоте в 1МГц хватит за глаза. :-)

YK>> ATtiny26 @11MHz : Длительность импульса ~700мксек.

YK>> IAR C/C++ Compiler for AVR YK>> 4.20A/W32 (4.20.1.3)

YK>> U16 func(U16 X)

Тип переменной.

YK>> { YK>> #define A 100.0 YK>> #define B 50000.0

YK>> return (U16)(A*log10(B*X)); YK>> } YK>> //------------------------------------------------------------------- YK>> __C_task void main(void) YK>> { YK>> // PORTA = c;

YK>> DDRA = BINARY(11100000); YK>> PORTA = BINARY(11100000);

YK>> DDRB = BINARY(01101000); YK>> PORTB = BINARY(01100000);

YK>> for (;;) YK>> { YK>> U16 x = func(598);

YK>> led_on();

Как ты время, необходимое для расчета померять собираешься?

YK>> x = func(450); YK>> led_off(); YK>> } YK>> }

Вопервых необязательно иар. Скачай винавр и аврстудию, кракать не надо. Вовторых ты невнимательно эху читаешь (отн. иара)... Если всетаки winavr - посмотри в аврлибсе, там есть модуль math.h.

∙ double log (double __x) __ATTR_CONST__ ∙ double log10 (double __x) __ATTR_CONST__

После компиляции симулятор аврстудии с твоей задачей справится без проблем. И обрати внимание, что тут уже писали о логарифмах (умножение -> сложение). Однако и вопросы у тебя... Nicolas

WT> В общем это ВАХ прямосмещенного германивого дида - какой она интересно функции подчиняется ? насколько я помню там чистая экспонента, а не логарифм. (U(I))

Hi Vladimir!

06 Aug 06 22:49, Vladimir Vassilevsky wrote to Slav Matveev:

SM>> погрешности log2 на [1..2)

VV> log2(x) ~ x - 0.957

метод наименьших квадратов?

VV> Максимальная ошибка 4.3e-2, то есть лучше, чем одна цифра после VV> запятой. Средняя точность примерно две цифры после запятой. И? ошибка во втором знаке это одна верная цифра после запятой. на 2/3 указанного интервала.

Slav.

Hi Wladimir!

04 Aug 06 09:32, Wladimir Tchernov wrote to Slav Matveev:

WT> Исследованием схемы она должна быть близка к ВАХ прямосмещенного WT> точечного германивого диода. умноженной не EXP от интеграла входного WT> сигнала.

Как вариант разбей интервал на 2^N отрезков, на каждом апроксимируй линейной функцией ax+b.

Slav.

Стандартная библиотека языка C.

В комплекте с твоим компилятором языка C для твоей целевой платформы.

Бывает да, бывает нет. Зависит от конкретного компилятора.

Если позарез нужно, то можно взять стороннюю библиотеку и адаптировать под твой компилятор и твою целевую платформу. (А исходники компилятора на всякий случай, не нужны? -- тогда только GCC...)

[оверквотинг съеден злыми пингвинами...]

А зачем второй нужен? :-/

KF> Стандартная библиотека языка C. KF>

любой исходник libc например пакет для linux с таким именем возьми или любой компилятор расковыряй (правда в проприетарных продуктах могут оказаться только хидеры и dll, потому лучше смотреть в linux)

Доброго времени суток тебе Vladislav!

05 Авг 06 14:37, Vladislav Baliasov -> Anatoly Mashanov:

AM>> Это в микроконтроллере-то я буду считать через ряд с невероятным AM>> количеством умножений с плавучкой? Hет уж.

VB> А почему и нет ? Компилятор делает именно это. И на ASM я делал так же VB> (логарифмы заняли 113 слов программной памяти AVR,

А исходным текстом не поделишся.

Я тут с грехом пополам все-же откомпилировал в Си вычисление функции ... в общем знаний не хватает пока разобраться в килобайте с лишним кода.

VB> а базовый набор VB> 32-битной плавучки - меньше 400 слов). Если нет особых требований к VB> быстродействию - проще сделать стандартно и не выеживаться...

Будь счастлив(а) Vladislav... С уважением Wladimir.

Доброго времени суток тебе Kirill!

04 Авг 06 13:46, Kirill Frolov -> Andrey Arnold:

KF> Я ничего не понял. Впрочем и не вникал. Хочу только сказать, что KF> ничто не мешает отсортировать список аргументов функции и её значений KF> и искать двоичным поиском за log2(N) времени,

А можно с этого места по подробнее, что-то никак не соображу.

Аргумент 1-65534 - это среднее значение периода. При 0,1 Гц - 65534, при 10 кГц

- 1

Итого 1,5 Гц на 1.

Функция нелинейна - быстро растет при малых аргуметах и мало меняется при больших.

Получается для каждого из 4096 результатов надо задать свой диапазон аргументов

- а это 3-4 байта на ячейку таблицы. Причем у одних значений диапазон аргументов огромен (сотни), а у других - только 1 значение.

KF> что для 4096 элементов KF> даст всего-то 12 операций сравнения. А этих элементов, очевидно, будет KF> в Nдцатьц раз меньше. Будет там что-то кратно двум или нет -- KF> совершенно не важно (что может позволить уменьшить ошибку KF> аппроксимации). Речь о применительности линейной интерполяции к задаче KF> озвученной WT.

Все равно не понял.

Будь счастлив(а) Kirill... С уважением Wladimir.

Доброго времени суток тебе Dmitry!

04 Авг 06 17:20, Dmitry E. Oboukhov -> Andrey Arnold:

AA>> Да я вроде понял. AA>> А в случае логарифма, там вообще просто получается. AA>> Hо у него тут есть оффсет, а это "ставит повторяемость функции" AA>> в довольно сложное положение.;) DO> у логарифма повторяемость тоже такая же DO> только она повторяться будет на диапазоне основания.

DO> а вот чтобы отмасштабировать результат табличный до нужного надо DO> подумать, похоже надо будет в степень основания вводить или корень DO> брать. DO> корень сложнее, а вот если основание и правда взять равным двум, то DO> тут можно поиграться (но таблицу надо собирать для такого диапазона DO> чтобы результат масштабировтаь только в бОльшую сторону)

Тоесть применить таблицу для аргументов 0,1-1, а затем еще и множители (х10, х100 .... х100000) ?

DO> мм DO> умножение

DO> надо подумать может масштабирование заменить аналогичным действием? DO> то есть две таблицы - логарифм и масштаб

Значит я понял практически правильно.

Будь счастлив(а) Dmitry... С уважением Wladimir.

Доброго времени суток тебе Vladimir!

03 Авг 06 22:27, Vladimir V. Teplouhov -> Wladimir Tchernov:

WT>> Требуется вычислять на ОМК (AVR - структуры) следующее выражение

WT>> Y=А*Log(В*X)

VT> если не решишь - напомни мылом, посмотрю в доку от ЕС-ки, VT> где все алгоритмы мат. функций описаны... Полезный трофей, VT> аднако :)

Я сейчас снимаю ВАХ а АЧХ с аналогового варианта схемы. Пытаюсь поймать все-ж какими функциями описывается работа каждого блока.

Диапазоны аргументов и функций считаю.

Будь счастлив(а) Vladimir... С уважением Wladimir.

Join the Discussion

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

Didn't find your answer?

Ask the community — no account required