NeoGS for 32-channel XM, IT, S3M

NeoGS software and hardware

Postby lvd » 27 Apr 2010, 12:16

TS-Labs wrote:Толсто, двери трещат. Из-за вас приходится перестраивать детектор.

Вообще он прав. Если надо передискретизовать цифровой сигнал, то правильно так - сначала перевести его на частоту НОК(частота1, частота2) путём вставления нулей между отсчётами, потом на этой чатсоте профильтровать фильтром до половины чатсоты выходной, и далее выгнать на выходную частоту путём взятия каждого энного отсчёта. В реальности это делается полифазными КИХ-фильтрами.
Ну и само собой, что для проигрывания модов и ХМов вся эта поебень никуда не всралась, линейной интерполяции хватает :)

TS-Labs wrote:Курим РТФМ по формату ХМ

За неимением оного - что мешает процессору переводить 32 громкости и паннинг в 64 громкости?

TS-Labs wrote:если частота ЦАП-а ниже частоты семпла (целая часть инкремента >0), то пропускать интерполяцию.

Тут в чём фишка. Когда так интреполировать при целом шаге >1, то дробная часть шага показывает не дистанцию между соседними отсчётами, а погоду на луне. Потому тут интреполяция может даже вредить.

Ещё вот вопрос. Как делается лупинг при условии что целая часть шага >1 ? А то аппаратно сразу вылезают компараторы и вычитаторы...
F̞͖̭̿̔ͯu̐̅cͬ̑ͩk̨̤̳͇̮̭̪̠̽̿̓̆ͭͩ ̷̩̰͎̩͓̘̾̀ͬ̊ͭ͛ͅda̝̺͙̬͎̝̾͟ ̰̜̝̯͉̯̖̓̎́ͨ̽ͫ͟f̟͇̭̀ͬͨͭ̐̚u̹̼̹̗̞͑̔͂͐̚cͭ̅̊̆̒̆ǩ̝̩̯́ͥ̔̍̑ḭ͓͍̳̬ͦ̽͂n͍͎͈̈̅ͩͬ ̊ͫ̂̾̑̈́f̲͚͉͓͗̋́ͧͦ̅ȗ͇̲̻͈̲̅̎͗͒ͭ͡c̬̟̠̹̯̈́ͩ͘ͅk̫̠̻̋͜a̲͒̾̇!͙͕̺͉̗̩̲̂̏̄̀
User avatar
lvd
 
Posts: 7170
Joined: 07 Apr 2007, 21:28
Group: Registered users

Postby TS-Labs » 27 Apr 2010, 16:59

lvd wrote:За неимением оного - что мешает процессору переводить 32 громкости и паннинг в 64 громкости?

Пожалуй, ты прав. Фактически, нам нужно иметь 32 громкости каждого канала в левом ухе и 32 в правом. Экономит аппаратное умножение в 2 раза.
Остальное вычислять плеером.

lvd wrote:Ещё вот вопрос. Как делается лупинг при условии что целая часть шага >1 ? А то аппаратно сразу вылезают компараторы и вычитаторы...

Я знаю, что они вылезают... Я посчитал, что для полного коммунизма нам требуется 4 бита целого инкремента, то есть на очень высокой ноте выбиратор будет пролетать аж почти по 16 байт. (например, инструмент на ноте С-3 оцифрован на частоте 76000, тогда чтоб сыграть его на ноте С-6 на частоте 37000 нам надо читать его в 16 раз быстрее. Как бы не не хватило...)
И в этом случае, да, нужны и сумматоры и компараторы.
Сумматоры:
24.12 бит адреса прибавить к 4.12 бит инкремента, то есть 36 и 16.
Компараторы:
24 бит адреса сравнить с 24 бит адреса, то есть 24 и 24.

Выход один:
Сначала рассчитать ФПГА таким образом, что вся необходимая математика для 32 каналов будет в 1 блоке (АЛУ), а каждый канал будет обрабатываться по очереди. Потом решаем во сколько раз нам позволяют ресурсы увеличить кол-во АЛУ для параллельных вычислений. Возможно несколько ситуаций:
1) Не хватает места даже для 1 АЛУ - жопа.
2) Хватает ТОЛЬКО для 1 АЛУ - уменьшаем кол-во каналов с 32 до сколько выйдет либо частоту дискретизации - унылое полужопие.
3) Хватает для 2/3/4 и тд АЛУ - лютый, бешеный вин!
TS-Labs
 
Posts: 1150
Joined: 19 Apr 2010, 10:10
Location: Wildest West
Group: Registered users

Postby lvd » 27 Apr 2010, 17:02

TS-Labs wrote:Я знаю, что они вылезают... Я посчитал, что для полного коммунизма нам требуется 4 бита целого инкремента, то есть на очень высокой ноте выбиратор будет пролетать аж почти по 16 байт. (например, инструмент на ноте С-3 оцифрован на частоте 76000, тогда чтоб сыграть его на ноте С-6 на частоте 37000 нам надо читать его в 16 раз быстрее. Как бы не не хватило...)И в этом случае, да, нужны и сумматоры и компараторы.Сумматоры: 24.12 бит адреса прибавить к 4.12 бит инкремента, то есть 36 и 16.Компараторы:24 бит адреса сравнить с 24 бит адреса, то есть 24 и 24.

Я правильно понимаю, границы лупинга можно сделать по краям 16 байтовых блоков?
F̞͖̭̿̔ͯu̐̅cͬ̑ͩk̨̤̳͇̮̭̪̠̽̿̓̆ͭͩ ̷̩̰͎̩͓̘̾̀ͬ̊ͭ͛ͅda̝̺͙̬͎̝̾͟ ̰̜̝̯͉̯̖̓̎́ͨ̽ͫ͟f̟͇̭̀ͬͨͭ̐̚u̹̼̹̗̞͑̔͂͐̚cͭ̅̊̆̒̆ǩ̝̩̯́ͥ̔̍̑ḭ͓͍̳̬ͦ̽͂n͍͎͈̈̅ͩͬ ̊ͫ̂̾̑̈́f̲͚͉͓͗̋́ͧͦ̅ȗ͇̲̻͈̲̅̎͗͒ͭ͡c̬̟̠̹̯̈́ͩ͘ͅk̫̠̻̋͜a̲͒̾̇!͙͕̺͉̗̩̲̂̏̄̀
User avatar
lvd
 
Posts: 7170
Joined: 07 Apr 2007, 21:28
Group: Registered users

Postby TS-Labs » 27 Apr 2010, 20:12

Чип должен играть петлю с ЛЮБОГО адреса по любой.
При этом, изменение может быть только на 15 байт плюс $FFFF после запятой (чуть менее 16 байт), но В ЛЮБУЮ СТОРОНУ. Т.е., как в плюс, так и в минус. При чем, проверять надо все 24 бита.
Например, имеем адрес $00FFFE, инкремент $03.BF13. Прибавляем, получим новый адрес $010001 и что-то в субадресе. Следовательно, компарацией только младших 4 бит отмазаться не удастся...

Чтобы прояснить ситуацию - народ волнуется - Hummer Ultra Sound это рабочее название для конфигурации, которая будет зашиваться в 30к Альтеры, стоящую на борту NeoGS. Никакие аппаратные изменения платы НГС не планируются. Кроме одного. Если я решу писать плеер для атмелки вместо з80, то она будет впихнута в виде переходника на место 380-го. Ящитаю, что аппаратная конфигурация НГС чуть более, чем полностью позволяет реализовать на ней приемлимый звуковой девайс.
Last edited by TS-Labs on 27 Apr 2010, 22:54, edited 4 times in total.
TS-Labs
 
Posts: 1150
Joined: 19 Apr 2010, 10:10
Location: Wildest West
Group: Registered users

Postby TS-Labs » 27 Apr 2010, 20:14

Я думаю, если это поможет, компарацию можно делать не 24 с 24, а в 3 захода по 8 с 8 через бит переполнения (так программно это выглядит на отмелке). Если конечно, это что-нибудь сэкономит.
То же касается и сумматоров.
TS-Labs
 
Posts: 1150
Joined: 19 Apr 2010, 10:10
Location: Wildest West
Group: Registered users

Postby TS-Labs » 27 Apr 2010, 20:51

Проверил вариант с пропусканием интерполяции при ненулевой целой части инкремента. Ну шо вам сказаты... Проблема на chiptunes, где инструменты могут быть длиной в 30 байт и состоять из одного периода пилы. В этом случае возникает неизбежная интерференция между частотой выборки и оцифрованной пилой. Это минусы. Плюсы: а) на качество чиповых музонов это не влияет, б) на серьезных модулях, где оцифровка действительно 76кГц, там выборка интерференции не создаст.
TS-Labs
 
Posts: 1150
Joined: 19 Apr 2010, 10:10
Location: Wildest West
Group: Registered users

Postby breeze » 27 Apr 2010, 23:31

/me читает умные слова и роняет слюни на пол в ожидании явления чуда в реале…
breeze
 
Posts: 538
Joined: 07 Feb 2009, 16:19
Group: Registered users

Postby lvd » 28 Apr 2010, 09:20

TS-Labs wrote:Чип должен играть петлю с ЛЮБОГО адреса по любой.

Я извиняюсь, если зададут петлю длиной 3 байта, а шаг по семплу выйдет 13 байт, мне что, делить с остатком???
F̞͖̭̿̔ͯu̐̅cͬ̑ͩk̨̤̳͇̮̭̪̠̽̿̓̆ͭͩ ̷̩̰͎̩͓̘̾̀ͬ̊ͭ͛ͅda̝̺͙̬͎̝̾͟ ̰̜̝̯͉̯̖̓̎́ͨ̽ͫ͟f̟͇̭̀ͬͨͭ̐̚u̹̼̹̗̞͑̔͂͐̚cͭ̅̊̆̒̆ǩ̝̩̯́ͥ̔̍̑ḭ͓͍̳̬ͦ̽͂n͍͎͈̈̅ͩͬ ̊ͫ̂̾̑̈́f̲͚͉͓͗̋́ͧͦ̅ȗ͇̲̻͈̲̅̎͗͒ͭ͡c̬̟̠̹̯̈́ͩ͘ͅk̫̠̻̋͜a̲͒̾̇!͙͕̺͉̗̩̲̂̏̄̀
User avatar
lvd
 
Posts: 7170
Joined: 07 Apr 2007, 21:28
Group: Registered users

Postby TS-Labs » 28 Apr 2010, 09:34

Ничего не делать. Будем крутиться на 1-м байте петли. Пример:
SARn=$008000
LSARn=$008000
LEARn=$008002
SIRn=$D000
$008000+$D=$00800D - переполнение, вылет за конец петли, не выполняется условие SARn<=LEARn, значит SARn=$008000 (LSARn->SARn).
TS-Labs
 
Posts: 1150
Joined: 19 Apr 2010, 10:10
Location: Wildest West
Group: Registered users

Postby TS-Labs » 28 Apr 2010, 09:38

Боюсь только, что надо ввести ограничение: адрес последнего байта последнего сэмпла должен быть <= (16МБ - 16), а адрес первого байта первого сэмпла >=16. То есть, выдерживать эти условия при загрузке модуля.
TS-Labs
 
Posts: 1150
Joined: 19 Apr 2010, 10:10
Location: Wildest West
Group: Registered users

PreviousNext

Return to NeoGS - софт и железо

Who is online

Users browsing this forum: No registered users and 1 guest

cron