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

Aug 02, 2006 108 Replies

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) Гете "Фауст"

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"

Доброго времени суток тебе 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.

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

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

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

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

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

KF> :-O

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

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

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

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

Доброго времени суток тебе 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.

Доброго времени суток тебе 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.

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.

Hi Dmitry!

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

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

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

Slav.

Hi Vladimir!

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

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

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

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

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

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

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

Афтар жжот.

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

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

Hello Vladimir.

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

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

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

Dimmy.

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

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

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

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

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

Доброго времени суток тебе 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.

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

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

мм умножение

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

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

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

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

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.

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

Join the Discussion

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

Didn't find your answer?

Ask the community — no account required