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

User Tag List

Показано с 1 по 5 из 5

Тема: Генератор шума в AY-3-8910

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1
    Master
    Регистрация
    20.01.2016
    Адрес
    п. Власиха, Московская обл.
    Сообщений
    593
    Спасибо Благодарностей отдано 
    6
    Спасибо Благодарностей получено 
    32
    Поблагодарили
    19 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Генератор шума в AY-3-8910

    Меня постоянно мучает вопрос, какой же алгоритм правильный.
    Надеюсь те кто ковырял внутренности чипа смогут прояснить данный вопрос.

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

    1. ay8910.c,v 1.6 2006/02/08
    noise_level = noise_level ^ (shiftreg.bit0 ^ shiftreg.bit1)
    shiftreg = (shiftreg.bit0 ^ shiftreg.bit3) ? (shiftreg >> 1) ^ 0x12000 : (shiftreg >> 1)

    Лог уровень шума меняется, если операция XOR битов 0 и 1 дает единицу (т.е. если бит 0 и бит 1 различаются)
    Если биты 0 и 3 различаются, то значение псевдогенератора случайных чисел ксорится с 0x12000


    2. http://www.cpcwiki.eu/index.php/PSG
    noise_level = noise_level ^ shiftreg.bit0
    newbit = shiftreg.bit0 ^ shiftreg.bit3
    shiftreg = (shiftreg >> 1) + (newbit << 16)

    Лог уровень шума ксорится с вытолкнутым из генератора битом, результат XOR бита 0 и бита 3 становится новым битом генератора


    3. http://wiki.intellivision.us/index.php?title=PSG
    noise_level = shiftreg.bit0
    shiftreg = (shiftreg >> 1) ^ ((shiftreg & 1) ? 0x14000 : 0);

    Уровень шума равен вытолкнутому биту, если он равен единице, то значение генератора ксорится с 0x14000

    4. ay-8910.v (тот что для FPGA)
    noise_level = shiftreg.bit0
    newbit = shiftreg.bit0 ^ shiftreg.bit3
    shiftreg = (shiftreg >> 1) + (newbit << 16)
    Инициализируется значением 0x10000
    вход bit0 ^ bit3
    выход нулевой бит


    ТРЕБУЕТСЯ ПОМОЩЬ В ПОИСКЕ ИСТИНЫ :-)

    PS: чисто на слух наиболее приятен такой вариант (это смесь 1 и 4)
    noise_level = noise_level ^ (shiftreg.bit0 ^ shiftreg.bit1)
    shiftreg = (shiftreg >> 1) + ((shiftreg.bit0 ^ shiftreg.bit3) << 16)
    Инициализируется значением 0x10000

    PS2: данные две операции равнозначны, видимо на чем-то удобнее делать так, а на чем-то иначе
    1) noise_level = noise_level ^ (shiftreg.bit0 ^ shiftreg.bit1)
    2) noise_level = shiftreg.bit0

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

    PS4: т.е. простейший алгоритм такой, выталкиваем бит справа, он будет уровнем шума, если он равен единице, то устанавливаем 16 бит и инвертируем 14-й бит, таким образом, правильные алгоритмы вроде как 3 и 4
    Последний раз редактировалось EvgenRU; 24.08.2016 в 15:50.

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

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

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

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

Похожие темы

  1. Способы уменьшения шума FDD?
    от Evgeny Muchkin в разделе Внешние накопители
    Ответов: 14
    Последнее: 08.04.2013, 17:17
  2. Генератор RND
    от Destr в разделе Программирование
    Ответов: 4
    Последнее: 19.10.2009, 21:16

Ваши права

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