Перейти к содержанию
    

Согласованный фильтр, ФИФО с отводами и т.д.

Здравствуйте!

 

Сейчас остановился на согласованном фильтре, 100 чипов, 2x оверсамплинг - т.е. посути 200 получипов.

 

Появились несколько вопросов:

 

1) Как коэффициенты хранить/использовать?

2) Как использовать LUT в SliceM в Спартан6? Я так понял, что надо описывать как регистр сдвига, не используя Reset.

 

Спасибо!

 

PS Сейчас буду второй раз читать xapp212 - с первого чот суть реализации не уловил...может вопросы и отпадут)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если использовать SLRC32E (в Spartan6) и Inverse FIR structure, при этом оверсамплинг 2х.

Как это описывать чтобы задейстовать SLRC32E(SLR16E) как в документе?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чтобы втянутся в тему, начал с данного примера (хотя он и не правильный СФ):

MF_1.JPG

 

Код:

module MF(Clock, Input, Output);
    
input Clock;
input Input;  

output Output;

reg coef [0:6];
reg [2:0] sum [0:6]; 

initial
    begin
        coef[0] = 1;
        coef[1] = 0;
        coef[2] = 1;
        coef[3] = 1;
        coef[4] = 1;
        coef[5] = 0;
        coef[6] = 0;
        
        sum[0] = 0;
        sum[1] = 0;
        sum[2] = 0;
        sum[3] = 0;
        sum[4] = 0;
        sum[5] = 0;
        sum[6] = 0;
    end

integer i;

always @(posedge Clock)
    begin
        for(i = 0; i < 7; i = i + 1)
            begin 
                if(i == 0)
                    begin
                        sum[i] <= Input & coef[i];
                    end
                else 
                    begin
                        sum[i] <= sum[i - 1] + Input & coef[i]; 
                       end
            end
            
    end

assign Output = sum[6];
    
endmodule

 

Логика такая, на вход поступает символ, он умножается на все коэффициенты (я И делаю - для примера) и складывается. При это прибавляется значение на предыдцщем сумматоре.

Может неправильно описал...почему-то неправильно работает...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может неправильно описал...почему-то неправильно работает...

 

FIR на цепи сумматоров

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сенк!

 

Все таки надо вначале вычислить значения после умножания на коэффициенты...

 

Так норм вроде:

 

module MF(Clock, Input, Output);
    
input Clock;
input Input;  

output [2:0] Output;

reg coef [0:6];
reg res [0:6];
reg [2:0] sum [0:6]; 

initial
    begin
        coef[0] = 1;
        coef[1] = 0;
        coef[2] = 1;
        coef[3] = 1;
        coef[4] = 1;
        coef[5] = 0;
        coef[6] = 0;

        res[0] = 0;
        res[1] = 0;
        res[2] = 0;
        res[3] = 0;
        res[4] = 0;
        res[5] = 0;
        res[6] = 0;
        
        sum[0] = 0;
        sum[1] = 0;
        sum[2] = 0;
        sum[3] = 0;
        sum[4] = 0;
        sum[5] = 0;
        sum[6] = 0;
    end

integer i;

always @(posedge Clock)
    begin
        for(i = 0; i < 7; i = i + 1)
            begin
                 res[i] <= Input & coef[i];
            end
        
        for(i = 0; i < 7; i = i + 1)
            begin 
                if(i == 0)
                    begin
                        sum[i] <= res[i];
                    end
                else 
                    begin
                        sum[i] <= sum[i - 1] + res[i]; 
                       end
            end
            
    end

assign Output = sum[6];
    
endmodule

 

Получил то, что и ожидал :)

mf_2.JPG

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Согласованный фильтр вроде как по-другому немного делается в классическом варианте, с него бы и начали...

out=Sum(input*coeff). Где входной сигнал записывается в сдвиговый регистр и каждое значение перемножается на свой коэффициент.

У Вас коэффициент одноразрядный же, берете сигнал Input (0 или 1) и ксорите его с коэффициентом (0 или 1).

В данном случае размах сигнала будет по диапазону в два раза меньше чем при перемножении.

Если хотите диапазон таким же оставить, то замените умножение на простейшую логику с мультиплексорами.

 

module MF(Clock, Input, Output);
    
input Clock;
input Input;  

output [2:0] Output;

parameter [6:0] coef =7'b1011100;
reg [6:0] reg_input;

integer i;
reg [6:0] res;

always @(posedge Clock)
reg_input<={input, reg_input[6:1]}

always @(*)
        for(i = 0; i < 6; i = i + 1)
                 res[i] = reg_input[i] ^ coef[i];
        
assign Output = ((res[0]+res[1])+(res[2]+res[3]))+((res[4]+res[5])+res[6]);
    
endmodule

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У Вас коэффициент одноразрядный же, берете сигнал Input (0 или 1) и ксорите его с коэффициентом (0 или 1).

А почему нужно ксорить?

Разве умножение на 1 - то же, что проинвертировать сигнал?

А умножить на 0 - оставить сигнал без изменений?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А почему нужно ксорить?

Разве умножение на 1 - то же, что проинвертировать сигнал?

А умножить на 0 - оставить сигнал без изменений?

А это уже надо на конкретную плисину смотреть, что выгодней. Вы предлагаете, я так понял, сделать мультиплексор с описанием, типа:

if (input[i]) out[i]<=~coef[i];
else out[i]<=coef[i];

Ну просто мне, например, кажется что в общем случае по ресурсам выгодней использовать один XOR или XNOR нежели мультиплексор и инвертор, но могу ошибаться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...Вы предлагаете, я так понял, сделать мультиплексор...

Я предлагаю делать то, что требуется от фильтра. Где нужно умножить на 0 - не передавать ничего, где нужно умножить на 1 - передать, как есть. Если бы нужно было умножить на -1 - проинвертировать :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Где нужно умножить на 0 - не передавать ничего, где нужно умножить на 1 - передать, как есть.
, я же предлагал заменить мультиплексор вентилем XOR, утверждая что это будет менее ресурсоемким (хотя зависит от конкретной плисины).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Попробуйте посчитать нарисованный на картинке фильтр по вашему алгоритму.

У меня не получилось пика корреляции. С каким порогом будете сравнивать?

У Вас получается не "нужно прибавлять единицу, или нет", а "прибавить единицу или отнять".

upd. Нет, пожалуй, и не так - как-то "размазывается" по времени, точнее не подберу слова.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

to ViKo

Я уже упоминал несколькими постами выше, что это не классическая структура. Она будет классической, если все линии задержки перенести в верхнюю линию, а из кучи сумматоров сделать один общий по всем отводам. Приведенный мною код именно под классическую схему.

У меня не получилось пика корреляции. С каким порогом будете сравнивать?

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

У Вас получается не "нужно прибавлять единицу, или нет", а "прибавить единицу или отнять".

Ну и в каком месте Вы это увидели?

always @(*)
        for(i = 0; i < 6; i = i + 1)
                 res[i] = reg_input[i] ^ coef[i];
        
assign Output = ((res[0]+res[1])+(res[2]+res[3]))+((res[4]+res[5])+res[6]);

Если сигналы одноразрядные, то да - нужно прибавлять единицу, или нет. Если двухразрядные, то прибавить единицу или отнять от общей суммы. Именно так по моим представлениям и должен работать согласованный фильтр. И, по моим представлениям, совпал сигнал с эталоном или нет можно с помощью мультиплексора:

case({input[i],coeff[i])}
2'b11:sum[i]<=1'b1;
2'b00:sum[i]<=1'b1;
default:sum[i]<=1'b0;
endcase

Или с помощью XNOR

Насчет приведенной схемы - да, это фильтр, но не согласованный. И будет согласованным, если на схеме кружочки трактовать не как умножить на 1 или 0, а как суммирование по модулю два со значениями в центре круга.

PS Код свой не проверял, симулятор полетел, проверю - доложу, если и ошибся то в мелочи, таких схем на ловлю ПШС уже много делал...

Изменено пользователем bogaev_roman

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Верно, будет работать фильтр и на xor. Только пик пойдет вниз, к нулю. Когда входная последовательность совпадает с коэффициентами фильтра, все xor дадут 0, и сумма станет равна 0.

В-принципе, что xor, что !xor, что and дают одинаковую разницу на выходе фильтра между отсутствием сигнала и присутствием. Вы правы. И на ПЛИС реализация тоже одинаковая - все равно через LUT пропускать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я предлагаю делать то, что требуется от фильтра. Где нужно умножить на 0 - не передавать ничего, где нужно умножить на 1 - передать, как есть. Если бы нужно было умножить на -1 - проинвертировать :)
Если входной сигнал у фильта знаковый, то в опорной последовательности 0 означает +1, а 1 -- -1. Соответственно, отсчёт сигнала либо прибавляется, либо вычитается. Иначе корреляционного пика вы не получите.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Согласованный фильтр вроде как по-другому немного делается в классическом варианте, с него бы и начали...

out=Sum(input*coeff). Где входной сигнал записывается в сдвиговый регистр и каждое значение перемножается на свой коэффициент.

У Вас коэффициент одноразрядный же, берете сигнал Input (0 или 1) и ксорите его с коэффициентом (0 или 1).

В данном случае размах сигнала будет по диапазону в два раза меньше чем при перемножении.

Если хотите диапазон таким же оставить, то замените умножение на простейшую логику с мультиплексорами.

Ага...надо было с класического, не подумал. Это пример только для начала, чтобы посмтортеть работу.

 

Теперь насчет самого СФ: пока непонятно сколько свободных ресурсов на кристалле остается - решили брать только знак, 0 - положит. , 1 - отрицат. (или наоборот сделать как в Варакине) (пройгрышь 2 дБ по сравнению с бесконечностью)

MF_varak.JPG

 

 

Если смотерть на ЛСФ, который в книгах описывается, там использвуется 1 и -1. И там значения получаются и положит, и отрицательные.

 

Примеры из Simulink. (токо это не преамбула - просто избавление от расширения спектра)

Pream.JPG

на%20выходе%20СФ.JPG

Преамбула вот:

preamble.JPG

pream_dia.JPG

 

Я вот не знаю, ДСФ норм если оставить, или лучше заюзать SL32С и несколько разрядов, именно по ресурасм. Ведь с помощью SL32С можно в перспективе работать)

 

ЗЫ:

 

Немного исправил код:

module MF(Clock, Input, Output);
    
input Clock;
input Input;  

output [2:0] Output;

reg [6:0] coef =7'b0011101;
reg [6:0] reg_input = 0;

integer i;
reg [6:0] res = 0;

always @(posedge Clock)
reg_input <= {Input, reg_input[6:1]};

always @(*)
        for(i = 0; i < 7; i = i + 1)
                 res[i] = reg_input[i] ~^ coef[i];
        
assign Output = res[0] + res[1] + res[2] + res[3] + res[4] + res[5] + res[6];
    
endmodule

mf_3.JPG

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...