Savitzky–Golay 필터와 IIR 또는 FIR 선형 필터


11
  • 전통적인 IIR / FIR 필터 (고주파수 진동을 제거하기위한 저역 통과), 예 : 이동 평균

  • 또는 Savitzky-Golay 필터

엔벨로프 신호와 같은 신호를 부드럽게하는 데 모두 유용 할 수 있습니다.

여기에 이미지 설명을 입력하십시오

Savitzky-Golay 필터는 어떤 애플리케이션에서 기존 저역 통과보다 더 흥미로울까요?

표준 필터와 다른 점은 무엇이며 표준 필터와 비교하여 무엇을 추가합니까?

입력 데이터에 적응합니까?

일시적 보존에 더 낫습니까?


당신이 결정했을 때 당신이 이제까지 일일 엔지니어링 상황에왔다 "평균 또는 다른 FIR 저역 통과를 이동하는 대신하자를 사용하여 A SG 필터를! 그것은 더 나은이이이 때문에 ...입니다" ? 그렇다면이 질문은 당신을위한 것입니다!

답변:


4

기존 답변 및 의견에 대한 토론은 주로 Savitzky-Golay 필터가 실제로 무엇인지에 매우 중점을 두었으므로 실제로는 평활 필터를 선택하는 방법에 대한 정보를 제공하여 기존 답변에 추가하려고합니다. 내 이해로, 질문이 실제로 무엇에 관한 것인지입니다.

우선, 다른 답변에서 논의 된 토론에서 명확하게 된 것을 반복하고 싶습니다. 질문의 평활 필터를 선형 및 시간 불변 (LTI) FIR / IIR 필터로 분류하고, 반면에 Savitzky-Golay 필터는 오해의 소지가 있습니다. Savitkzy-Golay 필터는 특정 기준 (로컬 다항식 근사)에 따라 설계된 표준 FIR 필터입니다. 따라서 질문에 언급 된 모든 필터는 LTI 필터입니다.

나머지 질문은 스무딩 필터를 선택하는 방법입니다. 계산 복잡도 및 / 또는 메모리가 문제가되는 경우, IIR 필터는 FIR 필터보다 선호 될 수 있습니다. 일반적으로 FIR 필터보다 필터 순서가 훨씬 낮은 노이즈 억제 (즉, 저지 대역 감쇠)를 달성하기 때문입니다. 그러나 실시간 처리가 필요한 경우 IIR 필터의 한 가지 가능한 단점은 정확히 선형 위상 응답을 가질 수 없다는 것입니다. 따라서 원하는 신호에 위상 왜곡이 발생합니다. 오프라인 처리의 경우 IIR 필터를 사용하더라도 영 위상 필터링 을 적용하여 위상 왜곡을 피할 수 있습니다 .

이전 단락에서 논의한 고려 사항 외에도 필터가 FIR 또는 IIR이면 그다지 중요하지 않은 설계 기준입니다. 왜냐하면 어떤 (안정한) IIR 필터도 FIR 필터에 의해 임의의 정확도로 근사 할 수 있기 때문입니다. FIR 필터는 IIR 필터에 의해 근사 될 수 있지만 후자는 훨씬 더 어려울 수 있습니다. 적절한 설계 기준은 분명히 데이터의 특성과 노이즈에 따라 다릅니다. 평활화와 관련하여 우리는 일반적으로 충분히 오버 샘플링 된 (즉, 평활 한) 데이터를 가정합니다. 잡음이 주로 고주파수 성분을 갖는 경우, 즉 데이터와 잡음 사이에 스펙트럼 중첩이 거의없는 경우, 원하는 신호를 유지하면서 정지 대역 감쇠를 최대화하거나 정지 대역 에너지를 최소화하려고합니다. 이 경우 Parks-McClellan 알고리즘을 사용하여 minimax 기준에 따라 설계된 선형 위상 FIR 필터를 선택할 수 있습니다. 또한 최소 제곱 법을 선택하여 정지 대역 에너지를 최소화 할 수 있습니다 (즉, 정지 대역의 노이즈 전력 최소화). 두 가지 기준 (최소 및 최소 제곱) 사이의 혼합은통과 대역의 최대 근사 오차를 제한하면서 정지 대역 에너지를 최소화하는 제한된 최소 제곱 설계 .

노이즈 스펙트럼이 신호 스펙트럼과 크게 겹치는 경우보다 신중한 접근 방식이 필요하며 너무 많은 노이즈를 남겨 두거나 (차단 주파수를 너무 높게 선택하여) 원하는 왜곡을 발생시키기 때문에 무차별 감쇠가 제대로 작동하지 않습니다. 너무 많은 신호. 이 경우 Savitzky-Golay (SG) 필터를 사용하는 것이 좋습니다. 지불해야 할 가격은 평범한 저지 대역 감쇠이지만, 한 가지 장점은 일부 신호 특성이 잘 보존된다는 것입니다. 이것은 SG 필터가 평탄한 통과 대역 응답을 갖는다는 사실과 관련이 있습니다.

(1)케이H(이자형제이ω)ω케이|ω=0=0케이=1,2,,아르 자형

여기서 은 근사 다항식의 차수이며 는 필터의 주파수 응답입니다. 특성 은 입력 신호 의 첫 번째 모멘트가 출력에 유지 되도록 보장합니다. 즉, 원하는 신호에서 피크의 폭과 높이가 잘 보존됩니다.아르 자형H(이자형제이ω)(1)아르 자형

물론 위에서 설명한 두 가지 유형의 스무딩 필터 (높은 저지 대역 감쇠 및 SG) 간에도 절충안이 있습니다. 우리는 에서 일정한 평탄도를 갖는 FIR 필터를 설계 할 수 있으며, 나머지 자유도를 사용하여 정지 대역 감쇠를 최대화하거나 정지 대역 에너지를 최소화 할 수 있습니다. FIR 필터의 경우 결과 설계 문제는 충분히 간단하고 볼록하며 여러 소프트웨어 패키지에서 사용 가능한 일반 최적화 루틴을 사용하여 주어진 응용 분야에 대한 최적의 필터를 얻을 수 있습니다.ω=0

SG 필터 이론에 관심이있는 사람들을 위해 내가 추천 할 수있는 가장 관련성있는 참고 문헌은 다음과 같습니다.


2

다른 어떤 도구와 마찬가지로 때로는 특정 도구가 다른 도구보다 낫습니다.

이동 평균 (MA) 필터는 데이터를 평활화하는 데 사용할 수 있으며 FIR입니다. 그것들은 당신이 생각해 낼 수있는 가장 간단한 필터이며 갑작스런 점프 나 다항식 트렌드를 모델링하지 않는 한 많은 작업에 잘 작동합니다. 이 필터는 본질적으로 저역 통과 필터이므로 신호에서 관심있는 데이터가 저주파이고 상당히 협 대역 일 때 가장 잘 작동합니다.

Savitzky-Golay (SG) 필터는 회선이 신호를 따라 미끄러질 때 시계열에 다항식을 적용하는 특수한 FIR 필터 그룹입니다. SG 필터는 관심있는 항목이 반드시 저주파수이고 상당히 좁은 대역 일 필요는없는 신호에 유용합니다.

Wikipedia 페이지를 읽으면 SG 필터와 MA 필터의 차이점을 매우 상세하게 설명합니다. 그러나 명심하십시오. 결국, 그들은 둘 다 비슷한 일을하는 도구 일뿐입니다. 올바른 도구를 사용할 때를 찾는 것은 당신에게 달려 있습니다.

편집 :

SG 필터가 기본적으로 어떤 방식 으로든 "적응"한다는 혼동이있는 것처럼 보이므로 간단한 MATLAB 예제를 포함 시켰습니다. Dan이 지적한 바와 같이, 이것들은 적응성이 될 수 있지만, 기본 구현은 종종 그렇지 않습니다. 코드를 살펴보면이 코드가 특별한 처리를하는 단순한 매트릭스 조회라는 것을 알 수 있습니다. 이 필터에 대한 어떤 것도 전통적인 의미에서 "적응 적"이 아닙니다. 단순히 다항식 피팅과 그 다항식이 컨벌루션을 통해 신호에 맞는 길이를 선택하는 것입니다. SG는 필수 FIR입니다. 내가 가지고있는 스크립트는이 줄거리를 생성합니다. MA와의 SG 필터 비교

이 그림을 보면 MA와 SG가 본질적으로 동일한 것을 달성하지만 몇 가지 중요한 차이점이 있음을 알 수 있습니다.

  1. MA는 노이즈를 억제하는 데 큰 도움이되지만 신호의 과도 점프를 캡처하는 작업은 열악합니다. 필터 길이를 늘려 더 많은 노이즈를 억제 할 수 있지만 과도 상태에서는 성능이 훨씬 떨어집니다. 이 효과는 모든 트랜 션트 근처에서 "스미어 링"으로 표시되며, 그림에서 볼 수 있습니다.
  2. SG는 신호의 과도를 캡처하는 데 큰 도움이되지만 노이즈를 억제하는 데는 큰 도움이되지 않습니다 (적어도 같은 크기의 MA와 비교했을 때). 프레임 길이를 늘려 비 과도 근처에서 노이즈 억제를 개선 할 수 있지만, 이는 과도 근처에서 Gibb 현상과 유사한 링잉을 유발합니다.

이러한 필터의 작동 방식을 더 잘 이해하려면 여기에서 코드를 작성하고 조작하고 SG 필터의 모든 개별 부분이 어떻게 작동하는지 확인하는 것이 좋습니다.

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
요점은 (다른 답변을 보면) SG 필터는 " 입력의 각 짧은 세그먼트에 대해 계수가 재 계산되는 완전 데이터 의존형 비선형 시변 필터 "인 것 같습니다.
g6kxjv1ozn

1
SG 필터는 여러 번 구현 한 결과로 특히 LMS 또는 RLS와 같은 평균 적응 형 필터와 비교할 때 적응 형 필터가 아닙니다. 필터 무게가 시간에 따라 변한다는 진술에 완전히 동의하지 않습니다. SG 필터는 본질적으로 테이블 조회이며, 테이블에서 값으로 필터링하여 과도 응답을 계산 한 다음 신호의 시작 / 종료시 에지 케이스로 돌아가서 처리합니다. MATLAB 예제로 내 게시물을 편집하여이 내용을 보여 드리겠습니다.
matthewjpollard

2
@matthewjpollard 참고로, 나는 개인적으로이 필터를 사용한 경험이 없지만, SG 필터가 가장 잘 구현 된 것은 시변 계수를 갖는 적응 형 필터 구현 인 것 같습니다. 코드에서 필터를 적용한 방식은 전체 시퀀스를 데이터 "하위 집합"으로 취급 한 것이 아니라 Wikipedia en.wikipedia.org/wiki/Savitzky%E2%80%에 설명 된 방식과 다릅니다. 93Golay_filter 와 Savitzky and Golay의 논문 자체는 실제로 적응력이 뛰어납니다
Dan Boschen

2
@matthewjpollard 실시간 시스템에서 데이터는 지속적으로 스트리밍되므로 짧은 간격에 걸쳐 계수를 다시 계산하거나 항상 작은 데이터 블록으로 작업합니까?
Dan Boschen

2
고마워 매트. 따라서 우리는 각 데이터 수집에 대해 계수가 계산된다는 점에서 적응 형 / 시간으로 수행하는 작업을 연결할 수 있습니다 (데이터 수집 내에서 동일한 계수는 시작 및 종료의 적절한 처리를 통해 수집하지만 한 수집에서 다음 수집까지 다양 함) 올바르게 이해하십시오). 코드와 예제 응용 프로그램을 공유해 주셔서 감사합니다.
Dan Boschen

2

노트

Savitzky-Golay (SG) 필터가 출력을 계산하는 방식을 조기에 잘못 해석했기 때문에 Savitzky-Golay (SG) 필터를 비선형, 시간에 따라 변하는 입력 데이터에 의존하는 것으로 표시 한 이전 답변 (이 편집 전) 제공된 위키 링크에 따라. 그래서 지금은 FIR-LTI 필터링으로 SG 필터를 구현하는 방법을 보는 사람들의 이익을 위해 수정하고 있습니다. @MattL에게 감사합니다. 그의 정정을 위해, 그가 제공 한 위대한 연결과 내가 문제를 조사 하는 동안 그가 가지고있는 인내심 (내가 결코 보여줄 수 없었던 인내) . 나는 솔직히 더 자세한 반대 의견을 선호하지만 그럼에도 불구하고 분명히 필요하지는 않습니다. 또한 정답은 다른 것입니다. 이것은 SG 필터의 LTI 속성에 대한 추가 설명을위한 것입니다.

이제 (이전에 해당 필터를 사용한 적이없는) 누군가 가 주어진 데이터에 대해 하위 LSE 다항식 적합으로 SG 필터의 정의에 직면 할 때 데이터에 의존하고 비선형 적이며 시간 (시프트) 가변 적응 필터.

그러나, 다항식 피팅 절차는 SG 자체에 의해 영리하게 해석되어 데이터에 독립적이고 시변이없는 선형 필터링이 가능하여 SG를 고정 LTI-FIR 필터로 만듭니다.

아래는 MattL에서 제공 하는 링크의 요약입니다 . 누락 된 것으로 보이는 자세한 내용은 원본 문서를 참조하거나 명확하게 요청하십시오. 그러나 나는 전체 문서를 여기에서 재현하고 싶지 않습니다.

2M+1x[M],x[M+1],...,x[0],x[1],...,x[M]n=0[]=미디엄,미디엄+1,...,1,0,1,...미디엄

[]=케이=0케이케이=0+1+22+...+

케이h[]

이자형=미디엄미디엄([]엑스[])2

엑스=[엑스[미디엄],엑스[미디엄+1],...,엑스[0],엑스[1],...,엑스[미디엄]]

케이이자형

(1)이자형나는=0   ,   ...에 대한    나는=0,1,..,

이제 LSE polyfit 절차에 익숙한 사람들을 위해 최적의 계수 세트를 정의하는 결과 행렬 방정식을 링크에서 작성합니다.

(2)=()1엑스=H엑스
엑스(2미디엄+1)×1H2미디엄+1H

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

이제 잠시 뒤로 물러서서 요점을 논의하십시오.

AHnakMNx[n]ak2nd

...이 (LSE polyfit)는 입력의 각 샘플에서 반복 될 수 있으며 매번 새로운 다항식과 출력 시퀀스 y [n]의 새로운 값을 생성합니다 ...

그렇다면이 수수께끼의 놀라움을 어떻게 극복 할 수 있습니까? SG 필터 출력을 해석하고 정의하여 다음과 같습니다.

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]엑스[미디엄],엑스[미디엄+1],...,엑스[1],엑스[],엑스[+1],...엑스[+미디엄]

0엑스[]와이[]엑스[]엑스[]h[]. 그러나이 SG 필터의 필터 계수는 무엇입니까? 볼 수 있습니다.

케이

=H엑스

[01]=[h(0,0)h(0,1)...h(0,2미디엄)h(1,0)h(1,1)...h(1,2미디엄)...h(,0)h(0,1)...h(0,2미디엄)][엑스[미디엄]엑스[미디엄+1]...엑스[미디엄]]

0H엑스

0=H(0,)엑스=H(0,케이)엑스[케이]=H(0,)엑스[]

h[]=H(0,)

2미디엄+1

와이[]2미디엄+1엑스[]h[]

와이[]=엑스[]h[]

논평

케이h[]와이[]엑스=H엑스케이[]케이h[]

MATLAB / OCTVE 코드

h[]h[]

% 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]');

출력은 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

이것이 문제를 분명히하기를 바랍니다.


2
@ Fat32 댓글이 길고 앞뒤로 오기 때문에 보드를 깨끗하게 유지하려면 일반적으로 "채팅"으로 이동합니다. 메인 페이지를 어지럽히 지 않고 모든 것이 여전히 있습니다. 그렇기 때문에 시스템이 앞뒤로 갈 때 채팅으로 이동하도록 제안하는 이유입니다. 걱정하지 말고 모두가 여전히 당신을 사랑합니다.
Dan Boschen

1
@ g6kxjv1ozn 나는 그 시점에 comign 오전 ... 기다려주십시오 ...
Fat32

2
@ Fat32 훌륭합니다! 나는 그것을 통해 읽었지만 그것을 통해 읽을 필요가 있고 그것은 매우 명확하게 쓰여져 있습니다. 나는 연필과 종이로 단계별로 따라 가야합니다. 이 모든 것을 여기에 넣어 주셔서 감사합니다.
Dan Boschen

4
1ω=0

2
케이h[]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.