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
Нет, проверял только в тестбенче. Я занимаюсь этим чуть больше месяца, поэтому ни знаний,ни опыта в этой области у меня нет.

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

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

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this