|
Проблемы с реализацией CIC фильтров |
|
|
|
Aug 12 2010, 10:54
|
Группа: Новичок
Сообщений: 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;
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 27)
|
Aug 13 2010, 05:29
|
Группа: Новичок
Сообщений: 9
Регистрация: 12-08-10
Пользователь №: 58 875

|
Цитата(rloc @ Aug 12 2010, 16:15)  Для начала подайте на вход дельта-импульс (в данном случае импульс большой амплитуды и длительностью в один период поступления входных данных) и сравните на выходе с импульсной характеристикой фильтра. А я не знаю импульсной характеристики фильтра. Количество каскадов мне выдал матлаб. И дельта-функция в этом случае мне никак не поможет, это же не КИХ - там, да - все коэффициенты высвечиваются сразу. Но не в нашем случае с CIC. Спасибо!
|
|
|
|
|
Aug 13 2010, 06:41
|
Знающий
   
Группа: Свой
Сообщений: 521
Регистрация: 12-05-06
Пользователь №: 17 030

|
Цитата(Art111 @ Aug 12 2010, 14:54)  Проблема в следующем. Требуется реализовать CIC фильтр в 12 секций с децимацией, к примеру 10. 12 секций это 12-го порядка чтоли !?? Если так, то это фантастика  .
--------------------
ну не художники мы...
|
|
|
|
|
Aug 13 2010, 07:11
|
Группа: Новичок
Сообщений: 9
Регистрация: 12-08-10
Пользователь №: 58 875

|
Цитата(alex_os @ Aug 13 2010, 10:41)  12 секций это 12-го порядка чтоли !?? Если так, то это фантастика  . А вы не могли бы пояснить, в чём конкретно фантастичность задачи? У нас следующая задача. Нужно сделать слудующий филтр: децимация 3, полоса пропускания 8 МГц, частота сэмплирования 100 МГц, затухание 110 Дб. Матлаб при расчёте фильтра с данными параметрами выдал 12 каскадов..
|
|
|
|
|
Aug 13 2010, 07:27
|
Группа: Новичок
Сообщений: 9
Регистрация: 12-08-10
Пользователь №: 58 875

|
А есть люди, на форуме, которые CIC писали руками?
|
|
|
|
|
Aug 13 2010, 07:36
|

Местный
  
Группа: Свой
Сообщений: 202
Регистрация: 2-10-06
Из: Петербург
Пользователь №: 20 881

|
Цитата(Art111 @ Aug 13 2010, 11:11)  А вы не могли бы пояснить, в чём конкретно фантастичность задачи? У нас следующая задача. Нужно сделать слудующий филтр: децимация 3, полоса пропускания 8 МГц, частота сэмплирования 100 МГц, затухание 110 Дб. Матлаб при расчёте фильтра с данными параметрами выдал 12 каскадов.. Не то чтобы фантастично, но как то не очень оптимально. Неравномерность в полосе пропускания у Вас на выходе будет около 10 дБ и рост разрядности, если не использовать Hogenauer pruning, 20 бит. Писать CIC фильтр с нуля, понимая как он работает, требуется ну полчаса максимум. Можно взять и сгенерировать код прямо в Matlab, но его придется немного ручками править.
|
|
|
|
|
Aug 13 2010, 07:47
|
Группа: Новичок
Сообщений: 9
Регистрация: 12-08-10
Пользователь №: 58 875

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

Местный
  
Группа: Свой
Сообщений: 202
Регистрация: 2-10-06
Из: Петербург
Пользователь №: 20 881

|
Цитата Естественно, компенсационник на выходе CIC будет стоять.. нужно ли городить огород, может просто одним децимирующим FIR фильтром можно обойтись.
|
|
|
|
|
Aug 13 2010, 07:53
|
Группа: Новичок
Сообщений: 9
Регистрация: 12-08-10
Пользователь №: 58 875

|
Цитата(DmitryR @ Aug 13 2010, 11:34)  Я FIR писал, это сложнее. я FIR тоже писал аж 2 способами и сравнивал их с IP-шными - резулттаты совпадали. А вот с CIC столкнулся впервые. Вроде, всё как в описании делаю. Сначала смещаю на нужное количетсво каскадов, всё суммирую, потом провожу понижение частоты, смещаю, вычитаю, выдаю. Разница с матлабовской моделью небольшая, у них в реакции на дельту нет отрицательных значений. У меня же есть. А ядро вообще выдаёт полную лажу во всём разрядном диапазоне  (
|
|
|
|
|
Aug 13 2010, 08:05
|
Знающий
   
Группа: Свой
Сообщений: 521
Регистрация: 12-05-06
Пользователь №: 17 030

|
Цитата(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
--------------------
ну не художники мы...
|
|
|
|
|
Aug 13 2010, 08:18
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
Цитата(Art111 @ Aug 13 2010, 02:27)  А есть люди, на форуме, которые CIC писали руками? интеграторы неправильно сделали, нарисуйте реализацию сic фильтра в симулинке и наложите ее на свое железо. увидите разницу %) и разрядность у вас не правильно выбрана, работать не будет. учите матчасть. Цитата(alex_os @ Aug 13 2010, 03:05)  Для Вашей задачи лучше всего FIR будет или CIC + FIR +1. Тем более что полоса фиксирована и всё равно будете ставить компенсационный FIR %)
--------------------
|
|
|
|
|
Aug 13 2010, 08:25
|
Местный
  
Группа: Участник
Сообщений: 312
Регистрация: 21-10-05
Пользователь №: 9 952

|
Цитата(Art111 @ Aug 13 2010, 11:11)  А вы не могли бы пояснить, в чём конкретно фантастичность задачи? У нас следующая задача. Нужно сделать слудующий филтр: децимация 3, полоса пропускания 8 МГц, частота сэмплирования 100 МГц, затухание 110 Дб. Матлаб при расчёте фильтра с данными параметрами выдал 12 каскадов.. Вам подойдет и 11-го порядка CIC - неравномерность на краю полосы (на 8 МГц) -8.21дБ, максимальная помеха от децимации на краю полосы -108дБ. Прошу прощения - почему-то сначала увидел 100 дБ максимальной помехи. Действительно, только 12-ый порядок подойдет.
Сообщение отредактировал 729 - Aug 13 2010, 08:39
|
|
|
|
|
Aug 13 2010, 08:47
|
Местный
  
Группа: Участник
Сообщений: 312
Регистрация: 21-10-05
Пользователь №: 9 952

|
Цитата(DmitryR @ Aug 13 2010, 12:42)  Обратите пристальное внимание на то, как вы делаете округление. Меня всегда ошибки преследовали именно в этом. Мы не делали округление, а просто отбрасывали, что вело к появлению некоторой постоянки. Но её легко замерить, а потом вычесть - работает вполне прилично.
|
|
|
|
|
Aug 13 2010, 08:57
|
Группа: Новичок
Сообщений: 9
Регистрация: 12-08-10
Пользователь №: 58 875

|
Цитата(des00 @ Aug 13 2010, 12:18)  интеграторы неправильно сделали, нарисуйте реализацию сic фильтра в симулинке и наложите ее на свое железо. увидите разницу %)
и разрядность у вас не правильно выбрана, работать не будет. учите матчасть.
+1. Тем более что полоса фиксирована и всё равно будете ставить компенсационный FIR %) C замечанием согласен. Исправлю, получившийся код выложу! Про разрядность - взял наобум. Потом планировал отрезать совсем другие разряды. Спасибо!
|
|
|
|
|
Jan 15 2015, 18:27
|
Частый гость
 
Группа: Участник
Сообщений: 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.). Согласно алгоритму в данной статье, фильтр работает при разрядности входных данных меньшей чем разрядность выходных. В противном случае моделирование показывает что фильтр работает неправильно! Есть соображение, что когда разрядность входных данных больше чем выходных, отбрасывать младшие биты в интеграторах вообще нельзя. Так ли это, или я ошибаюсь? Заранее благодарен за ответы.
|
|
|
|
|
Jan 15 2015, 19:18
|

я только учусь...
     
Группа: Модераторы
Сообщений: 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.
"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
|
|
|
|
|
Jan 15 2015, 19:51
|
Частый гость
 
Группа: Участник
Сообщений: 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 ядро работает корректно в обоих случаях. У меня нет.
|
|
|
|
|
Jan 15 2015, 20:01
|

я только учусь...
     
Группа: Модераторы
Сообщений: 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 фильтра (потому что у Вас интерполирующий) то, что я советовал ранее... Выбирать значащие биты Вы будете делать столько раз - сколько каскадов фильтров... Никуда не денитесь...
--------------------
If it doesn't work in simulation, it won't work on the board.
"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
|
|
|
|
|
Jan 15 2015, 20:07
|
Частый гость
 
Группа: Участник
Сообщений: 127
Регистрация: 24-02-11
Пользователь №: 63 222

|
Цитата(Maverick @ Jan 16 2015, 00:01)  нет Вы меня не поняли...
а потом уже применяете только ко входу то, что я советовал ранее... Ваш метод понятен. Но во первых он основан на эмпирических подходах, что далеко не всегда удобно, а во вторых я все же спрашивал про метод описанный в статье. У меня есть подозрение что я все таки что то не так: реализую, понимаю или может что-то упустил. Но все равно спасибо! Фильтр децимирующий.
Сообщение отредактировал PavPro - Jan 15 2015, 20:34
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|