Одной из причин такой разницы может быть то, что вы частично используете сглаженный сигнал во время сглаживания.В вашем цикле вы сохраняете сглаженное значение в NewSignal(i,:)
, и для следующего сэмпла для сглаживания это значение будет вызываться NewSignal(i-1,:)
.
Пусть NewSignal
будет определено только исходным signal
:
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
Обновление: Чтобы показать, что вышеприведенная функция действительно выполняетТак же как и в smooth
функции Matlab, давайте рассмотрим это MVCE :
t = (0:0.01:10).'; % time vector
y = sin(t) + 0.5*randn(size(t));
y_smooth1 = smooth(t,y,3,'moving');
y_smooth2 = smoothing(y);
difference_methods = abs(y_smooth1-y_smooth2);
Итак, создав синусоидальную волну, добавьте немного шума и определите абсолютную разницу между двумя методами.Если вы возьмете сумму всех различий, вы увидите, что это в сумме примерно равно 7,5137e-14, что не может объяснить различия, которые вы видите.
Построение сигнала сглаживания (синий оригинал, сглаживание красного цвета):
figure(1); clf; hold on
plot(t,y)
plot(t,y_smooth2)
И затем нанесение разницы между двумяметоды:
figure(2); clf; hold on;
plot(t,y_smooth1-y_smooth2)
Как видите, разница составляет порядка 1e-16, поэтому она зависит от относительной точности с плавающей точкой(см. eps
).