Jump to content
    

Подскажите, в чем может быть ошибка

Задача: разработка полифазного фильтра-дециматора. Частота дискретизации понижается в 4 раза. Судя по тестбенчу, децимация идет, но вот выходные данные меня сильно смущают. Кто может, посмотрите пожалуйста, намекните хотя бы, в чем может быть ошибка. Прилагаю сам фильтр и тестбенч.

 

В посте ошибка. Понижение частоты дискретизации в 6 раз.

ph_module.vhd

ph_testbecnch.vhd

Share this post


Link to post
Share on other sites

Задача: разработка полифазного фильтра-дециматора.

вы проверяли это в каком нибудь софте, типа матлаба например ?

 

Share this post


Link to post
Share on other sites

Нет, проверял только в тестбенче. Я занимаюсь этим чуть больше месяца, поэтому ни знаний,ни опыта в этой области у меня нет.

возьмите матлаб, откройте симулинк и сделайте ваш фильтр. тогда увидите в чем ваша проблема :)

Share this post


Link to post
Share on other sites

Ну, немножко я уже сам начинаю понимать, в чем она может быть. Например, взять этот кусок кода:

 

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;

 

Конвейер при этом, по идее, все равно останется.

 

Остается вопрос - как все же будет меняться входной сигнал в таком случае?

Share this post


Link to post
Share on other sites

в смысле как?

вот так и будет, каждый такт будет новое значение на dout_reg1

 

учитывайте что loop - это просто то что в цикле записать друг под другом указанное число раз, так что

1 и 2 кусок прям одно и тоже, только первый написан через одно место... ИМХО

Share this post


Link to post
Share on other sites

Ну, немножко я уже сам начинаю понимать, в чем она может быть.

вы явно пошли не туда, если уж не хотите изучать софт, без которого в дсп обработке дюже сложно работать, изучите литературу как делаются децимирующие фильтры. У вас ИМХО есть кардинальная ошибка в фильтре.

 

Share this post


Link to post
Share on other sites

Задача: разработка полифазного фильтра-дециматора. Частота дискретизации понижается в 4 раза. Судя по тестбенчу, децимация идет, но вот выходные данные меня сильно смущают. Кто может, посмотрите пожалуйста, намекните хотя бы, в чем может быть ошибка. Прилагаю сам фильтр и тестбенч.

 

В посте ошибка. Понижение частоты дискретизации в 6 раз.

Требования какие к разработке полифазного фильтра-дециматора? тактовая частота?

 

PS посмотрите в матлабе fdatool

Share this post


Link to post
Share on other sites

вы явно пошли не туда, если уж не хотите изучать софт, без которого в дсп обработке дюже сложно работать, изучите литературу как делаются децимирующие фильтры. У вас ИМХО есть кардинальная ошибка в фильтре.

Я читал Лайонса.

 

Как я вижу, есть тут такая проблема: в фильтре есть коммутатор, который делает так, чтобы с каждым тактом входной сигнал поступал на разные субфильтры. А итоговый выходной получается суммированием выходных сигналов со всех субфильтров. Ошибка, как мне кажется, в том, что на части последних субфильтровсигнал не успевает отфильтроваться. Я верно думаю?

 

Требования какие к разработке полифазного фильтра-дециматора? тактовая частота?

 

PS посмотрите в матлабе fdatool

Тактовая частота: 120 МГц.

Понижение частоты дискретизации в 6 раз.

 

Для получения коэффициентов советовали взять окно Кайзера.

Больше ничего конкретного.

Share this post


Link to post
Share on other sites

если проделывать такие действия

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;

Share this post


Link to post
Share on other sites

если проделывать такие действия

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;

Share this post


Link to post
Share on other sites

Я кажется понял, в чем тут коренной недостаток. Ведь я в субфильтрах я использую тот же тактовый сигнал, по которому переключаю коммутатор, а надо, чтобы тактовый сигнал для субфильтров имел частоту в 6 раз меньшую...

 

Ага,как я понял, ошибка еще и в количестве коэффициентов. Коэффициенты берутся от фильтра-прототипа, а количество коэффициентов у одного субфильтра определяется соотношением N/M , где N - число коэффициентов исходного фильтра, а M - коэффициент децимации. Все так?

Edited by desmond breezey

Share this post


Link to post
Share on other sites

Я кажется понял, в чем тут коренной недостаток. Ведь я в субфильтрах я использую тот же тактовый сигнал, по которому переключаю коммутатор, а надо, чтобы тактовый сигнал для субфильтров имел частоту в 6 раз меньшую...

 

Ага,как я понял, ошибка еще и в количестве коэффициентов. Коэффициенты берутся от фильтра-прототипа, а количество коэффициентов у одного субфильтра определяется соотношением N/M , где N - число коэффициентов исходного фильтра, а M - коэффициент децимации. Все так?

как насчет пульсаций в полосе пропускания и ширины полосы перехода (крутизна так сказать фильтра), а также уровня подавления 2 и более гармоники? и т.д. Частота работы фильтра?

Или это не важно?

 

Почему не CIC фильтр (вопрос с подвохом), а выбран FIR ?

 

 

почитайте, как будет время

 

Еще раз спрашу:

Требования какие к разработке полифазного фильтра-дециматора?

post-24839-1416428316_thumb.png

Share this post


Link to post
Share on other sites

как насчет пульсаций в полосе пропускания и ширины полосы перехода, а также уровня подавления 2 и более гармоники? и т.д.

Или это не важно?

 

Почему не CIC фильтр (вопрос с подвохом)?

Про них ничего не говорили, сказали лишь, что оптимально будет использовать окно Кайзера.

 

Я думал про CIC и интересовался на этот счет у преподавателя, но он сказал, что оптимальнее будет использовать полифазный фильтр. Статьи по ссылке читал уже.

 

ширины полосы перехода

5 МГц.

Граничная частота полосы пропускания 5 МГц, граничная частота полосы подавления 10 МГц.

Share this post


Link to post
Share on other sites

Про них ничего не говорили, сказали лишь, что оптимально будет использовать окно Кайзера.

 

Я думал про CIC и интересовался на этот счет у преподавателя, но он сказал, что оптимальнее будет использовать полифазный фильтр. Статьи по ссылке читал уже.

 

 

5 МГц.

Граничная частота полосы пропускания 5 МГц, граничная частота полосы подавления 10 МГц.

и все таки попробуйте в матлабе fdatool промоделировать, а также Вы получите коефициенты фильтра (скажу по секрету он и готовое описание для ПЛИС дает фильтра - вопрос же оптимальности реализации фильтра в ПЛИС я думаю у Вас не стоит)

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...