чтобы проверить, что обработка корректно работает. На 44 или 48 кГц и без фильтров все неплохо звучит. И кстати записи вполне неплохо читаются и без фильтров с sampleRate 4800 Гц. Мне интересно получить читаемую запись с минимально возможным sampleRate, за счет корректной интерполяции.
Вот например запись с SR 4800 Гц с линейным округлением nearest neighbor: https://transfiles.ru/pu49j
Прекрасно читается, хотя на слух слышны биения.
У меня-же интерес корректно используя фильтры получить читаемый файл с еще более низким SR. В теории он и звучать должен лучше - без биений.
реальный компаратор нормальные уровни получит, если фильтры корректно были применены, т.к. при воспроизведении wav переходы через ноль будут интерполированы реконструируирующим фильтром ЦАП-а и окажутся именно в тех точках, где должны быть. И при просмотре в редакторе точки сэмплов в такой записи будут напоминать случайный шум, а не меандр, т.к. информация о меандре в нем будет закодирована не в отдельных сэмплах, а в их комбинации.
Грубо говоря как это работает - можно подобрать амплитуду двух соседних сэмплов таким образом, чтобы прямая между ними пересекла ноль в требуемой точке времени, несмотря на то, что эту точку невозможно задать сеткой дискретной шкалы времени для заданного SR.
Если использовать sinc интерполяцию, то получится еще более точно чем используя прямые. При этом амплитуда сэмплов будет плавать, но точки перехода через ноль (то что видит аналоговый компаратор) будут задаваться с гораздо большей точностью чем позволяет дискретная шкала времени wav файла с заданым SR.
Чтобы было нагляднее, вот картинка:
Синие точки - это сэмплы. Красная линия это линейная интерполяция как сигнал меняется между сэмплами. Как видим, переход через ноль находится посредине между сэмплами и сэмпл в этой точке задать нельзя, т.к. разрешение частоты дискретизации не позволяет. Но зато можно меняя амплитуду соседних точек менять положение где красная линия будет пересекать ноль с достаточно высокой точностью, несмотря на то, что для двоичного сигнала разрешение частоты дискретизации не позволяет так точно задавать место, где сигнал будет пересекать ноль. В данном случае высокое разрешение по оси Y (амплитуды) позволяет более точно задать точку пересечения нуля на оси X (времени).
Мне как-раз и интересна обработка на грани, где без фильтров чтение просто не будет работать. А когда дискретность по времени позволяет точно задать точку перехода через ноль с большим запасом точности - это уже не интересно
Ну и как результат хочу прикрутить к эмулятору интерполяцию для более точной загрузки wav файлов, чтобы загрузка из wav файла работала как на реальном железе, сейчас у меня в эмуляторе в загрузчике wav файлов вместо sinc интерполяции используется просто поиск сэмплов где сигнал пересекает ноль и персчет номера сэмпла в частоту z80 с округлением. Это тот-же nearest neighbor, т.е. при таком способе довольно большие ошибки длительностей импульсов получаются при загрузке реальных записей, которые по сути отфильтрованы аналоговым фильтром АЦП и АЧХ магнитофонного тракта. Как мне видится их правильнее с интерполяцией загружать.







Ответить с цитированием