Bộ lọc Golay của Savitzky so với bộ lọc tuyến tính IIR hoặc FIR


11
  • Bộ lọc IIR / FIR truyền thống (thông thấp để loại bỏ các dao động freq cao), ví dụ: trung bình di chuyển,

  • hoặc bộ lọc Savitzky-Golay

tất cả có thể hữu ích để làm mịn tín hiệu, chẳng hạn như tín hiệu phong bì:

nhập mô tả hình ảnh ở đây

Đối với ứng dụng nào, bộ lọc Savitzky-Golay sẽ thú vị hơn so với đường thông thấp cổ điển?

Điều gì làm cho nó khác với bộ lọc tiêu chuẩn và nó thêm gì so với bộ lọc tiêu chuẩn?

Nó có tự thích ứng với dữ liệu đầu vào không?

Là nó tốt hơn để bảo quản thoáng qua?


Bạn đã bao giờ ở trong một tình huống kỹ thuật một ngày khi bạn quyết định "Hãy sử dụng bộ lọc SG thay vì di chuyển trung bình hoặc một đường thấp FIR khác! Tốt hơn bởi vì điều này và điều này ..." ? Sau đó, câu hỏi này là dành cho bạn!

Câu trả lời:


4

Vì cuộc thảo luận trong các câu trả lời và nhận xét hiện tại chủ yếu tập trung vào các bộ lọc Savitzky-Golay thực sự là gì (rất hữu ích), tôi sẽ cố gắng thêm vào các câu trả lời hiện có bằng cách cung cấp một số thông tin về cách thực sự chọn bộ lọc làm mịn. theo hiểu biết của tôi, câu hỏi thực sự là về cái gì

Trước hết, tôi muốn nhắc lại những gì đã trở nên rõ ràng trong cuộc thảo luận nảy sinh từ các câu trả lời khác: phân loại các bộ lọc làm mịn trong câu hỏi thành các bộ lọc FIR / IIR tuyến tính và bất biến theo thời gian (LTI) trên một mặt và Mặt khác, bộ lọc Savitzky-Golay là sai lệch. Bộ lọc Savitkzy-Golay chỉ là bộ lọc FIR tiêu chuẩn được thiết kế theo một tiêu chí cụ thể (xấp xỉ đa thức cục bộ). Vì vậy, tất cả các bộ lọc được đề cập trong câu hỏi là bộ lọc LTI.

Câu hỏi còn lại là làm thế nào để chọn bộ lọc làm mịn. Nếu độ phức tạp tính toán và / hoặc bộ nhớ là một vấn đề, bộ lọc IIR có thể thích hợp hơn các bộ lọc FIR, vì chúng thường sẽ đạt được mức khử nhiễu tương đương (nghĩa là suy giảm băng tần) với thứ tự bộ lọc thấp hơn nhiều so với bộ lọc FIR. Nhưng lưu ý rằng nếu xử lý thời gian thực là cần thiết, một nhược điểm có thể có của các bộ lọc IIR là chúng không thể có đáp ứng pha tuyến tính chính xác. Vì vậy, tín hiệu mong muốn sẽ bị một số biến dạng pha. Để xử lý ngoại tuyến, có thể tránh các biến dạng pha, ngay cả với các bộ lọc IIR, bằng cách áp dụng lọc không pha .

Ngoài các cân nhắc được thảo luận trong đoạn trước, chủ yếu là tiêu chí thiết kế mới là vấn đề, không quá nhiều nếu bộ lọc là FIR hoặc IIR, bởi vì bất kỳ bộ lọc IIR (ổn định) nào cũng có thể được xấp xỉ với độ chính xác tùy ý bởi bộ lọc FIR và bất kỳ Bộ lọc FIR có thể được xấp xỉ bằng bộ lọc IIR, mặc dù bộ lọc sau có thể khó khăn hơn nhiều. Tiêu chí thiết kế phù hợp rõ ràng phụ thuộc vào thuộc tính của dữ liệu và tiếng ồn. Khi nói đến làm mịn, chúng ta thường giả sử dữ liệu quá khổ (nghĩa là trơn tru). Nếu nhiễu chủ yếu là các thành phần tần số cao, nghĩa là, nếu có ít sự chồng chéo phổ giữa dữ liệu và nhiễu, chúng tôi muốn tối đa hóa sự suy giảm dải dừng hoặc giảm thiểu năng lượng dải dừng, đồng thời duy trì tín hiệu mong muốn tốt nhất có thể. Trong trường hợp này, chúng ta có thể chọn bộ lọc FIR pha tuyến tính được thiết kế theo tiêu chí minimax sử dụng thuật toán Công viên-McClellan. Chúng ta cũng có thể giảm thiểu năng lượng dải dừng (nghĩa là giảm thiểu công suất nhiễu trong dải dừng) bằng cách chọn phương pháp bình phương tối thiểu. Có thể kết hợp giữa hai tiêu chí (minimax và tối thiểu bình phương) bằng cách chọn mộtthiết kế bình phương tối thiểu bị ràng buộc , giúp giảm thiểu năng lượng dải dừng trong khi hạn chế lỗi xấp xỉ tối đa trong dải thông.

Nếu phổ nhiễu chồng lấp đáng kể với phổ tín hiệu, cần có cách tiếp cận cẩn thận hơn và suy giảm lực lượng vũ phu sẽ không hoạt động tốt vì bạn để quá nhiều nhiễu (bằng cách chọn tần số cắt quá cao) hoặc bạn làm biến dạng mong muốn tín hiệu quá nhiều. Trong trường hợp này, bộ lọc Savitzky-Golay (SG) có thể là một lựa chọn tốt. Cái giá phải trả là sự suy giảm băng thông tầm thường, nhưng một lợi thế là một số thuộc tính tín hiệu được bảo quản rất tốt. Điều này có liên quan đến thực tế là các bộ lọc SG có phản hồi băng thông phẳng, nghĩa là,

(1)dkH(ejω)dωk|ω=0=0k=1,2,,r

nơi r là thứ tự của các và xấp xỉ đa thức H(ejω) là đáp ứng tần số của bộ lọc. Thuộc tính (1) đảm bảo rằng các khoảnh khắc r đầu tiên của tín hiệu đầu vào được bảo toàn trong đầu ra, điều đó có nghĩa là chiều rộng và chiều cao của các đỉnh trong tín hiệu mong muốn được bảo quản tốt.

Tất nhiên, cũng có một sự thỏa hiệp giữa hai loại bộ lọc làm mịn được thảo luận ở trên (độ suy giảm băng tần cao và SG). Chúng ta có thể thiết kế một bộ lọc FIR với một mức độ nhất định độ phẳng tại ω=0 và sử dụng độ còn lại của tự do để phát huy tối đa dừng băng suy giảm, hoặc giảm thiểu năng lượng stopband. Trong trường hợp bộ lọc FIR, vấn đề thiết kế kết quả là đủ đơn giản (và lồi) và các thói quen tối ưu hóa chung có sẵn trong một số gói phần mềm có thể được sử dụng để có được bộ lọc tối ưu cho ứng dụng đã cho.

Đối với những người quan tâm đến lý thuyết về bộ lọc SG, các tài liệu tham khảo phù hợp nhất tôi có thể đề xuất là như sau:


2

Như với bất cứ điều gì, đôi khi một số công cụ nhất định là tốt hơn so với những người khác.

Bộ lọc di chuyển trung bình (MA) có thể được sử dụng để làm mịn dữ liệu và là FIR. Chúng gần như là bộ lọc đơn giản nhất bạn có thể nghĩ ra và chúng hoạt động tốt cho nhiều nhiệm vụ miễn là bạn không cố gắng mô hình hóa bất kỳ xu hướng nhảy bất ngờ hoặc đa thức nào. Hãy nhớ rằng mặc dù đây thực chất chỉ là bộ lọc thông thấp, vì vậy chúng hoạt động tốt nhất khi dữ liệu bạn quan tâm trong tín hiệu có tần số thấp và băng tần khá hẹp.

Bộ lọc Savitzky-Golay (SG) là một nhóm bộ lọc FIR đặc biệt phù hợp với đa thức cho chuỗi thời gian của bạn khi tích chập trượt dọc theo tín hiệu. Bộ lọc SG rất hữu ích cho các tín hiệu trong đó những thứ bạn quan tâm không nhất thiết phải là tần số thấp và dải tần khá hẹp.

Tôi nghĩ bạn sẽ thấy rằng nếu bạn đọc trang Wikipedia mà bạn đã liên kết khá kỹ lưỡng, nó sẽ giải thích sự khác biệt giữa các bộ lọc SG và MA một cách chi tiết khá nghiêm ngặt. Hãy ghi nhớ rằng: cuối cùng, cả hai chỉ là công cụ để làm những việc tương tự, tùy thuộc vào bạn để tìm ra khi nào nên sử dụng đúng công cụ

CHỈNH SỬA :

Vì dường như có một số nhầm lẫn rằng các bộ lọc SG là "thích ứng" theo một cách nào đó ở mức cơ bản, tôi đã bao gồm một ví dụ MATLAB đơn giản. Như Dan đã chỉ ra, những điều này có thể được thực hiện thích ứng, nhưng việc thực hiện cơ bản của chúng thường không được thực hiện. Bằng cách kiểm tra mã, bạn sẽ thấy rằng đây chỉ đơn giản là một ma trận tra cứu với một số xử lý đặc biệt. Không có gì về bộ lọc này là "thích ứng" theo nghĩa truyền thống, bạn chỉ cần chọn một bộ điều hợp đa thức và độ dài mà đa thức đó sẽ phù hợp với tín hiệu thông qua tích chập; SG là FIR thiết yếu. Kịch bản tôi có dưới đây tạo ra cốt truyện này: So sánh bộ lọc SG với MA

Nhìn vào hình này, bạn có thể thấy rằng MA và SG về cơ bản hoàn thành cùng một thứ, nhưng với một số điểm khác biệt quan trọng:

  1. MA làm một công việc tuyệt vời để triệt tiêu tiếng ồn, nhưng nó làm một công việc kém khi bắt được các bước nhảy thoáng qua trong tín hiệu. Chúng ta có thể triệt tiêu nhiều nhiễu hơn bằng cách tăng độ dài của bộ lọc, nhưng sau đó nó sẽ hoạt động thậm chí còn tệ hơn trên các quá độ; hiệu ứng này sẽ được xem là "bôi nhọ" gần bất kỳ quá độ nào, mà bạn sẽ có thể nhìn thấy trong hình minh họa.
  2. SG thực hiện công việc tuyệt vời trong việc thu các tín hiệu tạm thời, nhưng thực hiện công việc không quá lớn để triệt tiêu nhiễu (ít nhất là so với MA có cùng kích thước). Chúng ta có thể cải thiện khả năng khử nhiễu gần không tạm thời bằng cách tăng chiều dài khung hình, nhưng điều này sẽ giới thiệu tiếng chuông tương tự như hiện tượng Gibb gần bất kỳ quá độ nào.

Để bạn hiểu rõ hơn về cách thức các bộ lọc này hoạt động, tôi khuyến khích bạn lấy mã ở đây và thao tác với nó, và xem tất cả các phần riêng lẻ của bộ lọc SG hoạt động như thế nào.

Mã cho ví dụ MATLAB:

% Generate a signal "s" that has square waves, and scale it with a
% polynomial of order 5
up = 1*ones(1,100);
down = zeros(1,150);
s = [down down up up down up down up down up up up down down down down down];
n = numel(s);
nn = linspace(0,4,numel(s));
s = s .* (nn .^5);
sn = (s + 4*randn(size(s))).';

% smooth it with SMA of length 15
sz = 15;
h = 1/sz * ones(1,sz);
sn_sma = conv(sn,h,'same');

% smooth it with sgolay of frame length 15
m = (sz-1)/2;
% look up the SG matrix for this order and size
B = sgolay(5, sz);

% compute the steady state response for the signal, i.e. everywhere that
% isnt the first or last "frame" for the SG filter
steady = conv(sn, B(m+1,:), 'same');
% handle the transiet portion at the start of the signal
y_st   = B(1:m,:)*sn(1:sz);
% handle the transient portion at the end of the signal
y_en   = B(sz -m+1 : sz, :) * sn(n - sz+1:n);

% combine our results
sn_sg  = steady;
sn_sg(1:m) = y_st;
sn_sg(n-m+1:n) = y_en;

% plots
figure(1);
hold off;
plot(sn,'Color',[0.75 0.75 0.75]);
hold on;
plot(sn_sma,'b');
plot(sn_sg,'r');

legend('Noisy Signal','MA Smoothing','SG Smoothing, order 5','Location','NorthWest');

1
Điểm có vẻ là (bằng cách xem câu trả lời khác) rằng bộ lọc SG là " bộ lọc thay đổi thời gian phi tuyến phụ thuộc hoàn toàn dữ liệu có hệ số được tính lại cho từng phân đoạn ngắn của đầu vào".
g6kxjv1ozn

1
Bộ lọc SG, theo hiểu biết của tôi từ việc triển khai nó nhiều lần, hoàn toàn không phải là bộ lọc thích ứng, đặc biệt là so với bộ lọc thích ứng trung bình của bạn như LMS hoặc RLS. Tôi hoàn toàn không đồng ý với tuyên bố rằng trọng lượng bộ lọc thay đổi theo thời gian. Bộ lọc SG về cơ bản là tra cứu bảng, bạn lọc các giá trị từ bảng để tính toán phản hồi nhất thời, sau đó bạn quay lại và xử lý các trường hợp cạnh ở đầu / cuối tín hiệu. Tôi sẽ chỉnh sửa bài viết của mình bằng ví dụ MATLAB để hiển thị điều này cho bạn.
matthewjpollard

2
@matthewjpollard Lưu ý, cá nhân tôi không có kinh nghiệm đáng kể khi sử dụng bộ lọc này, nhưng đối với tôi, bộ lọc SG được triển khai tốt nhất dường như là một triển khai bộ lọc thích ứng, với các hệ số thay đổi theo thời gian. Cách bạn áp dụng bộ lọc trong mã của mình không phải (vì bạn đã xử lý toàn bộ chuỗi là "tập hợp con" dữ liệu, mà là cách cụ thể như được mô tả tại Wikipedia en.wikipedia.org/wiki/Savitzky%E2%80% 93Golay_filter và trong bài báo của Savitzky và Golay thực sự thích nghi: pdfs.semanticscholar.org/4830/ trộm
Dan Boschen

2
@matthewjpollard Trong các hệ thống thời gian thực của bạn là dữ liệu của bạn liên tục truyền phát, do đó bạn đang tính toán lại các hệ số trong các khoảng thời gian ngắn hơn hoặc bạn luôn làm việc trong các khối dữ liệu nhỏ?
Dan Boschen

2
Cảm ơn Matt. Vì vậy, có lẽ chúng ta có thể liên kết những gì bạn làm theo thời gian thích ứng / thời gian khác nhau theo nghĩa các hệ số được tính cho mỗi lần thu thập dữ liệu (cùng hệ số trong một thu thập dữ liệu tuy nhiên với việc xử lý bắt đầu và kết thúc đúng nhưng thay đổi từ một lần thu thập sang lần tiếp theo - nếu tôi hiểu đúng). Cảm ơn đã chia sẻ mã và ứng dụng ví dụ của bạn.
Dan Boschen

2

GHI CHÚ

câu trả lời trước của tôi (trước lần chỉnh sửa này) biểu thị bộ lọc Savitzky-Golay (SG) là phi tuyến, phụ thuộc dữ liệu đầu vào thay đổi theo thời gian là sai, do cách hiểu sai về cách bộ lọc Savitzky-Golay (SG) tính toán đầu ra của nó theo liên kết wiki được cung cấp. Vì vậy, bây giờ tôi đang sửa nó vì lợi ích của những người cũng sẽ thấy cách các bộ lọc SG có thể thực hiện được bằng cách lọc FIR-LTI. Cảm ơn @MattL. cho sự điều chỉnh của anh ấy, mối liên kết tuyệt vời mà anh ấy đã cung cấp và sự kiên nhẫn anh ấy có (mà tôi có thể chưa bao giờ thể hiện) trong quá trình điều tra vấn đề của tôi. Mặc dù tôi thực sự thích một sự phản đối dài dòng hơn mà rõ ràng là không cần thiết. Ngoài ra, xin lưu ý rằng câu trả lời đúng là câu trả lời khác, câu trả lời này chỉ để làm rõ thêm về thuộc tính LTI của các bộ lọc SG.

Bây giờ, không có gì đáng ngạc nhiên khi ai đó (chưa bao giờ sử dụng các bộ lọc đó trước đây) phải đối mặt với định nghĩa của bộ lọc SG là đa thức LSE có thứ tự thấp để cung cấp dữ liệu , anh ấy / cô ấy sẽ ngay lập tức đưa ra kết luận rằng những bộ phận đó phụ thuộc dữ liệu, phi tuyến và thời gian (thay đổi) khác nhau, bộ lọc thích ứng.

Tuy nhiên, quy trình khớp đa thức được chính SG diễn giải một cách khéo léo, nhờ đó nó cho phép lọc tuyến tính hoàn toàn độc lập, bất biến theo thời gian, có thể lọc SG, do đó biến SG thành bộ lọc LTI-FIR cố định.

Dưới đây là một bản tóm tắt ngắn nhất từ liên kết được cung cấp bởi MattL. Đối với bất kỳ chi tiết dường như bị thiếu, xin vui lòng tham khảo tài liệu gốc, hoặc yêu cầu làm rõ. Nhưng tôi không muốn sản xuất lại toàn bộ tài liệu ở đây.

2M+1x[M],x[M+1],...,x[0],x[1],...,x[M]n=0p[n]Nn=M,M+1,...,1,0,1,...M

p[n]=k=0Naknk=a0+a1n+a2n2+...+aNnN

akNthp[n]

E=MM(p[n]x[n])2

x=[x[M],x[M+1],...,x[0],x[1],...,x[M]]T

akE

(1)Eai=0   ,   for    i=0,1,..,N

Giờ đây, đối với những người quen thuộc với quy trình polyfit LSE, tôi sẽ chỉ cần viết phương trình ma trận kết quả (từ liên kết) xác định tập hệ số tối ưu:

(2)a=(ATA)1ATx=Hx
x(2M+1)×1H2M+1NAnAHA

A=[αn,i]=[(M)0(M)1...(M)N(M+1)0(M+1)1...(M+1)N...(0)0(0)1...(0)N...(M)0(M)1...(M)N]

Bây giờ hãy ngả lưng một lát và thảo luận về một điểm ở đây.

AHnakMNx[n]ak2nd

... Điều này (LSE polyfit) có thể được lặp lại ở mỗi mẫu của đầu vào, mỗi lần tạo ra một đa thức mới và một giá trị mới của chuỗi đầu ra y [n] ...

Vậy làm thế nào để chúng ta vượt qua sự ngạc nhiên khó hiểu này? Bằng cách giải thích và xác định đầu ra bộ lọc SG là như sau:

Nnx[n]y[n]p[n]n=0

y[n]=y[0]=m=0Namnm=a0

2M+1x[n]n=dy[n]a0p[n]x[n]n=dy[d]x[dM],x[dM+1],...,x[d1],x[d],x[d+1],...x[d+M]

a0x[n]y[n]x[n]nx[n]h[n]. Nhưng sau đó, các hệ số bộ lọc cho bộ lọc SG này là gì? Hãy xem nào.

ak

a=Hx

[a0a1aN]=[h(0,0)h(0,1)...h(0,2M)h(1,0)h(1,1)...h(1,2M)...h(N,0)h(0,1)...h(0,2M)][x[M]x[M+1]...x[M]]

a0Hx

a0=H(0,n)x=H(0,k)x[k]=H(0,n)x[n]

h[n]=H(0,n)

N2M+1

y[n]2M+1x[n]LhN[n]

y[n]=x[n]hN[n]

BÌNH LUẬN

akh[n]y[n]xa=Hxakp[n]akh[n]

MÃ MATLAB / OCTVE

h[n]h[n]

% Savitzky-Golay Filter
% 
clc; clear all; close all;

N = 3;                      % a0,a1,a2,a3 : 3rd order polynomial
M = 4;                      % x[-M],..x[M] . 2M + 1 data

A = zeros(2*M+1,N+1);
for n = -M:M
    A(n+M+1,:) = n.^[0:N];
end

H = (A'*A)^(-1)* A';        % LSE fit matrix

h = H(1,:);                 % S-G filter impulse response (nancausal symmetric FIR)

figure,subplot(2,1,1)
stem([-M:M],h);
title(['Impulse response h[n] of Savitzky-Golay filter of order N = ' num2str(N), ' and window size 2M+1 =  ' , num2str(2*M+1)]);

subplot(2,1,2)
plot(linspace(-1,1,1024), abs(fftshift(fft(h,1024))));
title('Frequency response magnitude of h[n]');

Đầu ra là:

nhập mô tả hình ảnh ở đây

Hy vọng điều này làm rõ vấn đề.


2
@ Fat32 Tôi nghĩ rằng đó là vì nó là một danh sách dài các danh sách bình luận, vì vậy để giữ cho bảng sạch, họ thường di chuyển nó "để trò chuyện". Tất cả vẫn còn đó, chỉ là không làm lộn xộn trang chính. Đó là lý do tại sao hệ thống đề nghị chuyển nó sang trò chuyện khi thời gian qua lại kéo dài. Không phải băn khoăn, mọi người vẫn yêu bạn.
Dan Boschen

1
@ g6kxjv1ozn Tôi đang đến thời điểm đó ... vui lòng đợi ...
Fat32

2
@ Fat32 Công việc tuyệt vời! Tôi đọc qua nó nhưng sẽ cần đọc qua nó và nó được viết rất rõ ràng, tôi sẽ chỉ cần làm theo từng bước bằng bút chì và giấy để hoàn toàn nhìn thấy nó như bạn bây giờ. Cảm ơn vì đã đặt tất cả những thứ này ở đây.
Dan Boschen

4
1ω=0

2
akh[n]
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.