Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2017-дек-15 01:52

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
СообщениеДобавлено: 2016-окт-24 11:38 
Не в сети

Зарегистрирован: 2016-янв-29 17:53
Сообщения: 54
Здравствуйте, скажите пожалуйста, сколько тактов в среднем(или минимальное/максимальное кол-во тактов) выполняется операция sin, cos? Есть ли другое решение, которое выполняется быстрее? какие параметры лучше подбирать(с плавающей запятой или int)?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-окт-24 11:50 
Не в сети

Зарегистрирован: 2014-июн-25 09:29
Сообщения: 46
Думаю, что количество тактов для выполнения Си-функций sin и cos не отражено в документации. Проще самому провести эксперимент, вычислив sin и cos и засекая по SysTick или иному аппаратному таймеру время до и после вычисления.
Другим решением может быть табличное представление функции sin и cos, в том числе, целочисленное представление функции вида z = A * sin (t / T), где А - амплитуда, Т - период. Т.е. заранее (при включении контроллера или даже в исходнике проекта) вычисляйте значения функции, заносите их в массив, а затем извлекайте ранее вычисленные значения из соответствующих элементов массива. Такой подход часто используют при генерации сигнала с помощью ЦАП.
Конкретизируйте задачу, может быть, подскажу подробней.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-ноя-03 13:51 
Не в сети

Зарегистрирован: 2016-янв-29 17:53
Сообщения: 54
Код:
//Constants
#define cordic_1K 0x26DD3B6A    // 1/k = 0.6072529350088812561694
#define half_pi 0x6487ED51      // pi / 2
#define MUL 1073741824.000000   // 1.0 = 1073741824
#define CORDIC_NTAB 32

int cordic_tab [] = {
    0x3243F6A8, 0x1DAC6705, 0x0FADBAFC, 0x07F56EA6, 0x03FEAB76, 0x01FFD55B, 0x00FFFAAA, 0x007FFF55,
    0x003FFFEA, 0x001FFFFD, 0x000FFFFF, 0x0007FFFF, 0x0003FFFF, 0x0001FFFF, 0x0000FFFF, 0x00007FFF,
    0x00003FFF, 0x00001FFF, 0x00000FFF, 0x000007FF, 0x000003FF, 0x000001FF, 0x000000FF, 0x0000007F,
    0x0000003F, 0x0000001F, 0x0000000F, 0x00000008, 0x00000004, 0x00000002, 0x00000001, 0x00000000
};

void cordic32_sin_cos(int alpha, int *s, int *c, int n)
{
    int k, d, tx;
    int z = alpha;
    *c = cordic_1K, *s = 0;
    n = (n > CORDIC_NTAB) ? CORDIC_NTAB : n;
    if(n<3) n = 3;
    for (k=0; k<n; ++k)
    {
        d = z >> 31;    //d = z>=0 ? 0 : -1;
        tx = *c;
        *c -= (((*s>>k) ^ d) - d);
        *s += (((tx>>k) ^ d) - d);
        z -= ((cordic_tab[k] ^ d) - d);
    }
}
Вот что для себя нашел


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-ноя-03 14:43 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1037
Откуда: Тула
fryn3 писал(а):
Вот что для себя нашел

Как тут нормируются входные-выходные данные?

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-дек-13 16:09 
Не в сети

Зарегистрирован: 2016-янв-29 17:53
Сообщения: 54
prostoRoman писал(а):
fryn3 писал(а):
Вот что для себя нашел

Как тут нормируются входные-выходные данные?

Что такое нормирование?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-дек-13 16:49 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1037
Откуда: Тула
fryn3 писал(а):
prostoRoman писал(а):
fryn3 писал(а):
Вот что для себя нашел

Как тут нормируются входные-выходные данные?

Что такое нормирование?

Сколько будет два*Пи, Пи/4 - на входе и +1,0,-1 на выходе?

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 3 часа


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

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB