Main Content

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

sgolay

사비츠키-골레이 필터(Savitzky-Golay Filter) 설계

설명

예제

b = sgolay(order,framelen)은 다항식 차수 order와 프레임 길이 framelen을 갖는 사비츠키-골레이 FIR 평활화 필터를 설계합니다.

b = sgolay(order,framelen,weights)는 가중 벡터 weights를 지정합니다. 이 벡터는 최소제곱 최소화에 사용되는 양의 실수 값 가중치를 포함합니다.

예제

[b,g] = sgolay(___)는 미분 필터로 구성된 행렬 g를 반환합니다. 이 출력 인수는 위에 열거된 모든 입력 구문과 함께 사용할 수 있습니다.

예제

모두 축소

200초 동안 1초에 5회씩 샘플링된, 백색 가우스 잡음이 포함된 0.2Hz 정현파로 구성된 신호를 생성합니다.

dt = 1/5;
t = (0:dt:200-dt)';

x = 5*sin(2*pi*0.2*t) + randn(size(t));

sgolay를 사용하여 신호를 평활화합니다. 21개 샘플로 구성된 프레임과 4차 다항식을 사용합니다.

order = 4;
framelen = 21;

b = sgolay(order,framelen);

b의 중앙 행을 사용하여 신호에 대해 컨벌루션을 수행함으로써 신호의 정상 상태 부분을 계산합니다.

ycenter = conv(x,b((framelen+1)/2,:),'valid');

과도를 계산합니다. 시작 과도에는 b의 마지막 행들을 사용하고, 종료 과도에는 b의 첫 번째 행들을 사용합니다.

ybegin = b(end:-1:(framelen+3)/2,:) * x(framelen:-1:1);
yend = b((framelen-1)/2:-1:1,:) * x(end:-1:end-(framelen-1));

과도 상태와 정상 상태 부분을 결합하여 완전한 평활화된 신호를 생성합니다. 원래 신호와 사비츠키-골레이 추정값을 플로팅합니다.

y = [ybegin; ycenter; yend];
plot([x y])
legend('Noisy Sinusoid','S-G smoothed sinusoid')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Noisy Sinusoid, S-G smoothed sinusoid.

20초 동안 1초에 4회씩 샘플링된, 백색 가우스 잡음이 포함된 0.2Hz 정현파로 구성된 신호를 생성합니다.

dt = 0.25;
t = (0:dt:20-1)';

x = 5*sin(2*pi*0.2*t)+0.5*randn(size(t));

사비츠키-골레이 방법을 사용하여 정현파의 처음 세 개 도함수를 추정합니다. 25개 샘플로 구성된 프레임과 5차 다항식을 사용합니다. 열을 dt의 거듭제곱으로 나누어 도함수를 올바르게 스케일링합니다.

[b,g] = sgolay(5,25);

dx = zeros(length(x),4);
for p = 0:3
  dx(:,p+1) = conv(x, factorial(p)/(-dt)^p * g(:,p+1), 'same');
end

원래 신호, 평활화된 시퀀스, 도함수 추정값을 플로팅합니다.

plot(x,'.-')
hold on
plot(dx)
hold off

legend('x','x (smoothed)','x''','x''''', 'x''''''')
title('Savitzky-Golay Derivative Estimates')

Figure contains an axes. The axes with title Savitzky-Golay Derivative Estimates contains 5 objects of type line. These objects represent x, x (smoothed), x', x'', x'''.

입력 인수

모두 축소

다항식 차수로, 양의 정수로 지정됩니다. order의 값은 framelen보다 작아야 합니다. order = framelen – 1이면 설계된 필터가 평활화를 수행하지 않습니다.

프레임 길이로, 양의 홀수 정수로 지정됩니다. framelen의 값은 order보다 커야 합니다.

가중 벡터로, 양의 실수형 벡터로 지정됩니다. 가중 벡터는 길이가 framelen과 같으며 최소제곱 최소화를 수행하는 데 쓰입니다.

출력 인수

모두 축소

시변 FIR 필터 계수로, framelen×framelen 행렬로 지정됩니다. 평활화 필터 구현(예: sgolayfilt)에서 마지막 (framelen-1)/2개의 행(각 행은 FIR 필터임)은 시작 과도(Transient) 중에 신호에 적용되며, 처음 (framelen-1)/2개 행은 종료 과도 중에 신호에 적용됩니다. 중앙 행은 정상 상태의 신호에 적용됩니다.

미분 필터로 구성된 행렬로, 행렬로 지정됩니다. g의 각 열은 차수가 p-1인 도함수에 대한 미분 필터이며, 여기서 p는 열 인덱스입니다. 길이가 framelen인 신호 x가 주어진 경우, xp((framelen+1)/2) = (factorial(p)) * g(:,p+1)' * x를 통해 신호의 가운데 값에 대한 p차 도함수 xp의 추정값을 구할 수 있습니다.

알고리즘

사비츠키-골레이 필터는 주파수 범위의 큰 부분을 차지하는, 잡음이 있는 신호를 평활화하는 데 사용됩니다. 사비츠키-골레이 평활화 필터는 표준 평균 FIR 필터보다 신호의 고주파 성분을 적게 제거하는 경향이 있습니다. 그러나 잡음 수준이 특히 높은 경우 잡음 제거 측면에서는 표준 평균 FIR 필터보다 효율이 떨어집니다.

필터링은 인근 점에서 측정한 값들의 기본적인 수준이 거의 동일하다는 가정하에, 신호의 각 점을 그 점을 중심으로 하는 이동 윈도우에 포함된 신호 값들의 조합으로 대체하여 이루어집니다. 예를 들어, 이동평균 필터는 각 데이터 점을 주변 데이터 점의 국소 평균으로 대체합니다. 주어진 데이터 점의 왼쪽에 점이 k개 있고 오른쪽에 점이 k개 있다면, 이동평균 필터는 총 L = 2k + 1의 윈도우 길이에 대해 다음과 같이 대체합니다.

xsx^s=1Lr=kkxs+r.

사비츠키-골레이 필터는 윈도우 내의 신호 값 전체에 대해 n차 다항식을 최소제곱 피팅하고 피팅된 다항식 곡선의 계산된 중심 점을 새로운 평활화된 데이터 점으로 택하여 이 개념을 일반화합니다. 이는 주어진 점 xs에 대해 다음과 같습니다.

[xskxs1xsxs+1xs+k]=[b0+b1(tskΔt)+b2(tskΔt)2++bn(tskΔt)nb0+b1(ts1Δt)+b2(ts1Δt)2++bn(ts1Δt)nb0+b1(ts0Δt)+b2(ts0Δt)2++bn(ts0Δt)nb0+b1(ts+1Δt)+b2(ts+1Δt)2++bn(ts+1Δt)nb0+b1(ts+kΔt)+b2(ts+kΔt)2++bn(ts+kΔt)n]=[a0+a1(k)+a2(k)2++an(k)na0+a1(1)+a2(1)2++an(1)na0+a1(0)+a2(0)2++an(0)na0+a1(1)+a2(1)2++an(1)na0+a1(k)+a2(k)2++an(k)n]

또는, 행렬로 표현하면 다음과 같습니다.

x=[1k(k)2(k)n112(2)2(2)n11(1)2(1)n100011121n12222n11kk2kn][a0an]Ha.

사비츠키-골레이 추정값을 구하려면 H의 의사 역행렬을 사용하여 a를 계산하고 결과 앞에 H를 곱합니다.

x^=H(HTH)1HTx=Bx.

sgolay는 조건이 나빠지지 않도록 qr 함수를 사용하여 B = QQT가 되는 H의 효율적 크기의 분해 H = QR을 계산합니다.

B는 한 번만 계산하면 됩니다. 대부분의 신호 점에 대해 사비츠키-골레이 추정값은 신호를 B의 중앙 행과 컨벌루션하여 얻게 됩니다. 필터링된 신호의 정상 상태 부분이 결과로 반환됩니다. B의 처음 k개 행은 초기 과도 상태의 값을 생성하고 B의 마지막 k개 행은 최종 과도 상태의 값을 생성합니다. 이에 대한 예제는 sgolayfilt를 참조하십시오. 윈도우 길이를 늘려서 잡음 억제를 개선할 수 있지만, 이렇게 하면 모든 과도 상태 근처에서 깁스 현상과 비슷한 링잉 현상이 발생합니다.

참고 문헌

[1] Orfanidis, Sophocles J. Introduction to Signal Processing. Englewood Cliffs, NJ: Prentice Hall, 1996.

[2] Press, William H., Saul A. Teukolsky, William T. Vetterling, and Brian P. Flannery. Numerical Recipes in C: The Art of Scientific Computing. New York: Cambridge University Press, 1992.

[3] Schafer, Ronald W. “What Is a Savitzky-Golay Filter? [Lecture Notes].” IEEE Signal Processing Magazine Vol. 28, Number 4, July 2011, pp. 111–117. https://doi.org/10.1109/MSP.2011.941097.

확장 기능

C/C++ 코드 생성
MATLAB® Coder™를 사용하여 C 코드나 C++ 코드를 생성할 수 있습니다.

참고 항목

| | |

R2006a 이전에 개발됨