2011-04-08 28 views
25

Có ai biết cách sử dụng bộ lọc trong MATLAB không? Tôi không phải là người hâm mộ, vì vậy tôi không quan tâm đến các đặc điểm cuộn-off - tôi có một vector tín hiệu 1 chiều x lấy mẫu ở 100 kHz và tôi muốn thực hiện lọc qua cao (nói, từ chối mọi thứ bên dưới 10Hz) để loại bỏ độ lệch đường cơ sở.Lọc qua cao trong MATLAB

Có các bộ lọc Butterworth, Elliptical và Chebychev được mô tả trong trợ giúp, nhưng không có giải thích đơn giản nào về cách triển khai.

Trả lời

48

Có một số bộ lọc có thể được sử dụng và lựa chọn thực tế của bộ lọc sẽ phụ thuộc vào những gì bạn đang cố gắng đạt được. Vì bạn đã đề cập đến các bộ lọc Butterworth, Chebyschev và Elliptical, tôi giả sử bạn đang tìm kiếm các bộ lọc IIR nói chung.

Wikipedia là một nơi tốt để bắt đầu đọc trên các bộ lọc khác nhau và những gì họ làm. Ví dụ: Butterworth tối đa bằng phẳng trong băng thông và phản hồi sẽ bị tắt trong băng tần dừng. Trong Chebyschev, bạn có một phản ứng trơn tru trong cả passband (loại 2) hoặc băng tần dừng (loại 1) và lớn hơn, gợn sóng bất thường trong khác và cuối cùng, trong bộ lọc Elliptical, có gợn sóng trong cả hai dải. Hình ảnh sau đây is taken from wikipedia.

enter image description here

Vì vậy, trong cả ba trường hợp, bạn phải trao đổi một cái gì đó cho cái gì khác. Trong Butterworth, bạn không nhận được gợn sóng, nhưng đáp ứng tần số cuộn là chậm hơn. Trong hình trên, phải mất từ ​​0.4 đến khoảng 0.55 để nhận được một nửa sức mạnh. Ở Chebyschev, bạn sẽ bị trượt dốc hơn, nhưng bạn phải cho phép những gợn sóng bất thường và lớn hơn ở một trong các dải, và trong Elliptical, bạn bị cắt đứt gần như ngay lập tức, nhưng bạn có những gợn sóng ở cả hai dải.

Lựa chọn bộ lọc sẽ phụ thuộc hoàn toàn vào ứng dụng của bạn. Bạn đang cố gắng để có được một tín hiệu sạch sẽ với ít hoặc không có tổn thất? Sau đó, bạn cần một cái gì đó cung cấp cho bạn một phản ứng trơn tru trong passband (Butterworth/Cheby2). Bạn đang cố gắng để giết tần số trong stopband, và bạn sẽ không nhớ một mất mát nhỏ trong phản ứng trong passband? Sau đó, bạn sẽ cần một cái gì đó mượt mà trong băng tần dừng (Cheby1). Bạn có cần các góc cắt cực kỳ sắc nét, tức là, bất cứ thứ gì vượt quá băng thông đều có hại cho phân tích của bạn không? Nếu vậy, bạn nên sử dụng bộ lọc Elliptical.

Điều cần nhớ về bộ lọc IIR là chúng đã có cực. Không giống như bộ lọc FIR nơi bạn có thể tăng thứ tự của bộ lọc với phân nhánh duy nhất là độ trễ bộ lọc, việc tăng thứ tự bộ lọc IIR sẽ làm cho bộ lọc không ổn định. Bởi không ổn định, tôi có nghĩa là bạn sẽ có các cực nằm bên ngoài vòng tròn đơn vị. Để xem tại sao điều này là như vậy, bạn có thể đọc các bài viết wiki trên IIR filters, đặc biệt là một phần về sự ổn định.

Để minh họa thêm điểm của tôi, hãy xem xét bộ lọc băng thông sau đây.

fpass=[0.05 0.2];%# passband 
fstop=[0.045 0.205]; %# frequency where it rolls off to half power 
Rpass=1;%# max permissible ripples in stopband (dB) 
Astop=40;%# min 40dB attenuation 
n=cheb2ord(fpass,fstop,Rpass,Astop);%# calculate minimum filter order to achieve these design requirements 

[b,a]=cheby2(n,Astop,fstop); 

Bây giờ nếu bạn nhìn vào sơ đồ zero-cực sử dụng zplane(b,a), bạn sẽ thấy rằng có một số cột (x) nằm bên ngoài vòng tròn đơn vị, mà làm cho phương pháp này không ổn định.

enter image description here

và điều này là hiển nhiên từ thực tế là các phản ứng tần số là tất cả haywire. Sử dụng freqz(b,a) để có được những điều sau

enter image description here

Để có được một bộ lọc ổn định hơn với yêu cầu thiết kế chính xác của bạn, bạn sẽ cần phải sử dụng các bộ lọc để thứ hai bằng cách sử dụng phương pháp z-p-k thay vì b-a, trong MATLAB. Đây là cách cho bộ lọc tương tự như trên:

[z,p,k]=cheby2(n,Astop,fstop); 
[s,g]=zp2sos(z,p,k);%# create second order sections 
Hd=dfilt.df2sos(s,g);%# create a dfilt object. 

Bây giờ nếu bạn nhìn vào các đặc điểm của bộ lọc này, bạn sẽ thấy rằng tất cả các cực nằm bên trong vòng tròn đơn vị (do đó ổn định) và phù hợp với yêu cầu thiết kế

enter image description here

enter image description here

cách tiếp cận tương tự cho butterellip, với tương đương buttordellipord. Tài liệu MATLAB cũng có các ví dụ tốt về thiết kế bộ lọc. Bạn có thể xây dựng dựa trên những ví dụ này và của tôi để thiết kế một bộ lọc theo những gì bạn muốn.

Để sử dụng bộ lọc trên dữ liệu của bạn, bạn có thể làm filter(b,a,data) hoặc filter(Hd,data) tùy thuộc vào bộ lọc nào bạn sử dụng cuối cùng. Nếu bạn muốn biến dạng pha không, hãy sử dụng filtfilt. Tuy nhiên, điều này không chấp nhận các đối tượng dfilt. Vì vậy, để zero-giai đoạn lọc với Hd, sử dụng filtfilthd tập tin có sẵn trên MathWorks tập tin trao đổi trang web

EDIT

Đây là để đáp ứng với @ bình luận DarenW của. Làm mịn và lọc là hai hoạt động khác nhau và mặc dù chúng tương tự nhau (trung bình di chuyển là bộ lọc thông thấp), bạn không thể thay thế một bộ lọc khác trừ khi bạn có thể chắc chắn rằng nó sẽ không mối quan tâm trong ứng dụng cụ thể.

Ví dụ, thực hiện đề nghị Daren về một tín hiệu chirp tuyến tính từ 0-25kHz, lấy mẫu tại 100kHz, điều này phổ tần số sau khi làm mịn với một bộ lọc Gaussian

enter image description here

Chắc chắn, sự trôi dạt gần 10Hz gần như là không. Tuy nhiên, hoạt động đã hoàn toàn thay đổi bản chất của các thành phần tần số trong tín hiệu ban đầu. Sự khác biệt này xảy ra bởi vì họ đã bỏ qua hoàn toàn việc loại bỏ hoạt động làm mịn (xem đường màu đỏ) và giả định rằng nó sẽ bằng phẳng. Nếu đó là sự thật, thì phép trừ sẽ có hiệu quả. Nhưng than ôi, đó không phải là trường hợp, đó là lý do tại sao toàn bộ một lĩnh vực thiết kế bộ lọc tồn tại.

+3

bạn làm cho tôi trở thành người tốt hơn với câu trả lời của bạn – Diego

7

Tạo bộ lọc của bạn - ví dụ bằng cách sử dụng [B,A] = butter(N,Wn,'high') trong đó N là thứ tự của bộ lọc - nếu bạn không chắc chắn đây là gì, chỉ cần đặt nó thành 10. Wn là tần suất cắt chuẩn hóa từ 0 đến 1, với 1 tương ứng với một nửa tốc độ lấy mẫu của tín hiệu. Nếu tỷ lệ mẫu của bạn là fs và bạn muốn có tần suất cắt là 10 Hz, bạn cần đặt Wn = (10/(fs/2)).

Sau đó, bạn có thể áp dụng bộ lọc bằng cách sử dụng Y = filter(B,A,X) trong đó X là tín hiệu của bạn. Bạn cũng có thể xem xét chức năng filtfilt.

0

Một cách rẻ tiền để làm điều này loại lọc mà không liên quan đến căng thẳng tế bào não về thiết kế, zeros và cực và gợn và tất cả những gì, là:

* Make a copy of the signal 
* Smooth it. For a 100KHz signal and wanting to eliminate about 10Hz on down, you'll need to smooth over about 10,000 points. Use a Gaussian smoother, or a box smoother maybe 1/2 that width twice, or whatever is handy. (A simple box smoother of total width 10,000 used once may produce unwanted edge effects) 
* Subtract the smoothed version from the original. Baseline drift will be gone. 

Nếu tín hiệu ban đầu là spikey, bạn có thể muốn sử dụng một bộ lọc trung gian ngắn trước khi bộ lọc mượt mà hơn.

Điều này khái quát dễ dàng với hình ảnh 2D, dữ liệu khối lượng 3D, bất cứ điều gì.

+1

làm mịn và trừ không phải là giải pháp vì nó thay đổi đặc tính của tín hiệu ban đầu (xem phần chỉnh sửa cho câu trả lời của tôi). Điều này là phổ biến trong xử lý hình ảnh, và hoạt động bởi vì tiếng ồn đốm thường ở xa trong tần số so với các tính năng hình ảnh chính là tần số thấp. Nhưng đây không phải là một cách tốt để đi về dữ liệu chuỗi thời gian. – abcd

Các vấn đề liên quan