Algorithm for curve smoothing
이전 댓글 표시
I have written a simple code that performs a 3-point moving average smoothing algorithm. It is supposed to follow the same algorithm as Matlab's smooth(...) function as described here.
However, the performance of my code is very different from that of Matlab. Matlab's 3-point filter appears to perform a much more aggressive smoothing. Why is that?
Here is my code:
NewSignal = signal;
for i = 2 : length(signal)-1
NewSignal(i,:) = (signal(i,:)+signal(i-1,:)+signal(i+1,:))./3;;
end
And here is how I called Matlab's function:
signal = smooth(time, signal, 3, 'moving');
And here is a comparison of the results:

As one can see, Matlab's function smooths the data a lot further. What is the reason for the discrepancy? How can I modify my code in order for it to perform more like the blue curve?
Any explanation would be greatly appreciated.
I am including the sample data which can be accessed through:
M = csvread('DS0009.csv');
time = M(:,1);
waveform = M(:,2);
댓글 수: 2
gonzalo Mier
2019년 5월 13일
The command that you are using:
waveform = smooth(time,waveform, 5, 'moving');
makes the average of 5 points while your loop use 3 points.
Try with:
waveform = smooth(time,waveform, 3, 'moving');
Sordin
2019년 5월 14일
답변 (1개)
darova
2019년 5월 14일
In this part
NewSignal = signal;
for i = 2 : length(signal)-1
NewSignal(i,:) = (NewSignal(i,:)+NewSignal(i-1,:)+NewSignal(i+1,:))./3;
% NewSignal(i,:) = (signal(i,:)+signal(i-1,:)+signal(i+1,:))./3; % it's different. try it
end
More generic version
NewSignal = signal;
n = 3;
for i = 1 : length(signal)-n+1
s = 0;
for j = 0:n-1
s = s + signal(i+j,:);
end
NewSignal(i,:) = s/n;
end
카테고리
도움말 센터 및 File Exchange에서 Smoothing and Denoising에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!