Вход

Просмотр полной версии : Нужны звуковые эффекты из Batty побитно



Руслан
21.08.2023, 13:06
Привет, подскажите пожалуйста как из бетти можно вытянуть звуковые эффекты? Хочу их использовать в ардуинке в своём проекте.

CityAceE
21.08.2023, 15:46
Исходники Batty доступны (https://github.com/CityAceE/Batty). Используя их можно перенаправить вывод звука куда угодно.

Руслан
21.08.2023, 16:14
Спасибо! Я то по наивности думал что там побитная таблица в игре просто. Щас вижу что там целая процедура. Тогда получается мне вместо бипера записывать данные в память? ; Used by the routines at play_sound_LC122, play_sound_choose_ctrl and play_sound_choose_letter.
sound_beep2:
LD A,$10
OUT ($FE),A
sound_beep2_0:
DJNZ sound_beep2_0
XOR A
OUT ($FE),A
LD B,D
sound_beep2_1:
DJNZ sound_beep2_1
RET

CityAceE
21.08.2023, 16:17
Тогда получается мне вместо бипера записывать данные в память?
Ну я бы начал именно с этого.

Barmaley_m
05.01.2024, 22:33
Спасибо! Я то по наивности думал что там побитная таблица в игре просто. Щас вижу что там целая процедура. Тогда получается мне вместо бипера записывать данные в память?
Не все так просто. Там надо для каждой команды, которая исполняется в процедуре, посчитать количество тактов. Если это команда условного перехода или DJNZ - то надо рассмотреть оба варианта по тактам, когда переход исполняется и когда он не исполняется. Тактовая частота процессора известна - 3,5МГц. Анализ процедуры генерации звука позволит выяснить задержки между переключениями сигнала на бипере. Если требуется повторить такой звук на Ардуино без ЦАП - то нужно более или менее точно выдержать эти задержки и сгенерировать такой же сигнал на выходе звука. Если же имеется аудио-ЦАП - то есть вариант 2. Сгенерировать в памяти компьютера такой же сигнал, как это делает процедура на Спектруме. Потом подвергнуть этот сигнал ФНЧ-фильтру, ограничив полосу пропускания до 20кГц или ниже (по желанию). После фильтрации частоту дискретизации сигнала (исходно 3,5МГц) можно будет снизить до примерно 44кГц путем выбрасывания лишних данных - это не приведет к потере качества благодаря теореме Котельникова. Отфильтрованный сигнал после передискретизации записать в память и воспроизводить. Но тут, скорее всего, потребуется много памяти.

В общем, задача непростая, но интересная!

Кря Кря
06.01.2024, 03:40
Можно просто в эмулятор добавить лог записи в порт fe + текущий эмулируемый такт и потом уже что душе угодно делать, к примеру скриптом создать битовый массив, ну либо сохранить wave, в каком то музыкальном редакторе передескритезировать на нужную частоту

Dexus
07.01.2024, 10:20
А просто записать с эмулятора wav и его скармливать ардуине не спортивно?

Barmaley_m
21.09.2024, 11:32
А просто записать с эмулятора wav и его скармливать ардуине не спортивно?
Зависит от качества обработки сигнала эмулятором. Есть ли там для бипера правильный ФНЧ или нет.

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

rst
21.09.2024, 11:57
Зависит от качества обработки сигнала эмулятором. Есть ли там для бипера правильный ФНЧ или нет.Почему думаете, что ФНЧ обязан быть? Мой эмулятор сейчас работает вообще без ФНЧ. И почти от всех программ звук получается нормальный.

ivagor
21.09.2024, 12:09
Есть такой раздел знаний - Цифровая обработка сигналов. Согласно ей ФНЧ в эмуляторе в звуковом тракте нужен. Примеры того, что получается, когда ФНЧ нет или, чаще, когда его параметры не соответствуют решаемой задаче, к сожалению все еще можно слышать в эмуляторах, хотя со временем ситуация становится лучше.

rst
21.09.2024, 13:27
Есть такой раздел знаний - Цифровая обработка сигналов. Согласно ей ФНЧ в эмуляторе в звуковом тракте нужен.Какое отношение имеет ЦОС к вопросу нужности ФНЧ в эмуляторе - вообще не понял...
Вопрос был про ФНЧ именно в самом эмуляторе. Так как ФНЧ в звуковом тракте хозяйской системы (Win) естественно и так имеется. Зачем ещё?

Примеры того, что получается, когда ФНЧ нет или, чаще, когда его параметры не соответствуют решаемой задаче, к сожалению все еще можно слышать в эмуляторах, хотя со временем ситуация становится лучше.Пример я слышу в своём эмуляторе - качество звука (субъективно) аналогично тому, что было в железном "Вектор-06Ц". Там ФНЧ можно считать, что тоже практически нет.

И судя по тестам разных программ, у меня складывается ощущение, что в эмуляторе нужен ФВЧ, а не ФНЧ. Вот про это было бы интересно узнать - реализуют ли ФВЧ в своих эмуляторах авторы? Такое ощущение, что реализуют.

ivagor
21.09.2024, 14:34
Частота дискретизации звука, который способен сгенерировать бипер в спектруме или векторе, в разы больше частоты дискретизации звука, с которой работает операционная система. Значит эмулятор должен делать децимацию и использовать при этом ФНЧ.

rst
21.09.2024, 15:15
Частота дискретизации звука, который способен сгенерировать бипер в спектруме или векторе, в разы больше частоты дискретизации звука, с которой работает операционная система. Значит эмулятор должен делать децимацию и использовать при этом ФНЧ.Это не так. Путаете тёплое с мягким. Децимация тут не нужна. Достаточно сделать передискретизацию (ресэмплинг) на частоту аудио-потока хозяйской ОС. Что и делает мой эмулятор.
Передискретизацию можно делать разными алгоритмами. Мой эмулятор использует простейшую - кусочно-линейной интерполяцией. Думаю - этого вполне достаточно для эмулятора.

А вставка сэмплов->ФНЧ->децимация - это тупое в лоб ("классическое") решение передискретизации. Которое практически применимо только если исходная частота и целевая частота - имеют примерно похожее разложение на простые сомножители. Что на практике редко бывает.

PS: Вобщем - ФНЧ в эмуляторе не нужен. Возможно нужен ФВЧ. А также (возможно) - нужна плавная подстройка коэффициента передискретизации.

ivagor
21.09.2024, 16:11
Путаете тёплое с мягким. Децимация тут не нужна. Достаточно сделать передискретизацию (ресэмплинг) на частоту аудио-потока хозяйской ОС. Что и делает мой эмулятор.
Смешно, спасибо за юмор.

кусочно-линейной интерполяцией
Здесь и "спрятан" ФНЧ.

Dexus
24.09.2024, 08:41
Зависит от качества обработки сигнала эмулятором. Есть ли там для бипера правильный ФНЧ или нет.

А звуковом редакторе нельзя обработать звуки? и сделать их более приятными и мягкими?
Вообще это из раздела "овчинка выделки не стоит", и вот все эти сломанные копья не нужны.

Barmaley_m
08.12.2024, 03:32
А звуковом редакторе нельзя обработать звуки? и сделать их более приятными и мягкими?
Если эмулятор неправильный (без ФНЧ) - то нельзя. При отсутствии в эмуляторе ФНЧ его выходной аудиосигнал имеет специфические нелинейные искажения, известные под названием "Aliasing (https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B8%D0%B0%D1%81%D0%B8%D0%BD%D0%B3)". Эти искажения необратимые, их устранить в звуковом редакторе или другим способом, в общем случае, невозможно.

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


Какое отношение имеет ЦОС к вопросу нужности ФНЧ в эмуляторе - вообще не понял...
Самое прямое. ЦОС отвечает на вопросы, что такое фильтр, зачем он нужен, и что происходит, если его не использовать, либо его параметры неподходящие.

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

Вопрос был про ФНЧ именно в самом эмуляторе.
Да, именно в эмуляторе. Я и Ivagor говорили об одном и том же. В эмуляторе. Нужен. Фильтр. Обязательно.

Так как ФНЧ в звуковом тракте хозяйской системы (Win) естественно и так имеется. Зачем ещё?
Затем, что частота дискретизации исходного сигнала (состояния порта #FE) - 3,5МГц. Это во много раз выше частоты дискретизации выходного сигнала (44100 или 48000Гц на звуковой карте).

Что будет, если при таком уменьшении частоты дискретизации не применять ФНЧ? Варианта 2.
1) Если в исходном сигнале были частоты выше 22050 или 24000Гц - то будет алиасинг (https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B8%D0%B0%D1%81%D0%B8%D0%BD%D0%B3).
2) Если в исходном сигнале высоких частот не было - то ничего не будет.

Есть ли в сигнале бипера частоты выше 22050 или 24000Гц? Конечно есть. Простой пример - вычисли преобразование Фурье от прямоугольного сигнала на какой-нибудь звуковой частоте типа 440Гц. Количество гармоник будет бесконечным, так что и частоты выше 22050Гц будут. В дискретном случае, с дискретизацией на 3,5МГц, гармоники будут вплоть до 1,75 МГц.

Что нужно сделать, чтобы в сигнале таких частот не было? Правильно, ФНЧ.

ФНЧ надо применять до того, как звук будет преобразован к частоте дискретизации операционной системы. После - уже поздно. Поэтому то, что в ОС и где-то там еще есть фильтры - это не значит, что тебе свой фильтр делать не надо.

Пример я слышу в своём эмуляторе - качество звука (субъективно) аналогично тому, что было в железном "Вектор-06Ц". Там ФНЧ можно считать, что тоже практически нет.
Ключевые слова - "Субъективно" и "практически". Ты наверняка не измерял уровень искажений, а на слух не научился еще, к чему надо прислушиваться. А измерения провести просто.
1) Выполняешь команду "BEEP" в бейсике, генерируя какой-нибудь музыкальный звук. Эта команда должна генерировать чистые прямоугольные сигналы нужной частоты.
2) Сохраняешь звуковой файл из эмулятора
3) Открываешь его в звуковом редакторе
4) Смотришь спектральный анализ. Видишь спектральные пики не только на базовой частоте звука и ее гармониках, а еще и кучу лишних пиков где попало. Это и есть алиасинг.

Если сделать в эмуляторе нормальный ФНЧ и повторить эксперимент - то спектральные пики будут только на базовой частоте звука и ее гармониках. На слух звук будет при этом чистым и звонким. Но я понимаю, для неопытного уха может быть непонятно, на какие аспекты звука надо обращать внимание.

На железном же компьютере выходной сигнал аналоговый. В нем присутствуют, в том числе, ультразвуковые частоты вплоть до нескольких мегагерц. Но ты их не слышишь. А те, что слышишь (аудиочастоты) - они чистые и не содержат посторонних спектральных линий. Если, конечно, усилитель и колонки не совсем ужасные.

Вот про это было бы интересно узнать - реализуют ли ФВЧ в своих эмуляторах авторы? Такое ощущение, что реализуют.
Реализуют. ФВЧ тоже нужен. Но не так критично. Он нужен для удаления из сигнала постоянной составляющей и оптимального использования динамического диапазона выходного сигнала. ФВЧ первого порядка вполне достаточно. И этот ФВЧ может работать на последнем этапе обработки сигнала, уже на частоте дискретизации звуковой карты.

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


Децимация тут не нужна. Достаточно сделать передискретизацию (ресэмплинг) на частоту аудио-потока хозяйской ОС. Что и делает мой эмулятор.
Децимация - это частный случай передискретизации. Я думаю, автор имел здесь в виду то, что децимация также подразумевает использование соответствующего ФНЧ. Для высококачественной передискретизации (более общий случай) ФНЧ тоже, конечно, нужен.

Передискретизацию можно делать разными алгоритмами. Мой эмулятор использует простейшую - кусочно-линейной интерполяцией.
Кусочно-линейная интерполяция, если ее рассмотреть с точки зрения ЦОС, неявно применяет ФНЧ. Но это плохой ФНЧ, который недостаточно подавляет высокие частоты. Как следствие - алиасигнга становится меньше, чем если совсем без фильтра. Но все же он остается, и достаточно много. Качество звука все равно плохое.

Думаю - этого вполне достаточно для эмулятора.
Нет, недостаточно. С хорошим фильтром можно получить значительно лучшее качество звука, и разница будет явно ощутима на слух.

А вставка сэмплов->ФНЧ->децимация - это тупое в лоб ("классическое") решение передискретизации. Которое практически применимо только если исходная частота и целевая частота - имеют примерно похожее разложение на простые сомножители. Что на практике редко бывает.

Передискретизация и ФНЧ бывают разные. В том числе есть решения, комбинирующие ФНЧ и более сложную, чем кусочно-линейную, интерполяцию. Таким образом можно с высоким качеством передискретизировать сигналы с произвольным (в том числе иррациональным) соотношением исходной и целевой частот дискретизации. Рекомендую почитать следующую статью: Polynomial Interpolators for High-Quality Resampling of Oversampled Audio (https://yehar.com/blog/wp-content/uploads/2009/08/deip.pdf). Без соответствующей теоретической подготовки, может, и не все поймешь, но попробуй хотя бы реализовать оттуда пару-тройку алгоритмов.

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

При теоретическом рассмотрении, в конечном счете, любая передискретизация может быть сведена к вставке нулей, потом ФНЧ, а потом выбрасыванию ненужных сэмплов. И именно так и следует теоретически рассматривать весь процесс. Но "в лоб" это делают редко, потому что слишком высокие вычислительные затраты. Как на расчет коэффициентов фильтра, так и на последующую фильтрацию.

Есть множество способов оптимизировать реализацию фильтра и всего процесса после того, как выполнены теоретические расчеты. Применяются неявные фильтры (как в случае кусочно-линейной или полиномиальной интерполяции), интерполяция коэффициентов фильтра (структуры фильтров Фарроу), полифазное разложение. Можно воспользоваться кусочным постоянством фильтруемого сигнала (я это впервые в эмуляторном мире реализовал в 2002г). Можно рассматривать фильтрацию в непрерывном времени (хотя расчеты ведутся, казалось бы, для дискретного времени). После оптимизации алгоритмы перестают быть внешне похожими на какую-либо фильтрацию, особенно для несведущего. Но делают они именно ее. И делают эффективно.

ZXMAK
08.12.2024, 08:54
А звуковом редакторе нельзя обработать звуки? и сделать их более приятными и мягкими?

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

А вот если вначале сделать децимацию скажем до 48 кГц, то при этой операции происходит безвозвратная потеря информации об исходном сигнале на частоте дискретизации 3.5 МГц и после этого уже восстановить её будет невозможно.

Если перед децимацией не был применен хороший ФНЧ, то применять его после децимации будет уже бесполезно. Это связано с тем, что при децимации частоты выше границы Найквиста заворачиваются гармошкой в новую полосу Fs/2, где Fs - это новая частота дискретизации. Т.е. ВЧ компоненты, которые были не слышны на исходной частоте дискретизации, после децимации будут размазаны по слышимой полосе.Вот эти завернутые ВЧ компоненты и называются алиасами.

Именно поэтому и нужен хороший ФНЧ перед децимацией - чтобы вырезать из сигнала все частоты выше новой Fs/2, тогда при сворачивании частот по полезному сигналу не будут размазаны те компоненты, которые перед децимацией были на высоких частотах которые не слышны.

goodboy
08.12.2024, 13:06
вспомнилось, что если эмуль поддерживает имитацию выгрузки на ленту (на слух звучит вполне похоже)
это совсем не означает возможность загрузить эти данные в реальный спек.
хотя например в SpecEmu можно включить RealTapeMode (успешная передача данных)

Titus
08.12.2024, 13:15
вспомнилось, что если эмуль поддерживает имитацию выгрузки на ленту (на слух звучит вполне похоже)
это совсем не означает возможность загрузить эти данные в реальный спек.
Ты имеешь в виду, что эмуль может применить БИХ-фильтр, который крутит фазой, портя таким образом сигнал?
Да, на слух это будет неотличимо скорее всего от неиспорченной записи.

Dexus
09.12.2024, 15:54
Barmaley_m,
> При отсутствии в эмуляторе ФНЧ его выходной аудиосигнал имеет специфические нелинейные искажения, известные под названием "Aliasing".

Это разве что в плохом эмуляторе не будет никакого ФНЧ. В том же старом добром Unreal он вполне приличный (свертка по х64 оверсемплинга)

Barmaley_m
15.12.2024, 15:18
Это разве что в плохом эмуляторе не будет никакого ФНЧ. В том же старом добром Unreal он вполне приличный (свертка по х64 оверсемплинга)
Тогда к чему твой вопрос? Если эмулятор хороший - то его аудиосигнал будет чистым и не будет нуждаться в обработке звуковым редактором. Если эмулятор плохой - то аудиосигнал будет необратимо искаженным, и обрабатывать его в звуковом редакторе будет бесполезно.

В обоих случаях звуковой редактор не нужен.

Звуковой редактор может пригодиться для монтажа звука или наложения спецэффектов. А улучшить с его помощью исходно плохое качество звука невозможно.

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


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

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

ZXMAK
15.12.2024, 15:31
Если эмулятор хороший - то его аудиосигнал будет чистым и не будет нуждаться в обработке звуковым редактором. Если эмулятор плохой - то аудиосигнал будет необратимо искаженным, и обрабатывать его в звуковом редакторе будет бесполезно.

В обоих случаях звуковой редактор не нужен.

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

Ваше утверждение будет почти справедливым, если запись сделана после децимации. Дело в том, что фильтр нужно применять до децимации. Поэтому если децимация сделана в эмуляторе, то и фильтр будет применен тот, что в эмуляторе. После этого уже ничего не сделаешь. В эмуляторе не может быть высококачественного фильтра, т.к. эмуляторы заточены на скоростную обработку в реальном времени. Применять тяжеловесные высококачественные фильтры в эмуляторе нет возможности.


Если в звуковом редакторе можно сделать лучше, чем делает эмулятор - то это значит, что эмулятор нуждается в улучшении обработки сигнала.

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

Конечно можно, только с высококачественным фильтром эмулятор будет так тормозить, что в лучшем случае 1-2 фпс будет. А в аудиоредакторе такой-же высококачественный фильтр наложить не проблема, т.к. там не нужна скорость эмуляции.


Чтобы было понятней, можно сравнить процесс с сохранением видеофайла. Если программа сохраняет файл со сжатием с потерями, то такое сжатие добавляет артефакты в изображение. Поэтому восстановить исходное изображение и перекодировтаь более качественно уже не получится - информация потеряна. Однако если программа сохраняет видео в формате без потерь, то вы всегда можете перепаковать в видеоредакторе видео гораздо более качественее, чем это можно сделать при записи видеофайла из программы в реальном времени.

Также точно и со звуком. Децимация - это по сути сжатие с потерями.

Barmaley_m
15.12.2024, 17:22
...гораздо более качественные фильтры и более сложную обработку, чем это возможно в эмуляторе, где важна скорость эмуляции.
В эмуляторе не может быть высококачественного фильтра, т.к. эмуляторы заточены на скоростную обработку в реальном времени. Применять тяжеловесные высококачественные фильтры в эмуляторе нет возможности.
Думаю, что есть. Я делал в 2002г эмулятор звука Atari800 - проект "mzpokeysnd". Не знаю, что осталось от моего кода в текущей версии эмулятора, но на тот момент это был прорыв, т.к. ранее использовалась лишь линейная интерполяция.

Переходная полоса ФНЧ была от 17000 до 22050 Гц, отклонение в полосе пропускания не более 1% (0.07дБ), подавление в полосе подавления сейчас точно уже не помню, но не менее 80дБ. И это все работало на том Pentium III, где я это все налаживал, без большого напряжения вычислительных ресурсов. Работало у многих людей и на вторых пентиумах. На первом пентиуме 133МГц тормозило, но 8кГц моно еще вытягивало. При этом общая частота дискретизации была в районе 1,7 МГц, 4 AY-подобных канала.

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

Думаю, что для современных компьютеров не представляет проблемы такая эмуляция бипера и AY в реальном времени, чтобы выходной сигнал на частоте дискретизации 44100 или 48000Гц был полностью свободен от заметных (объективными измерениями, а не только на слух) искажений Aliasing. Могу конкретно помочь с твоим эмулятором. Исходники вроде есть в открытом доступе. Могу посмотреть на новогодних каникулах и (если увижу возможность улучшения) помочь.

ZXMAK
15.12.2024, 18:23
Думаю, что есть. Я делал в 2002г эмулятор звука Atari800 - проект "mzpokeysnd". Не знаю, что осталось от моего кода в текущей версии эмулятора, но на тот момент это был прорыв, т.к. ранее использовалась лишь линейная интерполяция.

Переходная полоса ФНЧ была от 17000 до 22050 Гц, отклонение в полосе пропускания не более 1% (0.07дБ), подавление в полосе подавления сейчас точно уже не помню, но не менее 80дБ. И это все работало на том Pentium III

Это зависит от того, что вы понимаете под "качественным фильтром".

Для сравнения вот хороший FIR ФНЧ фильтр с указанными вами параметрами (17000-22050, 80 дБ), длина фильтра 3476 тапов:
https://i.imgur.com/1vTD8n4.png

А вот более качественный на (20000-21000, 200 дБ), длина фильтра 46807 тапов:
https://i.imgur.com/IaM342c.png

Первый и так тяжеловесный для эмулятора, но второй требует в десять раз большую производительность. А добавить сюда еще ФВЧ... Для обработки в аудиоредакторе это не имеет значения, а вот для эмулятора критично, т.к. он не может отдавать всю мощность процессора только на фильтр для звука, нужно еще выполнять основную задачу...

Barmaley_m
16.12.2024, 22:39
Первый и так тяжеловесный для эмулятора, но второй требует в десять раз большую производительность. А добавить сюда еще ФВЧ...
Такие фильтры "в лоб", прямым методом считать, к счастью, не нужно. Даже порядок фильтра имеет мало значения, если реализация использует соответствующие трюки. Я выше упоминал "использование кусочного постоянства входного сигнала", который применил для Atari. Есть и другие. Можно даже без умножения сделать фильтр с весьма впечатляющими характеристиками. В общем, погоди немного, я гляну в твой эмулятор, что там можно сделать, и приду с конкретными предложениями.

С ФВЧ вообще легко, он работает на выходной частоте (44100Гц), рекурсивный фильтр первого порядка. Можно реализовать без умножения, только с битовыми сдвигами.

И еще, я считаю, что 200дБ подавление и переходная полоса 20000-21000Гц - это перебор. -200дБ лежит гораздо ниже разрешающей способности 16-битного сигнала - поэтому искажения Aliasing будут много меньше погрешности квантования. Также и подавление с 21000Гц вместо 22050 - это излишне. До 22050 мы имеем полное право оставить сигналы, тем более, что они там частично подавлены. 20000 полосу пропускания можно оставить, хотя это только для юных слушателей. В 18 лет я такое слышал, а сейчас - уши уже не те.

Для практической разработки, думаю, надо задаться разумными требованиями, а не такими, которые и проверить-то не на чем будет, ибо нету таких усилителей, наушников или колонок, доступных для простого смертного. И ушей таких тоже почти ни у кого нет. А вот разумные требования стандартов Hi-Fi или даже Hi-End в эмуляторе реализовать без чрезмерной нагрузки на проц будет вполне возможно.

Titus
17.12.2024, 00:11
С ФВЧ вообще легко, он работает на выходной частоте (44100Гц), рекурсивный фильтр первого порядка. Можно реализовать без умножения, только с битовыми сдвигами.
На современных процессорах цена умножения и сдвига практически сравнялась, поэтому нет смысла оперировать сдвигами особо.

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


И еще, я считаю, что 200дБ подавление
Да и 100Дб это несколько перебор.
Тем более, что гармоники того же меандра хоть и распространяются на весь спектр, но являются затухающей последовательностью, да и сами по себе слабее порождающего их сигнала.

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

Кроме того, чем выше порядок фильтра (а крутые характеристики это всегда большой порядок), тем больше запаздывание выходного сигнала относительно оригинала.

Barmaley_m
17.12.2024, 02:18
На современных процессорах цена умножения и сдвига практически сравнялась, поэтому нет смысла оперировать сдвигами особо.
Это так. Но не всегда фильтры реализуются на PC-процессорах. Иногда нужно их реализовать на микроконтроллере без умножителя, на дискретной схеме или на FPGA. В любом случае возможность реализации без умножителя достойна упоминания. Например, если взять ARM-процессор - несмотря на наличие умножителя, ФНЧ первого порядка, который является составной частью ФВЧ, можно реализовать всего одной ассемблерной командой вида:

sub r0, r0, r0 asr 9

А с умножением будет больше команд - загрузить в регистр коэффициент фильтра, перемножить, сложить.

Да и 100Дб это несколько перебор.
Тем более, что гармоники того же меандра хоть и распространяются на весь спектр, но являются затухающей последовательностью, да и сами по себе слабее порождающего их сигнала.

Кроме того, чем выше порядок фильтра (а крутые характеристики это всегда большой порядок), тем больше запаздывание выходного сигнала относительно оригинала.
Согласен со всем вышесказанным. При таком конструктивном настрое обязательно получится хороший результат!

Barmaley_m
25.12.2024, 00:58
Это зависит от того, что вы понимаете под "качественным фильтром"
Привет. Я тебе в личку написал по звуку для эмулятора. Можешь ответить?

Barmaley_m
26.12.2024, 00:02
Я завершил анализ системы передискретизации, применяемой в эмуляторе ZXMAK. В комментариях написано, что она позаимствована из UnrealSpeccy - если так, то и синтез звука UnrealSpeccy должен иметь те же достоинства и недостатки.

Код передискретизации находится в файле SoundDeviceBase.cs. Реализуемый алгоритм передискретизации (с точки зрения ЦОС) таков:

1) Сначала происходит интерполяция методом удержания (Hold Interpolation (https://ru.wikipedia.org/wiki/%D0%AD%D0%BA%D1%81%D1%82%D1%80%D0%B0%D0%BF%D0%BE%D 0%BB%D1%8F%D1%82%D0%BE%D1%80_%D0%BD%D1%83%D0%BB%D0 %B5%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1% 8F%D0%B4%D0%BA%D0%B0)) с исходной частоты дискретизации (равной тактовой частоте Z80) на промежуточную частоту, которая в 64 раза выше выходной. Если выходная 44100Гц - то промежуточная частота будет около 2,82МГц. Это делается в строках 313 и 323 SoundDeviceBase.cs

2) Затем применяется ФНЧ, FIR-фильтр 127 порядка (128 коэффициентов). Прилагаю графики его АЧХ. Общий вид, область перехода между пропусканием и подавлением, и отдельно полоса пропускания. Фильтр реализован, главным образом, в функции FlushFrame().

3) После фильтра частота дискретизации уменьшается в 64 раза, т.е. приводится к стандартной частоте звуковой карты. Это также происходит в функции FlushFrame().

Применяются некоторые трюки. Автор кода воспользовался кусочным постоянством входных сигналов для оптимизации. В буферах хранятся не сами сигналы, а только их фронты. Поэтому и происходит вычисление частичных сумм коэффициентов фильтра в конструкторе SoundDeviceBase().

Что за тип фильтра применяется - не могу точно сказать. Если вывести график его коэффициентов - то получится что-то похожее на приподнятый косинус или обрезанную функцию Гаусса. Можно выяснить точно с помощью методов нелинейной аппроксимации, но в этом может быть разве что исторический интерес.

Теперь по поводу возможностей улучшения:
1) Интерполяция методом удержания до фильтра - существенный источник алиасинга. Если применить ее не до, а после фильтра - то уже искажений станет меньше. А если применить вместо неё интерполяцию многочленом или структурой фильтра Фарроу - то станет намного лучше.

2) Можно пересчитать и оптимизировать коэффициенты фильтра даже без повышения его порядка. Фактически, сейчас фильтр имеет частоту среза по уровню -3дБ около 15кГц. Его переходная полоса идет от 15 до примерно 50кГц. Подавление в полосе подавления - около 46дБ. Остаточные сигналы от 22050 до 50кГц отражаются в слышимую область в виде алиасинга.

Фильтр можно существенно улучшить без или с незначительным повышением вычислительных затрат на его работу.

Я готов все это сделать, но C# - не мой язык программирования. Я бы написал алгоритмы объектно-ориентированно на Си

ZXMAK: ты мог бы потом перевести их на C# или вызывать через интерфейс на Си, и встроить потом в свой эмулятор?

ZXMAK
26.12.2024, 18:22
Я бы написал алгоритмы объектно-ориентированно на Си

ZXMAK: ты мог бы потом перевести их на C# или вызывать через интерфейс на Си, и встроить потом в свой эмулятор?

не вопрос, главное, чтобы новый вариант не сильно больше процессора кушал :)

Я недавно, когда смотрел код AY, пробовал улучшить фильтр в octave, но без значительного увеличения порядка не получилось. Или сильный завал на ВЧ, или нужно сильно порядок фильтра увеличивать.

Titus
08.01.2025, 13:53
не вопрос, главное, чтобы новый вариант не сильно больше процессора кушал
Используй вычислительные шейдеры GPU. Как раз под фильтр хорошо подходят.
Хотя, ты опять будешь говорить, что это не кроссплатформенно)

^m00h^
08.01.2025, 14:43
Надо чтобы везде работало, в Linux, macos, haiku os без всяких хипстерских шейдеров..

Titus
08.01.2025, 16:23
Надо чтобы везде работало, в Linux, macos, haiku os без всяких хипстерских шейдеров..

Мне не надо. У меня один комп PC. Думаю, что и у 90% тоже PC с Виндой.
Если писать под кроссплатформенность, то лишаешься И скорости отклика, и качественной синхронной эмуляции.
Универсальность ухудшает качество используемого ресурса.

^m00h^
09.01.2025, 14:53
Но не у всех PC и винда, мир многомерен, и на других платформах также можно отстроить качество отклика и качественную синхронную эмуляцию.

ZXMAK
07.02.2025, 06:41
Я готов все это сделать, но C# - не мой язык программирования. Я бы написал алгоритмы объектно-ориентированно на Си

ZXMAK: ты мог бы потом перевести их на C# или вызывать через интерфейс на Си, и встроить потом в свой эмулятор?

Как там дела? есть какие-то результаты? Получилось чтото?

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