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

Aug 02, 2006 108 Replies

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


 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

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 больше тем точность выше. на точность так же влияет шаг в таблице (ну это и ёжику понятно ;) )

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>

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

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

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

:-O

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

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

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

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

 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

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.

 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

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

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

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

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

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

formatting link

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

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

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

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

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

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

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

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

Hello Wladimir.

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

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

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

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

Vladimir

Dmitry,

You wrote to Andrej Arnold:

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

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

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

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

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

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

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

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

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

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

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

Andrey

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

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

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

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

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

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

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

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

Join the Discussion

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

Didn't find your answer?

Ask the community — no account required