Полифазная фильтрация

Все что касается фильтрации
kaa
Сообщения: 36
Зарегистрирован: 17 мар 2019, 20:03

Полифазная фильтрация

Сообщение kaa »

Сигнала input длины input_length фильтруется полифазным фильтром polyphase_filter
для передискретизации в up_rate/down_rate раз.
Добиваю input в начале и конце нулями по phase_length-1 штук (phase_length = polyphase_filter / up_rate).
Т.е получаю на выходе фильтра отсчеты с первого "ненулевого".
Хочу отбросить невалидные значения, но с подсчетом их количества трудности.
Считал, что отбрасывать надо задержку фильтра округленную вверх, но например при
up_rate = 14;
down_rate = 13;
явно какая-то ошибка.
При
up_rate = 1001;
down_rate = 1000;
отбрасывается один валидный отсчет, хотя при
up_rate = 1000;
down_rate = 1001;
все хорошо.
Как правильно отфильтровать сигнал?

Скрипт матлаба прикладываю.
Вложения
resampling.m.7z
(1.4 КБ) 108 скачиваний

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

Re: Полифазная фильтрация

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

Код посмотрел.
Пока не могу сходу ответить надо анализировать скрипт.
Единственное, хотел уточнить, вам действительно требуется делать это через upsample downsample? Не смущает, что для обработки 50 отсчетов необходимо привлечь фильтр 20020 порядка?
Почему бы не сделать через полиномиальную интерполяцию?

kaa
Сообщения: 36
Зарегистрирован: 17 мар 2019, 20:03

Re: Полифазная фильтрация

Сообщение kaa »

up_rate = 1001;
down_rate = 1000;
Эти коэффициенты как пример неправильной работы алгоритма, в данном случае не важна эффективность, просто хотелось бы разобраться с полифазной передискретизацией.

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

kaa
Сообщения: 36
Зарегистрирован: 17 мар 2019, 20:03

Re: Полифазная фильтрация

Сообщение kaa »

Изменил расчет невалидной части передискретизированного сигнала:

Код: Выделить всё

invalid_out_length = fix((up_rate*(phase_length-1) - (ord/2)) / down_rate);
if rem((up_rate*(phase_length-1) - (ord/2)), down_rate)
    invalid_out_length = invalid_out_length + 1;
end
Теперь идея такая - считаю длину нулевой вставки после передискретизации, вычитаю ГВЗ фильтра.

Однако кажется что при некоторых соотношения up_rate и down_rate проявляется какая-то нецелочисленная задержка. Пример правильной и неправильной работы алгоритма на картинках.
2.png
2.png
Вложения
1.png

Ответить