Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: вопрос по выделению нескольких каналов
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
Valentin-k
здравствуйте. у меня даже скорее не вопрос, а поиск совета.

вообщем есть два спартана 6xls9, цап и ацп. основная задумка сделать линию с 8-10 каналами на разных частотах(это основная мысль, есть запасной вариант с двумя частотами).
длительность бита 10 мкс, полоса фильтра взята 90 КГц+30КГц на спад, коэффициенты считались с помощью матлаба, а затем грузились в корку. использую децимацию т.к. иначе не влезают фильтры. частота дискретизации 10 Мгц. частота нижнего канала 450 КГц и далее с шагом 240КГц. частота ПЛИС 100Мгц

так вот, когда в линии связи присутствует 4-5 частот - фильтры выделяют их нормально, а вот когда частот становится больше 7 и начинаются проблемы - частоты каналов выделяются раз на несколько посылок, а то и вовсе не выделяются.
вот и отсюда возник вопрос - реально ли тут добиться результата - не меняя ПЛИС и тп. а если возможно то, может выбранное мной направление решения тупиковое, и есть более интересные варианты? хотя бы направление поиска решения задать.

спасибо
Bad0512
Цитата(Valentin-k @ Oct 22 2014, 02:38) *
здравствуйте. у меня даже скорее не вопрос, а поиск совета.

вообщем есть два спартана 6xls9, цап и ацп. основная задумка сделать линию с 8-10 каналами на разных частотах(это основная мысль, есть запасной вариант с двумя частотами).
длительность бита 100 мкс, полоса фильтра взята 90 КГц+30КГц на спад, коэффициенты считались с помощью матлаба, а затем грузились в корку. использую децимацию т.к. иначе не влезают фильтры. частота дискретизации 10 Мгц. частота нижнего канала 450 КГц и далее с шагом 240КГц. частота ПЛИС 100Мгц

так вот, когда в линии связи присутствует 4-5 частот - фильтры выделяют их нормально, а вот когда частот становится больше 7 и начинаются проблемы - частоты каналов выделяются раз на несколько посылок, а то и вовсе не выделяются.
вот и отсюда возник вопрос - реально ли тут добиться результата - не меняя ПЛИС и тп. а если возможно то, может выбранное мной направление решения тупиковое, и есть более интересные варианты? хотя бы направление поиска решения задать.

спасибо

Вы бы сначала на функциональном уровне свои идеи отладили (Матлаб,Симулинк, далее RTL и функциональная отладка в симуляторе) прежде чем всё это реализовывать в железе. Не исключено что ошибка у вас в алгоритме.
iosifk
Цитата(Valentin-k @ Oct 21 2014, 23:38) *
здравствуйте. у меня даже скорее не вопрос, а поиск совета.

вообщем есть два спартана 6xls9, цап и ацп. основная задумка сделать линию с 8-10 каналами на разных частотах(это основная мысль, есть запасной вариант с двумя частотами).
длительность бита 100 мкс, полоса фильтра взята 90 КГц+30КГц на спад, коэффициенты считались с помощью матлаба, а затем грузились в корку. использую децимацию т.к. иначе не влезают фильтры. частота дискретизации 10 Мгц. частота нижнего канала 450 КГц и далее с шагом 240КГц. частота ПЛИС 100Мгц

Расклад может быть такой. Все фильтры низкочастотные можно обрабатывать одним командоаппаратом. Т.е. считаете, во сколько раз проект в ПЛИС быстрее, чем требуется обработка 1 фильтра. И вот во столько раз можно обработать несколько потоков. Если ВЧ фильтры могут не успеть, то среднечастотные может быть можно успеть обработать по-байтно, а НЧ и вообще побитно...
Я об этом написал в главе "многопоточность"...
bogaev_roman
Цитата(Valentin-k @ Oct 21 2014, 23:38) *
длительность бита 100 мкс, полоса фильтра взята 90 КГц+30КГц на спад, коэффициенты считались с помощью матлаба, а затем грузились в корку. использую децимацию т.к. иначе не влезают фильтры. частота дискретизации 10 Мгц. частота нижнего канала 450 КГц и далее с шагом 240КГц. частота ПЛИС 100Мгц

Вообще лучше модель для начала сделать и все отладить, как Bad0512 советовал.
Вы децимацию как делаете - просто частоту понижаете и все? Если да, то каким образом делаете пересинхронизацию? Обычно CIC - фильтры ставят для этих целей, а далее восстанавливающий ФНЧ.
А так информации вообще мало и лично я вообще ничего не понял. Вы хотите сделать частотное разделение каналов?
Valentin-k
Цитата(Bad0512 @ Oct 22 2014, 09:48) *
Вы бы сначала на функциональном уровне свои идеи отладили (Матлаб,Симулинк, далее RTL и функциональная отладка в симуляторе) прежде чем всё это реализовывать в железе. Не исключено что ошибка у вас в алгоритме.


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

Цитата(bogaev_roman @ Oct 22 2014, 14:41) *
Вообще лучше модель для начала сделать и все отладить, как Bad0512 советовал.
Вы децимацию как делаете - просто частоту понижаете и все? Если да, то каким образом делаете пересинхронизацию? Обычно CIC - фильтры ставят для этих целей, а далее восстанавливающий ФНЧ.
А так информации вообще мало и лично я вообще ничего не понял. Вы хотите сделать частотное разделение каналов?


я использую FIR с децимацией.
в принципе частотное разделение каналов

вообще в данный момент у меня есть мысли про использование FFT, а в частности алгоритм Герцеля читаю, но не уверен что будет успевать, да и хватит ли 90 точек
Самурай
Цитата(Valentin-k @ Oct 21 2014, 23:38) *
...
так вот, когда в линии связи присутствует 4-5 частот - фильтры выделяют их нормально, а вот когда частот становится больше 7 и начинаются проблемы - частоты каналов выделяются раз на несколько посылок, а то и вовсе не выделяются.

спасибо


Походу, Вы где-то про нормирование забыли. Каналы добавили -> диапазон сигнала увеличился - > АЦП/ЦАП в насыщение/переполнение улетели.

Еще интересно: а как Вы в приемнике каждый канал в ноль скидываете?sm.gif Про явный перенос по частоте ничего не видно. Или у Вас только косвенный перенос за счет децимирования работает? Уверены, что правильно все частоты выбрали?
Valentin-k
Цитата(Самурай @ Oct 22 2014, 18:33) *
Походу, Вы где-то про нормирование забыли. Каналы добавили -> диапазон сигнала увеличился - > АЦП/ЦАП в насыщение/переполнение улетели.

Еще интересно: а как Вы в приемнике каждый канал в ноль скидываете?sm.gif Про явный перенос по частоте ничего не видно. Или у Вас только косвенный перенос за счет децимирования работает? Уверены, что правильно все частоты выбрали?


о переносе частоты мысли были, но пока не пробовал реализовать. а вот что значит правильно? я старался подбирать частоты чтобы не были кратными, нижнюю частоту выбирал исходя из того чтобы в длину единичной информационной посылки влезло 5-6 периодов. а вот в ноль я не скидываю, как то об этом не задумывался
а на счет переполнения не совсем понял, сигнал на входе АЦП по амплитуде не изменяется от того сколько каналов. я рассчитал таблички для периода синусоиды на каждой частоте, но с одинаковым шагом, и на цап подаю суммарный код деленный на кол-во присутствующих каналов. - этот расчет проверен и в матлабе и в экселе и на осциллографе.
bogaev_roman
Цитата(Valentin-k @ Oct 22 2014, 19:22) *
я использую FIR с децимацией.
в принципе частотное разделение каналов

вообще в данный момент у меня есть мысли про использование FFT, а в частности алгоритм Герцеля читаю, но не уверен что будет успевать, да и хватит ли 90 точек


Еще раз - с какой частотой у Вас данные собираются после АЦП, на какой частоте работает фльтр, фильтр имеет собственную частоту или используется чип енэйбл (ce)? Временные ограничения прописываете?
В зависимости от ответов ситуаций может быть масса, нопример, данные после АЦП идут на частоте 100МГЦ и Вы берете каждый десятый отсчет и напрямую загоняете в фильтр, не прописывая ограничений - в этом случае будет сразу три ошибки - нет пересинхронизации при переходе от 100 к 10МГц и возможны гонки сигналов, нет ограничений и тоже не гарантируется правильная работа в принципе, беря каждый 10 отсчет будете хватать мусор и побочные гармоники.
Насчет БПФ - стоит вставить для того, чтобы посмотреть спектр входного сигнала (если другого способа нет посмотреть спектр после выхода АЦП), используйте готовую корку для начала и грамотно возьмите кол-во точек. В реальности БПФ - дорогое удовольствие.
В конкретно Вашем случае скорее всего подойдет классическая схема - на каждый канал ставить NCO на входе, потом цепочка из гребенчатых фильтров и ФНЧ на срез двойной частоты для переноса в ноль ну и ФАПЧ с обратной связью, но это уже надо писать в раздел по ЦОС, там другие спецы.
Valentin-k
Цитата(bogaev_roman @ Oct 22 2014, 20:32) *
Еще раз - с какой частотой у Вас данные собираются после АЦП, на какой частоте работает фльтр, фильтр имеет собственную частоту или используется чип енэйбл (ce)? Временные ограничения прописываете?
В зависимости от ответов ситуаций может быть масса, нопример, данные после АЦП идут на частоте 100МГЦ и Вы берете каждый десятый отсчет и напрямую загоняете в фильтр, не прописывая ограничений - в этом случае будет сразу три ошибки - нет пересинхронизации при переходе от 100 к 10МГц и возможны гонки сигналов, нет ограничений и тоже не гарантируется правильная работа в принципе, беря каждый 10 отсчет будете хватать мусор и побочные гармоники.
Насчет БПФ - стоит вставить для того, чтобы посмотреть спектр входного сигнала (если другого способа нет посмотреть спектр после выхода АЦП), используйте готовую корку для начала и грамотно возьмите кол-во точек. В реальности БПФ - дорогое удовольствие.
В конкретно Вашем случае скорее всего подойдет классическая схема - на каждый канал ставить NCO на входе, потом цепочка из гребенчатых фильтров и ФНЧ на срез двойной частоты для переноса в ноль ну и ФАПЧ с обратной связью, но это уже надо писать в раздел по ЦОС, там другие спецы.


в данный момент я опрашиваю АЦП с частотой 10 МГц, в корке фильтра дискретизацию задаю 10 МГц, а частоту тактирования 100МГц, временных ограничений не прописывал.
Valentin-k
вообщем попытка реализовать Герцеля не очень удалась, но причину пока найти не могу.
расчет, в том числе и целочисленный в экселе дает нужный результат, но тут получается ерунда...

CODE
entity gertsel is
Port ( reset : in STD_LOGIC;
clk : in STD_LOGIC;
x : in STD_LOGIC_VECTOR (9 downto 0);
en : in STD_LOGIC;
y : out STD_LOGIC_VECTOR (9 downto 0));
end gertsel;

architecture arc_gertsel of gertsel is
constant coeff0:signed(10 downto 0):=to_signed(485,11);--integer range 0 to 1024;
signal n: integer range 0 to 35;
signal q0:signed(10 downto 0);--integer range 0 to 2048;
signal q1:signed(10 downto 0);--integer range 0 to 2048;
signal q2:signed(10 downto 0);--integer range 0 to 2048;
signal input:signed(9 downto 0);--integer range 0 to 1024;
signal output:signed(9 downto 0);--integer range 0 to 1024;
signal mul1: signed(26 downto 0);
signal mul2: signed(31 downto 0);
signal mul3: signed(31 downto 0);
signal mul4: signed(42 downto 0);
signal sum1: signed(42 downto 0);
begin
process(clk)
begin
if(rising_edge(clk)) then
if(reset='1') then
n<=0;
--q0<=0;
--q1<=0;
--q2<=0;
--coeff0<=879;
--output<=0;
q0<=(others=>'0');
q1<=(others=>'0');
q2<=(others=>'0');
mul1<=(others=>'0');
mul2<=(others=>'0');
mul3<=(others=>'0');
mul4<=(others=>'0');
sum1<=(others=>'0');
input<=(others=>'0');
output<=(others=>'0');
else
--********************************
if(en='1' and clk='1') then
input<=signed(x);--to_INTEGER(unsigned(x(9 downto 0)));
--input<=input-to_signed(511,10);
n<=n+1;
q2<=q1;
q1<=q0;
end if;
mul1<=(coeff0*q1)/1024;
q0<=mul1(9 downto 0)+input-511-q2;
if(n=36 ) then
n<=n+1;
mul2<=q1*q1/1024;
mul3<=q2*q2/1024;
mul4<=coeff0*q1*q1/1024;
sum1<=(mul2+mul3-mul4);

output(9 downto 0)<=sum1(9 downto 0);
y<=std_logic_vector(output);
end if;
if(n=37) then
q1<=(others=>'0');
q2<=(others=>'0');
end if;

--********************************
end if;
end if;
end process;

end arc_gertsel;
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.