реклама на сайте
подробности

 
 
> Проблемы с реализацией CIC фильтров
Art111
сообщение Aug 12 2010, 10:54
Сообщение #1





Группа: Новичок
Сообщений: 9
Регистрация: 12-08-10
Пользователь №: 58 875



Добрый день!
Проблема в следующем. Требуется реализовать CIC фильтр в 12 секций с децимацией, к примеру 10.
Решил сначала построить его на IP-ядре (CIC Compiler Core). Оказалось, что он может генерить фильтр с максимальным количеством секций 6.
А надо 12. Как быть?
Ладно, структура вроде бы не сложная, решил написать руками. Текст привожу далее. (К примеру, для 3х каскадов. ) Если кто сталкивался с написанием такого фильтра в коде, посмотрите, пожалуйста, нет ли ошибок.
И последее. Фильтр надо как-то отлаживать. Проверить результат. Также буду очень признателен, если кто-нибудь скажет как лучше проверить, что он работает.
Спасибо!


library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_SIGNED.all;
use IEEE.STD_LOGIC_ARITH.all;

entity hcic is
port(
CLK : in STD_LOGIC;
CLK10 : in STD_LOGIC;
din : in STD_LOGIC_VECTOR(15 downto 0);
dout : out STD_LOGIC_VECTOR(15 downto 0) );
end hcic;

architecture BEH of hcic is


signal i0,i1,i2,i3,tempI0,tempI1,tempI2:STD_LOGIC_VECTOR(21 downto 0);
signal c0,c1,c2,c3,tempC0,tempC1,tempC2:STD_LOGIC_VECTOR(21 downto 0);
signal clk_dec :STD_LOGIC;
--signal clcc:STD_LOGIC_VECTOR(4 downto 0);

begin

process (clk)
begin
if(clk'event and clk='1')then
if din(15)='0' then i0<="0000000"&din(14 downto 0); else i0<="1111111"&din(14 downto 0);end if;
dout<=c3(15 downto 0);

end if;
end process;


--process (clk)
-- begin
-- if(clk'event and clk='1')then
-- clcc<=clcc+1;
-- if clcc="10011" then clk_dec<='1'; else clk_dec<='0'; clcc<="00000";end if;
-- end if;
--end process;

process (clk)--INTERGRATED
begin
if(clk'event and clk='1')then
tempI0<=i0;
tempI1<=i1;
tempI2<=i2;
i1<=signed(tempI0)+signed(i0);
i2<=signed(tempI1)+signed(i1);
i3<=signed(tempI2)+signed(i2);

end if;
end process;


process (CLK10)--COMB
begin
if(CLK10'event and CLK10='1')then
tempC0<=i3;
tempC1<=c1;
tempC2<=c2;
c1<=signed (tempC0)-signed (i3);
c2<=signed (tempC1)-signed (c1);
c3<=signed (tempC2)-signed (c2);

end if;
end process;

--
--
----
--
end BEH;
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
PavPro
сообщение Jan 15 2015, 18:27
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 127
Регистрация: 24-02-11
Пользователь №: 63 222



Хотелось бы прояснить для себя следующий момент касаемо в части реализации CIC-фильтров. К примеру есть 3 каскада интеграторов + гребенчатых фильтров, т.е. 3-х каскадный CIC-фильтр. При этом разрядность входных данных больше чем выходных (например in_data = 20 бит, out_data = 12 бит). Допускается ли в этом случае отбрасывать младшие биты в интеграторах согласно методики Хогенауера (Hogenauer, Eugene. An Economical Class of Digital Filters For Decimation and Interpolation, IEEE Transactions on Acoustics, Speech and Signal Processing, Vol. ASSP-29, pp. 155-162, April 1981.). Согласно алгоритму в данной статье, фильтр работает при разрядности входных данных меньшей чем разрядность выходных. В противном случае моделирование показывает что фильтр работает неправильно! Есть соображение, что когда разрядность входных данных больше чем выходных, отбрасывать младшие биты в интеграторах вообще нельзя. Так ли это, или я ошибаюсь?
Заранее благодарен за ответы.
Go to the top of the page
 
+Quote Post
Maverick
сообщение Jan 15 2015, 19:18
Сообщение #3


я только учусь...
******

Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839



Цитата(PavPro @ Jan 15 2015, 20:27) *
Хотелось бы прояснить для себя следующий момент касаемо в части реализации CIC-фильтров. К примеру есть 3 каскада интеграторов + гребенчатых фильтров, т.е. 3-х каскадный CIC-фильтр. При этом разрядность входных данных больше чем выходных (например in_data = 20 бит, out_data = 12 бит). Допускается ли в этом случае отбрасывать младшие биты в интеграторах согласно методики Хогенауера (Hogenauer, Eugene. An Economical Class of Digital Filters For Decimation and Interpolation, IEEE Transactions on Acoustics, Speech and Signal Processing, Vol. ASSP-29, pp. 155-162, April 1981.). Согласно алгоритму в данной статье, фильтр работает при разрядности входных данных меньшей чем разрядность выходных. В противном случае моделирование показывает что фильтр работает неправильно! Есть соображение, что когда разрядность входных данных больше чем выходных, отбрасывать младшие биты в интеграторах вообще нельзя. Так ли это, или я ошибаюсь?
Заранее благодарен за ответы.

нет, простое "обрезание" разрядности не подойдет

Возьмите промоделируйте - смотрите на выход СIC фильтра (полный выход со всеми разрядами) - уменьшите масштаб при моделировании (чтобы много выходных данных на экране видели) - смотрите какие биты меняются, а какие нет или практически не меняются.
В итоге берите только те которые меняются - значащие биты в необходимом количестве (чаще делают разрядность входа и выхода равными).
Если СIC фильтр перестраиваемый, то такую операцию нужно делать для каждого коэффициента. Можно взять несколько точек, а потом аппроксимировать...

Посмотрите как меняются входные данные и какие значащие биты там, постарайтесь чтобы выходные данные с СIC фильтра были аналогичными...

PS СIC фильтр делайте полный без "обрезания" на каскадах - совет
PS PS прошу прощения - ошибся - говорил про децимирующий СIC фильтр, но думаю в Вашем случае (интерполяции) все аналогично с точность до наоборот...


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
PavPro
сообщение Jan 15 2015, 19:51
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 127
Регистрация: 24-02-11
Пользователь №: 63 222



Цитата(Maverick @ Jan 15 2015, 23:18) *
нет, простое "обрезание" разрядности не подойдет

Возьмите промоделируйте - смотрите на выход СIC фильтра (полный выход со всеми разрядами) - уменьшите масштаб - смотрите какие биты меняются, а какие нет.
В итоге берите только те которые меняются - значащие биты.
Во всяком случае я так делал помогло...

Ну делать подбор усечения в каждом каскаде с последующим моделированием это слишком расточительно по времени. Я спрашивал про методику усечения описываемую Хогенауером. Согласно этой методики, можно заранее вычислить сколько бит и в каком каскаде можно отбрасывать с минимальным ущербом для конечного результата.
Другое дело что фильтр перестает правильно работать, когда разрядность входных данных больше чем выходных.
К примеру: есть два трехкаскадных фильтра: 1)N=3 кол-во секций, R=32 коэфФ. прореживания, М=2 разностная задержка. Bin= 8 бит, Bout =10 бит.
2)N=3 кол-во секций, R=32 коэфФ. прореживания, М=2 разностная задержка. Bin= 18 бит, Bout =10 бит.
Согласно приведенной в статье методики: для первого фильтра имеем следующие разрядности в промежуточных каскадах: 1 каскад = 26 бит, 2-ой =21 бит,
3-й = 16 бит, 4-й = 14 бит, 5-й = 13, 6-й = 12 бит.
для второго фильтра имеем такие же результаты, но первый фильтр работает правильно, второй нет.
Возникает вопрос ПОЧЕМУ? Для первого фильтра максимальная разрядность 1-го интегратора вычисляется по формуле Bint1=Bin + N*log2(R*M) = 8 + 3*log2(64)= 26 бит.
Для второго 20 + 3*log2(64) = 38 бит из которых мы учитываем только 26 старших (согласно Хогенауеру). Так вот я хотел спросить у знающих
людей: можно ли пользоваться данной методикой когда входная разрядность больше выходной. У Altera ядро работает корректно в обоих случаях. У меня нет.
Go to the top of the page
 
+Quote Post
Maverick
сообщение Jan 15 2015, 20:01
Сообщение #5


я только учусь...
******

Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839



Цитата(PavPro @ Jan 15 2015, 21:51) *
Ну делать подбор усечения в каждом каскаде с последующим моделированием это слишком расточительно по времени. Я спрашивал про методику усечения описываемую Хогенауером. Согласно этой методики, можно заранее вычислить сколько бит и в каком каскаде можно отбрасывать с минимальным ущербом для конечного результата.
Другое дело что фильтр перестает правильно работать, когда разрядность входных данных больше чем выходных.
К примеру: есть два трехкаскадных фильтра: 1)N=3 кол-во секций, R=32 коэфФ. прореживания, М=2 разностная задержка. Bin= 8 бит, Bout =10 бит.
2)N=3 кол-во секций, R=32 коэфФ. прореживания, М=2 разностная задержка. Bin= 18 бит, Bout =10 бит.
Согласно приведенной в статье методики: для первого фильтра имеем следующие разрядности в промежуточных каскадах: 1 каскад = 26 бит, 2-ой =21 бит,
3-й = 16 бит, 4-й = 14 бит, 5-й = 13, 6-й = 12 бит.
для второго фильтра имеем такие же результаты, но первый фильтр работает правильно, второй нет.
Возникает вопрос ПОЧЕМУ? Для первого фильтра максимальная разрядность 1-го интегратора вычисляется по формуле Bint1=Bin + N*log2(R*M) = 8 + 3*log2(64)= 26 бит.
Для второго 20 + 3*log2(64) = 38 бит из которых мы учитываем только 26 старших (согласно Хогенауеру). Так вот я хотел спросить у знающих
людей: можно ли пользоваться данной методикой когда входная разрядность больше выходной. У Altera ядро работает корректно в обоих случаях. У меня нет.

нет Вы меня не поняли...

Цитата
PS СIC фильтр делайте полный без "обрезания" разрядности на каскадах - совет


а потом уже применяете только ко входу СIC фильтра (потому что у Вас интерполирующий) то, что я советовал ранее...

Выбирать значащие биты Вы будете делать столько раз - сколько каскадов фильтров... Никуда не денитесь... sm.gif


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
PavPro
сообщение Jan 15 2015, 20:07
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 127
Регистрация: 24-02-11
Пользователь №: 63 222



Цитата(Maverick @ Jan 16 2015, 00:01) *
нет Вы меня не поняли...



а потом уже применяете только ко входу то, что я советовал ранее...

Ваш метод понятен. Но во первых он основан на эмпирических подходах, что далеко не всегда удобно, а во вторых я все же спрашивал про метод описанный в статье.
У меня есть подозрение что я все таки что то не так: реализую, понимаю или может что-то упустил. Но все равно спасибо!
Фильтр децимирующий.

Сообщение отредактировал PavPro - Jan 15 2015, 20:34
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Art111   Проблемы с реализацией CIC фильтров   Aug 12 2010, 10:54
- - des00   Цитата(Art111 @ Aug 12 2010, 05:54) Фильт...   Aug 12 2010, 11:12
- - DmitryR   Цитата(Art111 @ Aug 12 2010, 14:54) И пос...   Aug 12 2010, 11:17
|- - rloc   Для начала подайте на вход дельта-импульс (в данно...   Aug 12 2010, 12:15
|- - Art111   Цитата(rloc @ Aug 12 2010, 16:15) Для нач...   Aug 13 2010, 05:29
|- - rloc   Цитата(Art111 @ Aug 13 2010, 09:29) А я н...   Aug 16 2010, 15:26
- - alex_os   Цитата(Art111 @ Aug 12 2010, 14:54) Пробл...   Aug 13 2010, 06:41
|- - Art111   Цитата(alex_os @ Aug 13 2010, 10:41) 12 с...   Aug 13 2010, 07:11
||- - alex_os   Цитата(Art111 @ Aug 13 2010, 11:11) А вы ...   Aug 13 2010, 08:05
||- - 729   Цитата(Art111 @ Aug 13 2010, 11:11) А вы ...   Aug 13 2010, 08:25
|- - DmitryR   Цитата(alex_os @ Aug 13 2010, 10:41) 12 с...   Aug 13 2010, 07:17
|- - Art111   А есть люди, на форуме, которые CIC писали руками?   Aug 13 2010, 07:27
|- - DmitryR   Я FIR писал, это сложнее.   Aug 13 2010, 07:34
||- - Art111   Цитата(DmitryR @ Aug 13 2010, 11:34) Я FI...   Aug 13 2010, 07:53
||- - DmitryR   Цитата(Art111 @ Aug 13 2010, 11:53) Разни...   Aug 13 2010, 08:42
||- - 729   Цитата(DmitryR @ Aug 13 2010, 12:42) Обра...   Aug 13 2010, 08:47
|- - des00   Цитата(Art111 @ Aug 13 2010, 02:27) А ест...   Aug 13 2010, 08:18
|- - Art111   Цитата(des00 @ Aug 13 2010, 12:18) интегр...   Aug 13 2010, 08:57
- - hobgoblin   Цитата(Art111 @ Aug 13 2010, 11:11) А вы ...   Aug 13 2010, 07:36
|- - Art111   Цитата(hobgoblin @ Aug 13 2010, 11:36) Не...   Aug 13 2010, 07:47
- - hobgoblin   ЦитатаЕстественно, компенсационник на выходе CIC б...   Aug 13 2010, 07:53
- - hobgoblin   Почему бы просто не не сгенерировать код из матлаб...   Aug 13 2010, 08:05
- - vadimuzzz   тут смотрели? я по Хогенауэру делал, но не помню, ...   Jan 16 2015, 00:31


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 22:10
Рейтинг@Mail.ru


Страница сгенерированна за 0.01454 секунд с 7
ELECTRONIX ©2004-2016