传统的IIR / FIR滤波器(通过低通消除高频率振荡),例如移动平均,
都可以使信号平滑,例如包络信号:
Savitzky-Golay滤波器对于哪种应用比经典的低通更有趣?
它与标准过滤器有什么不同?与标准过滤器相比,它有什么优点?
它是否适应输入数据?
暂时保存更好吗?
您是否曾经有一天决定“让我们使用SG滤波器而不是移动平均线或另一个FIR低通!这是更好的选择,因为这,这个和这个...”是不是处于工程状况?那么这个问题适合您!
传统的IIR / FIR滤波器(通过低通消除高频率振荡),例如移动平均,
都可以使信号平滑,例如包络信号:
Savitzky-Golay滤波器对于哪种应用比经典的低通更有趣?
它与标准过滤器有什么不同?与标准过滤器相比,它有什么优点?
它是否适应输入数据?
暂时保存更好吗?
您是否曾经有一天决定“让我们使用SG滤波器而不是移动平均线或另一个FIR低通!这是更好的选择,因为这,这个和这个...”是不是处于工程状况?那么这个问题适合您!
Answers:
由于现有答案和评论中的讨论主要集中在Savitzky-Golay滤波器实际上是什么(非常有用)上,因此我将通过提供一些有关如何实际选择平滑滤波器的信息来尝试添加到现有答案中,据我了解,问题实际上是关于什么的。
首先,我想重复讨论中从其他答案中得出的明确结论:一方面将问题中的平滑滤波器归类为线性和时不变(LTI)FIR / IIR滤波器,并且另一方面,Savitzky-Golay滤波器具有误导性。Savitkzy-Golay滤波器只是根据特定条件(局部多项式逼近)设计的标准FIR滤波器。因此,问题中提到的所有过滤器都是LTI过滤器。
剩下的问题是如何选择平滑滤波器。如果计算复杂性和/或内存成为问题,IIR滤波器可能比FIR滤波器更可取,因为IIR滤波器通常会以比FIR滤波器低得多的滤波器阶数实现相当的噪声抑制(即阻带衰减)。但是请注意,如果需要实时处理,IIR滤波器的一个可能的缺点是它们不能具有精确的线性相位响应。因此,所需信号将遭受一些相位失真。对于离线处理,即使使用IIR滤波器,也可以通过应用零相位滤波来避免相位失真。。
除了上一段中讨论的考虑因素外,主要还是要考虑设计准则,而滤波器是FIR还是IIR则不是那么重要,因为任何(稳定的)IIR滤波器都可以由FIR滤波器以任意精度近似。 FIR滤波器可以由IIR滤波器近似,即使后者可能要困难得多。适当的设计标准显然取决于数据和噪声的属性。在进行平滑处理时,我们通常会假设数据已经过采样(即平滑)。如果噪声主要具有高频成分,即,如果数据和噪声之间几乎没有频谱重叠,则我们希望最大程度地降低阻带衰减或最小化阻带能量,同时尽可能保留所需信号。在这种情况下,我们可以选择使用Parks-McClellan算法根据极小极大准则设计的线性相位FIR滤波器。我们还可以通过选择最小二乘法来最小化阻带能量(即,最小化阻带中的噪声功率)。通过选择一个,可以在两个标准(最小最大和最小二乘)之间进行混合约束最小二乘设计,可将阻带能量降至最低,同时限制通带中的最大逼近误差。
如果噪声频谱与信号频谱明显重叠,则需要采取更谨慎的方法,并且强力衰减将无法很好地起作用,因为您会留下过多的噪声(通过选择过高的截止频率)或使所需的频谱失真信号太多。在这种情况下,Savitzky-Golay(SG)滤波器可能是一个不错的选择。要付出的代价是中等的阻带衰减,但是优点之一是很好地保留了某些信号特性。这与以下事实有关:SG滤波器具有平坦的通带响应,即
其中是近似多项式和的顺序是所述滤波器的频率响应。属性保证第一个了输入信号矩保留在输出中,这意味着所需信号中的峰的宽度和高度都得到了很好的保留。
当然,上面讨论的两种类型的平滑滤波器(高阻带衰减和SG)之间也存在折衷。我们可以设计一个在ω = 0时具有一定平坦度的FIR滤波器并使用剩余的自由度来最大化阻带衰减或最小化阻带能量。在FIR滤波器的情况下,所产生的设计问题足够简单(凸),并且可以使用几个软件包中可用的常规优化例程来获得给定应用的最佳滤波器。
对于对SG滤波器理论感兴趣的人,我可以推荐最相关的参考文献:
像其他任何东西一样,有时某些工具比其他工具更好。
移动平均(MA)滤波器可用于平滑数据,并且是FIR。它们几乎是您可以想到的最简单的过滤器,并且只要您不尝试对突然的跳跃或多项式趋势建模,它们就可以很好地完成许多任务。请记住,尽管它们实际上只是低通滤波器,所以当您在信号中关注的数据是低频且相当窄的带宽时,它们会发挥最佳作用。
Savitzky-Golay(SG)滤波器是一组特殊的FIR滤波器,当卷积沿信号滑动时,它们基本上适合您的时间序列的多项式。SG滤波器可用于信号,其中您所关心的不一定是低频和相当窄的频带。
我认为您会发现,如果您阅读了非常完整的Wikipedia页面,它就非常严格地解释了SG和MA过滤器之间的区别。不过请记住:最后,它们都是做类似事情的工具,这取决于您确定何时使用正确的工具
编辑:
由于在某种程度上说SG过滤器在某种程度上是“自适应”的,这似乎有些混乱,因此我提供了一个简单的MATLAB示例。正如Dan所指出的那样,可以使它们自适应,但是它们的基本实现常常不是。通过检查代码,您会发现这只是一个矩阵,并进行了一些特殊处理。在传统意义上,关于此滤波器的任何内容都不是“自适应的”,您只是在选择多项式拟合,以及通过卷积将多项式拟合到信号上的长度。SG是必不可少的FIR。我下面的脚本产生了这个图:
查看此图,您可以看到MA和SG本质上完成了同一件事,但有一些重要区别:
为了使您更好地了解这些过滤器的工作方式,我鼓励您在此处使用代码并对其进行操作,并查看SG过滤器的所有各个部分的工作方式。
MATLAB示例的代码:
% Generate a signal "s" that has square waves, and scale it with a
% polynomial of order 5
up = 1*ones(1,100);
down = zeros(1,150);
s = [down down up up down up down up down up up up down down down down down];
n = numel(s);
nn = linspace(0,4,numel(s));
s = s .* (nn .^5);
sn = (s + 4*randn(size(s))).';
% smooth it with SMA of length 15
sz = 15;
h = 1/sz * ones(1,sz);
sn_sma = conv(sn,h,'same');
% smooth it with sgolay of frame length 15
m = (sz-1)/2;
% look up the SG matrix for this order and size
B = sgolay(5, sz);
% compute the steady state response for the signal, i.e. everywhere that
% isnt the first or last "frame" for the SG filter
steady = conv(sn, B(m+1,:), 'same');
% handle the transiet portion at the start of the signal
y_st = B(1:m,:)*sn(1:sz);
% handle the transient portion at the end of the signal
y_en = B(sz -m+1 : sz, :) * sn(n - sz+1:n);
% combine our results
sn_sg = steady;
sn_sg(1:m) = y_st;
sn_sg(n-m+1:n) = y_en;
% plots
figure(1);
hold off;
plot(sn,'Color',[0.75 0.75 0.75]);
hold on;
plot(sn_sma,'b');
plot(sn_sg,'r');
legend('Noisy Signal','MA Smoothing','SG Smoothing, order 5','Location','NorthWest');
注意
我先前的回答(在此编辑之前)将Savitzky-Golay(SG)滤波器表示为非线性的,随时间变化的输入数据相关的错误,这是由于对Savitzky-Golay(SG)滤波器如何计算其输出的过早误解根据提供的Wiki链接。因此,现在我正对其进行修正,以使那些也了解SG过滤器如何通过FIR-LTI过滤实现的人受益。感谢@MattL。为了纠正他的问题,他提供了重要的联系,并在我对该问题进行调查期间表现出了他的耐心(我从未表现出过)。虽然老实说,我更倾向于冗长的反对,但这显然没有必要。还请注意,正确答案是另一个,这个答案只是为了进一步澄清SG滤波器的LTI属性。
现在不足为奇的是,当某人(以前从未使用过这些滤波器的人)面对SG滤波器的定义是对给定数据的低阶LSE多项式拟合时,他/她会立即得出结论,即这些依赖于数据,非线性且随时间变化的自适应滤波器。
但是,多项式拟合过程可以由SG自己巧妙地解释,因此它可以实现完全独立于数据的时不变线性滤波,因此使SG成为固定的LTI-FIR滤波器。
以下是MattL提供的链接的最简短摘要。有关似乎缺少的任何详细信息,请查阅原始文档,或要求进行澄清。但是我不想在这里重新制作整个文档。
现在,对于那些熟悉LSE polyfit程序的人,我将简单地写出定义最佳系数集的矩阵方程式(来自链接):
现在让我们退缩一会儿,在这里讨论一个要点。
...这个(LSE多项式拟合)可以在输入的每个样本上重复,每次生成一个新的多项式和一个新的输出序列y [n]的值...
那么我们如何克服这个令人困惑的惊喜呢?通过将SG过滤器输出解释和定义为以下内容:
也就是说,对于每个y [ d ]的输入集,根据样本x [[
。但是,此SG滤波器的滤波器系数是多少?让我们来看看。
评论
MATLAB / OCTVE代码
% Savitzky-Golay Filter
%
clc; clear all; close all;
N = 3; % a0,a1,a2,a3 : 3rd order polynomial
M = 4; % x[-M],..x[M] . 2M + 1 data
A = zeros(2*M+1,N+1);
for n = -M:M
A(n+M+1,:) = n.^[0:N];
end
H = (A'*A)^(-1)* A'; % LSE fit matrix
h = H(1,:); % S-G filter impulse response (nancausal symmetric FIR)
figure,subplot(2,1,1)
stem([-M:M],h);
title(['Impulse response h[n] of Savitzky-Golay filter of order N = ' num2str(N), ' and window size 2M+1 = ' , num2str(2*M+1)]);
subplot(2,1,2)
plot(linspace(-1,1,1024), abs(fftshift(fft(h,1024))));
title('Frequency response magnitude of h[n]');
输出为:
希望这可以澄清问题。