Просмотр полной версии : Воспроизведение WAV с испльзованием ШИМ
Доделал ШИМ до состояния, когда он не свистит и не жужжит. Используется КД. Частота дискретизации воспроизводимого звукового фрагмента 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-файлы, записанные с реала, т.к. звучание эмуляторов совсем другое.
А что такое КД?
КД - квазидиск (дополнительное ОЗУ 64 или 256 Кб).
Поправил пару мелких ошибок в pwm14
1. В pwm14.asm была неправильно указана длина звукового файла (31713 вместо 32713), из за чего не проигрывались последние 40 мс.
2. Вместо pwm14_3.rom был приложен pwm14_3.sfk :)
Архив в первом посте перезалил.
Сделал вариант с воспроизведением 4-битных отсчетов, частота дискретизации 19700 Гц, свиста не слышно, шипения меньше. Можно по аналогии доделать pwm14 и там частота дискретизации будет больше 24 кГц.
в VV звук мало чем от оригинала отличается, я бы даже сказал, практически неотличается :)
Ramiros, в VV свист слышен, которого не должно быть. Также сравни спектры из VV и приложеных wavов.
Ramiros, в VV свист слышен, которого не должно быть. Также сравни спектры из VV и приложеных wavов.
Я имел ввиду на слух, т.е. соотношение полезный сигнал/шум вполне на приличном уровне.
Мне было интересно, можно ли сделать на векторе ШИМ с приемлемым числом разрядов (не менее 3) и без свиста. Это получилось, но только на реале. В VV полезный сигнал слышен, согласен, но от реала отличие есть.
К сожалению практическое применение трудно представить в виду прожорливости памяти
16 секунд, если занять весь КД и все основное ОЗУ :)
Можно воспринимать это как демонстрацию потенциальных возможностей вектора по состоянию периферии на 88 г., ну и как тест эмулятора :).
Намного практичнее использовать для проигрывания wavов AY или COVOX, но и ШИМ через бипер можно маленько усовершенствовать. В трехбитный вариант можно добавить разбор полубайтов на ходу, в итоге максимальная длительность увеличится в два раза (32 секунды).
Предыдущие версии проигрывателя 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? Не в плане увеличения времени воспроизведения, а для возможности работы в любом МДОСе. Сейчас второй КД доступен и в эмуляторе, и в железе.
что если использовать второй КД, например, на порту 011h? Не в плане увеличения времени воспроизведения, а для возможности работы в любом МДОСе.
Думал об этом. Проблема в том, что вряд ли кто-то будет проверять на реале, а из эмуляторов второй кваз поддерживает только Emu. В Emu качество шима в целом, и данного варианта в особенности, неприемлемое. Тем не менее хорошо бы сделать для возможности использования с hdd.
Увеличение громкости - это хорошо, но хочется еще и качество улучшить. В 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 можно, но не нужно.
Есть в базисе карточка Covox sample (http://tenroom.ru/scalar/ware/821/index.html) (хотя сам образ muzspace.fdd). На самом деле там только один из трех примеров играет через covox, а два других - через таймер. Кажется я много лет назад писал про это, осталось только вспомнить - где. А люди верят написанному в картотеке, например вот (https://vk.com/wall291087158_336). На самом деле там samantha играет через covox, а chipdale - через таймер. Предположу, что в этом картридже предусмотрено объединение звука от вектора и ковокса, иначе бы ошибки не произошло, т.к. было бы очевидно, что chipdale играет не через ковокс.
Сильно улучшил таймерный проигрыватель 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 и проигрывателем для одного кваза.
Хорошо. На 16 kHz Найквист уже воспринимается на ухо сопоставимо с шумами при FM приёме какой-нибудь далёкой радиоточки.
Наверное стоит сделать расширение по умолчанию - чтобы каждый раз .WAV не надо было набирать. Всяко оно единственное из распознаваемых. Можно ещё процент загрузки на экран выводить в виде числища, но это я уже капризничаю.
стоит сделать расширение по умолчанию - чтобы каждый раз .WAV не надо было набирать
В следующей версии постараюсь сделать, в принципе сразу хотел, но самому мне это не сильно мешает, а больше наверно никто не запускал до сих пор :) Вот индикатор загрузки делать не хочу.
Доработал проигрыватель (https://zx-pk.ru/threads/11403-vosproizvedenie-wav-s-isplzovaniem-shim.html?p=1167154&viewfull=1#post1167154)
В Emu80 нужно (обязательно!) проверить, что громкость не больше 5
Баг, однако. Исправил, изменения в репозитории, войдет в следующий релиз.
Есть какая-то проблема с версией для двух квазидисков. Если wavpwm2q.com v. 1.3 вроде бы нормально играл в Emu80 в конфигурации с двумя EDD, то 1.5 проигрывает только небольшой фрагмент и останавливается.
Версию 1.4 я пропустил, проверить не могу. Конфиг с двумя квазами для Emu навскидку не нашел, чтобы еще в нем проверить...
В соответствующем конфиге emu версия для двух квазов работает нормально (если не считать качества звука), но я догадываюсь, в чем проблема в emu80. Скорее всего проблема будет и на реалах с двумя квазами, сделаю более корректный вариант.
Переделал работу с двумя квазами на более корректный вариант (https://zx-pk.ru/threads/11403-vosproizvedenie-wav-s-isplzovaniem-shim.html?p=1167154&viewfull=1#post1167154). И повторилась история с поиском РУС/ЛАТ в эмуляторе, теперь для emu80. Так и не нашел, переделал на УС.
повторилась история с поиском РУС/ЛАТ в эмуляторе, теперь для emu80. Так и не нашел
На будущее: раскладку клавиатуры всегда можно подсмотреть в подсказке по Alt-F1 (или "Помощь" -> "Справка по платформе").
В данном случае это был Ins.
Справку по платформе я смотрел, но искал глазами РУС/ЛАТ, самое похожее что увидел - УС (лат), но это было не то.
УС (лат), но это было не то
Да, "то" оно только в SDL-версии эмулятора, ибо Qt-версия не различает левые и правые модификаторы в силу специфики самого Qt...
Но УС даже лучше :)
Дело было в марте 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 крут!
https://caglrc.cc/scalar/ware/936/
В онлайновом хорошо играет, пожалуй даже чуть-чуть лучше чем в Emu80. Крут вектор, не так уж много домашних советских компов того времени в своем первозданном виде потянут без купюр такую штуку. Кроме вектора разве что корвет. Для апогея, Б2м и экзотических специалистов с таймерами пришлось бы снизить частоту дискретизации.
ivagor, к сожалению ты редко делишься секретами, поэтому мало кто узнает как и чем именно крут Вектор. Так со стороны для обывателя в том, что компьютер сыграл песенку, в наше время большого повода для восторга нет. Даже люди в принципе любопытные и интересующиеся техникой, но поколения помоложе, не могут этого оценить без объяснений. Вот бы ты рассказал поподробней, с картинками и все такое.
В данном случае я постарался описать с цифрами, что фишка в соотношении качества и размера. Если кто-то скажет, что подобное качество при 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
В данном случае я постарался описать с цифрами, что фишка в соотношении качества и размера. Если кто-то скажет, что подобное качество при 1 бите/отсчет в сжатом потоке - это ерунда, то я только пожму плечами, для советских домашних компов конца 80-х (причем без каких-либо дополнительных устройств) я ничего подобного не видел.
Цифры это хорошо, но все же, что такое векторное кодирование и как именно оно тут пригодилось -- объяснить простыми словами было бы очень интересно. Я например тогда как-то даже участвовал в процессе, хотя ты мою роль сильно преувеличил, но вот сейчас вспомнить что там за векторы и ка-минсы были так просто уже не могу.
Пересказывать учебники мне совсем не хочется, все околопрограммисты надеюсь знакомы с векторным квантованием/кодированием, или при желании могут загуглить.
Конкретно в данном примере:
1. Кодовая книга на 256 векторов
2. Каждый вектор по 8 отсчетов
3. Отсчеты по 8 бит или 256 уровней, но перед воспроизведением сплющиваются до 192 уровней, иначе в векторовский таймер при данной частоте дискретизации не влезает.
Немного смешной момент - затрудняюсь сказать, каким алгоритмом здесь сформирована кодовая книга, k-means или LBG.
Есть цифры PSNR
k-means 33.6 дБ
LBG 33.9 дБ
k-means матлаб умеет сам считать, поэтому побыстрее, а LBG считал пользовательской функцией - страшно медленно.
- - - Добавлено - - -
Забыл написать - здесь в кодовой книге звуковые отсчеты, а у идейного вдохновителя с C64 были разности, насколько помню.
В том и есть весь интерес, чтобы получить не пересказ учебника, а посмотреть как на практике учебник превращается в практическую пользу. Давай я попробую задавать вопросы, может быть так проще будет влезть в мои тапки как условного наблюдателя со стороны. Я геймер, родился в 2003, у моего папы был какой-то денди, который играл наверное видеокассеты. Зашел на фестиваль, а тут ламповый компьютер играет песни из бабушкиного патефона. Мне стало любопытно, но ничего не понятно, где тут вообще джаваскрипт.
Итак мы хотели проиграть в хорошем качестве песенку на Векторе-06ц без расширения памяти. Но песенка не влезает, поэтому пришлось придумать алгоритм, который позволяет сжать звук в 8 раз. Тут понятно.
1. Можно без пересказа учебника, хотя я не вижу вреда в кратком тезисном изложении принципов, но -- что же это за векторное кодирование и почему оно позволяет ужать в 8 раз, а другое (какое другое, например) не позволяет? что происходит, когда мы берем обычный PCM звук и пропускаем его через такое кодирование?
2. Что такое k-means, LBG? Наверное это алгоритмы, реализующие векторное квантование. Что именно они квантуют и что получается на их выходе? Как это помогает получить компактное представление звука?
3. Как из того, что получилось, получить обратно собственно звук?
4. Почему Вектор имеет какое-то преимущество перед другими компами. Что плееру этого кодека приходится делать по сравнению с более примитивным плеером PCM, который просто выкладывает равномерно семплы из памяти в регистр таймера?
5. Можно ли похожие способы кодирования применять для изображений?
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-цветных, можно посмотреть в его теме примеры картинок и возможно он захочет рассказать подробнее.
Спасибо, теперь кажется понятней. То есть можно сказать, что восстановленый звук весь состоит из кусочков длиной по 8 отсчетов и таких кусочков всего 256. Отсюда и берется соотношение 8:1.
А стыки между кусочками остаются просто как есть, мы надеемся, что более-менее и так должно стыковаться, потому что более-менее каждый кусочек похож? Может быть можно как-то повлиять на критерий кластеризации, чтобы минимизировать стыки? Или это надуманная проблема?
Точно, припоминаю про картинки parallelno. Надо будет посмотреть.
А стыки между кусочками остаются просто как есть, мы надеемся, что более-менее и так должно стыковаться, потому что более-менее каждый кусочек похож? Может быть можно как-то повлиять на критерий кластеризации, чтобы минимизировать стыки? Или это надуманная проблема?
Можно было бы делать деблокинг по аналогии с MPEG сглаживая переходы между блоками, но в рамках вектора при 22 кГц времени на это совсем нет.
Можно было бы делать деблокинг по аналогии с MPEG сглаживая переходы между блоками, но в рамках вектора при 22 кГц времени на это совсем нет.
А что если этот процесс повторить при кодировании?
1. Составляем первый словарь из оригинала, кодируем
2. Восстанавливаем со сглаживанием, получаем поколение 2
3. Строим словарь второго поколения из поколения 2, кодируем
4. Делаем демо для Вектора
Таким образом может быть получится сделать предварительную компенсацию стыков?
Умозрительно кажется, что так получится более гладко, но без проверки я не рискну утверждать что-то определенное. Сразу скажу, что сам в ближайшее время вряд ли буду пробовать, если кто-то попробует - интересно будет узнать результат.
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.
и именно поэтому кусочки должны описывать именно разность
а не готовые семплы
иначе маловато будет
и опять же эту разность лучше описывать в логарифмической шкале
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot