Filter lulus tinggi 0,01 Hz untuk drift lambat EEG

10

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?

forsker_for_dsp
sumber
1
Jadi masalahnya hanyalah respons awal dari filter? Apakah data yang direkam sebelumnya ini hanya dapat Anda isi dengan nol atau realtime?
endolith
Pendekatan lowpass-dan-kurangi juga akan menderita dari masalah yang Anda lihat. Masalahnya adalah bahwa setiap filter mengalami penundaan. Filter dengan cutoff tajam seperti yang Anda inginkan dapat mengalami penundaan sangat lama. Saya tidak yakin mengapa Anda akan melakukan penghapusan rata-rata selanjutnya; gain DC dari filter yang Anda perlihatkan adalah nol, sehingga tidak akan ada rata-rata yang cukup untuk dihapus (kecuali untuk periode sementara pada awal output karena keterlambatan filter).
Jason R

Jawaban:

6

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.NNNg ( t ) = g ( - t ) = f ( t ) NNg(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

rtollert
sumber
6

Lihatlah fungsi filtfilt. Ini memberikan respons fase nol dan respons langkah sempurna. Terutama, properti respons langkah dari pemfilteran filtfilt dapat menyelesaikan masalah Anda.

niaren
sumber
0

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

Chip Wrangler
sumber
-1

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.

Nama palsu
sumber
-1

Mengapa tidak melakukan penghapusan rata-rata? Langkah selanjutnya yang melakukannya "lagi" tidak memiliki efek (itu akan mengurangi nol).

ladkkasdöla
sumber
Ini lebih merupakan permintaan, dan bukan jawaban untuk pertanyaan. Ini mungkin cocok sebagai komentar pada satu titik, meskipun pertanyaannya sudah sangat lama sehingga sepertinya tidak ada gunanya pada titik ini.
Sam Maloney