信号平滑

这个例子展示了如何使用移动平均滤波器和重采样来隔离一天中时间的周期性成分对每小时温度读数的影响,以及从开环电压测量中去除不需要的线路噪声。该示例还展示了如何使用中值滤波器平滑时钟信号的电平,同时保留边缘。该示例还展示了如何使用Hampel过滤器来删除较大的异常值。

动机

平滑是指我们如何在数据中发现重要的模式,同时忽略那些不重要的东西(比如噪音)。我们使用滤波来实现这种平滑。平滑的目标是产生价值的缓慢变化,以便更容易地看到数据中的趋势。

有时,当您检查输入数据时,您可能希望平滑数据,以便看到信号中的趋势。在我们的例子中,我们有一组以摄氏温度为单位的温度读数,记录了2011年1月份洛根机场的每小时温度。

负载bostemp天=(1:31 * 24)/ 24;情节(天,tempC)轴ylabel('温度(\ circC)')xlabel(“时间从2011年1月1日开始(天数)”)标题(“洛根机场干球温度(来源:NOAA)”

请注意,我们可以直观地看到一天的时间对温度读数的影响。如果你只对一个月里每天的温度变化感兴趣,那么每小时的波动只会产生噪音,而噪音会使你很难辨别每天的变化。为了消除一天中时间的影响,我们现在想要使用移动平均滤波器来平滑数据。

移动平均滤波器

在其最简单的形式,长度为N的移动平均滤波器取平均的波形的每N个连续的样本。

要应用移动平均滤波器,以每个数据点,我们构建我们的系数我们的过滤器,使每个点相同的权重,并有助于1/24总平均水平。这给我们在每个24小时内的平均温度。

hoursPerDay = 24;coeff24hMA =一(1,hoursPerDay)/ hoursPerDay;avg24hTempC =滤波器(coeff24hMA,1,tempC);情节(天,[tempC avg24hTempC])图例(“每小时温度”'24小时平均值(延迟)”“位置”“最佳”)ylabel('温度(\ circC)')xlabel(“时间从2011年1月1日开始(天数)”)标题(“洛根机场干球温度(来源:NOAA)”

滤波器延时

需要注意的是滤波输出由约十二小时的延迟。这是因为,我们的移动平均滤波器具有延迟的事实。

的长度N的任何对称滤波器将具有(N-1)/ 2个采样的延迟。我们可以考虑手动这种延迟。

fDelay =(长度(coeff24hMA)-1)/ 2;剧情(天,tempC,...天fDelay / 24,avg24hTempC)轴传奇(“每小时温度”24小时平均的“位置”“最佳”)ylabel('温度(\ circC)')xlabel(“时间从2011年1月1日开始(天数)”)标题(“洛根机场干球温度(来源:NOAA)”

提取的平均差异

或者,我们也可以使用移动平均滤波器来更好地估计一天的时间是如何影响整体温度的。为此,首先从每小时的温度测量中减去平滑的数据。然后,将这些不同的数据分成天数,并取这个月所有31天的平均值。

图deltaTempC = tempC  -  avg24hTempC;deltaTempC =重塑(deltaTempC,24,31)'。情节(1:24,平均(deltaTempC))轴标题(“24小时平均温差”)xlabel(“每天一小时(从午夜开始)”)ylabel('温度差(\ circC)'

提取包络峰值

有时我们也想每天我们的温度信号变化的高点和低点有多么平滑变化的估计。要做到这一点,我们可以使用信封函数来连接极端高点和低点在24小时的时间段的子集检测到。在这个例子中,我们保证有各极高和极低之间至少16小时。我们还可以得到怎样的高点和低点是取两个极端之间的平均趋势感。

[envHigh,envLow] =信封(tempC,16,“高峰”);envMean =(envHigh + envLow)/ 2;剧情(天,tempC,...天,envHigh,...天,envMean,...天,envLow)轴传奇(“每小时温度”'高''意思''低'“位置”“最佳”)ylabel('温度(\ circC)')xlabel(“时间从2011年1月1日开始(天数)”)标题(“洛根机场干球温度(来源:NOAA)”

加权移动平均滤波器

其他种类的移动平均滤波器不相等加权每个样品。

另一种常见的滤波器如下的二项展开式 [ 1 / 2 1 / 2 ] ñ 。这种类型的滤波器在n值较大的情况下近似于一条正常的曲线,在n值较小的情况下可以滤除高频噪声 [ 1 / 2 1 / 2 ] 与自身,然​​后反复用卷积输出 [ 1 / 2 1 / 2 ] 规定的次数。在本例中,使用五个总迭代。

H = [1/2 1/2];binomialCoeff = CONV(H,H);对于N = 1:4 binomialCoeff = CONV(binomialCoeff,H);结束图fDelay =(长度(binomialCoeff)-1)/ 2;binomialMA =滤波器(binomialCoeff,1,tempC);剧情(天,tempC,...天fDelay / 24,binomialMA)轴传奇(“每小时温度”“二项式加权平均”“位置”“最佳”)ylabel('温度(\ circC)')xlabel(“时间从2011年1月1日开始(天数)”)标题(“洛根机场干球温度(来源:NOAA)”

有点类似于高斯膨胀滤波器另一个滤波器是指数移动平均滤波器。这种类型的加权移动平均过滤器的容易构建,并且不需要大的窗口大小。

指数加权移动平均滤波器在0和1之间调整一个参数。alpha值越高,平滑效果越差。

α= 0.45;exponentialMA = filter(alpha, [1 alpha-1], tempC);剧情(天,tempC,...天fDelay / 24,binomialMA,...天-1/24,exponentialMA)轴传奇(“每小时温度”...“二项式加权平均”...“指数加权平均”“位置”“最佳”)ylabel('温度(\ circC)')xlabel(“时间从2011年1月1日开始(天数)”)标题(“洛根机场干球温度(来源:NOAA)”

放大读数为一天。

轴([3 4 -5 2])

Savitzky-Golay过滤器

你会注意到,通过平滑数据,极端值有所裁剪。

更紧密地跟踪信号一点,可以使用加权移动平均过滤器的尝试,以适应多项式指定顺序的过采样的指定条数的最小二乘意义。

为方便起见,你可以使用函数sgolayfilt实现一个Savitzky-Golay平滑滤波器。使用sgolayfilt,则指定数据的奇数段和严格小于该段长度的多项式阶。的sgolayfilt函数在内部计算平滑多项式系数,执行延迟对准,并在数据记录的开始和结束照顾的瞬态效应。

三倍体= sgolayfilt(tempC, 3,7);quarticMA = sgolayfilt(tempC, 4,7);quinticMA = sgolayfilt(tempC, 5,9);剧情(天、天、天、天)“每小时温度”“三次加权MA”“四次加权MA”...“马Quintic-Weighted”“位置”“东南”)ylabel('温度(\ circC)')xlabel(“时间从2011年1月1日开始(天数)”)标题(“洛根机场干球温度(来源:NOAA)”)轴([3 5 -5 2])

重采样

有时它是有益的,以便正确地应用移动平均重采样的信号。

在我们的下一个例子中,我们采样通过模拟仪器的输入端的开环电压的干扰从60Hz的交流电源线噪声的存在。我们采样与1 kHz的采样率的电压。

负载openloop60hertzfs = 1000;t = (0:numel(openLoopVoltage)-1) / fs;情节(t, openLoopVoltage) ylabel ('电压(V)')xlabel(“时间(s)”)标题(开环电压测量的

我们试图通过噪音使用移动平均过滤器除去行的效果。

如果构建一个均匀加权移动平均过滤器,它会删除是周期性的相对于所述滤波器的持续时间的任何组分。

当以1000Hz采样大致有一〇〇〇年至1060年= 16.667样品中60Hz的一个完整的周期。让我们尝试“全面上涨”,并使用17点过滤器。这将使我们最大以1000Hz / 17 = 58.82 Hz的基频滤波。

情节(T,sgolayfilt(openLoopVoltage,1,17))ylabel('电压(V)')xlabel(“时间(s)”)标题(开环电压测量的)图例(“工作于58.82 Hz的移动平均滤波器”...'位置'“东南”

注意,虽然电压明显平滑,它仍然包含一个小的60赫兹纹波。

我们可以显著减少纹波,如果我们重新采样信号,让我们通过我们的移动平均滤波器捕捉到60赫兹信号的完整的完整周期。

如果我们在17 * 60赫兹= 1020赫兹重新采样信号,我们可以用我们的17点的移动平均滤波器,以除去60赫兹线噪声。

fsResamp = 1020;vResamp =重采样(openLoopVoltage,fsResamp,FS);tResamp =(0:numel(vResamp)-1)/ fsResamp;vAvgResamp = sgolayfilt(vResamp,1,17);图(tResamp,vAvgResamp)ylabel('电压(V)')xlabel(“时间(s)”)标题(开环电压测量的)图例(“以60Hz移动平均滤波器操作”...'位置'“东南”

中值滤波

移动平均,加权移动平均,和Savitzky-格雷滤波器平滑所有他们滤波器的数据。然而,这可能并不总是什么都想。例如,如果我们的数据是从一个时钟信号,并采取有锋利的边缘,我们不希望顺利?该过滤器到目前为止,我们讨论不工作这么好:

负载clockexyMovingAverage = CONV(X,一(5,1)/ 5,'相同');ySavitzkyGolay = sgolayfilt(X,3,5);情节(t x,...T,yMovingAverage,...吨,ySavitzkyGolay)图例(“原始信号”“移动平均”“Savitzky-Golay”

移动平均和Savitzky-Golay滤波器分别对时钟信号边缘处的过校正和过校正进行了滤波。

一个简单的方法来保持边缘,但仍然平滑的水平是使用中值过滤器:

yMedFilt = medfilt1 (x 5'截短');情节(t x,...t, yMedFilt)传说(“原始信号”“中值滤波”

通过Hampel的筛选异常值移除

许多过滤器是异常敏感。这是密切相关的中值滤波器的过滤器是过滤Hampel的。这个滤波器有助于从信号中去除异常值而不过度平滑的数据。

要看到这一点,加载一个火车鸣笛的音频记录,并添加一些人为的噪音峰值:

负载培养y(1:400:结束)= 2.1;情节(y)

自从我们推出的每穗只有一个样本的持续时间,我们可以只使用三个元素的中值滤波去除毛刺。

保持情节(medfilt1 (y, 3))传奇(“原始信号”“经滤波的信号”

过滤器上除去的尖峰,但它也除去了大量的原始信号的数据点。一个Hampel的过滤器的工作原理类似于中值滤波器,但它取代刚才这相当于几个标准差从本地中间值远的值。

传说hampel (y, 13) (“位置”“最佳”

只有异常值从原始信号中去除。

进一步的阅读

有关过滤和采样更多信息,请参见信号处理工具箱。

参考:肯德尔,莫里斯G.,阿兰·斯图尔特和J.基思奥德。统计先进理论,卷。3:设计和分析,时间序列。第4版。伦敦:麦克米伦,1983。