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

Aug 02, 2006 108 Replies

Mon Aug 07 2006 09:47, Dmitry E. Oboukhov wrote to Wladimir Tchernov:

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

VLV

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

Mon Aug 07 2006 10:49, Slav Matveev wrote to Vladimir Vassilevsky:

VV>> log2(x) ~ x - 0.957 SM> метод наименьших квадратов?

Минимизация максимальной ошибки. По МНК, возможно, получится немного по-другому, но все равно точность того же порядка.

VLV

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

Hello, Wladimir! You wrote to Kirill Frolov on Mon, 07 Aug 2006 14:20:24 +0600:

WT> 04 Авг 06 13:46, Kirill Frolov -> Andrey Arnold: DO>>>> я так понял линеаризация в нескольких диапазонах ??>>> Только число диапазонов не произвольное, а кратное степени числа ??>>> два и длина каждого одинакова. KF>> Я ничего не понял. Впрочем и не вникал. Хочу только сказать, что KF>> ничто не мешает отсортировать список аргументов функции и её KF>> значений и искать двоичным поиском за log2(N) времени, WT> А можно с этого места по подробнее, что-то никак не соображу. Тебе всё это лишнее. Тебе нужно считать стандартными в Це средствами, как тут уже несколько раз говорилось.

With best regards, Andrej Arnold. E-mail: snipped-for-privacy@aol.com

Пpивет, Wladimir!

*** 07 Aug 06 14:25, Wladimir Tchernov wrote to Vladislav Baliasov:

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

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

Hет, библиотека в целом имеет определенную ценность, и раздавать ее я не предполагал (а по своей сути базовая часть - это портированная библиотека плавучки из микрочиповской аппликухи). Принцип вычисления логарифма и значения коэффициентов взяты из библиотеки HI-Tech C для PIC.

с уважением Владислав

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

WT> Тоесть применить таблицу для аргументов 0,1-1, а затем еще и множители WT> (х10, х100 .... х100000) ? типа того (не знаю как логарифм разложится) ну и таблицу хорошо применять такую чтобы потом умножение деление было на 2 а не на 10 :) ну это уж как получится

Hello Wladimir!

07 Aug 06 14:20, you wrote to Kirill Frolov:

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

if((x&0xfff0) == 0) return(t1[x]); if((x&0xffe0) == 0){ if(x&1) return((t2[x-16] + t2[x-15]) >> 1); return(t2[x-16]); }; if((x&0xffc0) == 0) { if((x&3) == 2) return(t3[x-32] + t3[x-31]) >> 1); if((x&3) == 1) return(t3[x-32] * 3 + t3[x-31]) >> 2); if((x&3) == 3) return(t3[x-32] + t3[x-31] * 3) >> 2); /* и так далее */

Итого получается 12 сегментов по 17 слов, что меньше, чем 512 байт.

Кстати, я у себя, наверное, так и сделаю. Хотя бы потому, что аналитическое решение, занимая меньше места, не учитывает фактические погрешности измерителей, которые все равно надо убирать таблично.

WT> Получается для каждого из 4096 результатов надо задать свой диапазон WT> аргументов - а это 3-4 байта на ячейку таблицы. Причем у одних Hет. Поскольку функция вроде бы монотонна (Или это не так?), то вполне достаточно искать значение аргумента t[i] <= arg && arg < t[i+1]. Два байта на результат. WT> Все равно не понял. Двоичный поиск. Д.Кнут том 3.

Anatoly

Приветствую Вас, Vladimir!

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

О. А ты когда там учился? Физхимов (ФМХФ) как обзывали?

С уважением, Виталий.

... -|O|-

Anatoly,

You wrote to Wladimir Tchernov:

WT>> Функция нелинейна - быстро растет при малых аргуметах и мало WT>> меняется при больших. AM> if((x&0xfff0) == 0) return(t1[x]); AM> if((x&0xffe0) == 0){ AM> if(x&1) return((t2[x-16] + t2[x-15]) >> 1); AM> return(t2[x-16]); AM> }; AM> if((x&0xffc0) == 0) { AM> if((x&3) == 2) return(t3[x-32] + t3[x-31]) >> 1); AM> if((x&3) == 1) return(t3[x-32] * 3 + t3[x-31]) >> 2); AM> if((x&3) == 3) return(t3[x-32] + t3[x-31] * 3) >> 2); AM> /* и так далее */ AM>

AM> Итого получается 12 сегментов по 17 слов, что меньше, чем 512 байт.

Hичего не понял. Сколько тут массивов и каких они размеров? Зачем нужны эти бесконечные сравнения в старшОй части адреса? Какая получается в итоге в данном случае точность? А в "и так далее" у тебя в младшОм адресе будет до 16 сравнений? Я всё правильно понял?

AM> Кстати, я у себя, наверное, так и сделаю. Хотя бы потому, что AM> аналитическое решение, занимая меньше места, не учитывает фактические AM> погрешности измерителей, которые все равно надо убирать таблично.

Разумеется.

WT>> Получается для каждого из 4096 результатов надо задать свой WT>> диапазон аргументов - а это 3-4 байта на ячейку таблицы. Причем у WT>> одних AM> Hет. Поскольку функция вроде бы монотонна (Или это не так?),

Так, так.

AM> то вполне достаточно искать значение аргумента t[i] <= arg && arg < AM> t[i+1]. Два байта на результат.

Так сколько у тебя превычесленных точек всё же?

Andrey

linux тут никакого отношения не имеет. s/linux/gnu libc/. Только вот посллалл так послал... НАшёл куда. Тудас (в glibc) лучше и не соваться.

KF>

KF> linux тут никакого отношения не имеет. s/linux/gnu libc/. KF> Только вот посллалл так послал... HАшёл куда. Тудас (в glibc) KF> лучше и не соваться. почему лучше не соваться? я помнится туда заглядывал в поисках посмотреть как iconv работает, вполне себе библиотека :) просто надо научиться поиском пользоваться (grep/egrep), иначе действительно в таком огромном объеме кода долго искать нужную функцию придется ;)

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

07 Авг 06 09:47, Dmitry E. Oboukhov -> Wladimir Tchernov:

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

Да - меня в схемсах просветили - а у меня на выходе именно логарифм. Буду разбираться.

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

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

07 Авг 06 10:46, Kirill Frolov -> Wladimir Tchernov:

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

Уже посмотрел - нее я не настолько умный, что-бы понять КАК ЭТО РАБОТАЕТ :)

Попробую все-же по таблицам.

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

Один считает импульсы измеряя период по внешнему стробу, другой работает в хронизаторе отсчитывая внутреннее время в процессоре, для вычисления моментов суммирования значений частоты для интегрирования. Между эти событиями частота усредняется.

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

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

07 Авг 06 09:07, Nicolas Minakov -> Wladimir Tchernov:

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)

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

Понял.

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) { // 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();

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

А процедуры то нема :)

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

NM> Вопервых необязательно иар. Скачай винавр и аврстудию,

Я в АВР студии и пишу. 4.2 ... Только на ассемблере.

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

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

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

Сложновато мне выражать свои мысли и знаний маловато.

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

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

07 Авг 06 20:46, Vladislav Baliasov -> Wladimir Tchernov:

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

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

VB> Hет, библиотека в целом имеет определенную ценность, и раздавать ее я VB> не предполагал (а по своей сути базовая часть - это портированная VB> библиотека плавучки из микрочиповской аппликухи). Принцип вычисления VB> логарифма и значения коэффициентов взяты из библиотеки HI-Tech C для VB> PIC.

Hо она без исходников - тоесть дизассемблировал ? Даааа...

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

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

07 Авг 06 23:51, Dmitry E. Oboukhov -> Wladimir Tchernov:

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

WT>> Тоесть применить таблицу для аргументов 0,1-1, а затем еще и WT>> множители (х10, х100 .... х100000) ? DO> типа того (не знаю как логарифм разложится) DO> ну и таблицу хорошо применять такую чтобы потом умножение деление было DO> на 2 а не на 10 :) DO> ну это уж как получится

Должно получиться.

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

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

07 Авг 06 18:35, Vladimir Vassilevsky -> Dmitry E. Oboukhov:

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

VV> Типичная ВАХ диода - две разные экспоненты при больших и малых VV> токах. Все это экземплярно и плавает на милливольты на градус. VV> Точность - порядка 10%, если не принято особых мер по стабилизации VV> и компенсации всего.

Это я уже понял, причем сам ток диода его-же и греет....

Буду я в общем снимать ВАХ с этих диодов.

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

WT> Уже посмотрел - нее я не настолько умный, что-бы понять КАК ЭТО РАБОТАЕТ :) возьми книжку тогда Г.Корн Т.Корн по математике и выбери численный метод по вкусу ;)

Как это работает объясняется на первом курсе института подходящей направленности. Впрочем, понимать не обязательно. Достаточно взять и использовать.

Размеры таблиц должны быть внушительные...

Большая и сложная. Это примерно как пытаться понять принцип работы двигателя внутреннего сгорания на примере современного автомобиля -- бесполезно.

А оно, случайно, log.c не называется? Впрочем, для этого есть такие средства как sourcenavigator, cscope, ctags наконец.

У тебя есть список пар [аргумент, значение]. Массив с ними, если ещё не, отсортировываешь по аргументу. Потом когда надо найти две пары (для линейной интерполяции) слева и справа от имеющегося аргумента ищешь посредством двоичного поиска (в электронике известен как метод последовательного приближения) -- берёшь значение в середине массива. Если у тебя аргумент меньше -- берёшь далее значение в середине левой половины, а иначе в середине правой. И так в цикле, пока не найдёшь две соседних пары [аргумент, значение].

Вот вопрос как построить список и сколько выбрать пар и с каким шагом между ними чтоб получить заданную тобой максимальную погрешность. Задача может быть решена методом похожим на описанный выше: разбиваешь пополам, считаешь погрешность, если не подходит, разбиваешь ещё пополам, иначе разбиваешь пополам "остаток" и так далее... Это -- построение списока -- делается, естесственно, не в контроллере в реальном времени, а в пц.

Ничего не понял. У тебя на N элементов твоей таблицы будет приходиться две пары [аргумент, значение]. В пределе -- две таких пары на всю таблицу. Т.е. там не 4096 пар будет, а существенно меньше. Насколько существенно зависит от допускаемой погрешности. Речь именно об аппрокимации -- приближении твоей функции, а не вычислении точного значения. Нужна высокая точность -- аппроксимируй функциями бОльших степеней. Нужна непрерывность N-й производной -- сплайн. Нужны точные значения -- храни таблицу поправок к аппроксимирующей функции. Таблица будет меньше за счёт меньшей разрядности каждого элемента. Можешь, наконец, из степенных функций составлять свою кривую. Вариантов масса...

Что именно? Это, практически, типовая задача и для неё существуют типовые решения.

Join the Discussion

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

Didn't find your answer?

Ask the community — no account required