Бытовой ретро-компьютер своими руками
http://forum.pk-fpga.ru/

Эмулятор БК-0010-01, БК-0011 и БК-0011М
http://forum.pk-fpga.ru/viewtopic.php?f=45&t=5441
Страница 2 из 6

Автор:  peg [ 29 мар 2016, 11:14 ]
Заголовок сообщения:  Re: Эмулятор БК-0010-01, БК-0011 и БК-0011М

gid писал(а):
Беда в том, что там не совсем ШИМ. Там перед конденсатором прямоугольные импульсы переменной скважности, переменной частоты и разной амплитуды, для БК10 - 4 уровня, для БК11 - 8. А после конденсатора - примерно синусоида, амплитуда которой зависит как от скважности импульсов, так и от их амплитуды. Я пробовал эмулировать поведение конденсатора - заряд/разряд, но что-то вообще фигня получается.

Подождите. ШИМ - это один бит. А если 4-8 уровней - какой же это шим?
А где это у нас в БКашках 8 уровней? Почему я не знаю?
Вы covox имеете в виду?

Вообще-то, в БК0010 выход на магнитофон двухбитный (4 уровня). Но почему-то я не встречал ни у кого никаких упоминаний об этом.

Ну так и интегрируйте 8 уровней. Принципиальной разницы нет.
Выбирайте нулевой уровень посередине (напишу для 8 уровней).
Тогда имеем 4 скорости роста амплитуды и 4 скорости спада. Скорости пропорциональны величине ступенек.
При постоянном входном ненулевом сигнале амплитуда будет расти бесконечно. Просто ограничиваем ее определеным максимальным значением (положительным и отрицательным).
Максимальная скорость роста/спада одновременно задает максимальную частоту, для которой возможна максимальная выходная амплитуда. Далее начинается спад, обратно пропорциональный частоте (как фильтр первого порядка).

Автор:  peg [ 29 мар 2016, 11:28 ]
Заголовок сообщения:  Re: Эмулятор БК-0010-01, БК-0011 и БК-0011М

gid писал(а):
Со статической линковкой были некоторые проблемы, которые уже решены, я тут тоже об ней задумался, обновлённый билд будет выложен когда-нибудь потом.

Можно тогда все DLL-ки положить в архив с эмулятором. ;)

Автор:  peg [ 01 апр 2016, 11:24 ]
Заголовок сообщения:  Re: Эмулятор БК-0010-01, БК-0011 и БК-0011М

В окне отладки эмулятора, когда курсор активный, он становится темно-синим. Текста на курсоре я не разбираю (все закрашено курсором). Чтобы посмотреть, что там под курсором, надо его убрать! %(
Можно ли сделать курсор посветлее?

Автор:  gid [ 04 апр 2016, 14:37 ]
Заголовок сообщения:  Re: Эмулятор БК-0010-01, БК-0011 и БК-0011М

peg писал(а):
Ну так и интегрируйте 8 уровней. Принципиальной разницы нет.

Давайте конкретный алгоритм, сделаю.
peg писал(а):
Можно тогда все DLL-ки положить в архив с эмулятором. ;)

Или дождаться следующего билда. Я ж не знаю какие дллки нужны, у меня vc redist автоматом со студией ставится, а там, где ругается на недостаток дллок, я руками vc redist накатываю. Линуксоиду должно быть привычно самому всё что нужно для работы руками собрать, тем более, что все нужные дллки можно с инета по одной скачать.
peg писал(а):
В окне отладки эмулятора, когда курсор активный, он становится темно-синим.

Враньё, в win7, win8, win10 он становится светло синим, в WinXP - просто синим, это цвет стандартной цветовой схемы виндовс. Я лучше буду компилировать прогу без поддержки WinXP, чем мучиться с переопределением цвета курсора.

Автор:  peg [ 05 апр 2016, 00:41 ]
Заголовок сообщения:  Re: Эмулятор БК-0010-01, БК-0011 и БК-0011М

Начнем, например, с самого простого:
//максимальная амплитуда
#define MAX_AMP 10
//минимальная амплитуда
#define MIN_AMP -10

float input_amp; //входной уровень
float mid_amp; //середина входа
float out_amp; //выход фильтра
float k_speed = 0.2; //скоростной коэфф.
float f_speed; //скорость выходного сигнала
float decr = 0.001; //затухание выхода в отсутствие входа

//середина выхода
float mid_out = (MAX_AMP + MIN_AMP) / 2;

out_amp = 0;
. . . . . .

// выполнять каждый такт:
/////////////////////////////////////////////////
// получили очередное значение входа
// вычисляем скорость и выход
f_speed = k_speed * (input_amp - mid_amp);
out_amp = out_amp + f_speed;
//затухание выхода
out_amp = out_amp + decr * (mid_out - out_amp);
//ограничение выхода
if (out_amp > MAX_AMP) out_amp = MAX_AMP;
if (out_amp < MIN_AMP) out_amp = MIN_AMP;
/////////////////////////////////////////////////

Скоростной коэфф. выбираем из таких соображений:
за сколько тактов выход должен дорасти до максимума при максимальном входе? N_TACT = MAX_AMP / f_speed (при макс.входе). Отсюда вычисляем f_speed и следом - k_speed

Если что-то невнятно объяснил, спрашивайте.

Автор:  gid [ 11 апр 2016, 15:15 ]
Заголовок сообщения:  Re: Эмулятор БК-0010-01, БК-0011 и БК-0011М

peg писал(а):
Начнем, например, с самого простого:

Попробовал. Ерунда получается. Линейное возрастание/затухание даёт пилу. Для одного голоса звучание ещё вполне так себе, а полифония превращается в невнятную кашу.
Я допилил эмулятор конденсатора, получилось не идеально, но гораздо лучше, чем было раньше.

Автор:  peg [ 12 апр 2016, 00:07 ]
Заголовок сообщения:  Re: Эмулятор БК-0010-01, БК-0011 и БК-0011М

gid писал(а):
peg писал(а):
Ерунда получается. Линейное возрастание/затухание даёт пилу.
Я допилил эмулятор конденсатора, получилось не идеально, но гораздо лучше, чем было раньше.

Неудивительно, интеграл от константы - линейная функция.
Интегратор - это фильтр первого порядка. То, что Вы называете "конденсатор" - это тоже первый порядок. Разница весьма невелика.
Попробуйте второй или третий порядок. Для этого примените интегратор после интегратора. А потом можно еще.
Фильтр-то две строчки всего...

А вообще, что это за сигнал Вы фильтруете? Какова частота отсчетов?

Автор:  gid [ 12 апр 2016, 09:35 ]
Заголовок сообщения:  Re: Эмулятор БК-0010-01, БК-0011 и БК-0011М

peg писал(а):
А вообще, что это за сигнал Вы фильтруете? Какова частота отсчетов?

Я пробовал всякие фильтры, они там не помогут, там надо не фильтровать, а именно формировать хитрую амплитуду, которая получается на линейном выходе.
Я ничего не фильтрую, я тупо эмулирую конденсатор C15 (см. вложение), который заряжается/разряжается через резисторы R35, R29, R30, R31. Причём я упростил себе задачу и вместо резистивного делителя использую постоянное сопротивление для всех уровней и для заряда/разряда, хотя оно там динамически изменяется.
Частота дискретизации эмуляции равна частоте БК, на которой он в данный момент работает. Ну а модули вывода звука работают на частоте 44100, съём показаний с конденсатора делается с такой частотой, а то если постоянно вычислять экспоненту, очень уж тормозить начинает.

Вложения:

Автор:  peg [ 13 апр 2016, 21:11 ]
Заголовок сообщения:  Re: Эмулятор БК-0010-01, БК-0011 и БК-0011М

gid писал(а):
peg писал(а):
А вообще, что это за сигнал Вы фильтруете? Какова частота отсчетов?

Я пробовал всякие фильтры, они там не помогут, там надо не фильтровать, а именно формировать хитрую амплитуду, которая получается на линейном выходе.
Я ничего не фильтрую, я тупо эмулирую конденсатор C15 (см. вложение), который заряжается/разряжается через резисторы R35, R29, R30, R31

Ну вот. Теперь я сообразил. Вы боретесь с шумом квантования.
Из схемы следует, что на выходе ЦАПа имеем 3 бита/8 уровней амплитуды.
Мы хотим их сгладить. Частота вывода весьма высока и сложностей с фильтрацией не представляет. А вот ступеньки - это да. Так просто от них не избавиться, ведь они возникают на любой частоте. То есть, тупо отфильтровать не выйдет.

Вы знаете, есть такая штука - дизеринг(dithering)?
https://ru.wikipedia.org/wiki/%D0%94%D0 ... 0%BD%D0%B3

Надо добавить к выходным ступенькам белый шум с амплитудой ступеньки. А потом отфильтровать (интегратором два-три раза, ну или вашим "конденсатором").
Попробуйте, должно стать заметно лучше.

Автор:  peg [ 13 апр 2016, 23:10 ]
Заголовок сообщения:  Re: Эмулятор БК-0010-01, БК-0011 и БК-0011М

Возможно, я поспешил с советом (шум при дизеринге добавляют в сигнал до оцифровки). Хотя попробовать можно.

А просто линейное сглаживание не пробовали? То есть, вершины ступенек соединить прямыми (положить на углы ступенек "досточки"). Для этого надо обрабатывать текущую ступеньку и предыдущую (надо ждать изменения сигнала). А затем выдавать линейно изменяющуюся амплитуду от одной ступеньки до другой.
Может так случиться, что ждать придется слишком долго (например, больше 20-50 мС, не знаю, надо пробовать, какая задержка допустима), тогда выдавать ту же самую амплитуду, но имея запас в те же 20-50 мС, чтобы иметь возможность снова линейно (а не ступенчато) изменяться.
Надеюсь, не очень сумбурно?
Ну а если это поможет, то дальнейшее улучшение - это сглаживание полиномами (гладкими кривыми). Но сильно лучше уже не будет, так как информация о сигнале уже потеряна при оцифровке до 3 бит.
Я не знаю, это все-таки эмулятор. Может быть, есть возможность добавить шум до выхода на эти злосчастные 3 бита? Тогда дизеринг проходит в полный рост, точно будет лучше!

Страница 2 из 6 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/