Страница 1 из 1

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

Добавлено: 05 авг 2019, 10:36
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;
все хорошо.
Как правильно отфильтровать сигнал?

Скрипт матлаба прикладываю.

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

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

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

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

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

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

Добавлено: 07 авг 2019, 17:50
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