Matlab自定义类filter函数异常:仅前9个输出元素正确问题排查
问题排查:自定义差分方程求解函数偏差原因
核心错误原因
循环内修改输入数组x是导致后续结果偏差的根本问题:
- 代码中
if n < Nx; x=[x(2:end),0]; end这行逻辑,会在每次循环时把x左移一位并补0。这会导致后续n对应的x(n)不再是原始输入序列的第n个元素,而是经过多次移位后的错误值。比如当n=10时,x已经被移位9次,此时x(10)对应的是原始x的第1个元素后补的0,而非原始输入的第10个元素(若原始x长度足够)。
修正方案
不要修改原始x数组,通过索引直接访问原始x的对应位置,超出原始长度的位置视为0:
function y = difference_equation_solver(x,a,b,N) b = b(:)'; a = a(:)'; nb = length(b); na = length(a); Nx = length(x); y = zeros(1, N); for n = 1:N % 计算前向项(b与x的卷积) y(n) = b(1) * (n <= Nx ? x(n) : 0); for k = 2:nb idx = n - k + 1; if idx >= 1 y(n) = y(n) + b(k) * (idx <= Nx ? x(idx) : 0); end end % 计算反馈项(a与y的递归) for k = 2:na idx = n - k + 1; if idx >= 1 y(n) = y(n) - a(k) * y(idx); end end end end
修正说明
- 移除了对x数组的移位操作,所有x的访问都通过索引判断:索引在原始x长度范围内时取对应值,否则取0,符合线性系统对输入序列的零填充规则。
- 统一用
idx = n - k + 1计算偏移索引,逻辑更清晰,避免因数组移位导致的索引混乱。
内容的提问来源于stack exchange,提问作者Amazona
相关产品推荐
相关产品推荐

