Saya seorang insinyur perangkat lunak yang berpengalaman dan sedang mengerjakan sensor ponsel cerdas. Saya telah mengambil kelas EE mendasar dalam DSP dan saya mencoba menerapkan pengetahuan saya. Saya percaya bahwa saya memahami konvolusi, fungsi transfer, z-transform, dll. Saya tahu sedikit tentang filter FIR dan IIR.
Sekarang, ketika membaca melalui API perangkat lunak dan dokumentasi, saya melihat orang-orang menerapkan LPF untuk sensor data dalam domain waktu. Saya tahu Anda melakukannya melalui penggunaan persamaan perbedaan (mis. Y [i] = y [i-1] + 2 * x [i]), tetapi saya belajar di kelas EE bahwa LPF biasanya diterapkan melalui operasi konvolusi di mana Anda memadukan sinyal waktu dengan koefisien gelombang sinc (misalnya) dan dengan frekuensi cut-off tertentu. Jadi penggunaan sehari-hari "low-pass filter" tidak cukup tepat untuk saya.
Misalnya, Google Android API memiliki dokumentasi ini: http://developer.android.com/reference/android/hardware/SensorEvent.html#values
public void onSensorChanged(SensorEvent event)
{
// alpha is calculated as t / (t + dT)
// with t, the low-pass filter's time-constant
// and dT, the event delivery rate
final float alpha = 0.8;
gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];
linear_acceleration[0] = event.values[0] - gravity[0];
linear_acceleration[1] = event.values[1] - gravity[1];
linear_acceleration[2] = event.values[2] - gravity[2];
}
Bagaimana cara menafsirkan filter low-pass itu? Berapa frekuensi cut-off? Apa itu bandwidth transisi? Apakah mereka menggunakan LPF ini hanya untuk melakukan rata-rata?
sumber
Jawaban:
Filter dalam contoh Anda adalah filter first-order infinite impulse response (IIR) . Fungsi transfernya adalah:
yang sesuai dengan persamaan perbedaan:
di mana adalah input filter dan adalah output filter.x[n] y[n]
Jenis filter ini sering digunakan sebagai lowpass kompleksitas rendah dan sering disebut integrator bocor . Ini disukai karena penerapannya yang sederhana, kompleksitas komputasi yang rendah, dan kemampuannya: frekuensi cutoff-nya tergantung pada nilai . dapat mengambil nilai pada interval . tidak menghasilkan penyaringan sama sekali (output sama dengan input); saat meningkat, frekuensi cutoff filter berkurang. Anda dapat menganggap sebagai kasus batas di mana frekuensi cutoff sangat rendah (output filter adalah nol untuk semua waktu).α α [0,1) α=0 α α=1
Anda dapat memikirkan hal ini secara intuitif dengan memperhatikan bahwa input filter ditimbang oleh , sehingga ketika parameter meningkat, kuantitas berkurang, sehingga setiap sampel input memiliki efek proporsional yang lebih kecil pada nilai sampel output tertentu. Ini memiliki efek menghancurkan respons impuls filter selama periode waktu yang lebih lama. Penjumlahan dalam periode waktu yang lebih lama mirip dengan menghitung rata-rata bergerak yang panjang. Ketika panjang rata-rata bergerak meningkat, frekuensi cutoff rata-rata menurun.α 1−α
Sebagai contoh Anda, di mana , respons frekuensi filter adalah sebagai berikut:α=0.8
Dari contoh, saya akan menebak bahwa filter ini digunakan untuk memuluskan derau frekuensi tinggi dari serangkaian waktu pengukuran dari sensor, mencoba untuk menangkap sinyal frekuensi rendah yang cukup menarik. Ini akan menjadi aplikasi yang sangat khas untuk jenis filter ini.
Pada sub-pertanyaan Anda yang lain, Anda benar bahwa pemfilteran sering dilaksanakan melalui konvolusi sinyal input dengan respons impuls filter. Dalam kebanyakan kasus, ini hanya dilakukan dengan filter hingga respon impuls terbatas (FIR) . Filter IIR seperti ini biasanya diimplementasikan menggunakan persamaan perbedaan filter; karena respons impuls sistem IIR sangat panjang, Anda harus memotongnya hingga panjang yang terbatas untuk membuat konvolusi dengannya dapat ditelusuri, pada titik mana filter tidak lagi IIR. Format persamaan perbedaan hampir selalu lebih murah untuk diterapkan secara komputasi, meskipun umpan balik yang melekat dalam struktur itu dapat mengarah pada masalah numerik yang harus diatasi (seperti internal overflow dan akumulasi kesalahan pembulatan).
sumber
Untuk meringkas, filter IIR berdasarkan model fisik ideal sederhana, seperti filter RC, memiliki sejumlah kecil kutub dan nol, dan dengan demikian biasanya diimplementasikan sebagai persamaan perbedaan, karena sejumlah kecil kutub atau nol menyiratkan sangat sedikit operasi aritmatika per sampel menggunakan persamaan perbedaan.
Sebagai IIR menyiratkan respon impuls panjang tak terbatas, konvolusi akan membutuhkan selamanya untuk menghitung, atau penggunaan perkiraan.
Filter FIR biasanya diimplementasikan oleh konvolusi dengan respon impuls panjang terbatas (atau oleh konvolusi cepat FFT jika filter cukup lama untuk menjadi efisien secara komputasi). Jenis-jenis filter ini lebih sering digunakan ketika seseorang dapat memperkirakan spesifikasi respons frekuensi yang diinginkan dengan respon impuls panjang yang terbatas, daripada mengetahui di mana kutub dan nol bidang-pesawat Z berada.
Namun karena filter dengan spesifikasi yang tajam menyiratkan konvolusi FIR yang panjang, implementasi filter FIR bisa jauh lebih lambat, dan pengaturan mungkin melibatkan lebih banyak baris kode, yang mungkin mengapa filter FIR mungkin tidak sering digunakan dalam perangkat lunak sederhana contoh.
sumber
Saya menemukan diri saya kembali ke posting ini berulang kali. Terima kasih telah mengajukan pertanyaan. Berikut ini adalah implementasi integrator bocor yang hebat dan ramah komputasi dalam C (dimaksudkan untuk mikrokontroler).
Pertama, beberapa penataan ulang: y = α * x + (1 - α) * y_last = α * (x - y_last) + y_last
jika kita membatasi α menjadi sekitar 12%, 25%, 50%, (1/8, 1/4, 1/2, ...). Kita dapat memanfaatkan beberapa pemindahan bit yang efisien. Mengambil kasing 1/8, 8 => 2 ^ 3 => (downshift 3 kali)
= (x - y_last) / 8 + y_last
Semoga ini bisa membantu.
sumber