Saya kesulitan menemukan dokumentasi untuk mengimplementasikan filter band-pass atau high-pass dengan python / scipy / numpy.
Saya dapat dengan mudah membuat dan menerapkan filter low-pass, jadi saya bertanya:
Apakah secara konseptual benar untuk menyaring sinyal low-pass, lalu kurangi hasil dari sinyal asli, untuk mendapatkan frekuensi tinggi saja?
Juga, jika ada orang yang memiliki contoh sederhana dari filter bandpass naif di Python (lebih disukai menggunakan perpustakaan numpy dan scipy), saya akan sangat berterima kasih.
Apa yang saya cari adalah sesuatu seperti:
filtered_signal = band_pass(original_signal, rate, low=20, high=500)
Terima kasih atas bantuannya!
EDIT: dengan scipy, saya menggunakan ini sebagai low-pass, dengan hasil yang baik:
import numpy, scipy.signal
def firfilt(interval, freq, sampling_rate):
nfreq = freq/(0.5*sampling_rate)
taps = sampling_rate + 1
a = 1
b = scipy.signal.firwin(taps, cutoff=nfreq)
firstpass = scipy.signal.lfilter(b, a, interval)
## second pass to compensate phase delay
secondpass = scipy.signal.lfilter(b, a, firstpass[::-1])[::-1]
return secondpass
python
bandpass
highpass-filter
heltonbiker
sumber
sumber
scipy.signal.firwin
memberi tahu cara membuat filter low-pass, high-pass, band-pass, band-stop, dan multi-band. Apakah kamu sudah mencobafirwin(taps, cutoff=nfreq, pass_zero=False)
?Jawaban:
Secara teori Anda bisa melakukan ini, tetapi dalam praktiknya itu sulit dilakukan karena penyelarasan waktu dan fase harus cukup baik agar bisa bekerja. Jika penyelarasannya bagus Anda akan mendapatkan gangguan destruktif yang Anda cari. Jika tidak, Anda akan mendapat gangguan konstruktif. Lebih buruk lagi, apakah mereka mengganggu secara konstruktif atau konstruktif akan tergantung pada frekuensi - yaitu Anda bisa mendapatkan interferensi konstruktif dan destruktif secara bersamaan. Ini dapat bekerja, jika Anda hanya menyaring frekuensi yang cukup rendah, karena persyaratan waktu mereka yang paling longgar karena mereka berubah sangat lambat.
Cerita pendek - itu mungkin dilakukan tetapi cukup sulit sehingga umumnya masuk akal untuk hanya melakukan filter pass-tinggi.
Cara yang relatif mudah untuk membuat filter bandpass adalah membuat filter low-pass, dan kemudian memodulasinya ke frekuensi tengah yang Anda inginkan dengan mengalikannya dengan sinusoid frekuensi tersebut.
sumber
Anda dapat merancang berbagai jenis filter secara langsung dengan fungsi scipy.signal. Ada tiga fungsi utama untuk membuat filter respon impuls terbatas dengan paket scipy.signal.
Fungsi remez , sebagai argumen, mengambil jumlah ketukan (urutan +1), "band", dan keuntungan "yang diinginkan". "Band" ada di Hz. Fungsi ini agak aneh bahwa parameter "Hz" menentukan laju sampel dalam Hz. Contohnya adalah:
Catatan: Saya sedikit curang dan menggunakan urutan FFT yang lebih tinggi untuk membuat plot terlihat lebih bagus (diinterpolasi poin untuk visualisasi saja).
Contoh lowpass dan highpass:
Fungsi firwin mengambil jumlah tap lagi dan cutoff sebagai argumen. Cutoff dapat berupa beberapa nilai sebagai daftar untuk menentukan bandpass dan filter stopband. Unit default untuk cutoff adalah frekuensi dinormalisasi di mana cutoff nyquist adalah 1 dan laju sampel akan 2. Ini dapat dimodifikasi dengan menetapkan / nyq /. Menggunakan contoh-contoh di atas firwin akan disebut sebagai:
The firwin2 lebih dekat dengan funcion remez. Tetapi alih-alih memberikan keuntungan untuk band Anda memberikan keuntungan pada cutoffs.
Lebih banyak contoh tersedia di sini
sumber
firwin
, dan pembungkusnyabutter
adalah apa yang saya gunakan sekarang. Terima kasih!Anda mengindikasikan bahwa Anda mengalami kesulitan mencari tahu bagaimana merancang filter jalan pintas yang sesuai. Salah satu metode adalah pertama-tama merancang prototipe filter lowpass, kemudian menerapkan transformasi yang membelokkan respons filter ke dalam filter jenis lain (seperti filter highpass atau bandpass). Ini dilakukan dengan mengganti ekspresi untukz−1 ke dalam fungsi transfer filter lowpass prototipe. Berikut ini beberapa tautan ke informasi tentang topik tersebut:
http://www.mathworks.com/help/toolbox/dsp/ug/bsva1v1.html
http://www.ingelec.uns.edu.ar/pds2803/Materiales/Articulos/Constantinides.pdf
http://cnx.org/content/m12759/latest/
Khususnya, untuk transformasi lowpass-to-highpass, Anda dapat menerapkan subtitusi berikut:
dimanaωc adalah frekuensi cutoff dari prototipe dan filter lowpass ω′c adalah frekuensi cutoff yang dihasilkan dalam filter highpass yang ditransformasikan. Ada beberapa contoh yang diberikan dalam dokumentasi MATLAB yang ditunjukkan pada tautan pertama .; mungkin ada fungsi serupa yang tersedia di SciPy. Dengan demikian, banyak fungsi desain filter di perpustakaan yang mengikuti contoh MATLAB dengan cermat, dan mereka mampu mendesain filter dari semua tipe utama (lowpass, highpass, dll.) Dengan sedikit usaha.
sumber