信号平滑算法(Matlab';s移动平均)
我已经写了一个简单的代码,执行一个3点移动平均平滑算法。这意味着要遵循与所描述的Matlab平滑(…)函数相同的基本算法 然而,我的代码的结果与Matlab的非常不同。Matlab的3点滤波器似乎执行了更为积极的平滑 下面是使用我的代码(红色)和Matlab函数(蓝色)平滑的噪声数据的比较: 以下是我以函数形式编写的代码:信号平滑算法(Matlab';s移动平均),matlab,Matlab,我已经写了一个简单的代码,执行一个3点移动平均平滑算法。这意味着要遵循与所描述的Matlab平滑(…)函数相同的基本算法 然而,我的代码的结果与Matlab的非常不同。Matlab的3点滤波器似乎执行了更为积极的平滑 下面是使用我的代码(红色)和Matlab函数(蓝色)平滑的噪声数据的比较: 以下是我以函数形式编写的代码: function [NewSignal] = smoothing(signal) NewSignal = signal; for i = 2 : length(signal
function [NewSignal] = smoothing(signal)
NewSignal = signal;
for i = 2 : length(signal)-1
NewSignal(i,:) = (NewSignal(i,:)+NewSignal(i-1,:)+NewSignal(i+1,:))./3;
end
end
Matlab的功能使用如下:
signal=平滑(时间、信号、3,‘移动’)代码>
据我所知,Matlab的函数也是这样工作的;它平均每个料仓有3个相邻的料仓。所以我希望这两种算法产生相同的结果
那么,造成这种差异的原因是什么呢?我如何调整代码以产生相同的结果
编辑:
我的样本数据可以找到。可通过以下方式访问:
M = csvread('DS0009.csv');
time = M(:,1);
signal = M(:,2);
以下是使用rinkert校正的新结果(红色图):
造成这种差异的一个原因可能是,在平滑过程中,部分使用了平滑信号。在循环中,将平滑后的值存储在NewSignal(i,:)
中,对于下一个平滑示例,该值将由NewSignal(i-1,:)
调用
让NewSignal
仅由原始信号确定:
function [NewSignal] = smoothing(signal)
NewSignal = signal;
for i = 2 : length(signal)-1
NewSignal(i,:) = (signal(i,:)+signal(i-1,:)+signal(i+1,:))./3;
end
end
<强> Update:以显示上述函数实际上与Matlab的Simult函数相同,让我们考虑一下:
因此,创建一个正弦波,添加一些噪声,并确定两种方法之间的绝对差异。如果你把所有的差异加起来,你会发现这等于7.5137e-14,这不能解释你看到的差异
绘制平滑信号(蓝色原始,红色平滑):
然后绘制两种方法之间的差异:
figure(2); clf; hold on;
plot(t,y_smooth1-y_smooth2)
如您所见,差值为1e-16级,因此受浮点相对精度的影响(请参阅)。造成差值的一个原因可能是在平滑过程中部分使用了平滑信号。在循环中,将平滑后的值存储在NewSignal(i,:)
中,对于下一个平滑示例,该值将由NewSignal(i-1,:)
调用
让NewSignal
仅由原始信号确定:
function [NewSignal] = smoothing(signal)
NewSignal = signal;
for i = 2 : length(signal)-1
NewSignal(i,:) = (signal(i,:)+signal(i-1,:)+signal(i+1,:))./3;
end
end
<强> Update:以显示上述函数实际上与Matlab的Simult函数相同,让我们考虑一下:
因此,创建一个正弦波,添加一些噪声,并确定两种方法之间的绝对差异。如果你把所有的差异加起来,你会发现这等于7.5137e-14,这不能解释你看到的差异
绘制平滑信号(蓝色原始,红色平滑):
然后绘制两种方法之间的差异:
figure(2); clf; hold on;
plot(t,y_smooth1-y_smooth2)
如您所见,差异为1e-16级,因此受浮点相对精度的影响(请参阅)。要回答您在注释中的问题,函数过滤器和平滑在算术上执行相同的操作(如果它们应用于移动平均)。然而,在开始和结束时存在不同处理的特殊情况。
这也在smooth“”的文档中说明
在这里,您可以在一个示例中看到它:
%generate randonm data
signal=rand(1,50);
%plot data
plot(signal,'LineWidth',2)
hold on
%plot filtered data
plot(filter(ones(3,1)/3,1,signal),'r-','LineWidth',2)
%plot smoothed data
plot( smooth(signal,3,'moving'),'m--','LineWidth',2)
%plot smoothed and delayed
plot([zeros(1,1); smooth(signal,3,'moving')],'k--','LineWidth',2)
hold off
legend({'Data','Filter','Smooth','Smooth-Delay'})
如您所见,过滤后的数据(红色)只是平滑后的数据(洋红色)的延迟版本。此外,它们在开始时有所不同。延迟平滑数据会产生与滤波数据相同的波形(除了开始)。正如rinkert指出的,您的方法覆盖了您在下一步访问的数据点。这是另一个问题
在下一个示例中,您将看到rinkerts实现(smooth rinkert)与matlabssmooth
相同,并且由于覆盖了以下值,您的方法与这两种方法不同:
因此,正是你的函数将输入传递得更强。(正如Cris所指出的)要回答您在评论中的问题,函数过滤器
和平滑
在算术上执行相同的操作(如果它们应用于移动平均线)。然而,在开始和结束时存在不同处理的特殊情况。
这也在smooth“”的文档中说明
在这里,您可以在一个示例中看到它:
%generate randonm data
signal=rand(1,50);
%plot data
plot(signal,'LineWidth',2)
hold on
%plot filtered data
plot(filter(ones(3,1)/3,1,signal),'r-','LineWidth',2)
%plot smoothed data
plot( smooth(signal,3,'moving'),'m--','LineWidth',2)
%plot smoothed and delayed
plot([zeros(1,1); smooth(signal,3,'moving')],'k--','LineWidth',2)
hold off
legend({'Data','Filter','Smooth','Smooth-Delay'})
如您所见,过滤后的数据(红色)只是平滑后的数据(洋红色)的延迟版本。此外,它们在开始时有所不同。延迟平滑数据会产生与滤波数据相同的波形(除了开始)。正如rinkert指出的,您的方法覆盖了您在下一步访问的数据点。这是另一个问题
在下一个示例中,您将看到rinkerts实现(smooth rinkert)与matlabssmooth
相同,并且由于覆盖了以下值,您的方法与这两种方法不同:
因此,正是你的函数将输入传递得更强。(正如Cris所指出的)您可以使用matlabsfilter
函数和参数b=one(3,1)/3
和a=1
以以下方式filter(b,a,信号)
应用长度为3的移动平均滤波器;但是Matlab的平滑函数(跨度为3)不也应该执行相同的操作吗?Matlab使用的范围似乎比您实际指定的范围更大。比较filter
和smooth
的结果,您会发现它们主要在端点和延迟方面有所不同(因为