Savitzky–Golay滤波器与IIR或FIR线性滤波器


11
  • 传统的IIR / FIR滤波器(通过低通消除高频率振荡),例如移动平均,

  • Savitzky-Golay滤镜

都可以使信号平滑,例如包络信号:

在此处输入图片说明

Savitzky-Golay滤波器对于哪种应用比经典的低通更有趣?

它与标准过滤器有什么不同?与标准过滤器相比,它有什么优点?

它是否适应输入数据?

暂时保存更好吗?


您是否曾经有一天决定“让我们使用SG滤波器而不是移动平均线或另一个FIR低通!这是更好的选择,因为这,这个和这个...”是不是处于工程状况?那么这个问题适合您!

Answers:


4

由于现有答案和评论中的讨论主要集中在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滤波器具有平坦的通带响应,即

(1)dķHËĴωdωķ|ω=0=0ķ=1个2[R

其中[R是近似多项式和的顺序HËĴω是所述滤波器的频率响应。属性(1)保证第一个r了输入信号矩保留在输出中,这意味着所需信号中的峰的宽度和高度都得到了很好的保留。

当然,上面讨论的两种类型的平滑滤波器(高阻带衰减和SG)之间也存在折衷。我们可以设计一个在ω = 0时具有一定平坦度的FIR滤波器ω=0并使用剩余的自由度来最大化阻带衰减或最小化阻带能量。在FIR滤波器的情况下,所产生的设计问题足够简单(凸),并且可以使用几个软件包中可用的常规优化例程来获得给定应用的最佳滤波器。

对于对SG滤波器理论感兴趣的人,我可以推荐最相关的参考文献:


2

像其他任何东西一样,有时某些工具比其他工具更好。

移动平均(MA)滤波器可用于平滑数据,并且是FIR。它们几乎是您可以想到的最简单的过滤器,并且只要您不尝试对突然的跳跃或多项式趋势建模,它们就可以很好地完成许多任务。请记住,尽管它们实际上只是低通滤波器,所以当您在信号中关注的数据是低频且相当窄的带宽时,它们会发挥最佳作用。

Savitzky-Golay(SG)滤波器是一组特殊的FIR滤波器,当卷积沿信号滑动时,它们基本上适合您的时间序列的多项式。SG滤波器可用于信号,其中您所关心的不一定是低频和相当窄的频带。

我认为您会发现,如果您阅读了非常完整的Wikipedia页面,它就非常严格地解释了SG和MA过滤器之间的区别。不过请记住:最后,它们都是做类似事情的工具,这取决于您确定何时使用正确的工具

编辑

由于在某种程度上说SG过滤器在某种程度上是“自适应”的,这似乎有些混乱,因此我提供了一个简单的MATLAB示例。正如Dan所指出的那样,可以使它们自适应,但是它们的基本实现常常不是。通过检查代码,您会发现这只是一个矩阵,并进行了一些特殊处理。在传统意义上,关于此滤波器的任何内容都不是“自适应的”,您只是在选择多项式拟合,以及通过卷积将多项式拟合到信号上的长度。SG是必不可少的FIR。我下面的脚本产生了这个图: SG过滤器与MA的比较

查看此图,您可以看到MA和SG本质上完成了同一件事,但有一些重要区别:

  1. MA在抑制噪声方面做得很好,但是在捕获信号中的瞬态跳变方面做得很差。我们可以通过增加滤波器的长度来抑制更多的噪声,但是它在瞬变中的表现会更差。在任何瞬变附近,这种效果都将被视为“拖影”,您应该能够在所示的图中看到。
  2. SG在捕获信号瞬变方面做得很出色,但在抑制噪声方面却做得不太好(至少与相同大小的MA相比)。我们可以通过增加帧长来改善非瞬态附近的噪声抑制,但这将在任何瞬态附近引入类似于吉布现象的振铃。

为了使您更好地了解这些过滤器的工作方式,我鼓励您在此处使用代码并对其进行操作,并查看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');

1
似乎是(通过看另一个答案),SG滤波器是“完全依赖数据的非线性时变滤波器,其输入的每个短段都会重新计算系数”。
g6kxjv1ozn

1
从我多次实施后的理解来看,SG滤波器根本不是自适应滤波器,尤其是与LMS或RLS等平均自适应滤波器相比。我完全不同意滤波器权重随时间变化的说法。SG过滤器本质上是一个表查找,您使用表中的值进行过滤以计算瞬态响应,然后返回并处理信号开始/结束处的边缘情况。我将使用MATLAB示例编辑我的帖子,以向您展示。
matthewjpollard 18/09/27

2
@matthewjpollard需要注意的是,我个人没有使用此滤波器的丰富经验,但是对我来说,最佳实现的SG滤波器确实是具有时变系数的自适应滤波器实现。不是在代码中应用过滤器的方式(因为您将整个序列视为数据“子集”),而是Wikipedia en.wikipedia.org/wiki/Savitzky%E2%80%中所述的方法 93Golay_filter 和纸张本身由Savitzky和格雷的确是适应性:pdfs.semanticscholar.org/4830/...
丹Boschen

2
@matthewjpollard在您的实时系统中,您的数据是否一直在连续流传输,这样您就可以在较短的时间间隔内重新计算系数,或者您始终在处理小块数据吗?
Dan Boschen

2
谢谢马特。因此,也许我们可以将您所做的自适应/随时间变化的含义关联起来,即为每个数据收集计算系数(但是,数据收集中的相同系数经过适当的开始和结束处理,但从一个收集到下一个收集就不同了,如果我正确理解)。感谢您分享您的代码和示例应用程序。
Dan Boschen

2

注意

我先前的回答(在此编辑之前)将Savitzky-Golay(SG)滤波器表示为非线性的,随时间变化的输入数据相关的错误,这是由于对Savitzky-Golay(SG)滤波器如何计算其输出的过早误解根据提供的Wiki链接。因此,现在我正对其进行修正,以使那些也了解SG过滤器如何通过FIR-LTI过滤实现的人受益。感谢@MattL。为了纠正他的问题,他提供了重要的联系,并在我对该问题进行调查期间表现出了他的耐心(我从未表现出过)。虽然老实说,我更倾向于冗长的反对,但这显然没有必要。还请注意,正确答案是另一个,这个答案只是为了进一步澄清SG滤波器的LTI属性。

现在不足为奇的是,当某人(以前从未使用过这些滤波器的人)面对SG滤波器的定义是对给定数据的低阶LSE多项式拟合时,他/她会立即得出结论,即这些依赖于数据,非线性且随时间变化的自适应滤波器。

但是,多项式拟合过程可以由SG自己巧妙地解释,因此它可以实现完全独立于数据的时不变线性滤波,因此使SG成为固定的LTI-FIR滤波器。

以下是MattL提供的链接的最简短摘要。有关似乎缺少的任何详细信息,请查阅原始文档,或要求进行澄清。但是我不想在这里重新制作整个文档。

2中号+1个X[-中号]X[-中号+1个]X[0]X[1个]X[中号]ñ=0p[ñ]ññ=-中号-中号+1个-1个01个中号

p[n]=k=0Naknk=a0+a1n+a2n2+...+aNnñ

akNthp[n]

E=MM(p[n]x[n])2

x=[x[M],x[M+1],...,x[0],x[1],...,x[M]]T

akE

(1)Eai=0   ,   for    i=0,1,..,N

现在,对于那些熟悉LSE polyfit程序的人,我将简单地写出定义最佳系数集的矩阵方程式(来自链接):

(2)a=(ATA)1ATx=Hx
x(2M+1)×1H2M+1NAnAHA

A=[αn,i]=[(M)0(M)1...(M)N(M+1)0(M+1)1...(M+1)N...(0)0(0)1...(0)N...(M)0(M)1...(M)N]

现在让我们退缩一会儿,在这里讨论一个要点。

AHnakMNx[n]一个ķ2ñd

...这个(LSE多项式拟合)可以在输入的每个样本上重复,每次生成一个新的多项式和一个新的输出序列y [n]的值...

那么我们如何克服这个令人困惑的惊喜呢?通过将SG过滤器输出解释和定义为以下内容:

ññX[ñ]ÿ[ñ]p[ñ]ñ=0

ÿ[ñ]=ÿ[0]==0ñ一个ñ=一个0

也就是说,对于每个2中号+1个y [ d ]的输入集,根据样本x [[X[ñ]ñ=dÿ[ñ]一个0p[ñ]X[ñ]n=dy[d]x[dM],x[dM+1],...,x[d1],x[d],x[d+1],...x[d+M]

a0x[n]y[n]X[ñ]ñX[ñ]H[ñ]。但是,此SG滤波器的滤波器系数是多少?让我们来看看。

一个ķ

一个=HX

[一个0一个1个一个ñ]=[H00H01个H02中号H1个0H1个1个H1个2中号Hñ0H01个H02中号][X[-中号]X[-中号+1个]X[中号]]

一个0HX

a0=H(0,n)x=H(0,k)x[k]=H(0,n)x[n]

h[n]=H(0,n)

N2M+1

y[n]2M+1x[n]LhN[n]

y[n]=x[n]hN[n]

评论

akh[n]y[n]xa=Hxakp[n]akh[n]

MATLAB / OCTVE代码

h[n]h[n]

% 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]');

输出为:

在此处输入图片说明

希望这可以澄清问题。


2
@ Fat32我认为是因为这是一长串来回的评论,因此为了保持董事会的清洁度,他们通常将其“聊天”。它仍然存在,只是不会弄乱主页。这就是为什么系统建议在来回时间过长时将其移动为聊天。不要烦恼,每个人仍然爱你。
Dan Boschen

1
@ g6kxjv1ozn我很明白这一点...请稍候...
Fat32

2
@ Fat32太好了!我通读了它,但是需要通读它,而且写得很清楚,我只需要逐步使用铅笔和纸来完全了解它,就像您现在所做的那样。感谢您将所有内容都放在这里。
Dan Boschen

4
1ω=0

2
akh[n]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.