Làm cách nào để áp dụng bộ lọc Chebishev?


7

Tôi đọc một bài báo về một giao diện máy tính não. Trong bài báo này, các tác giả đã báo cáo "mỗi tín hiệu đã được lọc bằng bộ lọc Chebishev Loại I băng thông 8 bậc có tần số cắt là 0,1 và 10 Hz và được giảm theo tần số cắt cao". Tôi đã cố gắng thiết kế bộ lọc này với scipy:

import scipy.signal as signal
signal.cheby1(8,0.05,[0.1,10.0],btype='band',analog=0,output='ba')

Kết quả là:

Warning: invalid value encountered in sqrt
(array([ nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,
    nan,  nan,  nan,  nan,  nan,  nan]), array([ nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,
    nan,  nan,  nan,  nan,  nan,  nan]))

Tôi không có nền tảng về xử lý tín hiệu, vì vậy tôi thực sự không biết mình đang làm gì. Tôi không biết liệu họ đã sử dụng bộ lọc IIR hay FIR hay liệu tôi có phải chia tỷ lệ tần số giới hạn hay liệu tôi có sử dụng sai Ripple không. Tôi hy vọng bạn có thể giúp tôi.

Câu trả lời:


5

Vấn đề chính với ví dụ bạn đưa ra là chức năng thiết kế bộ lọc cheby1đang trả về tất cả NaNs, đây sẽ không phải là một bộ lọc rất tốt. Vấn đề là làm thế nào bạn chỉ định tần số cạnh băng thông / dải dừng. Hàm đặc biệt này có nghĩa là mô phỏng cheby1chức năng của MATLAB ; tần số mà bạn cung cấp phải được chuẩn hóa, sao cho giá trị 1tương ứng với một nửa tốc độ mẫu.

import scipy.signal as signal
fs = whatever_the_sample_rate_of_the_filter_input_is_going_to_be
signal.cheby1(8,0.05,[0.1/(fs/2),10.0/(fs/2)],btype='band',analog=0,output='ba')

Tôi không có SciPy tiện dụng, nhưng điều đó ít nhất nên thiết kế chính xác bộ lọc bạn muốn.


Cảm ơn, tôi sẽ thử nó vào buổi tối. Tốc độ lấy mẫu của tôi là 240 Hz. Bạn có biết làm thế nào để áp dụng bộ lọc trên dữ liệu? Tôi đã tìm thấy một công thức trên wikipedia ( en.wikipedia.org/wiki/ ,), nhưng công thức này mang lại cho tôi kết quả dao động kỳ lạ (những con số rất lớn ...). Vì vậy, tôi đoán tôi đã thực hiện một cái gì đó sai. Tôi thực hiện điều này trong C ++, vì vậy tôi không thể gọi hàm scipy.signal.lfilter. Btw. Điều gì sẽ thay đổi khi tôi thay đổi Ripple?
alfa

2
Đây là một bộ lọc thử thách số, vì bạn có các cực rất gần với vòng tròn đơn vị. Bạn cần chia bộ lọc thành các phần thứ tự thứ hai và áp dụng các phần đó theo tuần tự.
Hilmar

Và làm cách nào để chia bộ lọc thành các phần thứ hai? Tôi nghĩ Matlab có một chức năng cho việc này, nhưng nó không có sẵn trong scipy.
alfa

@alfa: không có scipy không có nó, nhưng tôi đã bắt đầu dịch mã octave sang python: gist.github.com/endolith/4525003
endolith

2

Hai tần số cắt thường có nghĩa là bộ lọc thông dải với đường cao tần ở 0,1Hz và đường truyền thấp ở 10 Hz. Ngưỡng thông thấp (cao hơn trong hai tần số) xác định mức độ bạn có thể xuống mẫu. Nếu bộ lọc thông thấp của bạn quá dốc, bạn có thể thoát ra với tốc độ mẫu mới là 20 Hz (gấp đôi mức cắt). Vì nó có độ dốc hạn chế, bạn cần để lại một dải bảo vệ giữa tần số cắt và tần số Nyquist mới. Bạn cần bao nhiêu tùy thuộc vào thứ tự của bộ lọc và mức độ khử răng cưa bạn có thể chịu đựng được.

Trong ví dụ cụ thể này, có vẻ như họ đã lấy mẫu xuống bởi hệ số 12 hoặc khoảng đó, điều này có vẻ quá hung dữ đối với tôi và có khả năng sẽ gây ra nhiều tiếng ồn răng cưa.


Cảm ơn đã giải thích. Tôi nghĩ rằng việc lấy mẫu theo hệ số 12 có ý nghĩa, bởi vì có rất nhiều nhiễu với biên độ và tần số cao và tín hiệu mà họ quan tâm có tần số rất thấp. Tôi thực sự muốn tái tạo kết quả của họ. Có bất kỳ hướng dẫn thực tế (có mã) về loại bộ lọc này không?
alfa
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.