Maverick_ 15 25 апреля, 2023 Опубликовано 25 апреля, 2023 · Жалоба Здраствуйте! подскажите как оптимально описать такую функцию в потоковом описании (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; описание которой реализована по формуле вычисления среднего но пока не придумал как єто сделать Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tegumay 4 25 апреля, 2023 Опубликовано 25 апреля, 2023 · Жалоба тут что-то не так (с) папаша Мюллер скользящее среднее Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 25 апреля, 2023 Опубликовано 25 апреля, 2023 · Жалоба 2 minutes ago, tegumay said: тут что-то не так (с) папаша Мюллер что именно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tegumay 4 25 апреля, 2023 Опубликовано 25 апреля, 2023 · Жалоба в самой вырезке из статьи. в статье коэффициентов нет, в формуле есть. =/ и когда n = 0,1,2 возникают глупые вопросы в варианте решения вопросов нет. по идее это все загоняется в конвеер. и вопрос, что подразумевается под потоковым описанием? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tegumay 4 25 апреля, 2023 Опубликовано 25 апреля, 2023 · Жалоба 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] только надо операции переставить под конвеер (зевает) и оптимизировать, а вообще хорошая головоломка. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 26 апреля, 2023 Опубликовано 26 апреля, 2023 · Жалоба 8 hours ago, tegumay said: только надо операции переставить под конвеер (зевает) и оптимизировать, а вообще хорошая головоломка. я бы тупо разбил на 2 фильтра и всё. первый это фир на 3 коэффицента по инверсной схеме с цепью сумматоров, а второй уже вот это рекурсивное звено, под разными соусами) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 26 апреля, 2023 Опубликовано 26 апреля, 2023 · Жалоба Всем спасибо))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Самурай 12 27 апреля, 2023 Опубликовано 27 апреля, 2023 · Жалоба В 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. Т.е. совпадать с полюсами фильтра. Т.е. числитель и знаменатель сокращаются и остается... константа:))). Но, позвольте, а где же тогда фильтр???:) Где-то у Вас ошибка...:) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tegumay 4 27 апреля, 2023 Опубликовано 27 апреля, 2023 · Жалоба Увидел заголовок наконец-то =/ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться