Saya memiliki sinyal yang diukur pada 100Hz dan saya perlu menerapkan filter smoothing Savitzky-Golay pada sinyal ini. Namun, pada pemeriksaan lebih dekat sinyal saya tidak diukur pada laju konstan sempurna, delta antara pengukuran berkisar antara 9,7 dan 10,3 ms.
Apakah ada cara untuk menggunakan filter Savitzky-Golay pada data yang tidak berjarak sama? Apakah ada metode lain yang bisa saya terapkan?
Jawaban:
Salah satu metode adalah dengan menguji ulang data Anda sehingga spasi sama, maka Anda dapat melakukan pemrosesan apa pun yang Anda suka. Resampling tanpa batas menggunakan filter linear tidak akan menjadi pilihan yang baik karena data tidak diberi spasi secara seragam, jadi Anda bisa menggunakan semacam interpolasi polinomial lokal (misalnya splines kubik) untuk memperkirakan berapa nilai sinyal yang mendasarinya "tepat" Interval 10 milidetik.
sumber
Karena cara Savitzky-Golay filter diturunkan (yaitu sebagai cocok polinomial kuadrat-lokal), ada generalisasi alami untuk pengambilan sampel tidak seragam - itu jauh lebih mahal secara komputasi.
Savitzky-Golay Filter secara Umum
Untuk filter standar, idenya adalah untuk menyesuaikan polinomial ke set sampel lokal [menggunakan kuadrat terkecil], lalu ganti sampel pusat dengan nilai polinomial pada indeks tengah (yaitu pada 0). Itu berarti koefisien filter SG standar dapat dihasilkan dengan membalikkan matriks Vandermonde indeks sampel. Misalnya, untuk menghasilkan parabola fit lokal di lima sampel (dengan indicies lokal -2, -1,0,1,2), sistem persamaan desain A c = y akan menjadi sebagai berikut:y0…y4 Ac=y
Dalam contoh di atas, adalah koefisien yang tidak diketahui dari polinomial kuadrat terkecil c 0 + c 1 x + c 2 x 2 . Karena nilai polinomial pada x = 0 hanya c 0 , menghitung pseudoinverse dari matriks desain (yaitu c = ( A T A ) - 1 A T y ) akan menghasilkan koefisien filter SG di baris atas. Dalam hal ini, mereka akan menjadic0…c2 c0+c1x+c2x2 x=0 c0 c=(ATA)−1ATy
Perhatikan bahwa karena turunan dari adalah c 1 + 2 c 2 x , baris kedua dari matriks (yang mengevaluasi c 1 ) akan menjadi filter derivatif yang dihaluskan. Argumen yang sama berlaku untuk baris berturut-turut - mereka memberikan turunan tingkat tinggi yang dihaluskan. Perhatikan bahwa saya menskalakan matriks dengan 35 sehingga baris pertama akan cocok dengan koefisien smoothing yang diberikan di Wikipedia (di atas). Filter derivatif masing-masing berbeda oleh faktor penskalaan lainnya.c0+c1x+c2x2 c1+2c2x c1
Pengambilan sampel yang tidak seragam
Ketika sampel ditempatkan secara merata, koefisien filter adalah terjemahan-invarian, sehingga hasilnya hanyalah filter FIR. Untuk sampel tidak seragam, koefisien akan berbeda berdasarkan jarak sampel lokal, sehingga matriks desain perlu dibangun dan dibalik di setiap sampel. Jika waktu sampel tidak seragam adalah , dan kami membangun koordinat lokal t n dengan setiap waktu sampel pusat ditetapkan pada 0 , yaituxn tn 0
maka setiap matriks desain akan berbentuk sebagai berikut:
The first row of the pseudoinverse ofA dotted with the local sample values will yield c0 , the smoothed value at that sample.
sumber
"As a cheap alternative, one can simply pretend that the data points are equally spaced ...f across the full width of the N point window
is less than N/2−−−−√ times the measurement noise on a single point,
then the cheap method can be used."
− Numerical Recipes pp. 771-772
if the change in
(derivation anyone ?)
("Pretend equally spaced" means:±N/2 points
around each t where you want SavGol(t ),ti→i .
That may be obvious, but got me for a while.)
take the nearest
not snap all
sumber
I found out, that there are two ways to use the savitzky-golay algorithm in Matlab. Once as a filter, and once as a smoothing function, but basically they should do the same.
sumber
If it's of any help, I've made a C implementation of the method described by datageist. Free to use at your own risk.
sumber