PDA

Просмотр полной версии : Воспроизведение WAV с испльзованием ШИМ



ivagor
27.11.2009, 20:44
Доделал ШИМ до состояния, когда он не свистит и не жужжит. Используется КД. Частота дискретизации воспроизводимого звукового фрагмента 23800 Гц, используются только 3 бита из каждого отсчета, поэтому шипит. Можно сделать по 4 бита из каждого отсчета, частота дискретизации будет ниже (скорее всего, настолько ниже, что будет слышен высокочастотный свист), но и шипа будет меньше. Прилагаю wav-файлы, записанные с реала, т.к. звучание эмуляторов совсем другое.
http://retrocomp.narod.ru/vector06c/pwm3bit.ZIP
http://retrocomp.narod.ru/vector06c/pwm4bit.ZIP

Error404
27.11.2009, 21:14
Доделал ШИМ до состояния, когда он не свистит и не жужжит. Используется КД. Частота дискретизации воспроизводимого звукового фрагмента 23800 Гц, используются только 3 бита из каждого отсчета, поэтому шипит. Можно сделать по 4 бита из каждого отсчета, частота дискретизации будет ниже (скорее всего, настолько ниже, что будет слышен высокочастотный свист), но и шипа будет меньше. Прилагаю wav-файлы, записанные с реала, т.к. звучание эмуляторов совсем другое.

А что такое КД?

ivagor
27.11.2009, 22:15
КД - квазидиск (дополнительное ОЗУ 64 или 256 Кб).

ivagor
28.11.2009, 07:39
Поправил пару мелких ошибок в pwm14
1. В pwm14.asm была неправильно указана длина звукового файла (31713 вместо 32713), из за чего не проигрывались последние 40 мс.
2. Вместо pwm14_3.rom был приложен pwm14_3.sfk :)
Архив в первом посте перезалил.

ivagor
28.11.2009, 09:35
Сделал вариант с воспроизведением 4-битных отсчетов, частота дискретизации 19700 Гц, свиста не слышно, шипения меньше. Можно по аналогии доделать pwm14 и там частота дискретизации будет больше 24 кГц.

Ramiros
28.11.2009, 12:06
в VV звук мало чем от оригинала отличается, я бы даже сказал, практически неотличается :)

ivagor
28.11.2009, 12:32
Ramiros, в VV свист слышен, которого не должно быть. Также сравни спектры из VV и приложеных wavов.

Ramiros
28.11.2009, 12:43
Ramiros, в VV свист слышен, которого не должно быть. Также сравни спектры из VV и приложеных wavов.

Я имел ввиду на слух, т.е. соотношение полезный сигнал/шум вполне на приличном уровне.

ivagor
28.11.2009, 12:52
Мне было интересно, можно ли сделать на векторе ШИМ с приемлемым числом разрядов (не менее 3) и без свиста. Это получилось, но только на реале. В VV полезный сигнал слышен, согласен, но от реала отличие есть.

Ramiros
28.11.2009, 13:52
К сожалению практическое применение трудно представить в виду прожорливости памяти

ivagor
28.11.2009, 14:49
16 секунд, если занять весь КД и все основное ОЗУ :)
Можно воспринимать это как демонстрацию потенциальных возможностей вектора по состоянию периферии на 88 г., ну и как тест эмулятора :).
Намного практичнее использовать для проигрывания wavов AY или COVOX, но и ШИМ через бипер можно маленько усовершенствовать. В трехбитный вариант можно добавить разбор полубайтов на ходу, в итоге максимальная длительность увеличится в два раза (32 секунды).

ivagor
11.10.2021, 19:05
Предыдущие версии проигрывателя wavов через ВИ53 выкладывались в ковоксной ветке (1.0 (https://zx-pk.ru/threads/14607-quot-covox-dlya-vektor-06ts-quot.html?p=878833&viewfull=1#post878833), 1.1 (https://zx-pk.ru/threads/14607-quot-covox-dlya-vektor-06ts-quot.html?p=880782&viewfull=1#post880782)), но думаю здесь они более к месту. В новой версии увеличил громкость для 22 кГц в 2 раза, для остальных частот дискретизации - в 3 раза. Плюс мелкие доработки. Используется весь кваз, поэтому исключительно для МикроДОС 28. Пара загрузочных образов с примерами тут. Из эмуляторов могу рекомендовать только v06x (удобнее пользоваться версией с гуем (https://zx-pk.ru/threads/28132-bipernaya-muzyka-na-vektore-06ts.html?p=1131801&viewfull=1#post1131801)).

Improver
12.10.2021, 11:56
ivagor, а что если использовать второй КД, например, на порту 011h? Не в плане увеличения времени воспроизведения, а для возможности работы в любом МДОСе. Сейчас второй КД доступен и в эмуляторе, и в железе.

ivagor
12.10.2021, 12:07
что если использовать второй КД, например, на порту 011h? Не в плане увеличения времени воспроизведения, а для возможности работы в любом МДОСе.
Думал об этом. Проблема в том, что вряд ли кто-то будет проверять на реале, а из эмуляторов второй кваз поддерживает только Emu. В Emu качество шима в целом, и данного варианта в особенности, неприемлемое. Тем не менее хорошо бы сделать для возможности использования с hdd.

ivagor
12.10.2021, 18:02
Увеличение громкости - это хорошо, но хочется еще и качество улучшить. В 1.1 и 1.2 для всех частот дискретизации 6-битное качество (64 уровня). В новой версии 1.3 (и 1.3qd2) (https://disk.yandex.ru/d/sUmwKZuvImvMsQ) получилось для 8 и 16 кГц поднять качество до 7 бит (128 уровней), почти ковокс. За увеличение качества пришлось пожертвовать частью громкости, для этих частот она стала как для 22 кГц, но все равно в 2 раза больше, чем было в 1.0-1.1. Максимальная громкость осталась для 11 кГц, но там осталось и 6-битное качество. Еще в 1.3 поправил гладкость проигрывания 16 и 22 кГц, которую слегка поломал в 1.2.
Сводка характеристик 1.3:
8 кГц (с линейной интерполяцией до 16 кГц), 7-битное качество, громкость 2/3
11 кГц (с линейной интерполяцией до 22 кГц), 6-битное качество, громкость 3/3
16 кГц, 7-битное качество, громкость 2/3
22 кГц, 6-битное качество, громкость 2/3
Кроме версии для МикроДОС 28 (wavpwmq.com) в комплекте также экспериментальная версия для двух квазидисков (10h и 11h, wavpwm2q.com). Предполгается ее запуск в досах, использующих только кваз 10h, кваз 11h будет занят wavом. Только для реала, запустить в соответствующем конфиге Emu можно, но не нужно.

ivagor
04.11.2022, 16:16
Есть в базисе карточка Covox sample (http://tenroom.ru/scalar/ware/821/index.html) (хотя сам образ muzspace.fdd). На самом деле там только один из трех примеров играет через covox, а два других - через таймер. Кажется я много лет назад писал про это, осталось только вспомнить - где. А люди верят написанному в картотеке, например вот (https://vk.com/wall291087158_336). На самом деле там samantha играет через covox, а chipdale - через таймер. Предположу, что в этом картридже предусмотрено объединение звука от вектора и ковокса, иначе бы ошибки не произошло, т.к. было бы очевидно, что chipdale играет не через ковокс.

ivagor
18.11.2022, 22:35
Сильно улучшил таймерный проигрыватель wav.
Версия 1.4:
8 кГц (с линейной интерполяцией до 16 кГц), 8-битное качество, громкость 3/3
11 кГц (с линейной интерполяцией до 22 кГц), 7-битное качество, громкость 2/3
16 кГц, 8-битное качество, громкость 3/3
22 кГц, 6-битное качество, громкость 3/3
Выкладываю только бинарники новой версии, образы дискет с примерами wav можно взять от версии 1.3 (https://zx-pk.ru/threads/11403-vosproizvedenie-wav-s-isplzovaniem-shim.html?p=1132898&viewfull=1#post1132898).
Эмуляторы. Безоговорочно подходит v06x. В Emu80 нужно (обязательно!) проверить, что громкость не больше 5 (Настройки>Настройки Эмулятора...>Системные>Звук>Громкость), и если больше, то уменьшить до 5.

Upd 21.11.2022: В 1.5 улучшил 22 кГц до 7-битного качества (громкость 2/3), теперь 6-битного не осталось, только 7 и 8. Расширение .wav теперь можно не указывать. Добавил readme.

Upd 29.11.2022: В 1.6 более корректная работа версии для двух квазидисков. Изменена клавиша прекращения проигрывания с РУС/ЛАТ на УС.

Upd 30.06.2023: Готовые образы (https://disk.yandex.ru/d/AtCNPLyqEHNtug) МикроДОС28 с примерами wav и проигрывателем для одного кваза.

PPC
20.11.2022, 15:03
Хорошо. На 16 kHz Найквист уже воспринимается на ухо сопоставимо с шумами при FM приёме какой-нибудь далёкой радиоточки.

Наверное стоит сделать расширение по умолчанию - чтобы каждый раз .WAV не надо было набирать. Всяко оно единственное из распознаваемых. Можно ещё процент загрузки на экран выводить в виде числища, но это я уже капризничаю.

ivagor
20.11.2022, 16:11
стоит сделать расширение по умолчанию - чтобы каждый раз .WAV не надо было набирать
В следующей версии постараюсь сделать, в принципе сразу хотел, но самому мне это не сильно мешает, а больше наверно никто не запускал до сих пор :) Вот индикатор загрузки делать не хочу.

ivagor
21.11.2022, 17:13
Доработал проигрыватель (https://zx-pk.ru/threads/11403-vosproizvedenie-wav-s-isplzovaniem-shim.html?p=1167154&viewfull=1#post1167154)

Pyk
28.11.2022, 22:51
В Emu80 нужно (обязательно!) проверить, что громкость не больше 5
Баг, однако. Исправил, изменения в репозитории, войдет в следующий релиз.

Есть какая-то проблема с версией для двух квазидисков. Если wavpwm2q.com v. 1.3 вроде бы нормально играл в Emu80 в конфигурации с двумя EDD, то 1.5 проигрывает только небольшой фрагмент и останавливается.
Версию 1.4 я пропустил, проверить не могу. Конфиг с двумя квазами для Emu навскидку не нашел, чтобы еще в нем проверить...

ivagor
29.11.2022, 06:29
В соответствующем конфиге emu версия для двух квазов работает нормально (если не считать качества звука), но я догадываюсь, в чем проблема в emu80. Скорее всего проблема будет и на реалах с двумя квазами, сделаю более корректный вариант.

ivagor
29.11.2022, 17:10
Переделал работу с двумя квазами на более корректный вариант (https://zx-pk.ru/threads/11403-vosproizvedenie-wav-s-isplzovaniem-shim.html?p=1167154&viewfull=1#post1167154). И повторилась история с поиском РУС/ЛАТ в эмуляторе, теперь для emu80. Так и не нашел, переделал на УС.

Pyk
29.11.2022, 18:46
повторилась история с поиском РУС/ЛАТ в эмуляторе, теперь для emu80. Так и не нашел
На будущее: раскладку клавиатуры всегда можно подсмотреть в подсказке по Alt-F1 (или "Помощь" -> "Справка по платформе").
В данном случае это был Ins.

ivagor
29.11.2022, 20:06
Справку по платформе я смотрел, но искал глазами РУС/ЛАТ, самое похожее что увидел - УС (лат), но это было не то.

Pyk
29.11.2022, 21:09
УС (лат), но это было не то
Да, "то" оно только в SDL-версии эмулятора, ибо Qt-версия не различает левые и правые модификаторы в силу специфики самого Qt...
Но УС даже лучше :)

ivagor
15.08.2023, 20:02
Дело было в марте 2020 года. svofski прочитал про воспроизведение оцифрованного звука сжатого векторным кодером (для C64, если не изменяет память) и прислал мне ссылку. Там было описание, полного и четкого алгоритма насколько помню не было. Пытался сделать по описанию - получалось плохо, пришлось изобрести свой велосипед на матлабе исходя из общих представлений о векторном кодировании. И svofski изобрел свой велосипед не на матлабе. А я еще накропал рилтаймовый декодер для вектора. Собственно результат можно послушать на реале или в v06x или в Emu80. В Emu или VV слушать не стоит.
Исходный фрагмент: 22.6 секунды, частота дискретизации 22 кГц, 8 бит/отсчет.
Без сжатия он занял бы 485.5 килобайт, т.е. не поместился бы в кваз. А тут удалось запихнуть в голый вектор. Сжатие в рабочем (без эксомизера) состоянии почти в 8 раз. Правда из-за технических ограничений вектора пришлось чуть придушить битность до 7.585 бит/отсчет (воспроизведение через ВИ53). Файл упакован эксомизером, но все равно слишком большой для обычного загрузчика, поэтому для реала подойдет hm22trip.wav с автостартующим быстрогрузом. Загружается, стартуем, ждем пока распакуется (по экрану пройдет волна), слушаем.
Клавиши управления: CC - пауза, УС - продолжить после остановки или воспроизвести с начала после окончания.
Воспроизведение с начала в любой момент: БЛК+СБР.

CityAceE
16.08.2023, 08:15
Для тех, кому лень запускать эмулятор:

https://youtu.be/J9oBi4_jF1o

P.S. И видео тут YouTube заблокировал из-за нарушения авторских прав на музыку. Надеюсь, что видео, доступное по ссылке всё-таки можно будет посмотреть/послушать.

ivagor
16.08.2023, 09:05
Можно сказать, что это независимое подтверждение качества, раз робот поймал, опознал и посчитал что достаточно похоже, чтобы заблокировать.

svofski
16.08.2023, 12:52
В онлайн-эмуляторе вполне приемлемо по-моему звучит. Я солидарен с ютубой, сам бы такое законтентматчил. ivagor крут!
https://caglrc.cc/scalar/ware/936/

ivagor
16.08.2023, 13:04
В онлайновом хорошо играет, пожалуй даже чуть-чуть лучше чем в Emu80. Крут вектор, не так уж много домашних советских компов того времени в своем первозданном виде потянут без купюр такую штуку. Кроме вектора разве что корвет. Для апогея, Б2м и экзотических специалистов с таймерами пришлось бы снизить частоту дискретизации.

svofski
16.08.2023, 13:10
ivagor, к сожалению ты редко делишься секретами, поэтому мало кто узнает как и чем именно крут Вектор. Так со стороны для обывателя в том, что компьютер сыграл песенку, в наше время большого повода для восторга нет. Даже люди в принципе любопытные и интересующиеся техникой, но поколения помоложе, не могут этого оценить без объяснений. Вот бы ты рассказал поподробней, с картинками и все такое.

ivagor
16.08.2023, 15:00
В данном случае я постарался описать с цифрами, что фишка в соотношении качества и размера. Если кто-то скажет, что подобное качество при 1 бите/отсчет в сжатом потоке - это ерунда, то я только пожму плечами, для советских домашних компов конца 80-х (причем без каких-либо дополнительных устройств) я ничего подобного не видел.

- - - Добавлено - - -

Уточнение про корвет - все же он уступит вектору по качеству. Скорости проца хватит, частота таймера выше, но для звука только один канал таймера вместо 3, поэтому в итоге будет 6.5 бит/отсчет вместо 7.6 у вектора. Зато у корвета потенциально можно фрагмент подлиннее уместить с учетом ГЗУ, но чтобы бесшовно (без треска и щелчков) переключать банки памяти придется уменьшить частоту дискретизации. У вектора аналогичная проблема с квазным проигрывателем, вряд ли в нем получится удержать 22 кГц.

NEO SPECTRUMAN
16.08.2023, 15:37
что фишка в соотношении качества и размера.
на тему улучшения кашоство
мне щас гулятсо некода
но могу подкинуть идею

по моему в adpcm у нас задаетсо амплитуда для блока данных
и потом сами данные в диапазоне -1...1 с прореженной битностью

так вот линейная шкала для звука скорей вссего не рациональна
ибо ступеньки восприятия у человека логарифмические

и вот можно побпробовать совместить 1...2 битный дельта код для логарифмической шкалы с общей амплитудой для блоков

шкала типо такая


333333333*
222*
1*
*
*1
*222
*333333333

ступенек на 16
и например с 2-мя нулями для симетрии
и чтоб 1 битный дельта код например не пищал в тишине

как вариант (возмможно более лучший)
линейную шкалу для дельта кода
но логарифмическую шкалу для общей амлитуды блоков

а можыт логарифмическую шкалу и туда и туда

16 логарифмических ступенек для общей амплитуды
хватит с головой
может даже 8

svofski
16.08.2023, 17:29
В данном случае я постарался описать с цифрами, что фишка в соотношении качества и размера. Если кто-то скажет, что подобное качество при 1 бите/отсчет в сжатом потоке - это ерунда, то я только пожму плечами, для советских домашних компов конца 80-х (причем без каких-либо дополнительных устройств) я ничего подобного не видел.

Цифры это хорошо, но все же, что такое векторное кодирование и как именно оно тут пригодилось -- объяснить простыми словами было бы очень интересно. Я например тогда как-то даже участвовал в процессе, хотя ты мою роль сильно преувеличил, но вот сейчас вспомнить что там за векторы и ка-минсы были так просто уже не могу.

ivagor
16.08.2023, 18:23
Пересказывать учебники мне совсем не хочется, все околопрограммисты надеюсь знакомы с векторным квантованием/кодированием, или при желании могут загуглить.
Конкретно в данном примере:
1. Кодовая книга на 256 векторов
2. Каждый вектор по 8 отсчетов
3. Отсчеты по 8 бит или 256 уровней, но перед воспроизведением сплющиваются до 192 уровней, иначе в векторовский таймер при данной частоте дискретизации не влезает.
Немного смешной момент - затрудняюсь сказать, каким алгоритмом здесь сформирована кодовая книга, k-means или LBG.
Есть цифры PSNR
k-means 33.6 дБ
LBG 33.9 дБ
k-means матлаб умеет сам считать, поэтому побыстрее, а LBG считал пользовательской функцией - страшно медленно.

- - - Добавлено - - -

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

svofski
16.08.2023, 19:17
В том и есть весь интерес, чтобы получить не пересказ учебника, а посмотреть как на практике учебник превращается в практическую пользу. Давай я попробую задавать вопросы, может быть так проще будет влезть в мои тапки как условного наблюдателя со стороны. Я геймер, родился в 2003, у моего папы был какой-то денди, который играл наверное видеокассеты. Зашел на фестиваль, а тут ламповый компьютер играет песни из бабушкиного патефона. Мне стало любопытно, но ничего не понятно, где тут вообще джаваскрипт.

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

1. Можно без пересказа учебника, хотя я не вижу вреда в кратком тезисном изложении принципов, но -- что же это за векторное кодирование и почему оно позволяет ужать в 8 раз, а другое (какое другое, например) не позволяет? что происходит, когда мы берем обычный PCM звук и пропускаем его через такое кодирование?

2. Что такое k-means, LBG? Наверное это алгоритмы, реализующие векторное квантование. Что именно они квантуют и что получается на их выходе? Как это помогает получить компактное представление звука?

3. Как из того, что получилось, получить обратно собственно звук?

4. Почему Вектор имеет какое-то преимущество перед другими компами. Что плееру этого кодека приходится делать по сравнению с более примитивным плеером PCM, который просто выкладывает равномерно семплы из памяти в регистр таймера?

5. Можно ли похожие способы кодирования применять для изображений?

ivagor
16.08.2023, 20:25
1. Разделяем исходный звуковой (или графический) объект на блоки, в данном примере на блоки по 8 отсчетов. В этом же самом примере 497304 отсчетов, получается 62163 блока. С помощью какого-нибудь алгоритма кластеризации (например k-means или LBG) формируем кодовую книгу желаемого размера, в примере желаемый размер - 256 векторов в кодовой книге, в каждом векторе по 8 отсчетов. Заменяем каждый блок на индекс вектора в кодовой книге. Все, мы сжали. Чем больше размер вектора, тем сильнее сжатие, но тем меньше качество.
На примере той же песенки PSNR (k-means):
вектора по 2 отcчета: 42.8 дБ
вектора по 4 отcчета: 37.2-37.3 дБ
вектора по 8 отcчетов: 33.6 дБ
2. Не буду притворятся, что хорошо помню k-means или LBG, тут отсылаю интересующихся к гуглу (можно отметить, что LBG лучше, но у меня нет быстрой реализации для матлаба).
3. Заменяем индексы на вектора (группы отсчетов) из кодовой книги.
4. Фишки вектора для данной задачи:
4.1. Сравнительно много озу для домашнего советского компа того времени
4.2. Проц более-менее шевелится
4.3. Принципиально - есть таймер, а значит можно ШИМом играть звуковые отсчеты
Отличие от плеера ИКМ минимальное - два "уровня абстракции" вместо одного. ИКМ плеер сразу берет звуковые отсчеты, а векторный берет номер вектора (индекс) из потока и потом берет звуковые отсчеты из кодовой книги.
5. Да, я пробовал для двухцветных, в принципе было не так уж плохо. parallelno пробовал для 16-цветных, можно посмотреть в его теме примеры картинок и возможно он захочет рассказать подробнее.

svofski
16.08.2023, 20:48
Спасибо, теперь кажется понятней. То есть можно сказать, что восстановленый звук весь состоит из кусочков длиной по 8 отсчетов и таких кусочков всего 256. Отсюда и берется соотношение 8:1.

А стыки между кусочками остаются просто как есть, мы надеемся, что более-менее и так должно стыковаться, потому что более-менее каждый кусочек похож? Может быть можно как-то повлиять на критерий кластеризации, чтобы минимизировать стыки? Или это надуманная проблема?

Точно, припоминаю про картинки parallelno. Надо будет посмотреть.

ivagor
16.08.2023, 21:01
А стыки между кусочками остаются просто как есть, мы надеемся, что более-менее и так должно стыковаться, потому что более-менее каждый кусочек похож? Может быть можно как-то повлиять на критерий кластеризации, чтобы минимизировать стыки? Или это надуманная проблема?
Можно было бы делать деблокинг по аналогии с MPEG сглаживая переходы между блоками, но в рамках вектора при 22 кГц времени на это совсем нет.

svofski
16.08.2023, 21:07
Можно было бы делать деблокинг по аналогии с MPEG сглаживая переходы между блоками, но в рамках вектора при 22 кГц времени на это совсем нет.

А что если этот процесс повторить при кодировании?

1. Составляем первый словарь из оригинала, кодируем
2. Восстанавливаем со сглаживанием, получаем поколение 2
3. Строим словарь второго поколения из поколения 2, кодируем
4. Делаем демо для Вектора

Таким образом может быть получится сделать предварительную компенсацию стыков?

ivagor
16.08.2023, 21:57
Умозрительно кажется, что так получится более гладко, но без проверки я не рискну утверждать что-то определенное. Сразу скажу, что сам в ближайшее время вряд ли буду пробовать, если кто-то попробует - интересно будет узнать результат.

parallelno
16.08.2023, 23:51
А что если этот процесс повторить при кодировании?

1. Составляем первый словарь из оригинала, кодируем
2. Восстанавливаем со сглаживанием, получаем поколение 2
3. Строим словарь второго поколения из поколения 2, кодируем
4. Делаем демо для Вектора

Таким образом может быть получится сделать предварительную компенсацию стыков?

Для картинок я пытался квантовать в два прохода. Сначала в книгу 512+, затем в 256. Получалось хуже чем сразу в один проход в книгу с 256 векторами. Это конечно не совсем то что ты предлагаешь, но можкт быть как-то поможет

- - - Updated - - -

Результат сжатия звука кстати классный! Спасибо за такой эксперимент. Было интересно послушать и почитать!

NEO SPECTRUMAN
17.08.2023, 18:30
из кусочков длиной по 8 отсчетов и таких кусочков всего 256. Отсюда и берется соотношение 8:1.
и именно поэтому кусочки должны описывать именно разность
а не готовые семплы
иначе маловато будет

и опять же эту разность лучше описывать в логарифмической шкале