一、自定义函数
function y = my_filter1(B, A, x)
n = length(B);
m = length(A);
% 初始化输出信号y和过去的输出z
y = zeros(1, length(x));
z = zeros(1, max(m-1, n-1)); % 初始化z以存储足够的内部状态
% 遍历输入信号x的每个元素
for k = 1:length(x)
% 初始化当前输出的和
y_sum = 0;
% 计算分子部分(前馈)
for i = 1:n
if k >= i
y_sum = y_sum + B(i) * x(k-i+1);
end
end
% 计算分母部分(反馈),注意只处理存在的元素
for i = 2:m
if i-1 <= length(z)
y_sum = y_sum - A(i) * z(i-1); % 注意这里使用i-1作为z的索引
end
end
% 存储当前输出
y(k) = y_sum;
% 更新内部状态(如果k足够大)
if k >= m-1
% 滑动窗口更新z
for i = m:-1:2
if i-1 <= length(z)
z(i-1) = z(i-2);
end
end
z(1) = y(k); % 存储最新的输出作为新的内部状态
end
end
end
二、数据测试及比对
B= [0.25, 0.5, 0.25];
A= 1;
x = [1, 2, 3, 4, 5];
y = my_filter1(B, A, x);
y1 = filter(B, A, x);
disp(y);
disp(y1);
if isequal(y, y1)
disp('yes');
else
disp('no');
end