matlab使用移动平均滤波器、重采样和Hampel过滤器进行信号平滑处理
此示例显示如何使用移动平均滤波器和重采样来隔离每小时温度读数的时间周期分量的影响,以及从开环电压测量中消除不需要的线路噪声。 该示例还显示了如何使用Hampel过滤器来移除大异常值。
动机
平滑是我们如何发现数据中的重要模式,同时忽略不重要的事物(即噪音)。我们使用过滤来执行此平滑。平滑的目标是产生缓慢的价值变化,以便更容易看到我们数据的趋势。
有时,当您检查输入数据时,您可能希望平滑数据以查看信号中的趋势。在我们的例子中,我们在洛根机场每个小时都有一套摄氏温度,在2011年1月的整个月。
请注意,我们可以直观地看到一天中的时间对温度读数的影响。如果您只对每月的日常温度变化感兴趣,则每小时波动只会产生噪音,这会使日常变化难以辨别。为了消除时间的影响,我们现在想通过使用移动平均滤波器来平滑我们的数据。
移动平均滤波器
在其最简单的形式中,长度为N的移动平均滤波器取波形的每N个连续样本的平均值。
为了对每个数据点应用移动平均滤波器,我们构造滤波器的系数,使每个点的权重相等,并且对总平均值贡献1/24。这给出了每24小时的平均温度。
过滤延迟
请注意,过滤后的输出会延迟大约十二小时。这是因为我们的移动平均滤波器有延迟。
任何长度为N的对称滤波器都将具有(N-1)/ 2个样本的延迟。
fDelay =(length(coeff24hMA)-1)/ 2;
提取平均差异
我们也可以使用移动平均滤波器来更好地估计一天中的时间如何影响整体温度。为此,首先从每小时温度测量值中减去平滑后的数据。然后,将差异数据细分为几天,并获取该月所有31天的平均值。
deltaTempC = reshape(deltaTempC,24,31)。';
提取峰值包络
有时我们也希望对每天温度信号的高低变化有一个平滑变化的估计。为此,我们可以使用该envelope
功能连接在24小时内检测到的极高和低点。在这个例子中,我们确保每个极高和极低之间至少有16个小时。我们还可以通过取两个极端之间的平均值来了解高点和低点的趋势。
加权移动平均滤波器
其他类型的移动平均滤波器不会对每个样本进行相同的加权
另一个常见的过滤器遵循二项式扩展。这种类型的滤波器近似于大的n值的正常曲线。它可用于滤除小n的高频噪声。要找到二项式滤波器的系数,请与其自身进行卷积,然后以规定的次数迭代地对输出进行卷积。在此示例中,使用五次总迭代。
binomialCoeff = conv(h,h);
fDelay =(length(binomialCoeff)-1)/ 2;
另一种类似于高斯扩展滤波器的滤波器是指数移动平均滤波器。这种类型的加权移动平均滤波器易于构造,并且不需要大的窗口 。
您可以通过0到1之间的alpha参数调整指数加权移动平均滤波器。较高的alpha值将具有较少的平滑。
exponentialMA = filter(alpha,[1 alpha-1],tempC);
plot(days,tempC,...
days-fDelay / 24,binomialMA,...
Savitzky-Golay过滤器
为了更紧密地跟踪信号,您可以使用加权移动平均滤波器,该滤波器尝试在最小二乘意义上拟合指定数量的样本上的指定顺序的多项式。
为方便起见,您可以使用该功能sgolayfilt
实现Savitzky-Golay平滑滤波器。
cubicMA = sgolayfilt(tempC,3,7);
quarticMA = sgolayfilt(tempC,4,7);
quinticMA = sgolayfilt(tempC,5,9);
重采样
我们在存在60 Hz交流电源线噪声干扰的情况下对模拟仪器输入端的开环电压进行采样。我们以1 kHz的采样率对电压进行采样。
fs = 1000;
t =(0:numel(openLoopVoltage)-1)/ fs;
让我们尝试使用移动平均滤波器消除线路噪声的影响。
如果构造一个均匀加权的移动平均滤波器,它将删除任何相对于滤波器持续时间而言是周期性的分量。
当以1000Hz采样时,在60Hz的完整周期中大约有1000/60 = 16.667个样本。让我们尝试“围捕”并使用17点过滤器。这将使我们在1000 Hz / 17 = 58.82 Hz的基频下进行最大滤波。
请注意,虽然电压显着平滑,但仍然包含60 Hz的小纹波。
如果我们重新采样信号,我们可以显着减少纹波,这样我们就可以通过移动平均滤波器捕获60 Hz信号的完整周期。
如果我们以17 * 60 Hz = 1020 Hz重新采样信号,我们可以使用我们的17点移动平均滤波器来消除60 Hz线路噪声。
中位数过滤器
移动平均线,加权移动平均线和Savitzky-Golay滤波器可以平滑它们过滤的所有数据。然而,这可能并不总是想要的。例如,如果我们的数据来自时钟信号并且具有我们不希望平滑的锐边,该怎么办?到目前为止讨论的过滤器效果不佳:
移动平均线和Savitzky-Golay滤波器分别在时钟信号边缘附近欠校正和过校正。
保留边缘但仍然平滑水平的一种简单方法是使用中值滤波器:
通过Hampel过滤器去除异常值
许多过滤器对异常值很敏感。与中值滤波器密切相关的滤波器是Hampel滤波器。此滤波器有助于从信号中删除异常值,而不会过度平滑数据。
由于我们引入的每个尖峰只有一个样本的持续时间,我们可以使用仅三个元素的中值滤波器来消除尖峰。
滤波器移除了尖峰,但它也删除了原始信号的大量数据点。Hampel滤波器的工作方式类似于中值滤波器,但它只取代了相当于远离局部中值的几个标准偏差的值。
仅从原始信号中移除异常值。
如果您有任何疑问,请在下面发表评论。