“Filter low-pass” dalam konteks API perangkat lunak non-EE

12

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?

stackoverflowuser2010
sumber
baik itu menggangguku juga
Sibbs Gambling

Jawaban:

11

Filter dalam contoh Anda adalah filter first-order infinite impulse response (IIR) . Fungsi transfernya adalah:

H(z)=1α1αz1

yang sesuai dengan persamaan perbedaan:

y[n]=αy[n1]+(1α)x[n]

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.8masukkan deskripsi gambar di sini

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).

Jason R
sumber
Terima kasih! Beberapa pertanyaan tindak lanjut: (1) Anda mengatakan persamaan Anda H (z) = ... adalah persamaan perbedaan; itu benar-benar fungsi transfer, bukan? Saya pikir persamaan perbedaan hanya untuk domain waktu. (2) Dalam integrator bocor Anda, apakah 1.0 sesuai dengan sampling_frequency / 2 (seperti di Matlab)? (3) Mengenai FIR vs IIR, apakah pemahaman saya benar bahwa persamaan perbedaan IIR dapat diterapkan dalam O (N) tetapi konvolusi adalah O (N ^ 2) atau O (N lgN) dengan konvolusi berbasis FFT? (4) Dapatkah Anda merekomendasikan buku untuk programmer perangkat lunak untuk mengimplementasikan ide-ide DSP ini? Seperti apa yang dilakukan contoh kode Android.
stackoverflowuser2010
(1) Anda benar, saya salah ketik. Saya akan memperbaiki jawabannya. (2) Ya; sumbu X dalam frekuensi dinormalisasi, dibagi dengan , jadi 1 sesuai dengan , yang merupakan setengah dari laju sampel. (3) Menghitung output untuk sampel tertentu menggunakan salah satu metode adalah , di mana adalah urutan filter. Filter IIR biasanya hanya memiliki jauh lebih kecil . (4) Saya akan merekomendasikan Memahami DSP oleh Lyons; itu buku pengantar yang bagus. + π O ( N ) N Nπ+πO(N)NN
Jason R
Saya tahu bahwa (i) menerapkan persamaan perbedaan adalah O (N). Tetapi saya berpikir bahwa (ii) operasi konvolusi menggunakan penjumlahan atas multiply-and-add (songho.ca/dsp/convolution/convolution.html) adalah O (N ^ 2) atau O (N lgN) dengan implementasi berbasis FFT . Dalam semua kasus, N adalah urutan filter - di mana saya mengasumsikan urutan filter dan panjang sinyal waktu adalah urutan besarnya yang sama (misalnya keduanya 256). Jadi bukankah (i) dan (ii) berbeda? Juga, saya memang melihat buku Lyons di Amazon.com, tetapi saya berharap untuk sesuatu yang ditulis lebih untuk programmer perangkat lunak C / Java.
stackoverflowuser2010
1
Kompleksitas untuk menghitung output sampel waktu tunggal adalah dengan persamaan perbedaan. Jika panjang sinyal input juga , maka total kompleksitas untuk menghitung output untuk setiap sampel input menjadi . Lebih umum untuk filter IIR, panjang sinyal input adalah nilai jauh lebih besar karena urutan filter kecil, sehingga kompleksitasnya dapat ditulis pada . Jika secara signifikan lebih kecil dari , maka Anda dapat mengambil beberapa manfaat komputasi. N O ( N 2 ) M N O ( M N ) M NO(N) NO(N2)MNO(MN)MN
Jason R
Maaf mengalahkan kuda mati. Untuk persamaan perbedaan umum ( ccrma.stanford.edu/~jos/fp/Difference_Equation_I.html ), bukankah kompleksitasnya benar-benar , di mana N adalah panjang sinyal input dan output dan M adalah urutan filter? Looping atas setiap output y [i], , adalah O (N), dan setiap y [i] membutuhkan loop O (N + M). Saya kira seperti yang Anda katakan, tergantung pada ukuran relatif N dan M, hasilnya adalah atau . i N O ( N 2 ) O ( N M )O(M×(N+M))iNO(N2)O(NM)
stackoverflowuser2010
2

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.

hotpaw2
sumber
0

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

#define SMOOTHING_FACTOR       (3)

int16_t FilterSample(int16_t new_sample)
{
  static int16_t last_result = 0;

  // Each bit shift down is equivalent to dividing-by-two
  last_result = (new_sample - last_result) >> SMOOTHING_FACTOR) + last_result;

  return last_result;
}

Semoga ini bisa membantu.

tarabyte
sumber