Вопрос по полиномиальной интерполяции

Все что касается фильтрации
alexx_78
Сообщения: 8
Зарегистрирован: 06 июн 2020, 11:11

Вопрос по полиномиальной интерполяции

Сообщение alexx_78 »

Добрый день!
Пытаюсь делать передискретизацию сигнала с 44,1 кГц в 48 кГц в реальном времени с помощью https://ru.dsplib.org/content/resamplin ... ne_ex.html
В выходном сигнале вижу небольшое смещение частоты полезного сигнала относительно эталона и загрязненный спектр. Если же просто обработать wav файл функцией farrow_spline(), то результат адекватный.
При работе в реальном времени я просто коплю N отсчетов, подаю их в функцию farrow_spline(), результат пишу в выходной буфер, затем следующие N отсчетов, и т.д. Очевидно, это не совсем правильно. Подскажите пожалуйста, как нужно использовать данную функцию в моем случае?

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 1116
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: Вопрос по полиномиальной интерполяции

Сообщение Бахурин Сергей »

Скорее всего проблема в стыковке блоков. Необходимо сделать обработку с перекрытием 4 отсчётов из буфера в буфер, чтобы на месте стыка убрать переходные процессы.

alexx_78
Сообщения: 8
Зарегистрирован: 06 июн 2020, 11:11

Re: Вопрос по полиномиальной интерполяции

Сообщение alexx_78 »

Спасибо! Буду пробовать

alexx_78
Сообщения: 8
Зарегистрирован: 06 июн 2020, 11:11

Re: Вопрос по полиномиальной интерполяции

Сообщение alexx_78 »

Попробовал так:
1. Беру N отсчетов, пишу выход в буфер
2. Беру 4 последних отсчета из предыдущего буфера + N - 4 из текущего, в выходной буфер пишу со смещением 3, иначе лишние точки появляются. Однако лучше пока не стало. На скриншоте верхний график эталонный сигнал, ниже место склейки с перекрытием, если не делать смещение в выходном буфере, ниже со смещением 3
Вложения
farrow_spline.png

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 1116
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: Вопрос по полиномиальной интерполяции

Сообщение Бахурин Сергей »

Явно в выделенной области скачок фазы, который портит спектр. Надо понять почему так происходит

alexx_78
Сообщения: 8
Зарегистрирован: 06 июн 2020, 11:11

Re: Вопрос по полиномиальной интерполяции

Сообщение alexx_78 »

Пока опытным путем пришел к тому, что если делается передискретизация в P/Q раз, то оптимально в качестве размера окна брать (Q * K) + 1, (где K = 1, 2, 3 и т.д.) входных отсчетов, а перекрытие делать по 1 отсчету и на входе и на выходе, тогда в некоторых случаях можно получить практически идентичный с обработкой всего файла результат

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 1116
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: Вопрос по полиномиальной интерполяции

Сообщение Бахурин Сергей »

Скорее всего проблемы с пересчетом времени. Покажите код

alexx_78
Сообщения: 8
Зарегистрирован: 06 июн 2020, 11:11

Re: Вопрос по полиномиальной интерполяции

Сообщение alexx_78 »

Тесты происходят в среде разработки Qt.
В качестве входных отсчетов используется сгенерированный в звуковом редакторе raw файл 16/44100 30 сек. Полезный сигнал синус 4400 Гц амплитудой 0,8.
Передискретизация делается в 160/147 раз, соответсвенно использую окно 148, перекрытие по 1 семплу для входа и выхода
Соответствующий кусок кода во вложении
Вложения
farrow_test.zip
(1010 байт) 109 скачиваний

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 1116
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: Вопрос по полиномиальной интерполяции

Сообщение Бахурин Сергей »

да проблема в стыковке. Дело в том, что при ресамплинге идет пересчет временных позиций входного и выходного массивов. Поскольку частоты дискретизации на входе и выходе разные, то последний отсчет входного массива по времени не совпадает с последним отсчетом выходного массива, временные шкалы разные. Поэтому стыковку надо делать с учетом этих шкал. К сожалению текущая функция этого не умеет. Она каждый блок начинает с 0 и заканчивает на n-1. Надо допиливать руками (лучше написать функцию, которая будет это уметь).

Выбор длины окна кратный Q дает видимость решения, поскольку последний отсчет первого блока после передискретизации совпадает с последним входным отсчетом. НО!!! первый остчет второго блока после передискретизации уже будет в ошибочной позиции, потому что функций не знает что до этого был блок и время не умеет пересчитывать. Смещение будет небольшим, но оно может начать накапливаться от блока к блоку. Поэтому выбор длины окна кратный Q не даст правильный результат (где-то будет норомально, но если посмотреть на длинном участке, то все равно время разбежится).

alexx_78
Сообщения: 8
Зарегистрирован: 06 июн 2020, 11:11

Re: Вопрос по полиномиальной интерполяции

Сообщение alexx_78 »

Спасибо. Тоже пришел к тем же выводам, что нужна реалтаймовая версия функции. Время к сожалению поджимает, не уверен, что смогу сам ее правильно допилить.
Попробую "классику" - вставлять P - 1 "0", потом LP FIR, потом беру каждый Q-й отсчет.
Я же правильно понимаю, что поскольку делаю upsampling, то могу фильтровать только один раз (после вставки "0") ?

Ответить