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

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

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

Y=А*Log(В*X)

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

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

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

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

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

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

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

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

Функция в таблице нелинейная, безразрывная, в виде суммы логарифмов (предположительно) снята запоминающим осциллографом с реального узла. Аргумент

16 бит, функция 12 бит.

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

Так-же нужно реализовать программно ФHЧ (интегратор с симматором на входе), на вход которого приходят прямоугольные импульсы постоянной амплитуды и длительности, но переменного периода следования от 0,1 сек, до 50 мкСек.

Результат с выхода этого ФHЧ и есть Х1. Опрос сотояния фильтра 4 раза в секунду.

Это я предпологаю собрать на реверсивном счетчике. Во время действия импульсов он инкрементируется, в паузах дикрементируется. Каждые 0,25 секунды его значение делиться на 5000 (типа интеграл взяли) и полученное чило идет далее.

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

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

Reply to
Wladimir Tchernov
Loading thread data ...

 X-Virus-Scanned: amavisd-new at bezeqint.net

Hello, Wladimir Tchernov! You wrote in conference fido7.ru.embedded to All on Wed, 02 Aug 2006 09:27:24

+0400:

WT> Доброго времени суток тебе All!

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

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

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

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

#include <math.h>

double x, y;

ну и так далее.

dima

formatting link

Reply to
Dmitry Orlov

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Reply to
Dmitry E. Oboukhov

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

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

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

Reply to
Dmitry E. Oboukhov

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

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

:-O

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

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

Reply to
Kirill Frolov

Скорей float x,y... Ибо double не у всех есть, да и громоздок.

Reply to
Kirill Frolov

Hello, Dmitry! You wrote to Wladimir Tchernov on Thu, 03 Aug 2006 10:41:45 +0600:

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

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

ЗЫ. По моему он своими бесконечными вопросами утомил не только меня.

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

Reply to
Andrej Arnold

 X-Virus-Scanned: amavisd-new at bezeqint.net

Hello, Kirill Frolov! You wrote in conference fido7.ru.embedded to Dmitry Orlov on Thu, 3 Aug 2006 07:54:44

+0000 (UTC):

KF> Скорей float x,y... Ибо double не у всех есть, да и громоздок.

Обычно для подобных контроллеров это одно и тоже.

dima

formatting link

Reply to
Dmitry Orlov

Hi Wladimir!

02 Aug 06 10:27, Wladimir Tchernov wrote to All:

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

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

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

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

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

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

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

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

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

Slav.

Reply to
Slav Matveev

 X-Virus-Scanned: amavisd-new at bezeqint.net

Hello, Slav Matveev! You wrote in conference fido7.ru.embedded to Wladimir Tchernov on Thu, 03 Aug 2006 13:48:55 +0400:

SM> Hi Wladimir!

SM> 02 Aug 06 10:27, Wladimir Tchernov wrote to All:

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

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

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

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

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

Даже не вопрос. Кто внимательно читает, видел, что нужно одно вычисление в

250ms. Это без вопростов делается стандартной математической библиотекой на любом контроллере, куда она влазит. Просто автор вопроса до такой степени не владеет темой (как и практически во всех вопросах, которые он задает), что даже этот совет ему не поможет. Не говоря уж о совете адаптировать алгоритм из glib к целочисленной арифметике. Тот, кто в состоянии это сделать, подобного уровня вопросов не задает. Кстати, вот как log считает IAR AVR:

/* - LOG.C -

The ANSI "log" function.

The coefficients are #2705 from Hart & Cheney. (19.38D)

$Name: V3_34L V3_34K V3_34J V3_34I V3_34H V3_34G $

Copyright 1986 - 1999 IAR Systems. All rights reserved.

*/

#include "sysmac.h" #include "math.h" #include "iccfloat.h" #include "float.h" #include "errno.h"

#if __FLOAT_SIZE__ == __DOUBLE_SIZE__ #define b0 0.20000008368e1 #define b1 0.6664407777 #define b2 0.41517739 #else #define b0 0.200000000000000261007e1 #define b1 0.6666666666633660894 #define b2 0.400000001206045365 #define b3 0.2857140915904889 #define b4 0.22223823332791 #define b5 0.1811136267967 #define b6 0.16948212488 #endif

double log(double arg) { #ifdef _INTRINSIC return log(arg); #else double z; int exp;

if (arg <= 0.0) { if (arg == 0.0) { errno = ERANGE; return -HUGE_VAL; } errno = EDOM; return __EDOM_VALUE; }

/* Using log(x) = log(2^n * y) = log(2^n) + log(y) = */ /* n * log(2) + log(y), where 1/sqrt(2) <= y <= sqrt(2) */

arg = frexp(arg,&exp);

#ifdef __IAR_SYSTEMS_ICC__ if (arg < __SQRTO2) { arg = __daddexp(arg,1); exp--; } #else while (arg < 0.5) { arg *= 2; exp--; } if (arg < __SQRTO2) { arg *= 2; exp--; } #endif

arg = (arg - 1) / (arg + 1); z = arg * arg;

#if __FLOAT_SIZE__ == __DOUBLE_SIZE__ arg = arg * ((b2 * z + b1) * z + b0); return (signed char) exp * __LOG2 + arg; #else arg = arg * ((((((b6 * z + b5) * z + b4) * z + b3) * z + b2) * z + b1) * z + b0); return exp * __LOG2 + arg; #endif #endif }

dima

formatting link

Reply to
Dmitry Orlov

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

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

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

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

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

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

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

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

VLV

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

Reply to
Vladimir Vassilevsky

VV> Логарифм по любому основанию элементарно считается через log2. через любой logN

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

Reply to
Dmitry E. Oboukhov

Thu Aug 03 2006 14:48, Slav Matveev wrote to Wladimir Tchernov:

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

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

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

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

VLV

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

Reply to
Vladimir Vassilevsky

AA> Да он в том же самом треде "Конкурс" находится. AA>

formatting link

я так понял линеаризация в нескольких диапазонах

это несколько из другой оперы чем тот алгоритм что я выше привел. это ближе к одной табличной выборке :)

AA> Короче, это у меня выскочило в: AA>

formatting link
а если ты был подписан на эху давно нафиг искать в гугле?

AA> После набора: AA>

AA> Andrej Arnold Natuerlich натюрлих я бы врядле додумался бы ввести ;)

Reply to
Dmitry E. Oboukhov

Hello, Dmitry! You wrote to Andrej Arnold on Thu, 03 Aug 2006 11:48:46 +0600:

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

DEO>>> далее на входе в твою функцию смотрим попадает ли x в твой DEO>>> диапазон если да - возвращаем результат, если нет, то делим или DEO>>> умножаем x на 2 до тех пор пока не попадет в диапазон, а потом DEO>>> умножаем или делим выборку из таблицы на два чтобы DEO>>> отмасштабировать результат. AA>> Я совсем недавно сюда несколько иной алгоритм кидал, захочет сам AA>> найдёт. DEO> отдупь в нетмыло или сюда если не сложно DEO> интересно, я просто часто таблично-приближенное вычисление делаю DEO> (пример выше). несколько иной алгоритм посмотреть было бы здорово DEO> :) Да он в том же самом треде "Конкурс" находится.

formatting link
Короче, это у меня выскочило в:
formatting link
После набора:

Andrej Arnold Natuerlich

сразу в первой ссылке.

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

Reply to
Andrej Arnold

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

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

DEO> а разве это не тот же ряд будет? чем вычисление log2 от log3 в DEO> реализации будет отличаться?

Тем, что числа представлены в двоичной системе. Очевидно, что целая часть log2 - это порядок числа. А log2 от мантиссы легко найти хоть через ряд, хоть через полином, хоть аппроксимацией по табличке.

VLV

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

Reply to
Vladimir Vassilevsky

Hello Wladimir.

02 Aug 06 10:27, you wrote to All:

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

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

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

Vladimir

Reply to
Vladimir V. Teplouhov

Dmitry,

You wrote to Andrej Arnold:

DO> я так понял линеаризация в нескольких диапазонах

Hу да. Только число диапазонов не произвольное, а кратное степени числа два и длина каждого одинакова.

DO> это несколько из другой оперы чем тот алгоритм что я выше привел. DO> это ближе к одной табличной выборке :)

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

Во всяком случае, для его задачи этот метод ИМХО хорошо подходит и довольно быстрый (что ему не требуется), поскольку нет вызова функций и связанной с каждым вызовом сохраненим регистров и прочего, совсем не короткого, оверхеда типа того же сдвига long, нормализации и тп. Hу а судя по тому, что в ответе он "отбрасывает" четыре младших бита, да ещё есть начальный оффсет, 64 диапазона ему хватит. Может даже 32 и меньше... функция-то довольно гладкая.

DO> а если ты был подписан на эху давно

Можно подумать ты недавно тут...;)

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

Так обычно быстрее получается.

AA>> Andrej Arnold Natuerlich DO> натюрлих я бы врядле додумался бы ввести ;)

Hу я просто помню, что там коментарии начинались с этого слова, да ещё и с заменённым умляютом...

Andrey

Reply to
Andrey Arnold

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

DEO>> а разве это не тот же ряд будет? чем вычисление log2 от log3 в DEO>> реализации будет отличаться? VV>

VV> Тем, что числа представлены в двоичной системе. ну в смысле делить/умножать на 2 проще? двигаем просто ? ну поэтому я диапазон в вышеприведенном примере от a до

2a предлагал, чтобы деление обойти.

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

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

за что же тогда товарища идиотом назвали?

Reply to
Dmitry E. Oboukhov

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

Reply to
Dmitry E. Oboukhov

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.