目的
通过平滑处理,我们可以发现数据中的重要模式,同时忽略不重要的内容(如噪声)。我们使用滤波来执行这种平滑处理。平滑处理的目标是呈现值的缓慢变化情况,以便更容易看到数据的趋势。
有时,当您检查输入数据时,您可能希望平滑处理数据以便看到信号的趋势。在我们的示例中,我们有一组 2011 年 1 月洛根机场每小时的摄氏温度读数。
load bostemp
days = (1:31*24)/24;
plot(days, tempC)
axis tight
ylabel('Temp (\circC)')
xlabel('Time elapsed from Jan 1, 2011 (days)')
title('Logan Airport Dry Bulb Temperature (source: NOAA)')
请注意,我们可以直观地看到一天中的时间对温度读数的影响。如果您只关注月内的每日温度变化,则每小时的波动只会产生噪声,使得每日的变化很难辨别。为了去除时间的影响,我们现在希望使用移动平均滤波器来平滑处理数据。
一种移动平均滤波器
移动平均滤波器的最简单形式是其长度为 N 并且取波形的每 N 个连续采样的平均值。
为了对每个数据点应用移动平均滤波器,我们构造滤波器的系数,使得每个点的权重相等且占比为总均值的 1/24。这样我们可以得出每 24 小时的平均温度。
hoursPerDay = 24;
coeff24hMA = ones(1, hoursPerDay)/hoursPerDay;
avg24hTempC = filter(coeff24hMA, 1, tempC);
plot(days,[tempC avg24hTempC])
legend('Hourly Temp','24 Hour Average (delayed)','location','best')
ylabel('Temp (\circC)')
xlabel('Time elapsed from Jan 1, 2011 (days)')
title('Logan Airport Dry Bulb Temperature (source: NOAA)')
滤波器延迟
请注意,滤波后的输出存在大约 12 个小时的延迟。这是因为我们的移动平均滤波器有延迟。
长度为 N 的任何对称滤波器都存在 (N-1)/2 个采样的延迟。我们可以人为去除这种延迟。
fDelay = (length(coeff24hMA)-1)/2;
plot(days,tempC, ...
days-fDelay/24,avg24hTempC)
axis tight
legend('Hourly Temp','24 Hour Average','location','best')
ylabel('Temp (\circC)')
xlabel('Time elapsed from Jan 1, 2011 (days)')
title('Logan Airport Dry Bulb Temperature (source: NOAA)')
提取平均