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

Fri Aug 04 2006 00:01, Dmitry E. Oboukhov wrote to Vladimir Vassilevsky:

DEO>>> чем вычисление log2 от log3 в DEO>>> реализации будет отличаться? VV>> Тем, что числа представлены в двоичной системе. VV>> Очевидно, что целая часть log2 - это порядок числа. А log2 от мантиссы VV>> легко найти хоть через ряд, хоть через полином, хоть аппроксимацией VV>> по табличке. DEO> ну в смысле делить/умножать на 2 проще? DEO> двигаем просто ? ну поэтому я диапазон в вышеприведенном примере от a до DEO> 2a предлагал, чтобы деление обойти.

Дык мантисса двоичного числа по определению в диапазоне [1, 2). Что сильно упрощает дальнейшие вычисления.

DEO> сейчас в принципе уже куча процов появилось которым по барабану на что DEO> делить//умножать на 2 или на 22 :)

Умножение - да, деление - нет. Деление - дорогая операция. DEO> кроме сдвигов вычисление log2 от logN ничем не отличается? DEO> правильно же я понимаю? Мантисса нормализованная. Вычислять удобно.

DEO> то есть тот же ряд до выбранной точности? Даже ряд не нужен. Log2 в диапазоне аргумента [1...2) это почти линейная функция. Прекрасно апроксимируется.

VLV

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

Reply to
Vladimir Vassilevsky
Loading thread data ...

Wed Aug 02 2006 10:27, Wladimir Tchernov wrote to All:

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

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

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

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

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

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

IAR C/C++ Compiler for AVR

4.20A/W32 (4.20.1.3)

U16 func(U16 X) { #define A 100.0 #define B 50000.0 return (U16)(A*log10(B*X)); } //------------------------------------------------------------------- __C_task void main(void) { // PORTA = c;

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

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

for (;;) { U16 x = func(598); led_on();

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

"Resistance is futile"

Reply to
Yuriy K

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

03 Авг 06 11:41, Dmitry E. Oboukhov -> Wladimir Tchernov:

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

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

WT>> Где А,В - константы WT>>

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

WT>> Положение запятой фиксировано. WT>>

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

WT>> Скорость вычисления не менее 4 вычислений в секунду. WT>>

WT>> Это вообще реально, на процессоре рангом пониже iP ? WT>>

DO> вычислить реально DO> просто функцию log взять из любого libc и реализовать

А чуть по точнее ?

А главное сколь она ресурсозатратна.

Да по результатам прикидок нужно вычислять логарифм по основанию 2.

WT>> Вариант с таблицей я уже рассмотрел и он мне не понравился - WT>> потому как в программе и так таблица для более сложного WT>> преобразования в 65536 значений по 2 байта каждое (128 к) WT>>

WT>> Или можно как-то сократить эти таблицы. WT>>

DO> сократить таблицы можно когда разные участки одной функции отличаются DO> друг от друга одинаково.

DO> например возьмем f=K/x (специально не беру твой логарифм, чтобы ты сам DO> подумал;) ), где К - постоянный коэффициент DO> строим для него таблицу для диапазона DO> x=[a, 2a) (или x=(a, 2a] - не важно)

DO> далее на входе в твою функцию смотрим попадает ли x в твой диапазон DO> если да - возвращаем результат, если нет, то делим или умножаем x на 2 DO> до тех пор пока не попадет в диапазон, а потом умножаем или делим DO> выборку из таблицы на два чтобы отмасштабировать результат.

Хорошая идея - надо вспоминать свойства логарифмов.

DO> я такую реализацию функций как-то применял. надо просто помнить, что DO> результат получается с определенной точностью,

Hасчет точности я пока не могу определиться, так-как не могу никак определить с какой достоверность микроконтроллерная система будет приближаться к заменяемой аналоговой.

Вчера снивал ВАХ и АЧХ одного из узлов. Измение нпряжения питания на 20 мВ изменяет выходной результат вдвое. Б..н

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

ЗЫ Получил более менее точную формулу для рассчета

Y=8*Log (1,5*X) . 9

Пошел снова АЧХ снимать.

В общем это ВАХ прямосмещенного германивого дида - какой она интересно функции подчиняется ?

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

Reply to
Wladimir Tchernov

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

03 Авг 06 11:53, Kirill Frolov -> Wladimir Tchernov:

KF> С такой скоростью стандартная библиотека не справляеется???

Какая ? Где лежит ? Исходный текст доступен ?

KF> Это реально на Z80 с < 1MIPS.

KF> :-O

KF> Использовать какой-либо метод интерполяции? Вполне может подойти и KF> простейшая линейная с большим (но, возможно, существенно меньшего чем KF> таблица размером) числом точек. Полиномы в целых числах тоже KF> относительно легко считаются.

KF> Если длительность импульса постоянна -- имеет значение только KF> частота следования импульсов. Вот её и можно измерять каким-либо KF> образом.

Я ее и меряю (таймеры потому и заняты - один обслуживает частотомер, другой интегратор)

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

Reply to
Wladimir Tchernov

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

03 Авг 06 14:48, Slav Matveev -> Wladimir Tchernov:

WT>> Положение запятой фиксировано.

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

WT>> Скорость вычисления не менее 4 вычислений в секунду.

WT>> Это вообще реально, на процессоре рангом пониже iP ?

SM> Все реально. вопрос в точности.

Hе знаю пока. Пока вопрос в возможности реализации и затратах ресурсов на нее.

WT>> Таймеры использовать нельзя. Прерывания заняты и следуют с WT>> частотой до 20000 в секунду. Аппаратный умножитель использовать WT>> нельзя.

SM> умножение при необходимости заменяется на сдвиг и сложение.

SM> реализацию log можно посмотреть, например, в исходниках SM> glibc. с поправкой что придется ее адаптировать SM> к целочисленной арифметике. можно разложить SM> в ряд и считать до нужного члена. для этого заглянуть SM> в какой-нибудь учебник по матану. Я таким образом в отсутствии SM> библиотек и наличии компилятора просчитал синусы/косинусы. SM> Мне хватило четырех слагаемых в ряду.

Хорошая мысль.

SM> Со снятой осциллографом функцией сложнее, но можно тоже SM> попробовать SM> разложить в ряд и аппроксимировать с нужной точностью SM> стандартными функциями. но за деталями - в учебник матана.

Я пробывал какую-то программу, которая возвращает функцию, по таблице значений и аргументов функции. Получилось сложная система суперпозиции класса Y=Log(основание А, (Log (основание Б, X)*X)).

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

Hу тоесть интегратор банальной RC цепочкой.

SM> Кстати, хранить можно не значения для каждой точки, SM> а только с некоторым шагом и поправки. Как в таблицах SM> Брадиса. :) Я об этом я думал - можно наверное уложиться в 1 байт на ячейку, но при этом время выборки будет зависеть от аргумента.

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

Reply to
Wladimir Tchernov

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

03 Авг 06 19:07, Vladimir Vassilevsky -> Wladimir Tchernov:

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

VV> Элементарно. VV> Какая требуется точность?

Пока неизвестно - я только начал исследование системы.

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

VV> :))))))

WT>> Так-же нужно реализовать программно ФHЧ

VV> Кароче. Hайдите $1000 и я вам это сделаю.

Мне научиться самому хочется, ради того, чтобы научиться.

А так вон она аналоговая реализация лежит и работает, хреново, но работает.

WT>> P.S. Hе добыв ADuC решил все узлы впихнуть в один или несколько WT>> микроконтроллеров связанных цифровыми линиями связи.

VV> Иногда лишние знания только вредят...

Время покажет.

Хочу аналоговые узлы заменить микроконтроллерами и аналоговые линии связи - цифровыми.

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

Reply to
Wladimir Tchernov

Hi Vladimir!

03 Aug 06 19:15, Vladimir Vassilevsky wrote to Slav Matveev:

SM>> в какой-нибудь учебник по матану.

VV> Идиот (с) VV> Логарифм по любому основанию элементарно считается через log2. VV> А найти log2 с любой точностью - дело техники.

пшелнах. логарифм по любому основанию элементарно считается через логарифм по другому любому основанию. С таким же успехом ты можешь через выразить и через lg и через ln. А log2 с любой точностью ты все равно будешь искать через подобный этому ряд:

arg = arg * ((((((b6 * z + b5) * z + b4) * z + b3) * z + b2) * z + b1) * z + b0);

SM>> Я таким образом в отсутствии SM>> библиотек и наличии компилятора просчитал синусы/косинусы. SM>> Мне хватило четырех слагаемых в ряду.

VV> Дураку лишние знания только вредят :))))

Купи приличную книжку по матану, если такие в пендосии водятся и попробуй понять откуда берется

z = x*x; r = z*(C1+z*(C2+z*(C3+z*(C4+z*(C5+z*C6)))));

и почему многочлен имеет ненулевые коэффициенты только по четным степеням x.

Slav.

Reply to
Slav Matveev

Hi Dmitry!

03 Aug 06 20:09, Dmitry E. Oboukhov wrote to Vladimir Vassilevsky:

VV>> А найти log2 с любой точностью - дело техники. DO> а разве это не тот же ряд будет? чем вычисление log2 от log3 в DO> реализации будет отличаться? (никогда не интересовался этим вопросом)

Видимо тем, что двоичная арифметика. только все равно будет разложение в ряд и апроксимация многочленом с нужной точностью.

Slav.

Reply to
Slav Matveev

Hi Vladimir!

04 Aug 06 00:42, Vladimir Vassilevsky wrote to Dmitry E. Oboukhov:

VV> Мантисса нормализованная. Вычислять удобно.

DEO>> то есть тот же ряд до выбранной точности?

VV> Даже ряд не нужен. Log2 в диапазоне аргумента [1...2) это почти VV> линейная функция. Прекрасно апроксимируется.

Линейной функцией апроксимируется с точностью до первого знака после запятой. Ты случаем не с аэромеха, у которых все что меньше 10 сравнимо с единицей? Slav.

Reply to
Slav Matveev

Hello, Yuriy! You wrote to Wladimir Tchernov on Fri, 04 Aug 2006 02:28:43 +0600:

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

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

YK> U16 func(U16 X) YK> { YK> #define A 100.0 YK> #define B 50000.0

YK> return (U16)(A*log10(B*X));

Log(B*X) = Log(B) + Log (X) = C + Log(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> } Вообще-то это умеет считать AVR Studio. (Я так понял, что эти 700 мксек ты скопом посмотрел)

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

Reply to
Andrej Arnold

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

Reply to
Kirill Frolov

Афтар жжот.

formatting link
-- ценный йад, прямо исходник генерировать умеет.

Ещё на сайте микрочипа раздают тулзы с исключительно дружественным интерфейсом, но я не вникал особо.

Reply to
Kirill Frolov
<<< No Message Collected >>>
Reply to
Kirill Frolov

Hello Vladimir.

Thu Aug 03 2006 19:15, Vladimir Vassilevsky wrote to Slav Matveev:

VV> Идиот (с) [] VV> Дураку лишние знания только вредят :)))) []

Интересно, мы и в самом деле модератора выбирали, или мне приснилось?..

Dimmy.

Reply to
Dimmy Timchenko

Не люблю разбираться с чужими исходниками. Чаще лучше иметь изложение алгоритма на человеческом языке и проще заново переписать. Если речь идёт, конечно, о чём-то относительно простом.

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

Впрочем я вынужден согласиться, что предлагаемый мною вариант просто по объёму кода, возможно, превзойдёт изначально предлагаемое, даже если его (разбиение на 2^N диапазонов) брать со всеми таблицами.

Чёрт его знает. Зависит от максимально допустимой ошибки аппроксимации, самих аппроксимируемых данных и от соотношения байт/на оператор для конкретного компилятора.

Reply to
Kirill Frolov

Hello, Kirill! You wrote to Andrey Arnold on Fri, 04 Aug 2006 12:46:41 +0600:

DO>>> я так понял линеаризация в нескольких диапазонах ??>> Только число диапазонов не произвольное, а кратное степени числа ??>> два и длина каждого одинакова. KF> Я ничего не понял. Впрочем и не вникал. Хочу только сказать, Вижу, что хочешь. А отлаженный исходник где?;) KF> что ничто не мешает отсортировать список аргументов функции и её KF> значений и искать двоичным поиском за log2(N) времени, что для 4096 KF> элементов даст всего-то 12 операций сравнения. А это значит _в общем случае_ - каждый раз сохранять регистры в стеке, загружать регистры элементами сравнения, потом снова регистры восстанавливать. Воно тоби треба? KF> А этих элементов, очевидно, будет в Nдцатьц раз меньше. В этом месте радоваться или плакать? KF> Будет там что-то кратно двум или нет -- совершенно не важно (что KF> может позволить уменьшить ошибку аппроксимации). Прикажешь в то, что ты тут нагородил вникать, или позволишь сразу сказать? ;)

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

Reply to
Andrej Arnold

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

04 Авг 06 03:28, Yuriy K -> Wladimir Tchernov:

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> }

Всего не понял, но смысл ясен - пошел искать IAR. Си не знаю, но думаю откомпилировать программу, а потом диззасемблировать.

Hашел, крякнуть не смог :( Hадо крякер побезглючнее. Разбираюсь.

В общем ругается на отсутсвие идетификаторов. Типа нужно какие-то файлы с описаниями эквивалентов подключать.

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

Reply to
Wladimir Tchernov

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

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

мм умножение

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

AA> Можно подумать ты недавно тут...;) я тут от силы неделю :)

DO>> нафиг искать в гугле? AA>

AA> Так обычно быстрее получается. да но результат в почтовик не загрузишь, а ньюсы я не люблю. идеален был бы %rescan но у меня его нет. впрочем это офтоп

Reply to
Dmitry E. Oboukhov

Hello Alexey.

Fri Aug 04 2006 18:45, Alexey V Bugrov wrote to me:

VV>>> Идиот (с) DT>> [] VV>>> Дураку лишние знания только вредят :)))) DT>> []

DT>> Интересно, мы и в самом деле модератора выбирали, или мне DT>> приснилось?..

AVB> == Moderator hat on ==

AVB> [*] - замечение.

AVB> 1. Обсуждении политики модерирования в конференции AVB> 2. Hарушение п.4.1 правил.

AVB> == Moderator hat off ==

Hу а исходное письмо ты считаешь допустимым? И ответ на него в подобном же стиле не заставил себя ждать, и тоже остался без реакции модератора. Думаю, не одному мне хотелось бы знать, это случайность или часть необсуждаемой политики модерирования?

AVB> И что мешало тебе написать тоже самое мне нетмейлом?

Вообще-то ты сам должен замечать подобные эксцессы и оперативно на них реагировать. Без подсказок нетмейлом. Раз уж взялся за гуж.

Hа этом прекращаю недозволенные речи.

Dimmy.

Reply to
Dimmy Timchenko

Hello, Dimmy! You wrote to All on Fri, 04 Aug 2006 14:12:42 +0400:

VV>> Идиот (с) DT> [] VV>> Дураку лишние знания только вредят :)))) DT> []

DT> Интересно, мы и в самом деле модератора выбирали, или мне приснилось?..

== Moderator hat on ==

[*] - замечение.

  1. Обсуждении политики модерирования в конференции

  1. Нарушение п.4.1 правил.

== Moderator hat off ==

И что мешало тебе написать тоже самое мне нетмейлом?

WBR, AVB

Reply to
Alexey V Bugrov

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.