Важная информация

User Tag List

Страница 1 из 16 12345 ... ПоследняяПоследняя
Показано с 1 по 10 из 155

Тема: Генерация синуса

  1. #1
    Veteran Аватар для Hacker VBI
    Регистрация
    05.03.2013
    Адрес
    г. Канев, Украина
    Сообщений
    1,596
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    2 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    Question Генерация синуса

    Нашёл интересную реализацию генератора синуса для арм/С.
    пытаюсь разобраться, но интересно АРМ устроен, некоторые вещи не ясны.
    Вопроса два:
    1. есть ли смысл в таком подходе?
    2. возможна ли достойная реализация под z80?

    вот сам код:
    С:
    s32 isin_S3(s32 x)
    {
    // S(x) = x * ( (3<<p) - (x*x>>r) ) >> s
    // n : Q-pos for quarter circle 13
    // A : Q-pos for output 12
    // p : Q-pos for parentheses intermediate 15
    // r = 2n-p 11
    // s = A-1-p-n 17

    static const int qN = 13, qA= 12, qP= 15, qR= 2*qN-qP, qS= qN+qP+1-qA;

    x= x<<(30-qN); // shift to full s32 range (Q13->Q30)

    if( (x^(x<<1)) < 0) // test for quadrant 1 or 2
    x= (1<<31) - x;

    x= x>>(30-qN);

    return x * ( (3<<qP) - (x*x>>qR) ) >> qS;
    }
    And, of course, there's an assembly version as well. It's only ten instructions, which I think is actually shorter than a LUT+lerp implementation.
    @ ARM assembly version, using n=13, p=15, A=12
    @ Input: gamma in Q13
    .arm
    .align
    .global isin_S3a
    isin_S3a:
    mov r0, r0, lsl #(30-13)
    teq r0, r0, lsl #1
    rsbmi r0, r0, #1<<31
    mov r0, r0, asr #(30-13)
    mul r1, r0, r0
    mov r1, r1, asr #11
    rsb r1, r1, #3<<15
    mul r0, r1, r0
    mov r0, r0, asr #17
    bx lr
    дома есть немного раскоментированный код арм-а , могу вечером выложить что обнаружил.
    Последний раз редактировалось Hacker VBI; 14.05.2013 в 15:45.

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2
    Veteran
    Регистрация
    01.03.2005
    Адрес
    Новосибирск
    Сообщений
    1,979
    Спасибо Благодарностей отдано 
    69
    Спасибо Благодарностей получено 
    261
    Поблагодарили
    99 сообщений
    Mentioned
    6 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Давай сразу на Z80 пример.

  4. #3
    Veteran Аватар для Hacker VBI
    Регистрация
    05.03.2013
    Адрес
    г. Канев, Украина
    Сообщений
    1,596
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    2 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    drbars, легко сказать.
    пока разбираю асм арма

  5. #4
    Master
    Регистрация
    25.03.2013
    Адрес
    г. Лондон, Великобритания
    Сообщений
    948
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    3 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Смотря для чего использовать. Умножение - дорогая операция, а тут - два умножения (хотя два умножения можно заменить одним кубом). Относительная погрешность в худшем случае - 4% (посчитал на ходу, мог ошибиться, конечно). Для генерации таблицы могло бы быть и поточнее, для работы на лету - слишком медленно для процессора без "дешёвого" умножения.
    Цель какая?

    ---------- Post added at 14:43 ---------- Previous post was at 14:32 ----------

    Тут мысль такая: они минимизировали абсолютные погрешности там, где синус большой, а то, что итоговые относительные значения аргумента врут там где синус маленьких их, типа, не волнует.
    В любом случае, в 3D движок я бы это не поставил, а в эффект где достаточно знать абсолютную величину синуса - можно.

  6. #5
    Veteran Аватар для Hacker VBI
    Регистрация
    05.03.2013
    Адрес
    г. Канев, Украина
    Сообщений
    1,596
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    2 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

  7. #6
    Master
    Регистрация
    25.03.2013
    Адрес
    г. Лондон, Великобритания
    Сообщений
    948
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    3 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Только не вздумай делать "в лоб" - тут всё подогнано для 32-битного процессора. Нет смысла делать так на 8-битном процессоре. Нужно делать 16-ти или даже 8-битную версию. Я прикину множители и напишу.

  8. #7
    Vitamin C++ Аватар для Vitamin
    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,254
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    80
    Поблагодарили
    34 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    А для чего такой изврат-то?
    Вот пример генератора синуса в 75 байт http://zxpress.ru/article.php?id=1289
    Вышеприведенный пример врядли будет короче, даже без учета процедуры умножения.

  9. #8
    Guru Аватар для jerri
    Регистрация
    01.03.2005
    Адрес
    Samara
    Сообщений
    4,746
    Спасибо Благодарностей отдано 
    256
    Спасибо Благодарностей получено 
    265
    Поблагодарили
    199 сообщений
    Mentioned
    12 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Vitamin, там ошибка в табличке
    С уважением,
    Jerri / Red Triangle.

  10. #9
    Veteran Аватар для Hacker VBI
    Регистрация
    05.03.2013
    Адрес
    г. Канев, Украина
    Сообщений
    1,596
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    2 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    После консультации с introspec и рекомендации Vitamin освоение арм-а и римейк данного генератора прекращён

  11. #10
    Master
    Регистрация
    25.03.2013
    Адрес
    г. Лондон, Великобритания
    Сообщений
    948
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    3 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от jerri Посмотреть сообщение
    Vitamin, там ошибка в табличке
    jerri, там по-моему не в табличке ошибка, а во втором полупериоде - они его сделали ldir, а что знак менять нужно, очевидно, забыли.
    "introspec" читается как "интроспек". некоторые читают как "интроспец", но я никакой не спец. я спек.

Страница 1 из 16 12345 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Качение синуса
    от Hacker VBI в разделе Программирование
    Ответов: 38
    Последнее: 08.04.2013, 00:40
  2. Генерация лабиринтов
    от TomCaT в разделе Программирование
    Ответов: 90
    Последнее: 26.06.2012, 10:59
  3. День рождения Синуса!
    от valeron в разделе Поздравления
    Ответов: 9
    Последнее: 19.05.2010, 15:31
  4. Генерация матрицы клавиатуры
    от AlexCrush в разделе Программирование
    Ответов: 5
    Последнее: 23.01.2007, 15:32

Ваши права

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