Matlab 滤波器与平滑数据
Matlab filter vs smoothdata
我找不到 filter
函数输出与 smoothdata
函数不同的原因。他们都应该使用 移动平均值 实现 5
平滑的 windowSize。精通这些功能的人可以解释发生了什么吗?
这是文档的 >link<,下面的代码改编自那里,添加了 smoothdata
(对于其他难题,smooth
函数,这也不相同):
% from documentation
t = linspace(-pi,pi,100);
rng default %initialize random number generator
x = sin(t) + 0.25*rand(size(t));
windowSize = 5;
b = (1/windowSize)*ones(1,windowSize);
a = 1;
y = filter(b,a,x);
%this is added for this example, you need >Matlab 2017a to run this
y2=smoothdata(x,'movmean',windowSize)
%y3=smooth(x,100); %bug in the code (obsolete)
y3=smooth(x,windowSize);
%now plot data
figure;
plot(t,x)
hold on
plot(t,y)
plot(t,y2)
plot(t,y3)
legend('Input Data','Filtered Data','smoothdata','smooth')
%show obvious parts of plot
xlim([0 3]);
ylim([0 1.25]);
这是我得到的输出:
情节的第一部分有一些不一致之处:
%this is added for this example, you need >Matlab 2017a to run this
y2 = smoothdata(x,'movmean',[windowSize-1,0]);
y3 = smoothdata(padarray(x,[0 2]),'movmean',[windowSize-1,0]);
%now plot data
figure(1); clf;
plot(t,x)
hold on
plot(t(1:10),y(1:10))
plot(t(1:10),y2(1:10))
plot(t(1:10),y3(1:10))
legend('Input Data','Filtered Data','smoothdata',['padded ' char(10) 'smoothdata'])
%show obvious parts of plot
xlim([-3.1784 -2.3858]);
如果是标量,window
parameter for smoothdata
会产生一个以原点为中心的 window。 filter
实施因果过滤器,这意味着它采用 windowSize
先前样本的平均值。因此,这两个结果之间的差异是 windowSize/2
个样本的偏移。你可以在你的情节中清楚地看到这种转变。使用两个参数模拟filter
的结果:
y2 = smoothdata(x,'movmean',[windowSize-1,0])
smooth
function也实现了移动平均线,第二个参数是window大小。您在这里使用的是 100
,而不是 windowSize
,后者的值为 5
。因此,这个结果是 20 倍以上的平均值。使用正确的 window 大小复制结果:
y3 = smooth(x,windowSize);
我推测 y3
将被转移 w.r.t。 filter
结果,就像问题中的 y2
。
我找不到 filter
函数输出与 smoothdata
函数不同的原因。他们都应该使用 移动平均值 实现 5
平滑的 windowSize。精通这些功能的人可以解释发生了什么吗?
这是文档的 >link<,下面的代码改编自那里,添加了 smoothdata
(对于其他难题,smooth
函数,这也不相同):
% from documentation
t = linspace(-pi,pi,100);
rng default %initialize random number generator
x = sin(t) + 0.25*rand(size(t));
windowSize = 5;
b = (1/windowSize)*ones(1,windowSize);
a = 1;
y = filter(b,a,x);
%this is added for this example, you need >Matlab 2017a to run this
y2=smoothdata(x,'movmean',windowSize)
%y3=smooth(x,100); %bug in the code (obsolete)
y3=smooth(x,windowSize);
%now plot data
figure;
plot(t,x)
hold on
plot(t,y)
plot(t,y2)
plot(t,y3)
legend('Input Data','Filtered Data','smoothdata','smooth')
%show obvious parts of plot
xlim([0 3]);
ylim([0 1.25]);
这是我得到的输出:
情节的第一部分有一些不一致之处:
%this is added for this example, you need >Matlab 2017a to run this
y2 = smoothdata(x,'movmean',[windowSize-1,0]);
y3 = smoothdata(padarray(x,[0 2]),'movmean',[windowSize-1,0]);
%now plot data
figure(1); clf;
plot(t,x)
hold on
plot(t(1:10),y(1:10))
plot(t(1:10),y2(1:10))
plot(t(1:10),y3(1:10))
legend('Input Data','Filtered Data','smoothdata',['padded ' char(10) 'smoothdata'])
%show obvious parts of plot
xlim([-3.1784 -2.3858]);
如果是标量,window
parameter for smoothdata
会产生一个以原点为中心的 window。 filter
实施因果过滤器,这意味着它采用 windowSize
先前样本的平均值。因此,这两个结果之间的差异是 windowSize/2
个样本的偏移。你可以在你的情节中清楚地看到这种转变。使用两个参数模拟filter
的结果:
y2 = smoothdata(x,'movmean',[windowSize-1,0])
smooth
function也实现了移动平均线,第二个参数是window大小。您在这里使用的是 100
,而不是 windowSize
,后者的值为 5
。因此,这个结果是 20 倍以上的平均值。使用正确的 window 大小复制结果:
y3 = smooth(x,windowSize);
我推测 y3
将被转移 w.r.t。 filter
结果,就像问题中的 y2
。