smooth
函数。默认方法是大小为5的移动平均值(方法可以更改)。例如:% some noisy signal
Fs = 200; f = 5;
t = 0:1/Fs:1-1/Fs;
y = sin(2*pi*f*t) + 0.6*randn(size(t));
subplot(411)
plot(y), title('Noisy signal')
% smoothed signal
subplot(412)
plot( smooth(y, 5, 'moving') ), title('smooth')
ylim([-2 2])
如果没有,你可以使用核心MATLAB中的filter
函数来使用自己的窗口函数:
% equivalent to a moving average window
wndwSize = 5;
h = ones(1,wndwSize)/wndwSize;
subplot(413)
plot( filter(h, 1, y) ), title('filter + square window')
% Guassian
h = pdf('Normal',-floor(wndwSize/2):floor(wndwSize/2),0,1);
subplot(414)
plot( filter(h, 1, y) ), title('filter + Guassian window')
一个简单(临时的)方法是在每个点处使用加权平均值(由 alpha
可调),与其邻居一起:
data(2:n-1) = alpha*data(2:n-1) + (1-alpha)*0.5*(data(1:n-2)+data(3:n))
或者一些变形。是的,要更加复杂一些,你可以先对数据进行傅里叶变换,然后截断高频部分。就像这样:
f = fft(data)
f(n/2+1-20:n/2+20) = zeros(40,1)
smoothed = real(ifft(f))
这将削减最高的20个频率。请注意对称地削减它们,否则反变换不再是实数。您需要仔细选择截止频率以获得适当级别的平滑度。这是一种非常简单的滤波(在频域中的盒式滤波),因此如果失真无法接受,可以尝试轻轻衰减高阶频率。
FFT并不是一个坏主意,但在这里可能有些过度。滑动平均法会给出通常较差的结果,除了用于晚交的作业(和白噪声)之外,应该避免使用。
我建议使用Savitzky-Golay滤波器(在Matlab中使用sgolayfilt(...))。这将为您提供最佳结果-在保持曲线形状的同时进行一些局部平滑处理。
-Paul
n
是数据的长度。 - Victor Liu