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
∂E∂ai=0 , for i=0,1,..,N(1)
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:
a=(ATA)−1ATx=Hx(2)
x(2M+1)×1H2M+1NAnAHA
A=[αn,i]=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢(−M)0(−M+1)0(0)0(M)0(−M)1(−M+1)1...(0)1...(M)1............(−M)N(−M+1)N(0)N(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[d−M],x[d−M+1],...,x[d−1],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
⎡⎣⎢⎢⎢⎢a0a1⋮aN⎤⎦⎥⎥⎥⎥=⎡⎣⎢⎢⎢⎢h(0,0)h(1,0)h(N,0)h(0,1)h(1,1)...h(0,1).........h(0,2M)h(1,2M)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à:
Hy vọng điều này làm rõ vấn đề.