Savitzky – Golay filtresi vs. IIR veya FIR doğrusal filtre


11
  • Geleneksel bir IIR / FIR filtresi (yüksek frekans salınımlarını gidermek için düşük geçiş), örneğin hareketli ortalama,

  • veya Savitzky-Golay filtresi

zarf sinyali gibi bir sinyali düzeltmek için hepsi yararlı olabilir:

resim açıklamasını buraya girin

Hangi uygulama için bir Savitzky-Golay filtresi klasik bir alçak geçitten daha ilginç olurdu?

Standart filtreden farklı kılan nedir ve standart filtrelere kıyasla ne ekler?

Kendini giriş verilerine uyarlıyor mu?

Geçici koruma için daha mı iyi?


Eğer karar verdiğinde Hiç bir gün bir mühendislik durum olmuştur "ortalama veya başka FIR alçak geçiren taşımak yerine Let kullanımını bir SG filtresi! Daha iyi bu ve bu ve bunun nedeni ... var" ? O zaman bu soru tam size göre!

Yanıtlar:


4

Mevcut cevaplar ve yorumlardaki tartışma esas olarak Savitzky-Golay filtrelerinin gerçekte ne olduğuna odaklandığından (ki bu çok yararlı oldu), gerçekte bir düzeltme filtresinin nasıl seçileceği hakkında bazı bilgiler sağlayarak mevcut cevaplara eklemeye çalışacağım. benim görüşüme göre, sorunun aslında neyle ilgili olduğu.

Her şeyden önce, diğer cevaplardan ortaya çıkarak tartışmada netleşen şeyleri tekrarlamak istiyorum: bir yandan sorudaki yumuşatma filtrelerinin bir yandan doğrusal ve zamanla değişmeyen (LTI) FIR / IIR filtrelerine sınıflandırılması ve Diğer yandan Savitzky-Golay filtreleri yanıltıcıdır. Savitkzy-Golay filtresi, yalnızca belirli bir kritere (yerel polinom yaklaşımı) göre tasarlanmış standart bir FIR filtresidir. Yani soruda bahsedilen tüm filtreler LTI filtreleridir.

Geriye kalan soru, bir düzeltme filtresinin nasıl seçileceğidir. Hesaplama karmaşıklığı ve / veya bellek bir sorunsa, FIR filtrelerine kıyasla IIR filtreleri tercih edilebilir, çünkü bunlar tipik olarak FIR filtrelerinden çok daha düşük bir filtre düzeniyle karşılaştırılabilir gürültü bastırma (yani, durdurma bandı zayıflaması) elde ederler. Ancak, gerçek zamanlı işleme gerekliyse, IIR filtrelerinin olası bir dezavantajı, tam olarak doğrusal bir faz tepkisine sahip olamayacaklarıdır. Böylece istenen sinyal bazı faz bozulmalarına maruz kalacaktır. Çevrimdışı işleme için, sıfır fazlı filtreleme uygulanarak IIR filtrelerde bile faz bozulmalarından kaçınılabilir .

Önceki paragrafta ele alınan hususların yanı sıra, filtrenin FIR veya IIR olması durumunda çok fazla olmayan esas olarak tasarım kriteri, çünkü herhangi bir (kararlı) IIR filtresi bir FIR filtresi ve herhangi bir rastgele filtre ile keyfi bir doğrulukla tahmin edilebilir. FIR filtresi, IIR filtresi ile yaklaşık olarak tahmin edilebilir, ancak ikincisi çok daha zor olabilir. Uygun tasarım kriteri açıkça verilerin özelliklerine ve gürültüye bağlıdır. Düzeltme söz konusu olduğunda, genellikle yeterince örneklenmiş (yani düzgün) veriler olduğunu varsayıyoruz. Gürültünün esas olarak yüksek frekanslı bileşenleri varsa, yani veri ve gürültü arasında çok az spektral örtüşme varsa, istenen bandı mümkün olduğunca korurken durdurma bandı zayıflamasını en üst düzeye çıkarmak veya durdurma bandı enerjisini en aza indirmek istiyoruz. Bu durumda, Parks-McClellan algoritmasını kullanarak bir minimax ölçütüne göre tasarlanmış doğrusal fazlı FIR filtresi seçebiliriz. Ayrıca, en küçük kareler yöntemini seçerek durdurma bandı enerjisini en aza indirebiliriz (yani durdurma bandındaki gürültü gücünü en aza indirebiliriz). İki kriter (minimax ve en küçük kareler) arasında bir karışım,geçiş bandındaki maksimum yaklaşım hatasını kısıtlarken durdurma bandı enerjisini en aza indiren kısıtlı en küçük kareler tasarımı .

Gürültü spektrumu sinyal spektrumu ile önemli ölçüde örtüşüyorsa, daha dikkatli bir yaklaşım gerekir ve kaba kuvvet zayıflaması iyi çalışmaz çünkü çok fazla gürültü bırakırsınız (kesme frekansını çok yüksek seçerek) veya istenen distorsiyonu sinyal çok fazla. Bu durumda Savitzky-Golay (SG) filtreleri iyi bir seçim olabilir. Ödenecek fiyat vasat stopband zayıflamasıdır, ancak bir avantajı bazı sinyal özelliklerinin çok iyi korunmasıdır. Bu, SG filtrelerinin düz geçiş bandı tepkisine sahip olmasıyla ilgilidir, yani,

(1)dk'H(ejω)dωk|ω=0=0k=1,2,...,r

burada r , yaklaşık polinomun sırasıdır ve 'H(ejω) filtrenin frekans cevabıdır. Özellik (1) , giriş sinyalinin ilk r momentinin çıkışta korunmasını garanti eder , bu da istenen sinyaldeki piklerin genişliğinin ve yüksekliğinin iyi korunmuş olduğu anlamına gelir.

Tabii ki yukarıda tartışılan iki tip düzeltme filtresi arasında da bir uzlaşma vardır (yüksek durdurma bandı zayıflaması ve SG). ω=0 belirli bir düzlük derecesine sahip bir FIR filtresi tasarlayabilir ve durdurma bandı zayıflamasını en üst düzeye çıkarmak veya durdurma bandı enerjisini en aza indirmek için kalan serbestlik derecelerini kullanabiliriz. FIR filtreleri durumunda, ortaya çıkan tasarım problemi yeterince basittir (ve dışbükey) ve belirli bir uygulama için en uygun filtreyi elde etmek için çeşitli yazılım paketlerinde bulunan genel optimizasyon rutinleri kullanılabilir.

SG filtreleri teorisi ile ilgilenenler için tavsiye edebileceğim en alakalı referanslar şunlardır:


2

Her şeyde olduğu gibi, bazen bazı araçlar diğerlerinden daha iyidir.

Hareketli ortalama (MA) filtreleri verileri düzgünleştirmek için kullanılabilir ve FIR'tır. Bunlar, neredeyse anlayabileceğiniz en basit filtredir ve ani sıçramalar veya polinom eğilimlerini modellemeye çalışmadığınız sürece birçok görev için iyi çalışırlar. Bunların aslında sadece düşük geçişli filtre olduğunu unutmayın, bu nedenle sinyalde önem verdiğiniz veriler düşük frekanslı ve oldukça dar bant olduğunda en iyi şekilde çalışırlar.

Savitzky-Golay (SG) filtreleri, evrişim sinyal boyunca kayarak zaman dizinize bir polinomu sığdıran özel bir FIR filtreler grubudur. SG filtreleri, önem verdiğiniz şeylerin düşük frekans ve oldukça dar bant olmadığı sinyaller için kullanışlıdır.

Bağlandığınız Wikipedia sayfasını okursanız, SG ve MA filtreleri arasındaki farkı oldukça ayrıntılı bir şekilde açıkladığını düşünüyorum. Yine de unutmayın: Sonunda, ikisi de sadece benzer şeyleri yapmak için araçlar, doğru aracı ne zaman kullanacağınızı öğrenmek size kalmış

DÜZENLE :

SG filtrelerinin bir şekilde temel düzeyde "uyarlanabilir" olduğu konusunda bir karışıklık olduğu için, basit bir MATLAB örneğini ekledim. Dan'ın belirttiği gibi, bunlar uyarlanabilir hale getirilebilir, ancak temel uygulamaları genellikle değildir. Kodu inceleyerek, bunun sadece özel bir işlemle sadece bir matris araması olduğunu göreceksiniz. Bu filtre hakkında hiçbir şey geleneksel anlamda "uyarlanabilir" değildir, basitçe bir polinom uyumu ve bu polinomun konveksiyon yoluyla sinyale sığacağı uzunluk seçersiniz; SG esastır FIR. Aşağıda var olan komut dosyası bu arsa üretir: MA ile SG filtre karşılaştırması

Bu şekle bakarak, MA ve SG'nin aslında aynı şeyi başardığını, ancak bazı önemli ayrımlarla görebilirsiniz:

  1. MA, gürültüyü bastırmak için harika bir iş çıkarır, ancak sinyaldeki geçici sıçramaları yakalayan kötü bir iş çıkarır. Filtrenin uzunluğunu artırarak daha fazla gürültüyü bastırabiliriz, ancak daha sonra geçici akımlarda daha da kötü performans gösterecektir; bu etki, gösterilen şekilde görebilmeniz gereken geçici akımların yakınında "bulaşma" olarak görülecektir.
  2. SG, sinyalin geçişlerini yakalamak için harika bir iş çıkarır, ancak gürültüyü bastırmak için çok iyi bir iş yapmaz (en azından aynı boyuttaki bir MA'ya kıyasla). Çerçeve uzunluğunu artırarak geçici olmayanların yakınında gürültü bastırma özelliğini artırabiliriz, ancak bu, Gibb fenomenine benzer herhangi bir geçişin yakınındaki zil seslerini getirecektir.

Bu filtrelerin nasıl çalıştığını daha iyi anlayabilmeniz için, kodu buraya alıp manipüle etmenizi ve SG filtresinin tüm parçalarının nasıl çalıştığını görmenizi öneririm.

MATLAB örneğinin kodu:

% 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
Mesele şu ki (diğer cevabı görerek), SG filtresinin " katsayıları girdisinin her kısa segmenti için yeniden hesaplanan, tamamen veriye bağlı, doğrusal olmayan, zamanla değişen bir filtre " olduğu görülmektedir.
g6kxjv1ozn

1
SG filtresi, bunu birkaç kez uygulamaktan anladığım kadarıyla, özellikle bir LMS veya RLS gibi ortalama uyarlanabilir filtrenize kıyasla hiç uyarlanabilir bir filtre değildir. Filtre ağırlıklarının zaman içinde değiştiğine dair ifadeye tamamen katılmıyorum. SG filtreleri esasen bir tablo aramasıdır, geçici bir yanıt hesaplamak için tablodaki değerlerle filtrelersiniz ve sonra geri dönüp sinyalin başlangıcında / sonunda kenar durumlarını ele alırsınız. Bunu size göstermek için yazımı bir MATLAB örneğiyle düzenleyeceğim.
matthewjpollard

2
@matthewjpollard Unutmayın, kişisel olarak bu filtreyi kullanma konusunda önemli bir deneyimim yok, ancak bana göre en iyi uygulanan SG filtresi, zamana göre değişen katsayılara sahip, uyarlanabilir bir filtre uygulaması gibi görünüyor. Filtreyi kodunuza uygulama şekli (dizinin tamamına "alt küme" verileri olarak işlem yaptığınız gibi) değil, özellikle Wikipedia en.wikipedia.org/wiki/Savitzky%E2%80% 93 Golay_filter ve Savitzky ve Golay'ın gazetede kendisi gerçekten uyarlanabilir: pdfs.semanticscholar.org/4830/…
Dan Boschen

2
@matthewjpollard Gerçek zamanlı sistemlerinizde verileriniz sürekli olarak akıyor, böylece katsayıları daha kısa aralıklarla yeniden hesaplıyor musunuz yoksa her zaman küçük veri bloklarında mı çalışıyorsunuz?
Dan Boschen

2
Teşekkürler Matt. Belki de her bir veri toplama için katsayıların hesaplanması anlamında uyarlanabilir / zaman olarak yaptığınız şeyleri ilişkilendirebiliriz (bir veri toplama içindeki aynı katsayılar, ancak başlangıç ​​ve bitiş işlemlerinin doğru bir şekilde yapılmasıyla, ancak bir toplamadan diğerine kadar değişiyorsa- doğru anlamak). Kodunuzu ve örnek uygulamanızı paylaştığınız için teşekkür ederiz.
Dan Boschen

2

NOT

Savitzky-Golay (SG) filtresini doğrusal olmayan, zamanla değişen bir giriş verisine bağımlı olarak gösteren önceki cevabım (bu düzenlemeden önce), Savitzky-Golay (SG) filtresinin çıktısını nasıl hesapladığı konusunda erken yanlış yorumlama nedeniyle yanlıştı sağlanan wiki bağlantısına göre. Şimdi, SG filtrelerinin FIR-LTI filtrelemeyle nasıl uygulanabileceğini de görecek olanların yararına düzeltiyorum. @MattL sayesinde. düzeltmesi için verdiği büyük bağlantı ve bu konuyu araştırmam sırasında gösterdiği sabır (hiç gösterememiştim) . Yine de dürüstçe, yine de açıkça gerekli olmayan daha ayrıntılı bir itirazı tercih edeceğim. Ayrıca lütfen doğru cevabın diğeri olduğunu unutmayın, bu sadece SG filtrelerinin LTI özelliğinin ek açıklaması içindir.

Şimdi (daha önce bu filtreleri hiç kullanmamış olan) birisinin SG filtresinin verilere düşük dereceli bir LSE polinomu uyumu vermesi durumunda, verilere derhal verilere bağlı, doğrusal olmayan ve zaman (vardiya) değişken, uyarlanabilir filtreler.

Yine de, polinom uydurma prosedürü SG tarafından akıllıca yorumlanır, böylece tamamen veri bağımsız, zamanla değişmeyen, doğrusal bir filtreleme mümkün olur, böylece SG'yi sabit bir LTI-FIR filtresi haline getirir.

Aşağıda, MattL tarafından sağlanan bağlantıdan kısa bir özet verilmiştir. Eksik gibi görünen tüm ayrıntılar için lütfen orijinal belgeye bakın veya açıklığa kavuşturun. Ancak belgenin tamamını burada yeniden üretmek istemiyorum.

2M+1x[-M],x[-M+1],...,x[0],x[1],...,x[M]n=0p[n]N-n=-M,-M+1,...,-1,0,1,...M

p[n]=Σk=0N-birknk=bir0+bir1n+bir2n2+...+birN-nN-

birkN-thp[n]

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

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

birkE

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

Şimdi LSE çoklu uyum prosedürüne aşina olanlar için, en uygun katsayı kümesini tanımlayan sonuçtaki matris denklemini (linkten) yazacağım:

(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-]

Şimdi bir anlığına arkanıza yaslanıp burada bir noktayı tartışalım.

bir'HnbirkMN-x[n]birk2nd

... Bu (LSE polifit) girişin her bir örneğinde tekrarlanabilir, her seferinde yeni bir polinom ve çıkış dizisi y [n] için yeni bir değer üretir ...

Peki bu şaşırtıcı sürprizi nasıl yenebiliriz? SG filtre çıkışını aşağıdaki şekilde yorumlayıp tanımlayarak:

N-nx[n]y[n]p[n]n=0

y[n]=y[0]=Σm=0N-birmnm=bir0

2M+1x[n]n=dy[n]a0p[n]x[n]n=dy[d]x[dM],x[dM+1],...,x[d1],x[d],x[d+1],...x[d+M]

a0x[n]y[n]x[n]nx[n]h[n]. Ama sonra, bu SG filtresi için filtre katsayıları nelerdir? Bakalım.

ak

a=Hx

[a0a1aN]=[h(0,0)h(0,1)...h(0,2M)h(1,0)h(1,1)...h(1,2M)...h(N-,0)h(0,1)...h(0,2M)][x[-M]x[-M+1]...x[M]]

bir0'Hx

bir0='H(0,n)x=Σ'H(0,k)x[k]='H(0,-n)x[n]

h[n]='H(0,-n)

N-2M+1

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

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

YORUM YAP

birkh[n]y[n]xbir='Hxbirkp[n]birkh[n]

MATLAB / OCTVE KODU

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

Çıktı:

resim açıklamasını buraya girin

Umarım bu sorunu açıklığa kavuşturur.


2
@ Fat32 Bunun uzun bir ileri ve geri yorum listesi olduğu için düşünüyorum, bu yüzden kurulu temiz tutmak için genellikle "sohbet" taşımak. Her şey hala orada, sadece ana sayfayı karıştırmıyor. Bu nedenle sistem, ileri geri uzun sürdüğünde sohbet etmeyi önermektedir. Üzülmemek için, herkes hala seni seviyor.
Dan Boschen

1
@ g6kxjv1ozn O noktaya geliyorum ... lütfen bekleyin ...
Fat32

2
@ Fat32 Harika iş çıkardın! Onu okudum ama okumalıyım ve çok net bir şekilde yazılmış, şimdi yaptığınız gibi tamamen görmek için adım adım kalem ve kağıtla takip etmem gerekecek. Hepsini buraya koyduğunuz için teşekkürler.
Dan Boschen

4
1ω=0

2
birkh[n]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.