我需要在Java中实现Matlab的filter(b,a,x)函数。在我这样做之前,我想在转换成Java之前用Matlab重写这个函数。到目前为止,所有的系数都写得很好。见下文:
x = load('data.csv');
windowSize = 10;
b = (1/windowSize)*ones(1,windowSize); % b coefficient - a is unused
i = 1;
for n = length(b) : length(x) % yes I know I am losing my first 10 samples
y(i,:) = [ b(1)*x(n) + b(2)*x(n-1) + b(3)*x(n-2) + b(4)*x(n-3) + ...
b(5)*x(n-4) + b(6)*x(n-5) + b(7)*x(n-6) + b(8)*x(n-7) + ...
b(9)*x(n-8) + b(10)*x(n-9) ];
i = i+1; % used for indexing calculated results into new array
end但是,当更改窗口大小时,我希望循环内容自动更新。在上面的例子中,如果我要将窗口大小增加2倍,那么我必须在for循环中写出两倍的b和x倍数。这对我的问题是个糟糕的解决方案。请给我建议。
发布于 2018-02-24 16:46:50
所以这个解决方案起作用了:
x = load('data.csv');
windowSize = 10;
b = (1/windowSize)*ones(1,windowSize);
i = 1;
for n = windowSize: length(x)
m = 0;
tempSum = 0;
for j = 1 : windowSize
temp = b(j)*x(n-m);
tempSum = tempSum + temp;
m = m + 1;
end
y(i,:) = [tempSum]
i = i+1;
end见下文的结果:


与其在一开始有非常不准确的结果,我只是略过这些。重要的是要注意,在这个解中,你丢失的样本数量等于b系数的数量。所以一定要重新确定X轴。
用Matlabs = setdiff(y,yy)函数对结果进行了比较,发现所提解与Matlabs (b,a,x)函数没有差别。
https://codereview.stackexchange.com/questions/188192
复制相似问题