信号平滑算法(Matlab';s移动平均)

信号平滑算法(Matlab';s移动平均),matlab,Matlab,我已经写了一个简单的代码,执行一个3点移动平均平滑算法。这意味着要遵循与所描述的Matlab平滑(…)函数相同的基本算法 然而,我的代码的结果与Matlab的非常不同。Matlab的3点滤波器似乎执行了更为积极的平滑 下面是使用我的代码(红色)和Matlab函数(蓝色)平滑的噪声数据的比较: 以下是我以函数形式编写的代码: function [NewSignal] = smoothing(signal) NewSignal = signal; for i = 2 : length(signal

我已经写了一个简单的代码,执行一个3点移动平均平滑算法。这意味着要遵循与所描述的Matlab平滑(…)函数相同的基本算法

然而,我的代码的结果与Matlab的非常不同。Matlab的3点滤波器似乎执行了更为积极的平滑

下面是使用我的代码(红色)和Matlab函数(蓝色)平滑的噪声数据的比较:

以下是我以函数形式编写的代码:

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)与matlabs
smooth
相同,并且由于覆盖了以下值,您的方法与这两种方法不同:


因此,正是你的函数将输入传递得更强。(正如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)与matlabs
smooth
相同,并且由于覆盖了以下值,您的方法与这两种方法不同:


因此,正是你的函数将输入传递得更强。(正如Cris所指出的)

您可以使用matlabs
filter
函数和参数
b=one(3,1)/3
a=1
以以下方式
filter(b,a,信号)
应用长度为3的移动平均滤波器;但是Matlab的平滑函数(跨度为3)不也应该执行相同的操作吗?Matlab使用的范围似乎比您实际指定的范围更大。比较
filter
smooth
的结果,您会发现它们主要在端点和延迟方面有所不同(因为