desmond breezey 0 18 ноября, 2014 Опубликовано 18 ноября, 2014 · Жалоба Задача: разработка полифазного фильтра-дециматора. Частота дискретизации понижается в 4 раза. Судя по тестбенчу, децимация идет, но вот выходные данные меня сильно смущают. Кто может, посмотрите пожалуйста, намекните хотя бы, в чем может быть ошибка. Прилагаю сам фильтр и тестбенч. В посте ошибка. Понижение частоты дискретизации в 6 раз. ph_module.vhd ph_testbecnch.vhd Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 19 ноября, 2014 Опубликовано 19 ноября, 2014 · Жалоба Задача: разработка полифазного фильтра-дециматора. вы проверяли это в каком нибудь софте, типа матлаба например ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
desmond breezey 0 19 ноября, 2014 Опубликовано 19 ноября, 2014 · Жалоба Нет, проверял только в тестбенче. Я занимаюсь этим чуть больше месяца, поэтому ни знаний,ни опыта в этой области у меня нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 19 ноября, 2014 Опубликовано 19 ноября, 2014 · Жалоба Нет, проверял только в тестбенче. Я занимаюсь этим чуть больше месяца, поэтому ни знаний,ни опыта в этой области у меня нет. возьмите матлаб, откройте симулинк и сделайте ваш фильтр. тогда увидите в чем ваша проблема :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
desmond breezey 0 19 ноября, 2014 Опубликовано 19 ноября, 2014 · Жалоба Ну, немножко я уже сам начинаю понимать, в чем она может быть. Например, взять этот кусок кода: pipeline1: process(c) begin if ( rising_edge(c) ) then for i in 0 to 4 loop case i is when 0 => m10 <= signed(x10)*signed(h10); when 1 => m11 <= signed(m10) + signed(x11)*signed(h11); when 2 => m12 <= signed(m11) + signed(x12)*signed(h12); when 3 => m13 <= signed(m12) + signed(x13)*signed(h13); when 4 => m14 <= signed(m13) + signed(x14)*signed(h14); dout_reg1 <= m14; when others => null; end case; end loop; end if; end process pipeline1; Как я понял, его можно переписать без потери функционала в следующем виде: begin pipeline1: process(c) begin if ( rising_edge(c) ) then m10 <= signed(x10)*signed(h10); m11 <= signed(m10) + signed(x10)*signed(h10); m12 <= signed(m11) + signed(x12)*signed(h12); m13 <= signed(m12) + signed(x13)*signed(h13); m14 <= signed(m13) + signed(x14)*signed(h14); dout_reg1 <= m14; end process pipeline1; Конвейер при этом, по идее, все равно останется. Остается вопрос - как все же будет меняться входной сигнал в таком случае? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 19 ноября, 2014 Опубликовано 19 ноября, 2014 · Жалоба в смысле как? вот так и будет, каждый такт будет новое значение на dout_reg1 учитывайте что loop - это просто то что в цикле записать друг под другом указанное число раз, так что 1 и 2 кусок прям одно и тоже, только первый написан через одно место... ИМХО Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 19 ноября, 2014 Опубликовано 19 ноября, 2014 · Жалоба Ну, немножко я уже сам начинаю понимать, в чем она может быть. вы явно пошли не туда, если уж не хотите изучать софт, без которого в дсп обработке дюже сложно работать, изучите литературу как делаются децимирующие фильтры. У вас ИМХО есть кардинальная ошибка в фильтре. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 19 ноября, 2014 Опубликовано 19 ноября, 2014 · Жалоба Задача: разработка полифазного фильтра-дециматора. Частота дискретизации понижается в 4 раза. Судя по тестбенчу, децимация идет, но вот выходные данные меня сильно смущают. Кто может, посмотрите пожалуйста, намекните хотя бы, в чем может быть ошибка. Прилагаю сам фильтр и тестбенч. В посте ошибка. Понижение частоты дискретизации в 6 раз. Требования какие к разработке полифазного фильтра-дециматора? тактовая частота? PS посмотрите в матлабе fdatool Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
desmond breezey 0 19 ноября, 2014 Опубликовано 19 ноября, 2014 · Жалоба вы явно пошли не туда, если уж не хотите изучать софт, без которого в дсп обработке дюже сложно работать, изучите литературу как делаются децимирующие фильтры. У вас ИМХО есть кардинальная ошибка в фильтре. Я читал Лайонса. Как я вижу, есть тут такая проблема: в фильтре есть коммутатор, который делает так, чтобы с каждым тактом входной сигнал поступал на разные субфильтры. А итоговый выходной получается суммированием выходных сигналов со всех субфильтров. Ошибка, как мне кажется, в том, что на части последних субфильтровсигнал не успевает отфильтроваться. Я верно думаю? Требования какие к разработке полифазного фильтра-дециматора? тактовая частота? PS посмотрите в матлабе fdatool Тактовая частота: 120 МГц. Понижение частоты дискретизации в 6 раз. Для получения коэффициентов советовали взять окно Кайзера. Больше ничего конкретного. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 19 ноября, 2014 Опубликовано 19 ноября, 2014 · Жалоба если проделывать такие действия m10 <= signed(x10)*signed(h10); m11 <= signed(m10) + signed(x10)*signed(h10); m12 <= signed(m11) + signed(x12)*signed(h12); m13 <= signed(m12) + signed(x13)*signed(h13); m14 <= signed(m13) + signed(x14)*signed(h14); вы на выходе после 5 такта получите то что ожидаете? Прям на бумажке посчитайте, коль матлаб вам претит. Если получите то смотрите времянку, если нет, то алгоритм:) И второй вопрос, по логике построения во 2 строке m11 <= signed(m10) + signed(x10)*signed(h10); не m11 <= signed(m10) + signed(x11)*signed(h11); должно быть? ну последние, как часто вы предполагаете должен меняться выход? не в 6 ли раз медленнее входа? У вас он меняется каждый такт... dout_reg1 <= m14; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
desmond breezey 0 19 ноября, 2014 Опубликовано 19 ноября, 2014 · Жалоба если проделывать такие действия m10 <= signed(x10)*signed(h10); m11 <= signed(m10) + signed(x10)*signed(h10); m12 <= signed(m11) + signed(x12)*signed(h12); m13 <= signed(m12) + signed(x13)*signed(h13); m14 <= signed(m13) + signed(x14)*signed(h14); вы на выходе после 5 такта получите то что ожидаете? Прям на бумажке посчитайте, коль матлаб вам претит. Если получите то смотрите времянку, если нет, то алгоритм:) И второй вопрос, по логике построения во 2 строке m11 <= signed(m10) + signed(x10)*signed(h10); не m11 <= signed(m10) + signed(x11)*signed(h11); должно быть? ну последние, как часто вы предполагаете должен меняться выход? не в 6 ли раз медленнее входа? У вас он меняется каждый такт... dout_reg1 <= m14; По поводу второго вопроса - так и есть, это я описался (когда переносил сюда,нечайно строчку удалил и набрал заново). Смотрите, например, первый кусок. По поводу последнего - тут можно сделать так, как я сделал с коммутатором. Как-то так: pipeline1: process(c) variable i: integer :=0; begin if ( rising_edge(c) ) then case i is when 0 => m10 <= signed(x10)*signed(h10); when 1 => m11 <= signed(m10) + signed(x11)*signed(h11); when 2 => m12 <= signed(m11) + signed(x12)*signed(h12); when 3 => m13 <= signed(m12) + signed(x13)*signed(h13); when 4 => m14 <= signed(m13) + signed(x14)*signed(h14); when 5 => dout_reg1 <= m14; when others => null; end case; if ( i < 6) then i := i + 1; else i := 0; end if; end if; end process pipeline1; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
desmond breezey 0 19 ноября, 2014 Опубликовано 19 ноября, 2014 (изменено) · Жалоба Я кажется понял, в чем тут коренной недостаток. Ведь я в субфильтрах я использую тот же тактовый сигнал, по которому переключаю коммутатор, а надо, чтобы тактовый сигнал для субфильтров имел частоту в 6 раз меньшую... Ага,как я понял, ошибка еще и в количестве коэффициентов. Коэффициенты берутся от фильтра-прототипа, а количество коэффициентов у одного субфильтра определяется соотношением N/M , где N - число коэффициентов исходного фильтра, а M - коэффициент децимации. Все так? Изменено 19 ноября, 2014 пользователем desmond breezey Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 19 ноября, 2014 Опубликовано 19 ноября, 2014 · Жалоба Я кажется понял, в чем тут коренной недостаток. Ведь я в субфильтрах я использую тот же тактовый сигнал, по которому переключаю коммутатор, а надо, чтобы тактовый сигнал для субфильтров имел частоту в 6 раз меньшую... Ага,как я понял, ошибка еще и в количестве коэффициентов. Коэффициенты берутся от фильтра-прототипа, а количество коэффициентов у одного субфильтра определяется соотношением N/M , где N - число коэффициентов исходного фильтра, а M - коэффициент децимации. Все так? как насчет пульсаций в полосе пропускания и ширины полосы перехода (крутизна так сказать фильтра), а также уровня подавления 2 и более гармоники? и т.д. Частота работы фильтра? Или это не важно? Почему не CIC фильтр (вопрос с подвохом), а выбран FIR ? почитайте, как будет время Еще раз спрашу: Требования какие к разработке полифазного фильтра-дециматора? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
desmond breezey 0 19 ноября, 2014 Опубликовано 19 ноября, 2014 · Жалоба как насчет пульсаций в полосе пропускания и ширины полосы перехода, а также уровня подавления 2 и более гармоники? и т.д. Или это не важно? Почему не CIC фильтр (вопрос с подвохом)? Про них ничего не говорили, сказали лишь, что оптимально будет использовать окно Кайзера. Я думал про CIC и интересовался на этот счет у преподавателя, но он сказал, что оптимальнее будет использовать полифазный фильтр. Статьи по ссылке читал уже. ширины полосы перехода 5 МГц. Граничная частота полосы пропускания 5 МГц, граничная частота полосы подавления 10 МГц. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 19 ноября, 2014 Опубликовано 19 ноября, 2014 · Жалоба Про них ничего не говорили, сказали лишь, что оптимально будет использовать окно Кайзера. Я думал про CIC и интересовался на этот счет у преподавателя, но он сказал, что оптимальнее будет использовать полифазный фильтр. Статьи по ссылке читал уже. 5 МГц. Граничная частота полосы пропускания 5 МГц, граничная частота полосы подавления 10 МГц. и все таки попробуйте в матлабе fdatool промоделировать, а также Вы получите коефициенты фильтра (скажу по секрету он и готовое описание для ПЛИС дает фильтра - вопрос же оптимальности реализации фильтра в ПЛИС я думаю у Вас не стоит) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться