Вычисление троичного арктангенса

32-разрядные микроконтроллеры разработки ОАО "НИИЭТ"

Модераторы: pip, _sva_

Ответить
_mark.sam_
Администратор
Сообщения: 41
Зарегистрирован: 12 фев 2015, 11:19

Вычисление троичного арктангенса

Сообщение _mark.sam_ » 03 авг 2017, 12:21

Повысить скорость вычислений можно как за счет использования быстродействующих реализаций (CORDIC), так и сокращая разрядность числа. В предлагаемой реализации используются 10 разрядные троичные числа вместо 32 битных "float".
Вложения
ternaryAtan_17_08_03.rar
В приложенном архиве библиотеки с троичным арктангенсом для Desktop (tssfix10digit4Desktop.h, tssfix10digit4Desktop.cpp.o, linkObj03.bat) и К1921ВК01Т (tssfix10digit4k1921.h, tssfix10digit4k1921.c.o, linkObj07.bat), руководство пользователя (ternaryAtan_17_08_03.pdf), примеры использования (main.cpp, main.c) и проверка точности (checkAtan02.xlsx).
(2.73 МБ) 17 скачиваний
технический специалист АО "НИИЭТ"

tnsfloat
Сообщения: 4
Зарегистрирован: 01 авг 2017, 12:08
Предприятие: usptu

Re: Вычисление арктангенса В троично – сбалансированной системе счисления

Сообщение tnsfloat » 04 авг 2017, 16:53

Время вычисления арктангенса из стандартной библиотеки float составляет примерно 3000 тактов контроллера К1921ВК01Т из 7000 имеющихся на выработку управляющего воздействия. Другими словами если сейчас на управление 1 двигателем контроллер К1921ВК01Т тратит 35% своей мощности (viewtopic.php?f=37&t=523), то сократив затраты всего на 5% можно будет управлять не 2, а 3 двигателями. Сокращение затрат на 10% позволит управлять 4 двигателями. Повысить скорость вычислений можно используя быстродействующие алгоритмы, типа CORDIC, можно сокращать разрядность числа либо переносить вычисления на аппаратный уровень. В предлагаемой программной библиотеке используются 10 разрядные троичные числа вместо 32 битных float.
В алфавите троично–сбалансированной системы счисления (ТСС) имеется три буквы 1; 0; -1, единичный разряд в ТСС называется тритом. Для эмуляции ТСС на доступной двоичной элементной базе можно использовать 2 битовые поля: -1 кодируется как 10; 0 кодируется как 00; 1 кодируется как 01.
Тригонометрические функции sin, cos, tan, atan и т.п. ограничены в области определения и/или области значения, поэтому для их реализации можно использовать числа с фиксированной запятой. Из практики известно, что максимальная разрядность аналого – цифровых преобразователей (АЦП) равна 14 битам. Мощность 14 битового числа составляет 2 в степени 14 = 16384, а вот мощность 9 тритового числа несколько больше 3 в степени 9 = 19683. Тогда можно использовать следующий ТСС формат – 10 тритовое число с фиксированной запятой, 7 разрядов на дробную часть, 3 разряда до запятой на целую часть, кроме того самый старший разряд – это ещё и признак переполнения. Такое ТСС число может храниться в 20 младших разрядах 32 битного int.
Зная, что АЦП выдает целое положительное число, программа (файл main.cpp из приложенного архива) в цикле 16384 раза из номера итерации формирует ТСС число в диапазоне от -8192 до 8191, вычисляет от него арктангенс и преобразует результат во float.
Оценить прирост производительности сейчас не представляется возможным, с одной стороны количество разрядов сократилось с 23 до 9, а с другой стороны операция сложения эмулируется программно. Собственно замеры времени производятся расстановкой аппаратных точек останова до и после арктангенса и функций преобразования типов. Как только мы получим контроллер, такие замеры будут сделаны, но все равно потребуется независимое подтверждение.
Если кого – то изложенное заинтересовало, давайте сделаем этот бейнчмарк сейчас, не откладывая в долгий ящик, любую посильную помощь предоставлю.
Вложения
ternaryAtan_17_08_03.rar
В приложенном архиве библиотеки с троичным арктангенсом для Desktop (tssfix10digit4Desktop.h, tssfix10digit4Desktop.cpp.o, linkObj03.bat) и К1921ВК01Т (tssfix10digit4k1921.h, tssfix10digit4k1921.c.o, linkObj07.bat), руководство пользователя (ternaryAtan_17_08_03.pdf), примеры использования (main.cpp, main.c) и проверка точности (checkAtan02.xlsx).
(2.73 МБ) 9 скачиваний
Умение забывать глупости, дает
возможность помнить главное.

Disona
Сообщения: 7
Зарегистрирован: 06 дек 2016, 11:18
Предприятие: НПФ Вектор
Откуда: Москва
Contact:

Re: Вычисление троичного арктангенса

Сообщение Disona » 07 авг 2017, 14:12

Добрый день.

Вы не могли бы поподробнее рассказать, как подключить ваш файл к проекту? Какой компилятор, с какими настройками? В архиве я вижу, что вы используете GCC. Вы можете скомпилировать ваш файл в виде библиотеки (*.a), чтобы его можно было подключить к другому проекту?
С уважением, Дмитрий Шпак
ООО "НПФ Вектор"

Disona
Сообщения: 7
Зарегистрирован: 06 дек 2016, 11:18
Предприятие: НПФ Вектор
Откуда: Москва
Contact:

Исходники

Сообщение Disona » 07 авг 2017, 14:20

На всякий случай спрошу - а в исходных кодах можно эти функции получить?
С уважением, Дмитрий Шпак
ООО "НПФ Вектор"

tnsfloat
Сообщения: 4
Зарегистрирован: 01 авг 2017, 12:08
Предприятие: usptu

Re: Вычисление троичного арктангенса

Сообщение tnsfloat » 07 авг 2017, 16:13

Добрый день Дмитрий.

Я откомпилировал файл tssfix10digit4k1921.c из командной строки в tssfix10digit4k1921.c.a,
D:/niiet/gcc-arm49/bin/arm-none-eabi-g++.exe -g -Os -Wall -Wextra -pipe "-fvisibility=default" -x c "-std=gnu99" -mthumb "-mcpu=cortex-m4" "-mfloat-abi=hard" "-mfpu=fpv4-sp-d16" -fdata-sections -ffunction-sections -flto -DNDEBUG -D__STARTUP_CLEAR_BSS -D__NO_SYSTEM_INIT "-D__START=main" -IF:/4niiet/atan05/source/app -IF:/4niiet/atan05/source/libs/CMSIS/Include -IF:/4niiet/atan05/source/libs/Device -c F:/4niiet/atan05/source/app/tssfix10digit4k1921.c -o F:/4niiet/atan05-Release/qtc_K1921VK0_c56cc0ad-release/atan05.qtc-K1921VK0-c56cc0ad.a39784b3/.obj/a39579e698efdf13/tssfix10digit4k1921.c.a

Компилятор (https://launchpad.net/gcc-arm-embedded), рекомендованный в «Руководство по настройке и использованию открытого ПО совместно с микроконтроллерами ОАО “НИИЭТ” на базе ядра ARM Cortex-M4» (download/file.php?id=250)

Исходный код кривой, его стыдно показывать.
Вложения
tssfix10digit4k1921.rar
В архиве файлы tssfix10digit4k1921.c.a и compA.bat
(38.48 КБ) 12 скачиваний
Умение забывать глупости, дает
возможность помнить главное.

Аватара пользователя
Лашкевич
Сообщения: 95
Зарегистрирован: 13 май 2015, 13:10
Предприятие: ООО "НПФ Вектор"
Откуда: Москва
Contact:

Re: Вычисление троичного арктангенса

Сообщение Лашкевич » 07 авг 2017, 16:49

Видится затруднительным подключать к проекту объектный файл - необходимо либо его скомпилировать в виде библиотеки (.lib), либо предоставлять исходный код. Если можно, сделайте готовый пример проекта в одной из доступных сред разработки, в которой будет всё компилироваться - тогда можно будет проверить...
С уважением,
Лашкевич Максим.
Инженер-программист ООО "НПФ Вектор", Москва.
http://motorcontrol.ru/

Disona
Сообщения: 7
Зарегистрирован: 06 дек 2016, 11:18
Предприятие: НПФ Вектор
Откуда: Москва
Contact:

Re: Вычисление троичного арктангенса

Сообщение Disona » 07 авг 2017, 20:47

tnsfloat писал(а):
07 авг 2017, 16:13
Я откомпилировал файл tssfix10digit4k1921.c из командной строки в tssfix10digit4k1921.c.a,
D:/niiet/gcc-arm49/bin/arm-none-eabi-g++.exe -g -Os -Wall -Wextra -pipe "-fvisibility=default" -x c "-std=gnu99" -mthumb "-mcpu=cortex-m4" "-mfloat-abi=hard" "-mfpu=fpv4-sp-d16" -fdata-sections -ffunction-sections -flto -DNDEBUG -D__STARTUP_CLEAR_BSS -D__NO_SYSTEM_INIT "-D__START=main" -IF:/4niiet/atan05/source/app -IF:/4niiet/atan05/source/libs/CMSIS/Include -IF:/4niiet/atan05/source/libs/Device -c F:/4niiet/atan05/source/app/tssfix10digit4k1921.c -o F:/4niiet/atan05-Release/qtc_K1921VK0_c56cc0ad-release/atan05.qtc-K1921VK0-c56cc0ad.a39784b3/.obj/a39579e698efdf13/tssfix10digit4k1921.c.a
К сожалению у меня не получилось подключить этот файл к проекту. Компилятор всё равно жалуется на то, что не может найти нужные функции. Попробуйте исопльзовать команду для компиляции, приведённую ниже. Примерно так мы вызываем компилятор для создания своих библиотек. Правда, мы пользуемся другой версией компилятора, но тоже GCC. Насколько я понимаю, интерфейсы программ одинаковы.

Код: Выделить всё

arm-none-eabi-gcc 
-mcpu=cortex-m4 
-mthumb 
-mfloat-abi=soft 
-O0 
-fmessage
-length=0 
-fsigned-char 
-ffunction-sections 
-fdata-sections  
-g3 
-I"F:/4niiet/atan05/source/libs/CMSIS/Include" 
-I"F:/4niiet/atan05/source/libs/Device" 
-std=gnu11 
-c 
-o "F:/4niiet/atan05-Release/qtc_K1921VK0_c56cc0ad-release/atan05.qtc-K1921VK0-c56cc0ad.a39784b3/.obj/a39579e698efdf13/tssfix10digit4k1921.o" "F:/4niiet/atan05-Release/qtc_K1921VK0_c56cc0ad-release/atan05.qtc-K1921VK0-c56cc0ad.a39784b3/.obj/a39579e698efdf13/tssfix10digit4k1921.c"
С уважением, Дмитрий Шпак
ООО "НПФ Вектор"

tnsfloat
Сообщения: 4
Зарегистрирован: 01 авг 2017, 12:08
Предприятие: usptu

Re: Вычисление троичного арктангенса

Сообщение tnsfloat » 08 авг 2017, 13:05

Добрый день.

Из объектного файла tssfix10digit4k1921.c.o командой
arm-none-eabi-ar.exe q libtssfix10digit4k1921.a tssfix10digit4k1921.c.o
получается статическая библиотека libtssfix10digit4k1921.a.
(файлы в архиве libTss_17_08_08.7z). Подключить статическую библиотеку к проекту в Qt Creator 3.4.2 (download/file.php?id=250) я не смог. Хотя, судя по тому, что в каталоге проекта …/source/libs/CMSIS/lib есть файл libarm_cortexM4fl_math.a, это возможно.

В документе «Реализация алгоритма вычисления арктангенса методом CORDIC в троично – сбалансированной системе счисления» (файл ternaryAtan_17_08_03.pdf в приложении предыдущего сообщения) на страницах 6-7 приведен пример получения файлов atan06.elf, atan06.hex и atan06.bin из объектного файла tssfix10digit4k1921.c.o и файлов из проекта Qt Creator 3.4.2.

С уважением.
Вложения
libTss_17_08_08.7z
(35.24 КБ) 13 скачиваний
Умение забывать глупости, дает
возможность помнить главное.

novikovfb
Сообщения: 16
Зарегистрирован: 01 сен 2011, 15:09

Re: Вычисление арктангенса В троично – сбалансированной системе счисления

Сообщение novikovfb » 16 авг 2017, 16:16

tnsfloat писал(а):
04 авг 2017, 16:53
Тригонометрические функции sin, cos, tan, atan и т.п. ограничены в области определения и/или области значения, поэтому для их реализации можно использовать числа с фиксированной запятой. Из практики известно, что максимальная разрядность аналого – цифровых преобразователей (АЦП) равна 14 битам.
при емкости Flash памяти в 1 Мб выделить таблицу констант для 16384 чисел float, т.е. 64 Кб - совсем не страшно, зато скорость "вычисления" получается максимальной.

tnsfloat
Сообщения: 4
Зарегистрирован: 01 авг 2017, 12:08
Предприятие: usptu

Re: Вычисление арктангенса В троично – сбалансированной системе счисления

Сообщение tnsfloat » 06 сен 2017, 19:19

novikovfb писал(а):
04 авг 2017, 16:53

при емкости Flash памяти в 1 Мб выделить таблицу констант для 16384 чисел float, т.е. 64 Кб.
Речь идет о функции atan2(x, y), она возвращает угол между осью ординат и прямой проходящей через точку (x, y) и началом координат. Для таблицы констант придется создать двумерный индексированный массив размером: 16384*16384*4= 1Мб, многовато.
В самом общем виде необходимо получить зависимость вида y=F(a, b, c, … n), это собственно и есть математическая модель управления некоторым процессом. Эту зависимость можно реализовать в виде непосредственных вычислений, в большинстве случаев так и делают, либо предпринимаются попытки использования искусственных нейронных сетей (ИНС). Ожидается, что ИНС дадут наиболее экономичное решение и я согласен с этим мнением.
Умение забывать глупости, дает
возможность помнить главное.

Ответить

Вернуться в «32-разрядные микроконтроллеры на ядре ARM Cortex»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя