Savitzky – Golay filter vs IIR atau filter linear FIR

11
  • Filter IIR / FIR tradisional (lowpass untuk menghapus osilasi freq tinggi), misalnya moving average,

  • atau filter Savitzky-Golay

semuanya dapat berguna untuk memperlancar sinyal, seperti sinyal amplop:

masukkan deskripsi gambar di sini

Untuk aplikasi apa filter Savitzky-Golay lebih menarik daripada lowpass klasik?

Apa yang membuatnya berbeda dari filter standar, dan apa yang ditambahkannya dibandingkan dengan filter standar?

Apakah itu menyesuaikan diri dengan input data?

Apakah lebih baik untuk pengawetan sementara?


Pernahkah Anda berada dalam situasi rekayasa suatu hari ketika Anda memutuskan "Ayo gunakan filter SG daripada rata-rata bergerak atau lowpass FIR lain! Lebih baik karena ini dan ini dan ini ..." ? Maka pertanyaan ini untuk Anda!

g6kxjv1ozn
sumber

Jawaban:

4

Karena diskusi dalam jawaban dan komentar yang ada terutama berfokus pada apa sebenarnya filter Savitzky-Golay (yang sangat berguna), saya akan mencoba menambahkan ke jawaban yang ada dengan memberikan beberapa informasi tentang bagaimana sebenarnya memilih filter smoothing, yang adalah, menurut pemahaman saya, tentang apa sebenarnya pertanyaan itu.

Pertama-tama, saya ingin mengulangi apa yang menjadi jelas dalam diskusi yang muncul dari jawaban lain: kategorisasi filter pemulusan dalam pertanyaan menjadi filter FIR / IIR linier dan time-invariant di satu sisi, dan Filter Savitzky-Golay di sisi lain menyesatkan. Filter Savitkzy-Golay hanyalah filter FIR standar yang dirancang sesuai dengan kriteria tertentu (perkiraan polinomial lokal). Jadi semua filter yang disebutkan dalam pertanyaan adalah filter LTI.

Pertanyaan yang tersisa adalah bagaimana memilih filter penghalusan. Jika kompleksitas komputasi dan / atau memori menjadi masalah, filter IIR mungkin lebih disukai daripada filter FIR, karena mereka biasanya akan mencapai penekanan kebisingan yang sebanding (yaitu, pelemahan stopband) dengan urutan filter yang jauh lebih rendah daripada filter FIR. Tetapi perhatikan bahwa jika pemrosesan waktu nyata diperlukan, satu kemungkinan kerugian dari filter IIR adalah bahwa mereka tidak dapat memiliki respons fase linier yang tepat. Jadi sinyal yang diinginkan akan mengalami beberapa distorsi fase. Untuk pemrosesan offline, distorsi fase dapat dihindari, bahkan dengan filter IIR, dengan menerapkan filter fase nol .

Terlepas dari pertimbangan yang dibahas dalam paragraf sebelumnya, itu terutama kriteria desain yang penting, tidak begitu banyak jika filter adalah FIR atau IIR, karena setiap filter IIR (stabil) dapat didekati dengan akurasi sewenang-wenang oleh filter FIR, dan Filter FIR dapat diperkirakan dengan filter IIR, meskipun yang terakhir bisa jauh lebih sulit. Kriteria desain yang tepat jelas tergantung pada sifat-sifat data dan kebisingan. Ketika datang untuk menghaluskan kita biasanya mengasumsikan data yang cukup berlebih (yaitu, halus). Jika noise memiliki komponen frekuensi tinggi, yaitu, jika ada sedikit tumpang tindih spektral antara data dan noise, kami ingin memaksimalkan atenuasi stop band, atau meminimalkan energi stop band, sambil mempertahankan sinyal yang diinginkan sebaik mungkin. Dalam hal ini kita dapat memilih filter FIR linier yang dirancang sesuai dengan kriteria minimum menggunakan algoritma Parks-McClellan. Kita juga bisa meminimalkan energi stop band (yaitu, meminimalkan daya noise di stop band) dengan memilih metode kuadrat terkecil. Gabungan antara dua kriteria (minimax dan kuadrat terkecil) dimungkinkan dengan memilih adesain squared least squared , yang meminimalkan energi stop band sambil membatasi kesalahan aproksimasi maksimum dalam pass band.

Jika spektrum noise secara signifikan tumpang tindih dengan spektrum sinyal, diperlukan pendekatan yang lebih hati-hati, dan pelemahan dengan kekerasan tidak akan bekerja dengan baik karena Anda meninggalkan terlalu banyak noise (dengan memilih frekuensi cut-off terlalu tinggi) atau Anda mendistorsi yang diinginkan sinyal terlalu banyak. Dalam hal ini filter Savitzky-Golay (SG) mungkin merupakan pilihan yang baik. Harga yang harus dibayar adalah pelemahan stopband biasa-biasa saja, tetapi satu keuntungan adalah bahwa beberapa sifat sinyal dipertahankan dengan sangat baik. Ini berkaitan dengan fakta bahwa filter SG memiliki respons pita lulus datar, yaitu,

(1)dkH(ejω)dωk|ω=0=0k=1,2,,r

di mana r adalah urutan polinomial yang mendekati dan H(ejω) adalah respons frekuensi filter. Properti (1) menjamin bahwa momen r pertama dari sinyal input dipertahankan dalam output, yang berarti bahwa lebar dan tinggi puncak pada sinyal yang diinginkan terjaga dengan baik.

Tentu saja ada juga kompromi antara dua jenis filter smoothing yang dibahas di atas (atenuasi stopband tinggi dan SG). Kita dapat merancang filter FIR dengan tingkat kerataan tertentu pada ω=0 dan menggunakan derajat kebebasan yang tersisa untuk memaksimalkan atenuasi stop band, atau meminimalkan energi stopband. Dalam kasus filter FIR, masalah desain yang dihasilkan cukup sederhana (dan cembung), dan rutin optimasi umum yang tersedia di beberapa paket perangkat lunak dapat digunakan untuk mendapatkan filter optimal untuk aplikasi yang diberikan.

Untuk yang tertarik dengan teori filter SG, referensi paling relevan yang dapat saya rekomendasikan adalah sebagai berikut:

Matt L.
sumber
2

Seperti apa pun, terkadang alat tertentu lebih baik daripada yang lain.

Filter moving average (MA) dapat digunakan untuk memuluskan data, dan FIR. Mereka cukup banyak filter paling sederhana yang dapat Anda buat, dan mereka bekerja dengan baik untuk banyak tugas selama Anda tidak mencoba untuk memodelkan lompatan tiba-tiba atau tren polinomial. Perlu diingat bahwa ini pada dasarnya hanya filter low-pass, sehingga mereka bekerja paling baik ketika data yang Anda pedulikan dalam sinyal adalah frekuensi rendah dan band yang cukup sempit.

Filter Savitzky-Golay (SG) adalah grup filter FIR khusus yang pada dasarnya sesuai dengan polinomial untuk deret waktu Anda saat konvolusi bergeser di sepanjang sinyal. Filter SG berguna untuk sinyal di mana hal-hal yang Anda pedulikan tidak selalu frekuensi rendah dan band yang cukup sempit.

Saya pikir Anda akan menemukan bahwa jika Anda membaca halaman Wikipedia yang Anda tautkan cukup menyeluruh, ini menjelaskan perbedaan antara filter SG dan MA dalam detail yang cukup ketat. Perlu diingat: pada akhirnya, keduanya hanyalah alat untuk melakukan hal yang sama, terserah Anda untuk mencari tahu kapan harus menggunakan alat yang tepat

EDIT :

Karena tampaknya ada beberapa kebingungan bahwa filter SG "adaptif" dalam beberapa hal di tingkat dasar, saya telah memasukkan contoh MATLAB sederhana. Seperti yang ditunjukkan oleh Dan, ini bisa dibuat adaptif, tetapi implementasi dasarnya seringkali tidak. Dengan memeriksa kodenya, Anda akan melihat bahwa ini hanyalah sebuah matriks mencari dengan penanganan khusus. Tidak ada satu pun tentang filter ini yang "adaptif" dalam pengertian tradisional, Anda hanya memilih polinomial fit dan panjang polinomial yang sesuai dengan sinyal melalui konvolusi; SG sangat penting. Skrip yang saya miliki di bawah menghasilkan plot ini: Perbandingan filter SG dengan MA

Melihat angka ini, Anda dapat melihat bahwa MA dan SG pada dasarnya mencapai hal yang sama, tetapi dengan beberapa perbedaan penting:

  1. MA melakukan pekerjaan yang sangat baik untuk menekan kebisingan, tetapi melakukan pekerjaan yang buruk menangkap lompatan sementara dalam sinyal. Kami dapat menekan lebih banyak noise dengan menambah panjang filter, tetapi kemudian akan bekerja lebih buruk pada transien; efek ini akan terlihat sebagai "corengan" di dekat transien apa pun, yang seharusnya dapat Anda lihat pada gambar yang ditunjukkan.
  2. SG melakukan pekerjaan yang baik dalam menangkap transien sinyal, tetapi melakukan pekerjaan yang tidak terlalu hebat untuk menekan kebisingan (setidaknya dibandingkan dengan MA dengan ukuran yang sama). Kita dapat meningkatkan penindasan kebisingan di dekat non-transien dengan meningkatkan panjang bingkai, tetapi ini akan memperkenalkan dering analog dengan fenomena Gibb di dekat transien apa pun.

Agar Anda mendapatkan pemahaman yang lebih baik tentang cara kerja filter ini, saya mendorong Anda untuk mengambil kode di sini dan memanipulasinya, dan melihat bagaimana semua bagian individu dari filter SG bekerja.

Contoh kode untuk 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');
matthewjpollard
sumber
1
Intinya tampaknya (dengan melihat jawaban yang lain) bahwa filter SG adalah "filter yang sepenuhnya tergantung waktu dan data nonlinear sepenuhnya yang koefisiennya dihitung ulang untuk setiap segmen pendek dari inputnya".
g6kxjv1ozn
1
Filter SG, menurut pemahaman saya dari menerapkannya beberapa kali, sama sekali bukan filter adaptif, terutama dibandingkan dengan filter adaptif rata-rata Anda seperti LMS atau RLS. Saya akan sangat tidak setuju dengan pernyataan bahwa bobot filter berbeda-beda waktu. Filter SG pada dasarnya adalah pencarian tabel, Anda memfilter dengan nilai-nilai dari tabel untuk menghitung respons transien, dan kemudian Anda kembali dan menangani kasing tepi pada awal / akhir sinyal. Saya akan mengedit posting saya dengan contoh MATLAB untuk menunjukkan ini kepada Anda.
matthewjpollard
2
@matthewjpollard Sebagai catatan, saya secara pribadi tidak memiliki pengalaman signifikan menggunakan filter ini, tetapi bagi saya filter SG sebagai penerapan terbaik tampaknya sangat banyak menjadi implementasi filter adaptif, dengan koefisien waktu yang bervariasi. Cara Anda menerapkan filter dalam kode Anda tidak (karena Anda memperlakukan seluruh urutan sebagai data "sub-set"), tetapi cara khusus seperti yang dijelaskan di Wikipedia en.wikipedia.org/wiki/Savitzky%E2%80%% 93Golay_filter dan di korannya sendiri oleh Savitzky dan Golay memang adaptif: pdfs.semanticscholar.org/4830/…
Dan Boschen
2
@matthewjpollard Dalam sistem waktu nyata Anda, apakah data Anda terus mengalir, sehingga Anda menghitung ulang koefisien dalam interval yang lebih pendek atau apakah Anda selalu bekerja dalam blok data kecil?
Dan Boschen
2
Terima kasih, Matt. Jadi mungkin kita dapat mengaitkan apa yang Anda lakukan sebagai adaptif / waktu yang berbeda dalam arti bahwa koefisien dihitung untuk setiap pengumpulan data (koefisien yang sama dalam pengumpulan data namun dengan perlakuan awal dan akhir yang tepat tetapi bervariasi dari satu pengumpulan ke yang berikutnya - jika saya mengerti dengan benar). Terima kasih telah membagikan kode dan contoh aplikasi Anda.
Dan Boschen
2

CATATAN

jawaban saya sebelumnya (sebelum edit ini) menunjukkan filter Savitzky-Golay (SG) sebagai non-linear, data input yang bervariasi tergantung waktu adalah salah, karena salah interpretasi dini tentang bagaimana filter Savitzky-Golay (SG) menghitung outputnya sesuai dengan tautan wiki yang disediakan. Jadi sekarang saya memperbaikinya untuk kepentingan mereka yang juga akan melihat bagaimana filter SG dapat diterapkan oleh filter FIR-LTI. Terima kasih kepada @MattL. untuk koreksi dirinya, mata rantai besar yang dia berikan dan kesabaran yang dia miliki (yang tidak akan pernah saya tunjukkan) selama penyelidikan saya tentang masalah ini. Meskipun aku jujur ​​lebih suka keberatan yang lebih verbal yang jelas tidak perlu. Harap perhatikan juga bahwa jawaban yang benar adalah yang lain, jawaban ini hanya untuk klarifikasi tambahan properti LTI dari filter SG.

Sekarang tidak mengherankan bahwa ketika seseorang (yang belum pernah menggunakan filter itu sebelumnya) menghadapi definisi filter SG sebagai polinomial LSE pesanan rendah untuk data yang diberikan, ia akan langsung melompat ke kesimpulan bahwa itu adalah data yang bergantung, nonlinier dan waktu (shift) filter adaptif yang bervariasi.

Namun, prosedur pemasangan polinomial ditafsirkan secara cerdik oleh SG sendiri, sehingga memungkinkan sepenuhnya penyaringan data, invarian waktu, penyaringan linier, sehingga menjadikan SG sebagai filter LTI-FIR tetap.

Di bawah ini adalah ringkasan terpendek dari tautan yang disediakan oleh MattL. Untuk setiap detail yang tampaknya hilang, silakan baca dokumen asli, atau minta klarifikasi. Tetapi saya tidak ingin memproduksi kembali seluruh dokumen di sini.

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

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

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

Sekarang bagi mereka yang terbiasa dengan prosedur polyfit LSE, saya hanya akan menulis persamaan matriks yang dihasilkan (dari tautan) yang mendefinisikan set koefisien optimal:

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

Sekarang mari kita bersandar sejenak dan membahas suatu hal di sini.

AHnakMNx[n]ak2nd

... Ini (Lfit polifit) dapat diulang pada setiap sampel input, setiap kali menghasilkan polinomial baru dan nilai baru dari urutan output y [n] ...

Jadi bagaimana kita mengatasi kejutan yang membingungkan ini? Dengan menafsirkan dan mendefinisikan output filter SG menjadi sebagai berikut:

Nnx[n]y[n]p[n]n=0

y[n]=y[0]=m=0Namnm=a0

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]. Tetapi kemudian, apa koefisien filter untuk filter SG ini? Ayo lihat.

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

a0Hx

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]

KOMENTAR

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

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

Outputnya adalah:

masukkan deskripsi gambar di sini

Semoga ini menjelaskan masalah ini.

Fat32
sumber
2
@ Fat32 Saya pikir itu karena itu adalah bolak-balik daftar komentar, sehingga untuk menjaga papan bersih mereka biasanya memindahkannya "untuk mengobrol". Itu semua masih ada, hanya saja tidak mengacaukan halaman utama. Itu sebabnya sistem menyarankan untuk memindahkannya ke chat ketika bolak-balik menjadi panjang. Jangan khawatir, semua orang masih mencintaimu.
Dan Boschen
1
@ g6kxjv1ozn Saya datang ke titik itu ... harap tunggu ...
Fat32
2
@ Fat32 Kerja bagus! Saya membacanya tetapi akan perlu membacanya dan itu ditulis dengan sangat jelas, saya hanya perlu menindaklanjuti dengan pensil dan kertas langkah demi langkah untuk benar-benar melihatnya seperti sekarang. Terima kasih telah meletakkan semua ini di sini.
Dan Boschen
4
1ω=0
2
akh[n]