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

реализация IIR - 3 порядка

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

подскажите как оптимально описать такую функцию в потоковом описании (pipeline)

y[n] = a2 * x[n-2] + a1 * x[n-1] + a0 * x[n] - 2 * y[n-1] - y[n-2]

где a1, a2, a0 коеф-ти

я подумываю описывать нападобии 

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity moving_average is
generic (
  G_NBIT                     : integer := 8;
  G_AVG_LEN_LOG              : integer := 2 );
port (
  i_clk                      : in  std_logic;
  i_rstb                     : in  std_logic;
  i_sync_reset               : in  std_logic;
  -- input
  i_data_ena                 : in  std_logic;
  i_data                     : in  std_logic_vector(G_NBIT-1 downto 0);
  -- output
  o_data_valid               : out std_logic;
  o_data                     : out std_logic_vector(G_NBIT-1 downto 0));
end moving_average;

architecture rtl of moving_average is

type t_moving_average is array (0 to 2**G_AVG_LEN_LOG-1) of signed(G_NBIT-1 downto 0);

signal p_moving_average                 : t_moving_average;
signal r_acc                            : signed(G_NBIT+G_AVG_LEN_LOG-1 downto 0);  -- average accumulator
signal r_data_valid                     : std_logic;

begin

p_average : process(i_clk,i_rstb)
begin
  if(i_rstb='0') then
    r_acc              <= (others=>'0');
  p_moving_average   <= (others=>(others=>'0'));
  r_data_valid       <= '0';
  o_data_valid       <= '0';
  o_data             <= (others=>'0');
  elsif(rising_edge(i_clk)) then
  r_data_valid       <= i_data_ena;
  o_data_valid       <= r_data_valid;
  if(i_sync_reset='1') then
    r_acc              <= (others=>'0');
    p_moving_average   <= (others=>(others=>'0'));
  elsif(i_data_ena='1') then
    p_moving_average   <= signed(i_data)&p_moving_average(0 to p_moving_average'length-2);
    r_acc              <= r_acc + signed(i_data)-p_moving_average(p_moving_average'length-1);
  end if;
  o_data             <= std_logic_vector(r_acc(G_NBIT+G_AVG_LEN_LOG-1 downto G_AVG_LEN_LOG));  -- divide by 2^G_AVG_LEN_LOG
  
  end if;
end process p_average;

end rtl;

описание которой реализована по формуле вычисления среднего 

20191206_074544_13270.jpg

 

но пока не придумал как єто сделать

 

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


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

2 minutes ago, tegumay said:

тут что-то не так (с) папаша Мюллер

что именно?

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


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

в самой вырезке из статьи.
в статье коэффициентов нет, в формуле есть. =/

и когда n = 0,1,2 возникают глупые вопросы
в варианте решения вопросов нет.
по идее это все загоняется в конвеер.
и вопрос, что подразумевается под потоковым описанием?

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


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

x[n-2]    
x[n-1]    a2*x[n-2](a2')
x[n]        a1*x[n-1](a1')    
              a0*x[n]        a1' + a2'(a12')    
              a0' + a12' (a012')
              a012' - y[n-2] (y2')
             2*y[n-1] (y1')
             y2' - y1'    
              y[n]
только надо операции переставить под конвеер (зевает) и оптимизировать, а вообще хорошая головоломка.

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


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

8 hours ago, tegumay said:

только надо операции переставить под конвеер (зевает) и оптимизировать, а вообще хорошая головоломка.

я бы тупо разбил на 2 фильтра и всё. первый это фир на 3 коэффицента по инверсной схеме с цепью сумматоров, а второй уже вот это рекурсивное звено, под разными соусами)

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


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

В 25.04.2023 в 14:19, Maverick_ сказал:

подскажите как оптимально описать такую функцию в потоковом описании (pipeline)

y[n] = a2 * x[n-2] + a1 * x[n-1] + a0 * x[n] - 2 * y[n-1] - y[n-2]

где a1, a2, a0 коеф-ти

Странный какой-то у Вас фильтр... Смотрим передаточную функцию:

 

\(H(z)=\frac{a0+a1*z^{-1}+a2*z^{-2}}{1+2*z^{-1}+z^{-2}}\)

 

И видим двойной полюс на единичной окружности на частоте Fs/2. Из чего следует, что:

 

1. Данный фильтр имеет смысл только в одном случае, а именно когда на этой же частоте расположен и двойной ноль. Во всех остальных случаях фильтр будет неустойчив или на грани устойчивости, это не считая дико-кривой АЧХ:)

 

2. Числитель передаточной функции имеет всего лишь 2-й порядок, а это значит, что он задает расположение только 2-х нулей на z-плоскости. Но из предыдущего пункта следует, что эти нули должны быть а) двойные и б) лежать на частоте Fs/2. Т.е. совпадать с полюсами фильтра. Т.е. числитель и знаменатель сокращаются и остается... константа:))). Но, позвольте, а где же тогда фильтр???:)

 

Где-то у Вас ошибка...:)

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


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

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

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

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

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

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

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

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

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

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