我有以下最小代码:
N=30;
P=200;
a = lpc(signal,N);
y = zeros(1, P);
y(1:N) = x(1:N);
for ii=(N+1):P
y(ii) = -sum(a(2:end) .* y((ii-1):-1:(ii-N)));
end
y
中的for循环效率不高,是一种向量化的方法吗?也许是matlab相关的功能?
编辑:
问题的更多背景 - 我试图使用lpc
有效地预测已知的周期性信号。对于a=lpc(signal,3)
我在matlab文档中发现y=filter([0 -a(2:end)],1,x)
会做什么,如何将其推广到lpc(signal,N)
?
答案 0 :(得分:1)
我使用符号工具箱为任何后来的y
值打印出公式。这些公式非常长,需要(ii-N)*N
次乘法才能使ii
步骤直接计算y
。矢量化解决方案必须进行所有这些乘法,它会更慢。
优化循环是可以完成的一切:
b=a(end:-1:2);
for ii=(N+1):P
y(ii) = -sum(b .* y((ii-N):(ii-1)));
end
向后索引很慢。
答案 1 :(得分:0)
我没有看到一种轻松可行的方式,因为y
中的每个位置都取决于它的先行者。所以他们必须一步一步地计算。