NEO SPECTRUMAN,
По крайней мере до 15кгц не должно быть никаких спадов. А тут чуть больше 3кгц и уже глушняк. Как телефонная связь.
Вид для печати
NEO SPECTRUMAN,
По крайней мере до 15кгц не должно быть никаких спадов. А тут чуть больше 3кгц и уже глушняк. Как телефонная связь.
о чем это ты? :v2_dizzy_facepalm:
это LP фильтр
после частоты среза (6КГц) не должно быть ничего вообще
тут у меня напрашиваются фразы
но изза простоты фильтра там что то все еще есть :)
надо будет сделать еще пару тройку повторных проходов поверх
Это хреновый LP фильтр.
И поэтому оно все будет отражаться, и это - неприемлемо.
На мой слух музыка отрендеренная с Ayumi звучит даже лучше оригинала (железного, у меня YM, и там просто шум, а Ayumi - звучит "кристально"). Дальше идёт ZX-Tune, Ay_emul/Unreal...
Закончить можно было бы после твоего утверждения:
И вообще, какие-то проблемы?
Ayumi дает звук, лишённый шумов аудиотракта (которые в реале присутствуют). На фоне этого тот абсолютный минимум артефактов (отраженных гармоник) Ayumi вообще не ощущается.
А в ZX-Tune движок от ay_emul взят и улучшен + управляемая скважность (пусть и в плеере) порой весьма скрашивает пресный меандр (хотя небезупречно - скважность шума вообще не стоит трогать).
Слыш, эльф. Вот смотри:
Это инициализация таблицы с коэффициентами
Это понижение дискретизации (32 сэмпла в один, который пойдёт на вывод). На входе в sndLev имеем амплитуду звука, снятую в данный момент эмуляции с железяки. В tmpLev накапливается сумма на выводКод:void init_kih() {
long double Fd = conf.snd.rate * DISCRATE;
long double Fs = 2;
long double Fx = 2;
long double H_id [DISCRATE] = {0};
long double W[DISCRATE] = {0};
long double Fc = (Fs + Fx) / (2 * Fd);
int i;
for (i = 0; i < DISCRATE; i++) {
if (i == 0) {
H_id[i] = 2 * M_PI * Fc;
} else {
H_id[i] = sinl(2 * M_PI * Fc * i) / (M_PI * i);
}
W[i] = 0.42 - 0.5 * cosl((2 * M_PI * i) / (DISCRATE - 1)) + 0.08 * cosl((4 * M_PI * i) / (DISCRATE - 1));
H[i] = H_id[i] * W[i];
}
// normalizzze
double sum = 0;
for (i = 0; i < DISCRATE; i++) sum += H[i];
for (i = 0; i < DISCRATE; i++) H[i] /= sum;
}
Звучит как *****. Что не так?Код:...
tmpLev.left += sndLev.left * H[disCount];
tmpLev.right += sndLev.right * H[disCount];
disCount++;
if (disCount >= DISCRATE) {
sndLev = tmpLev; <- это пойдёт в звуковой буфер
tmpLev.left = 0;
tmpLev.right = 0;
disCount = 0;
...
>Звучит как *****. Что не так?
Хз. Что за функция создающая таблицу? Откуда она?
А вообще, может дело в том, что это не свертка происходит, и никакого overlap add нет? Это предположение. Я насколько вижу — сверточный буфер в 32 значение, и сигнал децимируется тоже с шагом в 32. Что происходит с крайними значениями буфера? Какой вклад они имеют в итоговые суммы? Если в одном фрейме свертки это 0%, то в соседнем должно быть 100%
http://www.dsprelated.com/josimages_...p2/img1395.png.
Т.е. шаг должен быть как минимум в 2 раза короче сверточного буфера.
https://habr.com/ru/post/128140/
PS: Ну да, конечно, ошибка в формуле. Надо
W[i] = 0.42 + 0.5 * cosl((2 * M_PI * i) / (DISCRATE - 1)) + 0.08 * cosl((4 * M_PI * i) / (DISCRATE - 1));
Так лучше
ЗЫ: Без этого фильтра звук чище. С ним резко затихают верхние частоты.
запиши звук с эмулятора до и после
тест пищалка полторы минуты
https://dropmefiles.com.ua/ru/Rsv3
посмотрим глазами
вот мы сравнивали (по быстренькому) фпга пищалки разной степени унылости
https://zx-pk.ru/threads/31677-nsid_...=1#post1063361
сравним с ними и с унриалом