Mon Aug 07 2006 09:47, Dmitry E. Oboukhov wrote to Wladimir Tchernov:
WT>> В общем это ВАХ прямосмещенного германивого дида - какой она интересно WT>> функции подчиняется ? DEO> насколько я помню там чистая экспонента, а не логарифм. (U(I)) Типичная ВАХ диода - две разные экспоненты при больших и малых токах. Все это экземплярно и плавает на милливольты на градус. Точность - порядка 10%, если не принято особых мер по стабилизации и компенсации всего.
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
*** 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 :) ну это уж как получится
Итого получается 12 сегментов по 17 слов, что меньше, чем 512 байт.
Кстати, я у себя, наверное, так и сделаю. Хотя бы потому, что аналитическое решение, занимая меньше места, не учитывает фактические погрешности измерителей, которые все равно надо убирать таблично.
WT> Получается для каждого из 4096 результатов надо задать свой диапазон WT> аргументов - а это 3-4 байта на ячейку таблицы. Причем у одних Hет. Поскольку функция вроде бы монотонна (Или это не так?), то вполне достаточно искать значение аргумента t[i] <= arg && arg < t[i+1]. Два байта на результат. WT> Все равно не понял. Двоичный поиск. Д.Кнут том 3.
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]. Два байта на результат.
KF> linux тут никакого отношения не имеет. s/linux/gnu libc/. KF> Только вот посллалл так послал... HАшёл куда. Тудас (в glibc) KF> лучше и не соваться. почему лучше не соваться? я помнится туда заглядывал в поисках посмотреть как iconv работает, вполне себе библиотека :) просто надо научиться поиском пользоваться (grep/egrep), иначе действительно в таком огромном объеме кода долго искать нужную функцию придется ;)
07 Авг 06 09:47, Dmitry E. Oboukhov -> Wladimir Tchernov:
WT>> В общем это ВАХ прямосмещенного германивого дида - какой она WT>> интересно функции подчиняется ? DO> насколько я помню там чистая экспонента, а не логарифм. (U(I))
Да - меня в схемсах просветили - а у меня на выходе именно логарифм. Буду разбираться.
Уже посмотрел - нее я не настолько умный, что-бы понять КАК ЭТО РАБОТАЕТ :)
Попробую все-же по таблицам.
KF> А зачем второй нужен? :-/
Один считает импульсы измеряя период по внешнему стробу, другой работает в хронизаторе отсчитывая внутреннее время в процессоре, для вычисления моментов суммирования значений частоты для интегрирования. Между эти событиями частота усредняется.
NM> После компиляции симулятор аврстудии с твоей задачей справится без NM> проблем. И обрати внимание, что тут уже писали о логарифмах (умножение NM> -> сложение). Однако и вопросы у тебя...
Сложновато мне выражать свои мысли и знаний маловато.
VB>>> А почему и нет ? Компилятор делает именно это. И на ASM я делал VB>>> так же (логарифмы заняли 113 слов программной памяти AVR,
WT>> А исходным текстом не поделишся.
VB> Hет, библиотека в целом имеет определенную ценность, и раздавать ее я VB> не предполагал (а по своей сути базовая часть - это портированная VB> библиотека плавучки из микрочиповской аппликухи). Принцип вычисления VB> логарифма и значения коэффициентов взяты из библиотеки HI-Tech C для VB> PIC.
Hо она без исходников - тоесть дизассемблировал ? Даааа...
Будь счастлив(а) Vladislav... С уважением Wladimir.
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> ну это уж как получится
07 Авг 06 18:35, Vladimir Vassilevsky -> Dmitry E. Oboukhov:
WT>>> В общем это ВАХ прямосмещенного германивого дида - какой она WT>>> интересно функции подчиняется ? DEO>> насколько я помню там чистая экспонента, а не логарифм. (U(I))
VV> Типичная ВАХ диода - две разные экспоненты при больших и малых VV> токах. Все это экземплярно и плавает на милливольты на градус. VV> Точность - порядка 10%, если не принято особых мер по стабилизации VV> и компенсации всего.
Это я уже понял, причем сам ток диода его-же и греет....
Буду я в общем снимать ВАХ с этих диодов.
Будь счастлив(а) Vladimir... С уважением Wladimir.
WT> Уже посмотрел - нее я не настолько умный, что-бы понять КАК ЭТО РАБОТАЕТ :) возьми книжку тогда Г.Корн Т.Корн по математике и выбери численный метод по вкусу ;)
У тебя есть список пар [аргумент, значение]. Массив с ними, если ещё не, отсортировываешь по аргументу. Потом когда надо найти две пары (для линейной интерполяции) слева и справа от имеющегося аргумента ищешь посредством двоичного поиска (в электронике известен как метод последовательного приближения) -- берёшь значение в середине массива. Если у тебя аргумент меньше -- берёшь далее значение в середине левой половины, а иначе в середине правой. И так в цикле, пока не найдёшь две соседних пары [аргумент, значение].
Вот вопрос как построить список и сколько выбрать пар и с каким шагом между ними чтоб получить заданную тобой максимальную погрешность. Задача может быть решена методом похожим на описанный выше: разбиваешь пополам, считаешь погрешность, если не подходит, разбиваешь ещё пополам, иначе разбиваешь пополам "остаток" и так далее... Это -- построение списока -- делается, естесственно, не в контроллере в реальном времени, а в пц.
Ничего не понял. У тебя на N элементов твоей таблицы будет приходиться две пары [аргумент, значение]. В пределе -- две таких пары на всю таблицу. Т.е. там не 4096 пар будет, а существенно меньше. Насколько существенно зависит от допускаемой погрешности. Речь именно об аппрокимации -- приближении твоей функции, а не вычислении точного значения. Нужна высокая точность -- аппроксимируй функциями бОльших степеней. Нужна непрерывность N-й производной -- сплайн. Нужны точные значения -- храни таблицу поправок к аппроксимирующей функции. Таблица будет меньше за счёт меньшей разрядности каждого элемента. Можешь, наконец, из степенных функций составлять свою кривую. Вариантов масса...
Что именно? Это, практически, типовая задача и для неё существуют типовые решения.
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.