Сигнала 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 КБ) 209 скачиваний
- Бахурин Сергей
- Администратор
- Сообщения: 1116
- Зарегистрирован: 05 окт 2010, 19:55
- Контактная информация:
Re: Полифазная фильтрация
Код посмотрел.
Пока не могу сходу ответить надо анализировать скрипт.
Единственное, хотел уточнить, вам действительно требуется делать это через upsample downsample? Не смущает, что для обработки 50 отсчетов необходимо привлечь фильтр 20020 порядка?
Почему бы не сделать через полиномиальную интерполяцию?
Пока не могу сходу ответить надо анализировать скрипт.
Единственное, хотел уточнить, вам действительно требуется делать это через upsample downsample? Не смущает, что для обработки 50 отсчетов необходимо привлечь фильтр 20020 порядка?
Почему бы не сделать через полиномиальную интерполяцию?
Re: Полифазная фильтрация
up_rate = 1001;
down_rate = 1000;
Эти коэффициенты как пример неправильной работы алгоритма, в данном случае не важна эффективность, просто хотелось бы разобраться с полифазной передискретизацией.
Однако отмечу, что единственной проблемой является хранение и доступ к элементам фильтра такого порядка, сама передискретизация выполняет достаточно мало действий.
down_rate = 1000;
Эти коэффициенты как пример неправильной работы алгоритма, в данном случае не важна эффективность, просто хотелось бы разобраться с полифазной передискретизацией.
Однако отмечу, что единственной проблемой является хранение и доступ к элементам фильтра такого порядка, сама передискретизация выполняет достаточно мало действий.
Re: Полифазная фильтрация
Изменил расчет невалидной части передискретизированного сигнала:
Теперь идея такая - считаю длину нулевой вставки после передискретизации, вычитаю ГВЗ фильтра.
Однако кажется что при некоторых соотношения up_rate и down_rate проявляется какая-то нецелочисленная задержка. Пример правильной и неправильной работы алгоритма на картинках.
Код: Выделить всё
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 проявляется какая-то нецелочисленная задержка. Пример правильной и неправильной работы алгоритма на картинках.