Вопрос по полиномиальной интерполяции
Вопрос по полиномиальной интерполяции
Добрый день!
Пытаюсь делать передискретизацию сигнала с 44,1 кГц в 48 кГц в реальном времени с помощью https://ru.dsplib.org/content/resamplin ... ne_ex.html
В выходном сигнале вижу небольшое смещение частоты полезного сигнала относительно эталона и загрязненный спектр. Если же просто обработать wav файл функцией farrow_spline(), то результат адекватный.
При работе в реальном времени я просто коплю N отсчетов, подаю их в функцию farrow_spline(), результат пишу в выходной буфер, затем следующие N отсчетов, и т.д. Очевидно, это не совсем правильно. Подскажите пожалуйста, как нужно использовать данную функцию в моем случае?
Пытаюсь делать передискретизацию сигнала с 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 отсчётов из буфера в буфер, чтобы на месте стыка убрать переходные процессы.
Re: Вопрос по полиномиальной интерполяции
Спасибо! Буду пробовать
Re: Вопрос по полиномиальной интерполяции
Попробовал так:
1. Беру N отсчетов, пишу выход в буфер
2. Беру 4 последних отсчета из предыдущего буфера + N - 4 из текущего, в выходной буфер пишу со смещением 3, иначе лишние точки появляются. Однако лучше пока не стало. На скриншоте верхний график эталонный сигнал, ниже место склейки с перекрытием, если не делать смещение в выходном буфере, ниже со смещением 3
1. Беру N отсчетов, пишу выход в буфер
2. Беру 4 последних отсчета из предыдущего буфера + N - 4 из текущего, в выходной буфер пишу со смещением 3, иначе лишние точки появляются. Однако лучше пока не стало. На скриншоте верхний график эталонный сигнал, ниже место склейки с перекрытием, если не делать смещение в выходном буфере, ниже со смещением 3
- Бахурин Сергей
- Администратор
- Сообщения: 1116
- Зарегистрирован: 05 окт 2010, 19:55
- Контактная информация:
Re: Вопрос по полиномиальной интерполяции
Явно в выделенной области скачок фазы, который портит спектр. Надо понять почему так происходит
Re: Вопрос по полиномиальной интерполяции
Пока опытным путем пришел к тому, что если делается передискретизация в P/Q раз, то оптимально в качестве размера окна брать (Q * K) + 1, (где K = 1, 2, 3 и т.д.) входных отсчетов, а перекрытие делать по 1 отсчету и на входе и на выходе, тогда в некоторых случаях можно получить практически идентичный с обработкой всего файла результат
- Бахурин Сергей
- Администратор
- Сообщения: 1116
- Зарегистрирован: 05 окт 2010, 19:55
- Контактная информация:
Re: Вопрос по полиномиальной интерполяции
Скорее всего проблемы с пересчетом времени. Покажите код
Re: Вопрос по полиномиальной интерполяции
Тесты происходят в среде разработки Qt.
В качестве входных отсчетов используется сгенерированный в звуковом редакторе raw файл 16/44100 30 сек. Полезный сигнал синус 4400 Гц амплитудой 0,8.
Передискретизация делается в 160/147 раз, соответсвенно использую окно 148, перекрытие по 1 семплу для входа и выхода
Соответствующий кусок кода во вложении
В качестве входных отсчетов используется сгенерированный в звуковом редакторе raw файл 16/44100 30 сек. Полезный сигнал синус 4400 Гц амплитудой 0,8.
Передискретизация делается в 160/147 раз, соответсвенно использую окно 148, перекрытие по 1 семплу для входа и выхода
Соответствующий кусок кода во вложении
- Вложения
-
- farrow_test.zip
- (1010 байт) 110 скачиваний
- Бахурин Сергей
- Администратор
- Сообщения: 1116
- Зарегистрирован: 05 окт 2010, 19:55
- Контактная информация:
Re: Вопрос по полиномиальной интерполяции
да проблема в стыковке. Дело в том, что при ресамплинге идет пересчет временных позиций входного и выходного массивов. Поскольку частоты дискретизации на входе и выходе разные, то последний отсчет входного массива по времени не совпадает с последним отсчетом выходного массива, временные шкалы разные. Поэтому стыковку надо делать с учетом этих шкал. К сожалению текущая функция этого не умеет. Она каждый блок начинает с 0 и заканчивает на n-1. Надо допиливать руками (лучше написать функцию, которая будет это уметь).
Выбор длины окна кратный Q дает видимость решения, поскольку последний отсчет первого блока после передискретизации совпадает с последним входным отсчетом. НО!!! первый остчет второго блока после передискретизации уже будет в ошибочной позиции, потому что функций не знает что до этого был блок и время не умеет пересчитывать. Смещение будет небольшим, но оно может начать накапливаться от блока к блоку. Поэтому выбор длины окна кратный Q не даст правильный результат (где-то будет норомально, но если посмотреть на длинном участке, то все равно время разбежится).
Выбор длины окна кратный Q дает видимость решения, поскольку последний отсчет первого блока после передискретизации совпадает с последним входным отсчетом. НО!!! первый остчет второго блока после передискретизации уже будет в ошибочной позиции, потому что функций не знает что до этого был блок и время не умеет пересчитывать. Смещение будет небольшим, но оно может начать накапливаться от блока к блоку. Поэтому выбор длины окна кратный Q не даст правильный результат (где-то будет норомально, но если посмотреть на длинном участке, то все равно время разбежится).
Re: Вопрос по полиномиальной интерполяции
Спасибо. Тоже пришел к тем же выводам, что нужна реалтаймовая версия функции. Время к сожалению поджимает, не уверен, что смогу сам ее правильно допилить.
Попробую "классику" - вставлять P - 1 "0", потом LP FIR, потом беру каждый Q-й отсчет.
Я же правильно понимаю, что поскольку делаю upsampling, то могу фильтровать только один раз (после вставки "0") ?
Попробую "классику" - вставлять P - 1 "0", потом LP FIR, потом беру каждый Q-й отсчет.
Я же правильно понимаю, что поскольку делаю upsampling, то могу фильтровать только один раз (после вставки "0") ?