windowSize = a; y=filter(ones(1,windowSize)/windowSize,1,x); 上述命令实际上计算的是: y(1)=(1/a)*x(1); y(2)=(1/a)*x(2)+(1/a)*x(1); ... ... y(a)=(1/a)*x(a)+(1/a)*x(a-1)+...+(1/a)*x(1); ... ... y(i)=(1/a)*x(i)+(1/a)*x(i-1)+...+(1/a)*x(i-a+1); ... .... 可以看出,计算某一位置处的平均值时,窗口的前端位于该处。有时为了将窗口中部放在所计算的位置处,这样上述计算方式则变为(为叙述方便起见,设a为奇数): y(1)=(1/a)*x(1)+(1/a)*x(2)+...+(1/a)*x((a+1)/2); y(2)=(1/a)*x(1)+(1/a)*x(2)+...+(1/a)*x((a+1)/2+1); ... ... y((a+1)/2)=(1/a)*x(1)+(1/a)*x(2)+...+(1/a)*x((a+1)/2)+...+(1/a)*x(a); ... ... y(i)=(1/a)*x(i-(a-1)/2)+(1/a)*x(i-(a-1)/2+1)+...+(1/a)*x(i)+...+(1/a)*x(i+(a-1)/2); ... ... 这种方式的滑动平均称为中心滑动平均,其Matlab的计算语句为: windowSize = a; y1=filter(ones(1,a/2+1)/windowSize,1,x); y2=filter(ones(1,a/2+1)/windowSize,1,fliplr(x)); y=y1+fliplr(y2)-(1/a)*x; 如利用1-2-1 滤波器计算有权重的中心滑动平均,其Matlab语句为: y1=filter([0.5 0.25],1,x); y2=filter([0.5 0.25],1,fliplr(x)); y=y1+fliplr(y2)-0.5*x; |
|