Saya mencoba membuat filter pass tinggi untuk dataset electroencephalographic (EEG), untuk menghilangkan drift yang sangat lambat. Namun frekuensi sekitar 0,3 Hz sangat penting untuk penelitian yang dilayani data ini.
Saya menggunakan Matlab dan saya mencoba berbagai hal. Tampaknya atenuasi dB sangat rendah, dari 3 dB baik-baik saja dengan filter FIR. Sebagai contoh saya menggunakan itu:
h=fdesign.highpass('Fst,Fp,Ast,Ap',0.005,0.01,3,1,250); % i needed to cut
d=design(h,'butter');
fvtool(d)
Namun filter ini membuat penyimpangan dc pada awal data dan saya tidak ingin kehilangan titik data pertama ini.
Saya telah membaca halaman Anda bahwa ide yang cerdas adalah merancang filter low pass yang nantinya akan saya kurangi dari data sebenarnya. Saya melakukannya dengan filter equiripple dan itu berhasil tetapi meninggalkan lift dasar. Saya tidak ingin menjalankan sekarang penghapusan rata-rata karena ini adalah langkah selanjutnya dalam protokol analisis.
Ada saran?
Jawaban:
Anda meminta mesin waktu: untuk menghindari tonjolan DC pada , Anda perlu mengetahui kondisi filter seolah-olah telah berjalan sebelum perekaman dimulai. Itu tidak akan terjadi apa pun jenis filter yang Anda gunakan.t=0
Inilah trik yang mungkin berguna bagi Anda. Katakanlah Anda memiliki filter tap FIR (atau filter IIR yang respons impulsnya melambat hingga 0 setelah sampel ). Ambil sampel pertama dari sinyal Anda, balikkan, dan tambahkan itu ke awal sinyal Anda. Akibatnya, kami mendefinisikan sinyal baru untuk keperluan penyaringan. Ketika Anda memfilternya, status filter sudah akan "dipersiapkan" dengan sinyal awal: hapus sampel pertama dari output, dan semoga DC semoga hilang.NN N g ( t ) = g ( - t ) = f ( t ) NN g(t)=g(−t)=f(t) N
Tidak perlu dikatakan, ada banyak gotcha dengan skema itu - untuk permulaan, lebih sulit dilakukan untuk pemrosesan realtime, dan jika turunan sinyal tinggi pada , Anda masih akan memiliki masalah kepercayaan dengan beberapa sampel pertama. Tetapi harus menyingkirkan benjolan.t=0
sumber
Lihatlah fungsi filtfilt. Ini memberikan respons fase nol dan respons langkah sempurna. Terutama, properti respons langkah dari pemfilteran filtfilt dapat menyelesaikan masalah Anda.
sumber
Saya melakukan trik yang dijelaskan Mr. rtollert dan berpikir itu yang terbaik yang bisa saya lakukan.
Jika Anda menempuh rute pengambilan sampel kontinu / kompensasi perangkat keras, maka efisiensi mungkin membuat Anda tertarik pada DC blocker seperti dijelaskan oleh Randy Yates dan Richard Lyons dalam dsp Tips & Tricks Maret 2008
sumber
Saya mencoba sesuatu yang bekerja dengan baik - untuk penguat yang ditentukan. kode matlab ada di sini: https://sites.google.com/site/marialstavrinou/home/dc-offset-removal-filter-in-matlab .
sumber
Anda tidak peduli dengan nilai DC absolut, benar?
Mengapa tidak menambahkan saja offset statis ke data Anda sehingga titik data pertama nol?
Tentu, Anda harus menambahkan offset ke setiap titik data, tetapi itu benar-benar akan menghindari masalah langkah-respons besar yang Anda alami dengan filter.
Secara efektif filter dimulai diinisialisasi ke nol. Oleh karena itu, ketika data Anda mulai, filter melihat langkah besar dari nol hingga tingkat DC apa pun yang Anda miliki.
Cukup tambahkan offset untuk menghapus tangga-langkah.
sumber
Mengapa tidak melakukan penghapusan rata-rata? Langkah selanjutnya yang melakukannya "lagi" tidak memiliki efek (itu akan mengurangi nol).
sumber