Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблемы с реализацией CIC фильтров
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
Art111
Добрый день!
Проблема в следующем. Требуется реализовать 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;
des00
Цитата(Art111 @ Aug 12 2010, 05:54) *
Фильтр надо как-то отлаживать. Проверить результат. Также буду очень признателен, если кто-нибудь скажет как лучше проверить, что он работает.

В симулинк его запихиваете, ставите рядом такой же симулинковский и отлаживаете. Там и посмотрите правильно вы сделали или нет %)
DmitryR
Цитата(Art111 @ Aug 12 2010, 14:54) *
И последее. Фильтр надо как-то отлаживать. Проверить результат. Также буду очень признателен, если кто-нибудь скажет как лучше проверить, что он работает.

Я думаю с помощью Matlab. Ставите референсный CIC, рядом - свой HDL код, подаете некий паттерн и сравниваете выходы.
rloc
Для начала подайте на вход дельта-импульс (в данном случае импульс большой амплитуды и длительностью в один период поступления входных данных) и сравните на выходе с импульсной характеристикой фильтра.
Art111
Цитата(rloc @ Aug 12 2010, 16:15) *
Для начала подайте на вход дельта-импульс (в данном случае импульс большой амплитуды и длительностью в один период поступления входных данных) и сравните на выходе с импульсной характеристикой фильтра.

А я не знаю импульсной характеристики фильтра. Количество каскадов мне выдал матлаб. И дельта-функция в этом случае мне никак не поможет, это же не КИХ - там, да - все коэффициенты высвечиваются сразу. Но не в нашем случае с CIC. Спасибо!
alex_os
Цитата(Art111 @ Aug 12 2010, 14:54) *
Проблема в следующем. Требуется реализовать CIC фильтр в 12 секций с децимацией, к примеру 10.

12 секций это 12-го порядка чтоли !?? Если так, то это фантастика smile.gif.
Art111
Цитата(alex_os @ Aug 13 2010, 10:41) *
12 секций это 12-го порядка чтоли !?? Если так, то это фантастика smile.gif.

А вы не могли бы пояснить, в чём конкретно фантастичность задачи?
У нас следующая задача. Нужно сделать слудующий филтр: децимация 3, полоса пропускания 8 МГц, частота сэмплирования 100 МГц, затухание 110 Дб. Матлаб при расчёте фильтра с данными параметрами выдал 12 каскадов..
DmitryR
Цитата(alex_os @ Aug 13 2010, 10:41) *
12 секций это 12-го порядка чтоли !?? Если так, то это фантастика smile.gif.

12 секций - это 12 секций. Альтера умеет генерить такие, так что никакой фантастики тут нет. Просто у Xilinx корка почему-то ограничена шестью секциями.
Art111
А есть люди, на форуме, которые CIC писали руками?
DmitryR
Я FIR писал, это сложнее.
hobgoblin
Цитата(Art111 @ Aug 13 2010, 11:11) *
А вы не могли бы пояснить, в чём конкретно фантастичность задачи?
У нас следующая задача. Нужно сделать слудующий филтр: децимация 3, полоса пропускания 8 МГц, частота сэмплирования 100 МГц, затухание 110 Дб. Матлаб при расчёте фильтра с данными параметрами выдал 12 каскадов..

Не то чтобы фантастично, но как то не очень оптимально. Неравномерность в полосе пропускания у Вас на выходе будет около 10 дБ и рост разрядности, если не использовать Hogenauer pruning, 20 бит.
Писать CIC фильтр с нуля, понимая как он работает, требуется ну полчаса максимум. Можно взять и сгенерировать код прямо в Matlab, но его придется немного ручками править.
Art111
Цитата(hobgoblin @ Aug 13 2010, 11:36) *
Не то чтобы фантастично, но как то не очень оптимально. Неравномерность в полосе пропускания у Вас на выходе будет около 10 дБ и рост разрядности, если не использовать Hogenauer pruning, 20 бит.
Писать CIC фильтр с нуля, понимая как он работает, требуется ну полчаса максимум. Можно взять и сгенерировать код прямо в Matlab, но его придется немного ручками править.

Естественно, компенсационник на выходе CIC будет стоять..
hobgoblin
Цитата
Естественно, компенсационник на выходе CIC будет стоять..

нужно ли городить огород, может просто одним децимирующим FIR фильтром можно обойтись.

Art111
Цитата(DmitryR @ Aug 13 2010, 11:34) *
Я FIR писал, это сложнее.

я FIR тоже писал аж 2 способами и сравнивал их с IP-шными - резулттаты совпадали. А вот с CIC столкнулся впервые.
Вроде, всё как в описании делаю. Сначала смещаю на нужное количетсво каскадов, всё суммирую, потом провожу понижение частоты, смещаю, вычитаю, выдаю.
Разница с матлабовской моделью небольшая, у них в реакции на дельту нет отрицательных значений. У меня же есть. А ядро вообще выдаёт полную лажу во всём разрядном диапазонеsad.gif(
hobgoblin
Почему бы просто не не сгенерировать код из матлаба и не посмотреть как он устроен. Можно еще автоматом модельку симулинковскую сгенерить, построенную из стандартных блоков. Если не знаете как это делается, то код генерится из объекта mfilt функцией generatehdl(), а модель - функцией realizemdl().
alex_os
Цитата(Art111 @ Aug 13 2010, 11:11) *
А вы не могли бы пояснить, в чём конкретно фантастичность задачи?
У нас следующая задача. Нужно сделать слудующий филтр: децимация 3, полоса пропускания 8 МГц, частота сэмплирования 100 МГц, затухание 110 Дб. Матлаб при расчёте фильтра с данными параметрами выдал 12 каскадов..


Никто не запрещает сделать CIC 12го порядка но
1) СIC дециматор в 10 раз 12го порядка будет уметь усиление 10^12 это потребует максимальную разрядность
в фильтре = число_разрядов_АЦП + 40
2) Полоса пропускания ну очень кривая будет (представляете sinc(x)^12 )
3) Почитайте описание микросхем DDC , врядли там найдете СIC больше 5го порядка.

p.s. Для Вашей задачи лучше всего FIR будет или CIC + FIR

des00
Цитата(Art111 @ Aug 13 2010, 02:27) *
А есть люди, на форуме, которые CIC писали руками?

интеграторы неправильно сделали, нарисуйте реализацию сic фильтра в симулинке и наложите ее на свое железо. увидите разницу %)

и разрядность у вас не правильно выбрана, работать не будет. учите матчасть.

Цитата(alex_os @ Aug 13 2010, 03:05) *
Для Вашей задачи лучше всего FIR будет или CIC + FIR

+1. Тем более что полоса фиксирована и всё равно будете ставить компенсационный FIR %)
729
Цитата(Art111 @ Aug 13 2010, 11:11) *
А вы не могли бы пояснить, в чём конкретно фантастичность задачи?
У нас следующая задача. Нужно сделать слудующий филтр: децимация 3, полоса пропускания 8 МГц, частота сэмплирования 100 МГц, затухание 110 Дб. Матлаб при расчёте фильтра с данными параметрами выдал 12 каскадов..

Вам подойдет и 11-го порядка CIC - неравномерность на краю полосы (на 8 МГц) -8.21дБ, максимальная помеха от децимации на краю полосы -108дБ.

Прошу прощения - почему-то сначала увидел 100 дБ максимальной помехи. Действительно, только 12-ый порядок подойдет.
DmitryR
Цитата(Art111 @ Aug 13 2010, 11:53) *
Разница с матлабовской моделью небольшая

Обратите пристальное внимание на то, как вы делаете округление. Меня всегда ошибки преследовали именно в этом.
729
Цитата(DmitryR @ Aug 13 2010, 12:42) *
Обратите пристальное внимание на то, как вы делаете округление. Меня всегда ошибки преследовали именно в этом.

Мы не делали округление, а просто отбрасывали, что вело к появлению некоторой постоянки. Но её легко замерить, а потом вычесть - работает вполне прилично.

Art111
Цитата(des00 @ Aug 13 2010, 12:18) *
интеграторы неправильно сделали, нарисуйте реализацию сic фильтра в симулинке и наложите ее на свое железо. увидите разницу %)

и разрядность у вас не правильно выбрана, работать не будет. учите матчасть.


+1. Тем более что полоса фиксирована и всё равно будете ставить компенсационный FIR %)


C замечанием согласен. Исправлю, получившийся код выложу! Про разрядность - взял наобум. Потом планировал отрезать совсем другие разряды. Спасибо!
rloc
Цитата(Art111 @ Aug 13 2010, 09:29) *
А я не знаю импульсной характеристики фильтра. Количество каскадов мне выдал матлаб. И дельта-функция в этом случае мне никак не поможет, это же не КИХ - там, да - все коэффициенты высвечиваются сразу. Но не в нашем случае с CIC. Спасибо!

Вы глубоко заблуждаетесь, CIC фильтр эквивалентен N каскадам КИХ фильтров с прямоугольной импульсной характеристикой, соединенных последовательно (разница только в физической реализации). А суммарная импульсная характеристика фильтра определяется как свертка всех импульсных характеристик последовательно соединенных каскадов. Для примера, импульсная характеристика 2-х каскадов - равнобедренный треугольник, 3-х каскадов - параболический вид (сложно в уме прикинуть) и т.д.
PavPro
Хотелось бы прояснить для себя следующий момент касаемо в части реализации 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.). Согласно алгоритму в данной статье, фильтр работает при разрядности входных данных меньшей чем разрядность выходных. В противном случае моделирование показывает что фильтр работает неправильно! Есть соображение, что когда разрядность входных данных больше чем выходных, отбрасывать младшие биты в интеграторах вообще нельзя. Так ли это, или я ошибаюсь?
Заранее благодарен за ответы.
Maverick
Цитата(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 фильтр, но думаю в Вашем случае (интерполяции) все аналогично с точность до наоборот...
PavPro
Цитата(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 ядро работает корректно в обоих случаях. У меня нет.
Maverick
Цитата(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
PavPro
Цитата(Maverick @ Jan 16 2015, 00:01) *
нет Вы меня не поняли...



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

Ваш метод понятен. Но во первых он основан на эмпирических подходах, что далеко не всегда удобно, а во вторых я все же спрашивал про метод описанный в статье.
У меня есть подозрение что я все таки что то не так: реализую, понимаю или может что-то упустил. Но все равно спасибо!
Фильтр децимирующий.
vadimuzzz
тут смотрели? я по Хогенауэру делал, но не помню, в каких условиях проверял
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.